From b00eeb04ed99e7486f76dabe082c410d0627c81e Mon Sep 17 00:00:00 2001 From: Packit Date: Sep 18 2020 15:20:51 +0000 Subject: gcr-3.28.0 base --- diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..a2caa04 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +Questions to: +Gnome Keyring Mailing List + +Main authors: +Stef Walter diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..eb685a5 --- /dev/null +++ b/COPYING @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..dacadf3 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,33 @@ +=== ChangeLog discontinued === + + gcr does not use a manually edited ChangeLog file. We rely on commit + messages to provide change history. Please write commit messages + in the following format: + +=== begin example commit === + + Short explanation of the commit + + Longer explanation explaining exactly what's changed, whether any + external or private interfaces changed, what bugs were fixed (with bug + tracker reference if applicable) and so forth. Be concise but not too + brief. + +=== end example commit === + + - Always add a brief description of the commit to the _first_ line of + the commit and terminate by two newlines. This may be the title of + a fixed bug, copied from Bugzilla. + + - First line (the brief description) must only be one sentence and + should start with a capital letter unless it starts with a + lowercase symbol or identifier. Don't use a trailing full stop, + and don't exceed 72 characters. + + - The main description (the body) is normal prose and should use + normal punctuation and capital letters where appropriate. + + - When committing code on behalf of others use the --author option, + e.g. git commit -a --author "Joe Coder " and + --signoff. + diff --git a/HACKING b/HACKING new file mode 100644 index 0000000..3550870 --- /dev/null +++ b/HACKING @@ -0,0 +1,142 @@ + +HACKING GCR and GCK libraries + +BUILD OPTIONS +--------------- + +Build options for developers: + + --enable-strict: Build with -Werror, disable deprecations, and fatal warnings + + --enable-debug: Turn off compiler optimization + --disable-debug: Turn off all debug options and output. + + --enable-coverage: Build coverage, use 'make coverage' for summary. + + +PATCHES +---------- + +Patches should be submitted to bugzilla: + +http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&component=gcr + +The gnome-keyring mailing list is: +gnome-keyring-list@gnome.org + +egg + Various bits of code shared with other modules + +gck + A public library for accessing PKCS#11 modules. + +gcr + A public library for bits of crypto UI and parsing etc... + +schema + Desktop settings schemas for crypto stuff + +testing + Testing CA, gnupg and other mock setups + +---------------------------------------------------------------------------------- + CODING STYLE +---------------------------------------------------------------------------------- + +Our coding style is very similar to the linux coding style: + + http://lxr.linux.no/linux/Documentation/CodingStyle + +Summary below. Differences from Linux coding style are marked with a plus +instead of an asterisk: + + + Space between function name and parentheses. + + my_function_call (arg1, arg2); + + * Braces on the same line as conditional with spaces around braces: + + if (test) { + do_y (); + do_z (); + } + + switch (value) { + case CONSTANT: + do_z (); + break; + default: + break; + } + + * Braces around functions on a separate line from function name, + return value on a separate line, arguments on separate lines. + + static void + my_special_function (int arg1, + int arg2) + { + /* body of function */ + } + + * Don't use braces unnecessarily: + + if (test) + do_this_thing (); + + * But use braces here, when one section has more than a line: + + if (test) { + do_this_thing (); + } else { + do_other_thing (); + smile_nicely (); + } + + * Use of tabs for 8 char indent. + + ------->if (test) { + ------->------->Value; + ------->------->Value; + ------->} + + * No trailing whitespace on lines. Git will warn you about this. + Please enforce it like so (in gnome-keyring checkout): + + $ cp -ipv .git/hooks/pre-commit.sample .git/hooks/pre-commit + + * The '*' in a pointer declaraction belongs with the variable name: + + char *name; + + + Extra long wrapped lines should wrap to function opening brace + using spaces past indentation point. + + ------>my_function_call ("this is a very long argument here", + ------> "wrapped argument is indented with spaces"); + + * Function names are in lower case with _ separators. + + this_is_a_long_function_name (); + + * Constants are all in upper case with _ separators. + + THIS_IS_A_CONSTANT + + + Structures should be typedefed to avoid saying 'struct' and names + are CamelCase: + + ThisIsAStruct + + * One line comments should look like: + + /* This is a one line comment */ + + * Multi line comments should look like: + + /* + * This is a multiline comment. + * And it has a useless second line. + */ + +When in doubt adapt to the style of the code around your patch. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..e62566f --- /dev/null +++ b/Makefile.am @@ -0,0 +1,207 @@ +NULL = + +SUBDIRS = \ + . \ + po \ + docs/reference/gck \ + docs/reference/gcr + +ACLOCAL_AMFLAGS = -I build/m4 ${ACLOCAL_FLAGS} + +DISTCHECK_CONFIGURE_FLAGS = \ + --enable-gtk-doc \ + --disable-coverage \ + --disable-update-mime \ + --disable-update-icon-cache \ + --with-gtk \ + --with-pkcs11-modules=$(abs_srcdir)/$(top_distdir)/_inst/lib/ + +DISTCLEANFILES = \ + intltool-extract \ + intltool-merge \ + intltool-update + +dist-hook: + @if test -d "$(srcdir)/.git"; \ + then \ + echo Creating ChangeLog && \ + ( cd "$(top_srcdir)" && \ + echo '# Generate automatically. Do not edit.'; echo; \ + $(top_srcdir)/missing --run git log --stat --date=short ) > ChangeLog.tmp \ + && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \ + || ( rm -f ChangeLog.tmp ; \ + echo Failed to generate ChangeLog >&2 ); \ + else \ + echo A git clone is required to generate a ChangeLog >&2; \ + fi + +check-local: check-gck-symbols check-gcr-symbols check-ui-symbols + +upload-release: $(DIST_ARCHIVES) + scp $(DIST_ARCHIVES) master.gnome.org: + ssh master.gnome.org ftpadmin install $(DIST_ARCHIVES) + +# Default executable tests +LOG_DRIVER = $(srcdir)/build/tap-driver +LOG_DRIVER_FLAGS = --format=tap +LOG_COMPILER = $(srcdir)/build/tap-gtester + +VALGRIND_ARGS = --trace-children=no --quiet --error-exitcode=33 \ + --suppressions=valgrind-suppressions --gen-suppressions=all \ + --num-callers=16 +VALGRIND_SUPPRESSIONS = \ + build/gcr.supp \ + build/gcrypt.supp \ + build/glib.supp \ + build/glibc.supp \ + build/p11-kit.supp \ + build/pixman.supp \ + build/pthread.supp \ + build/unknown.supp + +valgrind-suppressions: $(VALGRIND_SUPPRESSIONS) + $(AM_V_GEN) cat $^ > $@ + +check-memory: valgrind-suppressions + $(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \ + $(AM_MAKEFLAGS) check +recheck-memory: valgrind-suppressions + $(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \ + $(AM_MAKEFLAGS) recheck + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(builddir) \ + -I$(srcdir)/build \ + -DSRCDIR="\"@abs_srcdir@\"" \ + -DBUILDDIR="\"@abs_builddir@\"" \ + -DLOCALEDIR=\""$(datadir)/locale"\" \ + -DLIBEXECDIR="\"$(libexecdir)\"" \ + $(GLIB_CFLAGS) + +LDADD = \ + $(GLIB_LIBS) + +BUILT_SOURCES = +TESTS = + +check_PROGRAMS = +check_LTLIBRARIES = +lib_LTLIBRARIES = +libexec_PROGRAMS = +noinst_LTLIBRARIES = +noinst_PROGRAMS = $(check_PROGRAMS) + +pkgconfig_DATA = +pkgconfigdir = $(libdir)/pkgconfig + +CLEANFILES = \ + $(pkgconfig_DATA) + +EXTRA_DIST = \ + intltool-extract.in \ + intltool-merge.in \ + intltool-update.in \ + HACKING \ + build/valgrind \ + $(VALGRIND_SUPPRESSIONS) \ + build/enum-template.c \ + build/enum-template.h \ + build/g-ir-unbreak.xsl \ + build/tap-driver \ + build/tap-gtester \ + build/gdbus-unbreak-codegen \ + $(NULL) + +TEST_SUPPRESSIONS = $(top_builddir)/build/valgrind-suppressions + +GDBUS_CODEGEN = $(top_srcdir)/build/gdbus-unbreak-codegen + +V_SED = $(V_SED_$(V)) +V_SED_ = $(V_SED_$(AM_DEFAULT_VERBOSITY)) +V_SED_0 = @echo " SED " $@; + +SED_SUBST = sed \ + -e 's,[@]datadir[@],$(datadir),g' \ + -e 's,[@]libexecdir[@],$(libexecdir),g' \ + -e 's,[@]libdir[@],$(libdir),g' \ + -e 's,[@]includedir[@],$(includedir),g' \ + -e 's,[@]datarootdir[@],$(datarootdir),g' \ + -e 's,[@]sysconfdir[@],$(sysconfdir),g' \ + -e 's,[@]bindir[@],$(bindir),g' \ + -e 's,[@]exec_prefix[@],$(exec_prefix),g' \ + -e 's,[@]prefix[@],$(prefix),g' \ + -e 's,[@]PACKAGE[@],$(PACKAGE),g' \ + -e 's,[@]VERSION[@],$(VERSION),g' \ + $(NULL) + +.desktop.in.in.desktop.in: + $(V_SED) $(SED_SUBST) $< > $@ + +@INTLTOOL_DESKTOP_RULE@ + +.service.in.service: + $(V_SED) $(SED_SUBST) $< > $@ + +ENUM_TEMPLATE_C = $(top_srcdir)/build/enum-template.c +ENUM_TEMPLATE_H = $(top_srcdir)/build/enum-template.h + +V_XSLTPROC = $(V_XSLTPROC_$(V)) +V_XSLTPROC_ = $(V_XSLTPROC_$(AM_DEFAULT_VERBOSITY)) +V_XSLTPROC_0 = @echo " XSLTPROC" $@; + +FIX_GIR = $(top_srcdir)/build/g-ir-unbreak.xsl + +.broken.gir.gir: + $(V_XSLTPROC) xsltproc -o $@ $(FIX_GIR) $< +.broken.typelib.typelib: + $(AM_V_GEN) cp $< $@ + +SUFFIXES = .desktop.in .desktop.in.in .service .service.in .broken.typelib .broken.gir .gir + +if HAVE_INTROSPECTION + +include $(INTROSPECTION_MAKEFILE) + +INTROSPECTION_GIRS = +INTROSPECTION_SCANNER_ARGS = $(INTROSPECTION_FLAGS) --warn-all --add-include-path=. +INTROSPECTION_COMPILER_ARGS = --includedir=. + +girdir = $(datadir)/gir-1.0 +gir_DATA = + +typelibsdir = $(libdir)/girepository-1.0 +typelibs_DATA = $(gir_DATA:.gir=.typelib) + +CLEANFILES += \ + $(gir_DATA) \ + $(typelibs_DATA) \ + $(BUILT_SOURCES) + +if ENABLE_VAPIGEN + +include $(VAPIGEN_MAKEFILE) + +VAPIGEN_VAPIS = +VAPI_DEPS = $(VAPIGEN_VAPIS:.vapi=.deps) + +vapidir = $(datadir)/vala/vapi +vapi_DATA = $(VAPIGEN_VAPIS) $(VAPI_DEPS) + +CLEANFILES += \ + $(VAPIGEN_VAPIS) \ + $(VAPI_DEPS) + +endif + +endif + +include egg/Makefile.am +include gck/Makefile.am +include gcr/Makefile.am +include schema/Makefile.am + +if WITH_GTK +include ui/Makefile.am +include ui/icons/Makefile.am +endif diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..fb5f67f --- /dev/null +++ b/Makefile.in @@ -0,0 +1,6488 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +# included in top-level Makefile.am + +# included in top-level Makefile.am + +# included in top-level Makefile.am + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) +check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) +libexec_PROGRAMS = gcr-ssh-askpass$(EXEEXT) $(am__EXEEXT_4) +noinst_PROGRAMS = $(check_PROGRAMS) frob-openpgp$(EXEEXT) \ + frob-certificate-request$(EXEEXT) frob-parser$(EXEEXT) \ + $(am__EXEEXT_5) +@HAVE_INTROSPECTION_TRUE@am__append_1 = \ +@HAVE_INTROSPECTION_TRUE@ $(gir_DATA) \ +@HAVE_INTROSPECTION_TRUE@ $(typelibs_DATA) \ +@HAVE_INTROSPECTION_TRUE@ $(BUILT_SOURCES) + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@am__append_2 = \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ $(VAPIGEN_VAPIS) \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ $(VAPI_DEPS) + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@am__append_3 = \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ gck/Gck-@GCK_MAJOR@.metadata \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ gck/pkcs11.vapi + +@WITH_GTK_TRUE@am__append_4 = gcr/gcr.h +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@am__append_5 = \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ gcr/Gcr-@GCR_MAJOR@.metadata + +@WITH_GTK_TRUE@am__append_6 = \ +@WITH_GTK_TRUE@ $(ui_BUILT_SOURCES) + +@WITH_GTK_TRUE@am__append_7 = \ +@WITH_GTK_TRUE@ libgcr-ui-@GCR_MAJOR@.la + +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@am__append_8 = GcrUi-@GCR_MAJOR@.gir +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@am__append_9 = GcrUi-@GCR_MAJOR@.gir +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@am__append_10 = gcr-ui-@GCR_MAJOR@.vapi +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@am__append_11 = \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ ui/GcrUi-@GCR_MAJOR@.metadata + +@WITH_GTK_TRUE@am__append_12 = \ +@WITH_GTK_TRUE@ gcr-$(GCR_MAJOR).pc \ +@WITH_GTK_TRUE@ gcr-ui-$(GCR_MAJOR).pc + +@WITH_GTK_TRUE@bin_PROGRAMS = gcr-viewer$(EXEEXT) +@WITH_GTK_TRUE@am__append_13 = gcr-prompter +@WITH_GTK_TRUE@am__append_14 = ui/gcr.pc.in ui/gcr-ui.pc.in \ +@WITH_GTK_TRUE@ ui/gcr-ui.symbols ui/gcr.gresource.xml \ +@WITH_GTK_TRUE@ $(desktop_in_in_files) $(ui_RESOURCES) \ +@WITH_GTK_TRUE@ $(mime_DATA) ui/fixtures ui/icons/src \ +@WITH_GTK_TRUE@ ui/icons/render-icons.py +@WITH_GTK_TRUE@am__append_15 = \ +@WITH_GTK_TRUE@ $(desktop_DATA) \ +@WITH_GTK_TRUE@ gcr-ui-actual.abi \ +@WITH_GTK_TRUE@ gcr-ui-expected.abi \ +@WITH_GTK_TRUE@ $(desktop_in_files) \ +@WITH_GTK_TRUE@ $(NULL) + + +# ------------------------------------------------------------------ +@WITH_GTK_TRUE@am__append_16 = \ +@WITH_GTK_TRUE@ frob-certificate \ +@WITH_GTK_TRUE@ frob-combo-selector \ +@WITH_GTK_TRUE@ frob-gnupg-selector \ +@WITH_GTK_TRUE@ frob-import-button \ +@WITH_GTK_TRUE@ frob-key \ +@WITH_GTK_TRUE@ frob-tree-selector \ +@WITH_GTK_TRUE@ frob-prompt \ +@WITH_GTK_TRUE@ frob-request \ +@WITH_GTK_TRUE@ frob-system-prompt \ +@WITH_GTK_TRUE@ frob-unlock \ +@WITH_GTK_TRUE@ frob-unlock-options + +@WITH_GTK_TRUE@am__append_17 = \ +@WITH_GTK_TRUE@ ui/icons/16x16 \ +@WITH_GTK_TRUE@ ui/icons/22x22 \ +@WITH_GTK_TRUE@ ui/icons/24x24 \ +@WITH_GTK_TRUE@ ui/icons/32x32 \ +@WITH_GTK_TRUE@ ui/icons/48x48 \ +@WITH_GTK_TRUE@ ui/icons/256x256 + +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(gck_inc_HEADERS) \ + $(am__gcr_inc_HEADERS_DIST) $(am__ui_inc_HEADERS_DIST) \ + $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = gck/gck.pc gck/gck-version.h gcr/gcr-base.pc \ + gcr/gcr-version.h ui/gcr.pc ui/gcr-ui.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(convertdir)" \ + "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(girdir)" \ + "$(DESTDIR)$(mimedir)" "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(servicedir)" "$(DESTDIR)$(typelibsdir)" \ + "$(DESTDIR)$(vapidir)" "$(DESTDIR)$(gck_incdir)" \ + "$(DESTDIR)$(gcr_incdir)" "$(DESTDIR)$(ui_incdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libegg_asn1x_la_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am_libegg_asn1x_la_OBJECTS = egg/libegg_asn1x_la-egg-asn1x.lo +libegg_asn1x_la_OBJECTS = $(am_libegg_asn1x_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libegg_asn1x_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libegg_asn1x_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am__DEPENDENCIES_1 = +libegg_hex_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libegg_hex_la_OBJECTS = egg/libegg_hex_la-egg-hex.lo +libegg_hex_la_OBJECTS = $(am_libegg_hex_la_OBJECTS) +libegg_hex_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libegg_hex_la_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +libegg_secmem_la_LIBADD = +am_libegg_secmem_la_OBJECTS = egg/egg-secure-memory.lo +libegg_secmem_la_OBJECTS = $(am_libegg_secmem_la_OBJECTS) +libegg_test_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libegg_test_la_OBJECTS = egg/libegg_test_la-egg-testing.lo \ + egg/libegg_test_la-mock-interaction.lo +libegg_test_la_OBJECTS = $(am_libegg_test_la_OBJECTS) +libegg_test_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libegg_test_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ + $@ +libegg_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__objects_1 = +am_libegg_la_OBJECTS = egg/libegg_la-egg-armor.lo \ + egg/libegg_la-egg-asn1x.lo egg/libegg_la-egg-asn1-defs.lo \ + egg/libegg_la-egg-buffer.lo egg/libegg_la-egg-dh.lo \ + egg/libegg_la-egg-dn.lo egg/libegg_la-egg-decimal.lo \ + egg/libegg_la-egg-hex.lo egg/libegg_la-egg-hkdf.lo \ + egg/libegg_la-egg-libgcrypt.lo egg/libegg_la-egg-oid.lo \ + egg/libegg_la-egg-padding.lo egg/libegg_la-egg-openssl.lo \ + egg/libegg_la-egg-secure-memory.lo egg/libegg_la-egg-symkey.lo \ + egg/libegg_la-egg-testing.lo egg/libegg_la-egg-timegm.lo \ + $(am__objects_1) +libegg_la_OBJECTS = $(am_libegg_la_OBJECTS) +libegg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libegg_la_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +libgck_@GCK_MAJOR@_la_DEPENDENCIES = libegg-hex.la libegg-secmem.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__objects_2 = gck/libgck_@GCK_MAJOR@_la-gck-attributes.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-dump.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-enumerator.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-misc.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-module.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-modules.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-object.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-object-cache.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-password.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-session.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-slot.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-uri.lo +am__objects_3 = gck/libgck_@GCK_MAJOR@_la-gck-call.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-interaction.lo +am_libgck_@GCK_MAJOR@_la_OBJECTS = $(am__objects_2) $(am__objects_3) +am__objects_4 = gck/libgck_@GCK_MAJOR@_la-gck-marshal.lo \ + gck/libgck_@GCK_MAJOR@_la-gck-enum-types.lo +nodist_libgck_@GCK_MAJOR@_la_OBJECTS = $(am__objects_4) +libgck_@GCK_MAJOR@_la_OBJECTS = $(am_libgck_@GCK_MAJOR@_la_OBJECTS) \ + $(nodist_libgck_@GCK_MAJOR@_la_OBJECTS) +libgck_@GCK_MAJOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) \ + $(libgck_@GCK_MAJOR@_la_LDFLAGS) $(LDFLAGS) -o $@ +libgck_testable_la_DEPENDENCIES = libegg-hex.la libegg-secmem.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgck_testable_la_OBJECTS = gck/libgck_testable_la-gck-mock.lo \ + gck/libgck_testable_la-gck-test.lo +libgck_testable_la_OBJECTS = $(am_libgck_testable_la_OBJECTS) +libgck_testable_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libgck_testable_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +libgcr_base_@GCR_MAJOR@_la_DEPENDENCIES = libegg.la \ + libgck-@GCK_MAJOR@.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__objects_5 = gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-collection.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-icons.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-importer.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-library.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-parser.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.lo \ + $(am__objects_1) +am__objects_6 = \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-column.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-record.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-trust.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-util.lo $(am__objects_1) +am_libgcr_base_@GCR_MAJOR@_la_OBJECTS = $(am__objects_5) \ + $(am__objects_6) $(am__objects_1) +am__objects_7 = gcr/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-oids.lo \ + gcr/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.lo +nodist_libgcr_base_@GCR_MAJOR@_la_OBJECTS = $(am__objects_7) +libgcr_base_@GCR_MAJOR@_la_OBJECTS = \ + $(am_libgcr_base_@GCR_MAJOR@_la_OBJECTS) \ + $(nodist_libgcr_base_@GCR_MAJOR@_la_OBJECTS) +libgcr_base_@GCR_MAJOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) \ + $(libgcr_base_@GCR_MAJOR@_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_GTK_TRUE@libgcr_ui_@GCR_MAJOR@_la_DEPENDENCIES = libegg.la \ +@WITH_GTK_TRUE@ libgcr-base-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgck-@GCK_MAJOR@.la $(am__DEPENDENCIES_1) \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__libgcr_ui_@GCR_MAJOR@_la_SOURCES_DIST = \ + ui/gcr-certificate-renderer.c ui/gcr-certificate-renderer.h \ + ui/gcr-certificate-widget.c ui/gcr-certificate-widget.h \ + ui/gcr-collection-model.c ui/gcr-collection-model.h \ + ui/gcr-combo-selector.c ui/gcr-combo-selector.h \ + ui/gcr-failure-renderer.c ui/gcr-failure-renderer.h \ + ui/gcr-key-renderer.c ui/gcr-key-renderer.h \ + ui/gcr-key-widget.c ui/gcr-key-widget.h ui/gcr-import-button.c \ + ui/gcr-import-button.h ui/gcr-list-selector.c \ + ui/gcr-list-selector.h ui/gcr-prompt-dialog.c \ + ui/gcr-prompt-dialog.h ui/gcr-renderer.c ui/gcr-renderer.h \ + ui/gcr-secure-entry-buffer.c ui/gcr-secure-entry-buffer.h \ + ui/gcr-tree-selector.c ui/gcr-tree-selector.h \ + ui/gcr-unlock-options-widget.c ui/gcr-unlock-options-widget.h \ + ui/gcr-viewer.c ui/gcr-viewer.h ui/gcr-viewer-widget.c \ + ui/gcr-viewer-widget.h ui/gcr-ui.h ui/eggimagemenuitem.c \ + ui/eggimagemenuitem.h ui/gcr-certificate-basics-widget.c \ + ui/gcr-certificate-basics-widget.h \ + ui/gcr-certificate-details-widget.c \ + ui/gcr-certificate-details-widget.h \ + ui/gcr-certificate-exporter.c ui/gcr-certificate-exporter.h \ + ui/gcr-certificate-renderer-private.h \ + ui/gcr-certificate-request-renderer.c \ + ui/gcr-certificate-request-renderer.h ui/gcr-deprecated.h \ + ui/gcr-dialog-util.c ui/gcr-dialog-util.h \ + ui/gcr-display-scrolled.c ui/gcr-display-scrolled.h \ + ui/gcr-display-view.c ui/gcr-display-view.h \ + ui/gcr-gnupg-renderer.c ui/gcr-gnupg-renderer.h \ + ui/gcr-list-selector-private.h ui/gcr-live-search.c \ + ui/gcr-live-search.h ui/gcr-pkcs11-import-dialog.c \ + ui/gcr-pkcs11-import-dialog.h \ + ui/gcr-pkcs11-import-interaction.c \ + ui/gcr-pkcs11-import-interaction.h ui/gcr-unlock-renderer.c \ + ui/gcr-unlock-renderer.h ui/gcr-viewer-window.c \ + ui/gcr-viewer-window.h +@WITH_GTK_TRUE@am__objects_8 = ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.lo \ +@WITH_GTK_TRUE@ $(am__objects_1) +@WITH_GTK_TRUE@am__objects_9 = ui/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.lo \ +@WITH_GTK_TRUE@ $(am__objects_1) +@WITH_GTK_TRUE@am_libgcr_ui_@GCR_MAJOR@_la_OBJECTS = $(am__objects_8) \ +@WITH_GTK_TRUE@ $(am__objects_9) $(am__objects_1) +@WITH_GTK_TRUE@am__objects_10 = \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.lo \ +@WITH_GTK_TRUE@ ui/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.lo +@WITH_GTK_TRUE@nodist_libgcr_ui_@GCR_MAJOR@_la_OBJECTS = \ +@WITH_GTK_TRUE@ $(am__objects_10) +libgcr_ui_@GCR_MAJOR@_la_OBJECTS = \ + $(am_libgcr_ui_@GCR_MAJOR@_la_OBJECTS) \ + $(nodist_libgcr_ui_@GCR_MAJOR@_la_OBJECTS) +libgcr_ui_@GCR_MAJOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) \ + $(libgcr_ui_@GCR_MAJOR@_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_GTK_TRUE@am_libgcr_ui_@GCR_MAJOR@_la_rpath = -rpath $(libdir) +libmock_test_module_la_DEPENDENCIES = libgck-testable.la +am_libmock_test_module_la_OBJECTS = \ + gck/libmock_test_module_la-mock-test-module.lo +libmock_test_module_la_OBJECTS = $(am_libmock_test_module_la_OBJECTS) +libmock_test_module_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libmock_test_module_la_CFLAGS) $(CFLAGS) \ + $(libmock_test_module_la_LDFLAGS) $(LDFLAGS) -o $@ +am__EXEEXT_1 = test-asn1$(EXEEXT) test-asn1x$(EXEEXT) test-dn$(EXEEXT) \ + test-decimal$(EXEEXT) test-hex$(EXEEXT) test-hkdf$(EXEEXT) \ + test-oid$(EXEEXT) test-secmem$(EXEEXT) test-padding$(EXEEXT) \ + test-symkey$(EXEEXT) test-armor$(EXEEXT) test-openssl$(EXEEXT) \ + test-dh$(EXEEXT) +am__EXEEXT_2 = test-gck-attributes$(EXEEXT) test-gck-module$(EXEEXT) \ + test-gck-slot$(EXEEXT) test-gck-session$(EXEEXT) \ + test-gck-object$(EXEEXT) test-gck-crypto$(EXEEXT) \ + test-gck-uri$(EXEEXT) test-gck-enumerator$(EXEEXT) \ + test-gck-modules$(EXEEXT) +am__EXEEXT_3 = test-util$(EXEEXT) test-filter-collection$(EXEEXT) \ + test-secret-exchange$(EXEEXT) test-simple-certificate$(EXEEXT) \ + test-certificate$(EXEEXT) test-certificate-chain$(EXEEXT) \ + test-subject-public-key$(EXEEXT) test-fingerprint$(EXEEXT) \ + test-pkcs11-certificate$(EXEEXT) test-openpgp$(EXEEXT) \ + test-openssh$(EXEEXT) test-secure-memory$(EXEEXT) \ + test-trust$(EXEEXT) test-parser$(EXEEXT) test-record$(EXEEXT) \ + test-memory-icon$(EXEEXT) test-gnupg-key$(EXEEXT) \ + test-gnupg-collection$(EXEEXT) test-gnupg-process$(EXEEXT) \ + test-system-prompt$(EXEEXT) test-ssh-askpass$(EXEEXT) +@WITH_GTK_TRUE@am__EXEEXT_4 = gcr-prompter$(EXEEXT) +@WITH_GTK_TRUE@am__EXEEXT_5 = frob-certificate$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-combo-selector$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-gnupg-selector$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-import-button$(EXEEXT) frob-key$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-tree-selector$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-prompt$(EXEEXT) frob-request$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-system-prompt$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-unlock$(EXEEXT) \ +@WITH_GTK_TRUE@ frob-unlock-options$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(noinst_PROGRAMS) +am__frob_certificate_SOURCES_DIST = ui/frob-certificate.c +@WITH_GTK_TRUE@am_frob_certificate_OBJECTS = \ +@WITH_GTK_TRUE@ ui/frob_certificate-frob-certificate.$(OBJEXT) +frob_certificate_OBJECTS = $(am_frob_certificate_OBJECTS) +@WITH_GTK_TRUE@am__DEPENDENCIES_2 = libgcr-ui-@GCR_MAJOR@.la \ +@WITH_GTK_TRUE@ libgcr-base-@GCR_MAJOR@.la libegg.la \ +@WITH_GTK_TRUE@ libgck-testable.la $(am__DEPENDENCIES_1) \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +@WITH_GTK_TRUE@frob_certificate_DEPENDENCIES = $(am__DEPENDENCIES_2) +frob_certificate_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_certificate_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_frob_certificate_request_OBJECTS = gcr/frob_certificate_request-frob-certificate-request.$(OBJEXT) \ + gcr/frob_certificate_request-console-interaction.$(OBJEXT) +frob_certificate_request_OBJECTS = \ + $(am_frob_certificate_request_OBJECTS) +am__DEPENDENCIES_3 = libgcr-base-@GCR_MAJOR@.la libegg.la \ + libgck-testable.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +frob_certificate_request_DEPENDENCIES = $(am__DEPENDENCIES_3) +frob_certificate_request_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_certificate_request_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__frob_combo_selector_SOURCES_DIST = ui/frob-combo-selector.c +@WITH_GTK_TRUE@am_frob_combo_selector_OBJECTS = ui/frob_combo_selector-frob-combo-selector.$(OBJEXT) +frob_combo_selector_OBJECTS = $(am_frob_combo_selector_OBJECTS) +@WITH_GTK_TRUE@frob_combo_selector_DEPENDENCIES = \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_2) +frob_combo_selector_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_combo_selector_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__frob_gnupg_selector_SOURCES_DIST = ui/frob-gnupg-selector.c +@WITH_GTK_TRUE@am_frob_gnupg_selector_OBJECTS = ui/frob_gnupg_selector-frob-gnupg-selector.$(OBJEXT) +frob_gnupg_selector_OBJECTS = $(am_frob_gnupg_selector_OBJECTS) +@WITH_GTK_TRUE@frob_gnupg_selector_DEPENDENCIES = \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_2) +frob_gnupg_selector_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_gnupg_selector_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__frob_import_button_SOURCES_DIST = ui/frob-import-button.c +@WITH_GTK_TRUE@am_frob_import_button_OBJECTS = ui/frob_import_button-frob-import-button.$(OBJEXT) +frob_import_button_OBJECTS = $(am_frob_import_button_OBJECTS) +@WITH_GTK_TRUE@frob_import_button_DEPENDENCIES = \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_2) +frob_import_button_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_import_button_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__frob_key_SOURCES_DIST = ui/frob-key.c +@WITH_GTK_TRUE@am_frob_key_OBJECTS = ui/frob_key-frob-key.$(OBJEXT) +frob_key_OBJECTS = $(am_frob_key_OBJECTS) +@WITH_GTK_TRUE@frob_key_DEPENDENCIES = $(am__DEPENDENCIES_2) +frob_key_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(frob_key_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_frob_openpgp_OBJECTS = gcr/frob_openpgp-frob-openpgp.$(OBJEXT) +frob_openpgp_OBJECTS = $(am_frob_openpgp_OBJECTS) +frob_openpgp_DEPENDENCIES = $(am__DEPENDENCIES_3) +frob_openpgp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(frob_openpgp_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_frob_parser_OBJECTS = gcr/frob_parser-frob-parser.$(OBJEXT) +frob_parser_OBJECTS = $(am_frob_parser_OBJECTS) +frob_parser_DEPENDENCIES = $(am__DEPENDENCIES_3) +frob_parser_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(frob_parser_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__frob_prompt_SOURCES_DIST = ui/frob-prompt.c +@WITH_GTK_TRUE@am_frob_prompt_OBJECTS = \ +@WITH_GTK_TRUE@ ui/frob_prompt-frob-prompt.$(OBJEXT) +frob_prompt_OBJECTS = $(am_frob_prompt_OBJECTS) +@WITH_GTK_TRUE@frob_prompt_DEPENDENCIES = $(am__DEPENDENCIES_2) +frob_prompt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(frob_prompt_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__frob_request_SOURCES_DIST = ui/frob-request.c +@WITH_GTK_TRUE@am_frob_request_OBJECTS = \ +@WITH_GTK_TRUE@ ui/frob_request-frob-request.$(OBJEXT) +frob_request_OBJECTS = $(am_frob_request_OBJECTS) +@WITH_GTK_TRUE@frob_request_DEPENDENCIES = $(am__DEPENDENCIES_2) +frob_request_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(frob_request_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__frob_system_prompt_SOURCES_DIST = ui/frob-system-prompt.c +@WITH_GTK_TRUE@am_frob_system_prompt_OBJECTS = ui/frob_system_prompt-frob-system-prompt.$(OBJEXT) +frob_system_prompt_OBJECTS = $(am_frob_system_prompt_OBJECTS) +@WITH_GTK_TRUE@frob_system_prompt_DEPENDENCIES = \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_2) +frob_system_prompt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_system_prompt_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__frob_tree_selector_SOURCES_DIST = ui/frob-tree-selector.c +@WITH_GTK_TRUE@am_frob_tree_selector_OBJECTS = ui/frob_tree_selector-frob-tree-selector.$(OBJEXT) +frob_tree_selector_OBJECTS = $(am_frob_tree_selector_OBJECTS) +@WITH_GTK_TRUE@frob_tree_selector_DEPENDENCIES = \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_2) +frob_tree_selector_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_tree_selector_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__frob_unlock_SOURCES_DIST = ui/frob-unlock.c ui/gcr-viewer-window.c +@WITH_GTK_TRUE@am_frob_unlock_OBJECTS = \ +@WITH_GTK_TRUE@ ui/frob_unlock-frob-unlock.$(OBJEXT) \ +@WITH_GTK_TRUE@ ui/frob_unlock-gcr-viewer-window.$(OBJEXT) +frob_unlock_OBJECTS = $(am_frob_unlock_OBJECTS) +@WITH_GTK_TRUE@frob_unlock_DEPENDENCIES = $(am__DEPENDENCIES_2) +frob_unlock_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(frob_unlock_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__frob_unlock_options_SOURCES_DIST = ui/frob-unlock-options.c +@WITH_GTK_TRUE@am_frob_unlock_options_OBJECTS = ui/frob_unlock_options-frob-unlock-options.$(OBJEXT) +frob_unlock_options_OBJECTS = $(am_frob_unlock_options_OBJECTS) +@WITH_GTK_TRUE@frob_unlock_options_DEPENDENCIES = \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_2) +frob_unlock_options_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(frob_unlock_options_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__gcr_prompter_SOURCES_DIST = ui/gcr-prompter-tool.c +@WITH_GTK_TRUE@am_gcr_prompter_OBJECTS = \ +@WITH_GTK_TRUE@ ui/gcr_prompter-gcr-prompter-tool.$(OBJEXT) +gcr_prompter_OBJECTS = $(am_gcr_prompter_OBJECTS) +@WITH_GTK_TRUE@gcr_prompter_DEPENDENCIES = libgcr-ui-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgcr-base-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgck-@GCK_MAJOR@.la $(am__DEPENDENCIES_1) +gcr_prompter_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(gcr_prompter_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_gcr_ssh_askpass_OBJECTS = \ + gcr/gcr_ssh_askpass-gcr-ssh-askpass.$(OBJEXT) +gcr_ssh_askpass_OBJECTS = $(am_gcr_ssh_askpass_OBJECTS) +gcr_ssh_askpass_DEPENDENCIES = libegg.la $(am__DEPENDENCIES_1) +gcr_ssh_askpass_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(gcr_ssh_askpass_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am__gcr_viewer_SOURCES_DIST = ui/gcr-viewer-tool.c +@WITH_GTK_TRUE@am_gcr_viewer_OBJECTS = \ +@WITH_GTK_TRUE@ ui/gcr_viewer-gcr-viewer-tool.$(OBJEXT) +gcr_viewer_OBJECTS = $(am_gcr_viewer_OBJECTS) +@WITH_GTK_TRUE@gcr_viewer_DEPENDENCIES = libgcr-ui-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgcr-base-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgck-@GCK_MAJOR@.la $(am__DEPENDENCIES_1) \ +@WITH_GTK_TRUE@ $(am__DEPENDENCIES_1) +gcr_viewer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(gcr_viewer_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_armor_OBJECTS = egg/test-armor.$(OBJEXT) +test_armor_OBJECTS = $(am_test_armor_OBJECTS) +am__DEPENDENCIES_4 = libegg.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_armor_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_asn1_OBJECTS = egg/test-asn1.$(OBJEXT) +test_asn1_OBJECTS = $(am_test_asn1_OBJECTS) +test_asn1_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_asn1x_OBJECTS = egg/test-asn1x.$(OBJEXT) +test_asn1x_OBJECTS = $(am_test_asn1x_OBJECTS) +test_asn1x_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_certificate_OBJECTS = \ + gcr/test_certificate-test-certificate.$(OBJEXT) +test_certificate_OBJECTS = $(am_test_certificate_OBJECTS) +test_certificate_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_certificate_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_certificate_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_certificate_chain_OBJECTS = \ + gcr/test_certificate_chain-test-certificate-chain.$(OBJEXT) +test_certificate_chain_OBJECTS = $(am_test_certificate_chain_OBJECTS) +test_certificate_chain_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_certificate_chain_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_certificate_chain_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_decimal_OBJECTS = egg/test-decimal.$(OBJEXT) +test_decimal_OBJECTS = $(am_test_decimal_OBJECTS) +test_decimal_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_dh_OBJECTS = egg/test-dh.$(OBJEXT) +test_dh_OBJECTS = $(am_test_dh_OBJECTS) +test_dh_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_dn_OBJECTS = egg/test-dn.$(OBJEXT) +test_dn_OBJECTS = $(am_test_dn_OBJECTS) +test_dn_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_filter_collection_OBJECTS = \ + gcr/test_filter_collection-test-filter-collection.$(OBJEXT) +test_filter_collection_OBJECTS = $(am_test_filter_collection_OBJECTS) +test_filter_collection_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_filter_collection_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_filter_collection_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_fingerprint_OBJECTS = \ + gcr/test_fingerprint-test-fingerprint.$(OBJEXT) +test_fingerprint_OBJECTS = $(am_test_fingerprint_OBJECTS) +test_fingerprint_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_fingerprint_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_fingerprint_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_gck_attributes_OBJECTS = \ + gck/test_gck_attributes-test-gck-attributes.$(OBJEXT) +test_gck_attributes_OBJECTS = $(am_test_gck_attributes_OBJECTS) +am__DEPENDENCIES_5 = libgck-testable.la libegg-test.la libegg-hex.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +test_gck_attributes_DEPENDENCIES = $(am__DEPENDENCIES_5) +test_gck_attributes_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gck_attributes_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_gck_crypto_OBJECTS = \ + gck/test_gck_crypto-test-gck-crypto.$(OBJEXT) +test_gck_crypto_OBJECTS = $(am_test_gck_crypto_OBJECTS) +test_gck_crypto_DEPENDENCIES = $(am__DEPENDENCIES_5) +test_gck_crypto_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gck_crypto_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_gck_enumerator_OBJECTS = \ + gck/test_gck_enumerator-test-gck-enumerator.$(OBJEXT) +test_gck_enumerator_OBJECTS = $(am_test_gck_enumerator_OBJECTS) +test_gck_enumerator_DEPENDENCIES = libegg-test.la \ + $(am__DEPENDENCIES_5) +test_gck_enumerator_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gck_enumerator_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_gck_module_OBJECTS = \ + gck/test_gck_module-test-gck-module.$(OBJEXT) +test_gck_module_OBJECTS = $(am_test_gck_module_OBJECTS) +test_gck_module_DEPENDENCIES = $(am__DEPENDENCIES_5) +test_gck_module_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gck_module_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_gck_modules_OBJECTS = \ + gck/test_gck_modules-test-gck-modules.$(OBJEXT) +test_gck_modules_OBJECTS = $(am_test_gck_modules_OBJECTS) +test_gck_modules_DEPENDENCIES = $(am__DEPENDENCIES_5) +test_gck_modules_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gck_modules_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_gck_object_OBJECTS = \ + gck/test_gck_object-test-gck-object.$(OBJEXT) +test_gck_object_OBJECTS = $(am_test_gck_object_OBJECTS) +test_gck_object_DEPENDENCIES = $(am__DEPENDENCIES_5) +test_gck_object_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gck_object_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_gck_session_OBJECTS = \ + gck/test_gck_session-test-gck-session.$(OBJEXT) +test_gck_session_OBJECTS = $(am_test_gck_session_OBJECTS) +test_gck_session_DEPENDENCIES = libegg-test.la $(am__DEPENDENCIES_5) +test_gck_session_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gck_session_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_gck_slot_OBJECTS = gck/test_gck_slot-test-gck-slot.$(OBJEXT) +test_gck_slot_OBJECTS = $(am_test_gck_slot_OBJECTS) +test_gck_slot_DEPENDENCIES = $(am__DEPENDENCIES_5) +test_gck_slot_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_gck_slot_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_gck_uri_OBJECTS = gck/test_gck_uri-test-gck-uri.$(OBJEXT) +test_gck_uri_OBJECTS = $(am_test_gck_uri_OBJECTS) +test_gck_uri_DEPENDENCIES = $(am__DEPENDENCIES_5) +test_gck_uri_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_gck_uri_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_gnupg_collection_OBJECTS = \ + gcr/test_gnupg_collection-test-gnupg-collection.$(OBJEXT) +test_gnupg_collection_OBJECTS = $(am_test_gnupg_collection_OBJECTS) +test_gnupg_collection_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_gnupg_collection_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gnupg_collection_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_gnupg_key_OBJECTS = \ + gcr/test_gnupg_key-test-gnupg-key.$(OBJEXT) +test_gnupg_key_OBJECTS = $(am_test_gnupg_key_OBJECTS) +test_gnupg_key_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_gnupg_key_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gnupg_key_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ + $@ +am_test_gnupg_process_OBJECTS = \ + gcr/test_gnupg_process-test-gnupg-process.$(OBJEXT) +test_gnupg_process_OBJECTS = $(am_test_gnupg_process_OBJECTS) +test_gnupg_process_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_gnupg_process_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_gnupg_process_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_hex_OBJECTS = egg/test-hex.$(OBJEXT) +test_hex_OBJECTS = $(am_test_hex_OBJECTS) +test_hex_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_hkdf_OBJECTS = egg/test-hkdf.$(OBJEXT) +test_hkdf_OBJECTS = $(am_test_hkdf_OBJECTS) +test_hkdf_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_memory_icon_OBJECTS = \ + gcr/test_memory_icon-test-memory-icon.$(OBJEXT) +test_memory_icon_OBJECTS = $(am_test_memory_icon_OBJECTS) +test_memory_icon_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_memory_icon_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_memory_icon_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_oid_OBJECTS = egg/test-oid.$(OBJEXT) +test_oid_OBJECTS = $(am_test_oid_OBJECTS) +test_oid_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_openpgp_OBJECTS = gcr/test_openpgp-test-openpgp.$(OBJEXT) +test_openpgp_OBJECTS = $(am_test_openpgp_OBJECTS) +test_openpgp_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_openpgp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_openpgp_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_openssh_OBJECTS = gcr/test_openssh-test-openssh.$(OBJEXT) +test_openssh_OBJECTS = $(am_test_openssh_OBJECTS) +test_openssh_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_openssh_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_openssh_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_openssl_OBJECTS = egg/test-openssl.$(OBJEXT) +test_openssl_OBJECTS = $(am_test_openssl_OBJECTS) +test_openssl_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_padding_OBJECTS = egg/test-padding.$(OBJEXT) +test_padding_OBJECTS = $(am_test_padding_OBJECTS) +test_padding_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_parser_OBJECTS = gcr/test_parser-test-parser.$(OBJEXT) +test_parser_OBJECTS = $(am_test_parser_OBJECTS) +test_parser_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_parser_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_parser_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_pkcs11_certificate_OBJECTS = \ + gcr/test_pkcs11_certificate-test-pkcs11-certificate.$(OBJEXT) +test_pkcs11_certificate_OBJECTS = \ + $(am_test_pkcs11_certificate_OBJECTS) +test_pkcs11_certificate_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_pkcs11_certificate_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_pkcs11_certificate_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_record_OBJECTS = gcr/test_record-test-record.$(OBJEXT) +test_record_OBJECTS = $(am_test_record_OBJECTS) +test_record_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_record_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_record_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_secmem_OBJECTS = egg/test-secmem.$(OBJEXT) +test_secmem_OBJECTS = $(am_test_secmem_OBJECTS) +test_secmem_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_secret_exchange_OBJECTS = \ + gcr/test_secret_exchange-test-secret-exchange.$(OBJEXT) +test_secret_exchange_OBJECTS = $(am_test_secret_exchange_OBJECTS) +test_secret_exchange_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_secret_exchange_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_secret_exchange_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_secure_memory_OBJECTS = \ + gcr/test_secure_memory-test-secure-memory.$(OBJEXT) +test_secure_memory_OBJECTS = $(am_test_secure_memory_OBJECTS) +test_secure_memory_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_secure_memory_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_secure_memory_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_simple_certificate_OBJECTS = \ + gcr/test_simple_certificate-test-simple-certificate.$(OBJEXT) +test_simple_certificate_OBJECTS = \ + $(am_test_simple_certificate_OBJECTS) +test_simple_certificate_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_simple_certificate_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_simple_certificate_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_ssh_askpass_OBJECTS = \ + gcr/test_ssh_askpass-test-ssh-askpass.$(OBJEXT) +test_ssh_askpass_OBJECTS = $(am_test_ssh_askpass_OBJECTS) +test_ssh_askpass_DEPENDENCIES = libegg-test.la $(am__DEPENDENCIES_3) +test_ssh_askpass_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_ssh_askpass_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_test_subject_public_key_OBJECTS = \ + gcr/test_subject_public_key-test-subject-public-key.$(OBJEXT) +test_subject_public_key_OBJECTS = \ + $(am_test_subject_public_key_OBJECTS) +test_subject_public_key_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_subject_public_key_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_subject_public_key_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_symkey_OBJECTS = egg/test-symkey.$(OBJEXT) +test_symkey_OBJECTS = $(am_test_symkey_OBJECTS) +test_symkey_DEPENDENCIES = $(am__DEPENDENCIES_4) +am_test_system_prompt_OBJECTS = \ + gcr/test_system_prompt-test-system-prompt.$(OBJEXT) +test_system_prompt_OBJECTS = $(am_test_system_prompt_OBJECTS) +test_system_prompt_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_system_prompt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(test_system_prompt_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_test_trust_OBJECTS = gcr/test_trust-test-trust.$(OBJEXT) +test_trust_OBJECTS = $(am_test_trust_OBJECTS) +test_trust_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_trust_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_trust_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_test_util_OBJECTS = gcr/test_util-test-util.$(OBJEXT) +test_util_OBJECTS = $(am_test_util_OBJECTS) +test_util_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_util_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_util_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libegg_asn1x_la_SOURCES) $(libegg_hex_la_SOURCES) \ + $(libegg_secmem_la_SOURCES) $(libegg_test_la_SOURCES) \ + $(libegg_la_SOURCES) $(libgck_@GCK_MAJOR@_la_SOURCES) \ + $(nodist_libgck_@GCK_MAJOR@_la_SOURCES) \ + $(libgck_testable_la_SOURCES) \ + $(libgcr_base_@GCR_MAJOR@_la_SOURCES) \ + $(nodist_libgcr_base_@GCR_MAJOR@_la_SOURCES) \ + $(libgcr_ui_@GCR_MAJOR@_la_SOURCES) \ + $(nodist_libgcr_ui_@GCR_MAJOR@_la_SOURCES) \ + $(libmock_test_module_la_SOURCES) $(frob_certificate_SOURCES) \ + $(frob_certificate_request_SOURCES) \ + $(frob_combo_selector_SOURCES) $(frob_gnupg_selector_SOURCES) \ + $(frob_import_button_SOURCES) $(frob_key_SOURCES) \ + $(frob_openpgp_SOURCES) $(frob_parser_SOURCES) \ + $(frob_prompt_SOURCES) $(frob_request_SOURCES) \ + $(frob_system_prompt_SOURCES) $(frob_tree_selector_SOURCES) \ + $(frob_unlock_SOURCES) $(frob_unlock_options_SOURCES) \ + $(gcr_prompter_SOURCES) $(gcr_ssh_askpass_SOURCES) \ + $(gcr_viewer_SOURCES) $(test_armor_SOURCES) \ + $(test_asn1_SOURCES) $(test_asn1x_SOURCES) \ + $(test_certificate_SOURCES) $(test_certificate_chain_SOURCES) \ + $(test_decimal_SOURCES) $(test_dh_SOURCES) $(test_dn_SOURCES) \ + $(test_filter_collection_SOURCES) $(test_fingerprint_SOURCES) \ + $(test_gck_attributes_SOURCES) $(test_gck_crypto_SOURCES) \ + $(test_gck_enumerator_SOURCES) $(test_gck_module_SOURCES) \ + $(test_gck_modules_SOURCES) $(test_gck_object_SOURCES) \ + $(test_gck_session_SOURCES) $(test_gck_slot_SOURCES) \ + $(test_gck_uri_SOURCES) $(test_gnupg_collection_SOURCES) \ + $(test_gnupg_key_SOURCES) $(test_gnupg_process_SOURCES) \ + $(test_hex_SOURCES) $(test_hkdf_SOURCES) \ + $(test_memory_icon_SOURCES) $(test_oid_SOURCES) \ + $(test_openpgp_SOURCES) $(test_openssh_SOURCES) \ + $(test_openssl_SOURCES) $(test_padding_SOURCES) \ + $(test_parser_SOURCES) $(test_pkcs11_certificate_SOURCES) \ + $(test_record_SOURCES) $(test_secmem_SOURCES) \ + $(test_secret_exchange_SOURCES) $(test_secure_memory_SOURCES) \ + $(test_simple_certificate_SOURCES) $(test_ssh_askpass_SOURCES) \ + $(test_subject_public_key_SOURCES) $(test_symkey_SOURCES) \ + $(test_system_prompt_SOURCES) $(test_trust_SOURCES) \ + $(test_util_SOURCES) +DIST_SOURCES = $(libegg_asn1x_la_SOURCES) $(libegg_hex_la_SOURCES) \ + $(libegg_secmem_la_SOURCES) $(libegg_test_la_SOURCES) \ + $(libegg_la_SOURCES) $(libgck_@GCK_MAJOR@_la_SOURCES) \ + $(libgck_testable_la_SOURCES) \ + $(libgcr_base_@GCR_MAJOR@_la_SOURCES) \ + $(am__libgcr_ui_@GCR_MAJOR@_la_SOURCES_DIST) \ + $(libmock_test_module_la_SOURCES) \ + $(am__frob_certificate_SOURCES_DIST) \ + $(frob_certificate_request_SOURCES) \ + $(am__frob_combo_selector_SOURCES_DIST) \ + $(am__frob_gnupg_selector_SOURCES_DIST) \ + $(am__frob_import_button_SOURCES_DIST) \ + $(am__frob_key_SOURCES_DIST) $(frob_openpgp_SOURCES) \ + $(frob_parser_SOURCES) $(am__frob_prompt_SOURCES_DIST) \ + $(am__frob_request_SOURCES_DIST) \ + $(am__frob_system_prompt_SOURCES_DIST) \ + $(am__frob_tree_selector_SOURCES_DIST) \ + $(am__frob_unlock_SOURCES_DIST) \ + $(am__frob_unlock_options_SOURCES_DIST) \ + $(am__gcr_prompter_SOURCES_DIST) $(gcr_ssh_askpass_SOURCES) \ + $(am__gcr_viewer_SOURCES_DIST) $(test_armor_SOURCES) \ + $(test_asn1_SOURCES) $(test_asn1x_SOURCES) \ + $(test_certificate_SOURCES) $(test_certificate_chain_SOURCES) \ + $(test_decimal_SOURCES) $(test_dh_SOURCES) $(test_dn_SOURCES) \ + $(test_filter_collection_SOURCES) $(test_fingerprint_SOURCES) \ + $(test_gck_attributes_SOURCES) $(test_gck_crypto_SOURCES) \ + $(test_gck_enumerator_SOURCES) $(test_gck_module_SOURCES) \ + $(test_gck_modules_SOURCES) $(test_gck_object_SOURCES) \ + $(test_gck_session_SOURCES) $(test_gck_slot_SOURCES) \ + $(test_gck_uri_SOURCES) $(test_gnupg_collection_SOURCES) \ + $(test_gnupg_key_SOURCES) $(test_gnupg_process_SOURCES) \ + $(test_hex_SOURCES) $(test_hkdf_SOURCES) \ + $(test_memory_icon_SOURCES) $(test_oid_SOURCES) \ + $(test_openpgp_SOURCES) $(test_openssh_SOURCES) \ + $(test_openssl_SOURCES) $(test_padding_SOURCES) \ + $(test_parser_SOURCES) $(test_pkcs11_certificate_SOURCES) \ + $(test_record_SOURCES) $(test_secmem_SOURCES) \ + $(test_secret_exchange_SOURCES) $(test_secure_memory_SOURCES) \ + $(test_simple_certificate_SOURCES) $(test_ssh_askpass_SOURCES) \ + $(test_subject_public_key_SOURCES) $(test_symkey_SOURCES) \ + $(test_system_prompt_SOURCES) $(test_trust_SOURCES) \ + $(test_util_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(convert_DATA) $(desktop_DATA) $(gir_DATA) $(mime_DATA) \ + $(pkgconfig_DATA) $(service_DATA) $(typelibs_DATA) \ + $(vapi_DATA) +am__gcr_inc_HEADERS_DIST = gcr/gcr-base.h gcr/gcr-certificate.h \ + gcr/gcr-certificate-chain.h gcr/gcr-certificate-request.h \ + gcr/gcr-collection.h gcr/gcr-column.h gcr/gcr-comparable.h \ + gcr/gcr-deprecated-base.h gcr/gcr-fingerprint.h \ + gcr/gcr-filter-collection.h gcr/gcr-icons.h gcr/gcr-importer.h \ + gcr/gcr-import-interaction.h gcr/gcr-library.h \ + gcr/gcr-mock-prompter.h gcr/gcr-parser.h \ + gcr/gcr-pkcs11-certificate.h gcr/gcr-prompt.h \ + gcr/gcr-secret-exchange.h gcr/gcr-secure-memory.h \ + gcr/gcr-simple-certificate.h gcr/gcr-simple-collection.h \ + gcr/gcr-ssh-askpass.h gcr/gcr-system-prompt.h \ + gcr/gcr-system-prompter.h gcr/gcr-trust.h gcr/gcr-types.h \ + gcr/gcr-union-collection.h gcr/gcr-unlock-options.h \ + gcr/gcr-version.h gcr/gcr-enum-types-base.h gcr/gcr.h +am__ui_inc_HEADERS_DIST = ui/gcr-ui.h \ + ui/gcr-certificate-basics-widget.h \ + ui/gcr-certificate-details-widget.h \ + ui/gcr-certificate-renderer.h ui/gcr-certificate-widget.h \ + ui/gcr-collection-model.h ui/gcr-combo-selector.h \ + ui/gcr-deprecated.h ui/gcr-failure-renderer.h \ + ui/gcr-key-renderer.h ui/gcr-key-widget.h \ + ui/gcr-import-button.h ui/gcr-list-selector.h \ + ui/gcr-prompt-dialog.h ui/gcr-renderer.h \ + ui/gcr-secure-entry-buffer.h ui/gcr-tree-selector.h \ + ui/gcr-unlock-options-widget.h ui/gcr-viewer.h \ + ui/gcr-viewer-widget.h ui/gcr-enum-types.h +HEADERS = $(gck_inc_HEADERS) $(gcr_inc_HEADERS) $(ui_inc_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope check recheck distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +DIST_SUBDIRS = . po docs/reference/gck docs/reference/gcr \ + ui/icons/16x16 ui/icons/22x22 ui/icons/24x24 ui/icons/32x32 \ + ui/icons/48x48 ui/icons/256x256 +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/egg/Makefile.am $(srcdir)/gck/Makefile.am \ + $(srcdir)/gcr/Makefile.am $(srcdir)/schema/Makefile.am \ + $(srcdir)/ui/Makefile.am $(srcdir)/ui/icons/Makefile.am \ + $(top_srcdir)/build/compile $(top_srcdir)/build/config.guess \ + $(top_srcdir)/build/config.sub $(top_srcdir)/build/depcomp \ + $(top_srcdir)/build/install-sh $(top_srcdir)/build/ltmain.sh \ + $(top_srcdir)/build/missing $(top_srcdir)/build/test-driver \ + $(top_srcdir)/gck/gck-version.h.in $(top_srcdir)/gck/gck.pc.in \ + $(top_srcdir)/gcr/gcr-base.pc.in \ + $(top_srcdir)/gcr/gcr-version.h.in \ + $(top_srcdir)/ui/gcr-ui.pc.in $(top_srcdir)/ui/gcr.pc.in \ + AUTHORS COPYING ChangeLog NEWS README build/compile \ + build/config.guess build/config.sub build/depcomp \ + build/install-sh build/ltmain.sh build/missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +GZIP_ENV = --best +DIST_ARCHIVES = $(distdir).tar.xz +DIST_TARGETS = dist-xz +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +SUBDIRS = . po docs/reference/gck docs/reference/gcr $(am__append_17) +ACLOCAL_AMFLAGS = -I build/m4 ${ACLOCAL_FLAGS} +DISTCHECK_CONFIGURE_FLAGS = \ + --enable-gtk-doc \ + --disable-coverage \ + --disable-update-mime \ + --disable-update-icon-cache \ + --with-gtk \ + --with-pkcs11-modules=$(abs_srcdir)/$(top_distdir)/_inst/lib/ + +DISTCLEANFILES = \ + intltool-extract \ + intltool-merge \ + intltool-update + + +# Default executable tests +LOG_DRIVER = $(srcdir)/build/tap-driver +LOG_DRIVER_FLAGS = --format=tap +LOG_COMPILER = $(srcdir)/build/tap-gtester +VALGRIND_ARGS = --trace-children=no --quiet --error-exitcode=33 \ + --suppressions=valgrind-suppressions --gen-suppressions=all \ + --num-callers=16 + +VALGRIND_SUPPRESSIONS = \ + build/gcr.supp \ + build/gcrypt.supp \ + build/glib.supp \ + build/glibc.supp \ + build/p11-kit.supp \ + build/pixman.supp \ + build/pthread.supp \ + build/unknown.supp + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(builddir) \ + -I$(srcdir)/build \ + -DSRCDIR="\"@abs_srcdir@\"" \ + -DBUILDDIR="\"@abs_builddir@\"" \ + -DLOCALEDIR=\""$(datadir)/locale"\" \ + -DLIBEXECDIR="\"$(libexecdir)\"" \ + $(GLIB_CFLAGS) + +LDADD = \ + $(GLIB_LIBS) + +BUILT_SOURCES = $(gck_BUILT_SOURCES) $(gcr_BUILT_SOURCES) \ + $(am__append_6) +check_LTLIBRARIES = libmock-test-module.la +lib_LTLIBRARIES = libgck-@GCK_MAJOR@.la libgcr-base-@GCR_MAJOR@.la \ + $(am__append_7) +noinst_LTLIBRARIES = libegg.la libegg-asn1x.la libegg-hex.la \ + libegg-secmem.la libegg-test.la libgck-testable.la + +# ---------------------------------------------------------------- +pkgconfig_DATA = gck-$(GCK_MAJOR).pc gcr-base-$(GCR_MAJOR).pc \ + $(am__append_12) +pkgconfigdir = $(libdir)/pkgconfig +CLEANFILES = $(pkgconfig_DATA) $(am__append_1) $(am__append_2) \ + gck-$(GCK_MAJOR).pc $(gir_DATA) $(typelibs_DATA) \ + $(BUILT_SOURCES) gck-actual.abi gck-expected.abi \ + $(service_DATA) gcr-base-actual.abi gcr-base-expected.abi \ + Gcr-3.broken.gir $(am__append_15) +EXTRA_DIST = intltool-extract.in intltool-merge.in intltool-update.in \ + HACKING build/valgrind $(VALGRIND_SUPPRESSIONS) \ + build/enum-template.c build/enum-template.h \ + build/g-ir-unbreak.xsl build/tap-driver build/tap-gtester \ + build/gdbus-unbreak-codegen $(NULL) egg/fixtures $(ASN_SRCS) \ + $(NULL) gck/gck.pc.in gck/gck-marshal.list gck/gck-version.h \ + gck/gck.symbols gck/pkcs11-trust-assertions.h gck/pkcs11i.h \ + $(am__append_3) gcr/gcr-base.pc.in gcr/gcr-marshal.list \ + gcr/gcr-oids.list gcr/gcr-mkoids $(DBUS_XML_DEFINITIONS) \ + gcr/gcr-base.symbols $(service_in_files) gcr/gcr-version.h.in \ + $(am__append_5) gcr/fixtures $(convert_DATA) \ + $(gsettings_SCHEMAS) $(gsettings_SCHEMAS:.xml=.valid) $(NULL) \ + $(am__append_11) $(am__append_14) +TEST_SUPPRESSIONS = $(top_builddir)/build/valgrind-suppressions +GDBUS_CODEGEN = $(top_srcdir)/build/gdbus-unbreak-codegen +V_SED = $(V_SED_$(V)) +V_SED_ = $(V_SED_$(AM_DEFAULT_VERBOSITY)) +V_SED_0 = @echo " SED " $@; +SED_SUBST = sed \ + -e 's,[@]datadir[@],$(datadir),g' \ + -e 's,[@]libexecdir[@],$(libexecdir),g' \ + -e 's,[@]libdir[@],$(libdir),g' \ + -e 's,[@]includedir[@],$(includedir),g' \ + -e 's,[@]datarootdir[@],$(datarootdir),g' \ + -e 's,[@]sysconfdir[@],$(sysconfdir),g' \ + -e 's,[@]bindir[@],$(bindir),g' \ + -e 's,[@]exec_prefix[@],$(exec_prefix),g' \ + -e 's,[@]prefix[@],$(prefix),g' \ + -e 's,[@]PACKAGE[@],$(PACKAGE),g' \ + -e 's,[@]VERSION[@],$(VERSION),g' \ + $(NULL) + +ENUM_TEMPLATE_C = $(top_srcdir)/build/enum-template.c +ENUM_TEMPLATE_H = $(top_srcdir)/build/enum-template.h +V_XSLTPROC = $(V_XSLTPROC_$(V)) +V_XSLTPROC_ = $(V_XSLTPROC_$(AM_DEFAULT_VERBOSITY)) +V_XSLTPROC_0 = @echo " XSLTPROC" $@; +FIX_GIR = $(top_srcdir)/build/g-ir-unbreak.xsl +SUFFIXES = .desktop.in .desktop.in.in .service .service.in .broken.typelib .broken.gir .gir + +# ------------------------------------------------------------------ +# INTROSPECTION +@HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = Gck-@GCK_MAJOR@.gir \ +@HAVE_INTROSPECTION_TRUE@ Gcr-@GCR_MAJOR@.broken.gir \ +@HAVE_INTROSPECTION_TRUE@ $(am__append_8) +@HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ARGS = $(INTROSPECTION_FLAGS) --warn-all --add-include-path=. +@HAVE_INTROSPECTION_TRUE@INTROSPECTION_COMPILER_ARGS = --includedir=. +@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0 +@HAVE_INTROSPECTION_TRUE@gir_DATA = Gck-@GCK_MAJOR@.gir \ +@HAVE_INTROSPECTION_TRUE@ Gcr-@GCR_MAJOR@.gir $(am__append_9) +@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0 +@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(gir_DATA:.gir=.typelib) +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@VAPIGEN_VAPIS = gck-@GCK_MAJOR@.vapi \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ gcr-@GCR_MAJOR@.vapi \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ $(am__append_10) +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@VAPI_DEPS = $(VAPIGEN_VAPIS:.vapi=.deps) +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@vapidir = $(datadir)/vala/vapi +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@vapi_DATA = $(VAPIGEN_VAPIS) \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ $(VAPI_DEPS) \ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ gck/pkcs11.vapi +libegg_la_CFLAGS = \ + $(GLIB_CFLAGS) \ + $(LIBGCRYPT_CFLAGS) + +libegg_la_LIBADD = \ + $(GLIB_LIBS) \ + $(LIBGCRYPT_LIBS) + +libegg_la_SOURCES = \ + egg/egg-armor.c egg/egg-armor.h \ + egg/egg-asn1x.c egg/egg-asn1x.h \ + egg/egg-asn1-defs.c egg/egg-asn1-defs.h \ + egg/egg-buffer.c egg/egg-buffer.h \ + egg/egg-dh.c egg/egg-dh.h \ + egg/egg-dn.c egg/egg-dn.h \ + egg/egg-error.h \ + egg/egg-decimal.c egg/egg-decimal.h \ + egg/egg-hex.c egg/egg-hex.h \ + egg/egg-hkdf.c egg/egg-hkdf.h \ + egg/egg-libgcrypt.c egg/egg-libgcrypt.h \ + egg/egg-oid.c egg/egg-oid.h \ + egg/egg-padding.c egg/egg-padding.h \ + egg/egg-openssl.c egg/egg-openssl.h \ + egg/egg-secure-memory.c egg/egg-secure-memory.h \ + egg/egg-symkey.c egg/egg-symkey.h \ + egg/egg-testing.c egg/egg-testing.h \ + egg/egg-timegm.c egg/egg-timegm.h \ + egg/pk.asn.h egg/pkix.asn.h \ + $(NULL) + + +# -------------------------------------------------------------------- +# COMMON STUFF COMPILED INTO SMALLER COMPONENTS +libegg_asn1x_la_SOURCES = \ + egg/egg-asn1x.c egg/egg-asn1x.h + +libegg_asn1x_la_CFLAGS = \ + $(GLIB_CFLAGS) + +libegg_hex_la_SOURCES = \ + egg/egg-hex.c egg/egg-hex.h + +libegg_hex_la_CFLAGS = \ + $(GLIB_CFLAGS) + +libegg_hex_la_LIBADD = \ + $(GLIB_LIBS) + +libegg_secmem_la_SOURCES = \ + egg/egg-secure-memory.c egg/egg-secure-memory.h + +libegg_test_la_SOURCES = \ + egg/egg-testing.c egg/egg-testing.h \ + egg/mock-interaction.c egg/mock-interaction.h + +libegg_test_la_CFLAGS = \ + $(GLIB_CFLAGS) + +libegg_test_la_LIBADD = \ + $(GLIB_LIBS) + + +# ------------------------------------------------------------------- +egg_LDADD = \ + libegg.la \ + $(LIBGCRYPT_LIBS) \ + $(GLIB_LIBS) + +egg_TESTS = \ + test-asn1 \ + test-asn1x \ + test-dn \ + test-decimal \ + test-hex \ + test-hkdf \ + test-oid \ + test-secmem \ + test-padding \ + test-symkey \ + test-armor \ + test-openssl \ + test-dh + +test_armor_SOURCES = egg/test-armor.c +test_armor_LDADD = $(egg_LDADD) +test_asn1_SOURCES = egg/test-asn1.c egg/test.asn.h +test_asn1_LDADD = $(egg_LDADD) +test_asn1x_SOURCES = egg/test-asn1x.c +test_asn1x_LDADD = $(egg_LDADD) +test_decimal_SOURCES = egg/test-decimal.c +test_decimal_LDADD = $(egg_LDADD) +test_dh_SOURCES = egg/test-dh.c +test_dh_LDADD = $(egg_LDADD) +test_dn_SOURCES = egg/test-dn.c +test_dn_LDADD = $(egg_LDADD) +test_hex_SOURCES = egg/test-hex.c +test_hex_LDADD = $(egg_LDADD) +test_hkdf_SOURCES = egg/test-hkdf.c +test_hkdf_LDADD = $(egg_LDADD) +test_oid_SOURCES = egg/test-oid.c +test_oid_LDADD = $(egg_LDADD) +test_openssl_SOURCES = egg/test-openssl.c +test_openssl_LDADD = $(egg_LDADD) +test_padding_SOURCES = egg/test-padding.c +test_padding_LDADD = $(egg_LDADD) +test_secmem_SOURCES = egg/test-secmem.c +test_secmem_LDADD = $(egg_LDADD) +test_symkey_SOURCES = egg/test-symkey.c +test_symkey_LDADD = $(egg_LDADD) +ASN_SRCS = \ + egg/pk.asn \ + egg/pkix.asn \ + egg/test.asn \ + $(NULL) + +gck_incdir = $(includedir)/gck-@GCK_MAJOR@/gck +gck_HEADER_FILES = \ + gck/gck.h \ + gck/gck-deprecated.h + +gck_inc_HEADERS = \ + $(gck_HEADER_FILES) \ + gck/gck-enum-types.h \ + gck/gck-version.h \ + gck/pkcs11.h \ + gck/pkcs11n.h \ + gck/pkcs11x.h + +gck_BUILT_SOURCES = \ + gck/gck-marshal.c gck/gck-marshal.h \ + gck/gck-enum-types.c gck/gck-enum-types.h + +gck_PUBLIC_FILES = \ + gck/gck.h \ + gck/gck-enum-types.h \ + gck/gck-attributes.c \ + gck/gck-dump.c \ + gck/gck-enumerator.c \ + gck/gck-misc.c \ + gck/gck-module.c \ + gck/gck-modules.c \ + gck/gck-object.c \ + gck/gck-object-cache.c \ + gck/gck-password.c \ + gck/gck-session.c \ + gck/gck-slot.c \ + gck/gck-uri.c \ + gck/gck-version.h + +gck_INTERNAL_FILES = \ + gck/gck-call.c \ + gck/gck-deprecated.h \ + gck/gck-interaction.c \ + gck/gck-private.h \ + gck/pkcs11.h + +libgck_@GCK_MAJOR@_la_SOURCES = \ + $(gck_PUBLIC_FILES) \ + $(gck_INTERNAL_FILES) + +nodist_libgck_@GCK_MAJOR@_la_SOURCES = \ + $(gck_BUILT_SOURCES) + +libgck_@GCK_MAJOR@_la_CFLAGS = \ + $(P11_KIT_CFLAGS) \ + -DG_LOG_DOMAIN=\"Gck\" \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DP11_KIT_API_SUBJECT_TO_CHANGE \ + -DPKCS11_REGISTRY_DIR=\"$(libdir)/pkcs11\" + +libgck_@GCK_MAJOR@_la_LDFLAGS = \ + -version-info $(GCK_LT_RELEASE) \ + -no-undefined \ + -export-symbols-regex '^gck_.*|^SECMEM_.*' + +libgck_@GCK_MAJOR@_la_LIBADD = \ + libegg-hex.la \ + libegg-secmem.la \ + $(P11_KIT_LIBS) \ + $(GIO_LIBS) \ + $(GLIB_LIBS) + +libgck_testable_la_SOURCES = \ + gck/gck-mock.c gck/gck-mock.h \ + gck/gck-test.c gck/gck-test.h + +libgck_testable_la_CFLAGS = \ + $(libgck_@GCK_MAJOR@_la_CFLAGS) + +libgck_testable_la_LIBADD = \ + $(libgck_@GCK_MAJOR@_la_OBJECTS) \ + libegg-hex.la \ + libegg-secmem.la \ + $(P11_KIT_LIBS) \ + $(GIO_LIBS) \ + $(GLIB_LIBS) + +EXTRA_libgck_testable_la_DEPENDENCIES = $(libgck_@GCK_MAJOR@_la_OBJECTS) +@HAVE_INTROSPECTION_TRUE@Gck_@GCK_MAJOR@_gir_PACKAGES = gobject-2.0 gio-2.0 p11-kit-1 +@HAVE_INTROSPECTION_TRUE@Gck_@GCK_MAJOR@_gir_EXPORT_PACKAGES = gck-@GCK_MAJOR@ +@HAVE_INTROSPECTION_TRUE@Gck_@GCK_MAJOR@_gir_INCLUDES = GObject-2.0 Gio-2.0 +@HAVE_INTROSPECTION_TRUE@Gck_@GCK_MAJOR@_gir_LIBS = libgck-@GCK_MAJOR@.la +@HAVE_INTROSPECTION_TRUE@Gck_@GCK_MAJOR@_gir_CFLAGS = -I$(srcdir) -I$(builddir) -DGCK_COMPILATION -DGCK_API_SUBJECT_TO_CHANGE +@HAVE_INTROSPECTION_TRUE@Gck_@GCK_MAJOR@_gir_FILES = $(gck_PUBLIC_FILES) +@HAVE_INTROSPECTION_TRUE@Gck_@GCK_MAJOR@_gir_SCANNERFLAGS = --add-include-path=$(srcdir)/gck --c-include "gck/gck.h" +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gck_@GCK_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gck_@GCK_MAJOR@_vapi_METADATADIRS = $(srcdir)/gck +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gck_@GCK_MAJOR@_vapi_FILES = Gck-@GCK_MAJOR@.gir +gck_CFLAGS = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DG_LOG_DOMAIN=\"Gck\" \ + $(P11_KIT_CFLAGS) \ + $(GLIB_CFLAGS) + +gck_LIBS = \ + libgck-testable.la \ + libegg-test.la \ + libegg-hex.la \ + $(GLIB_LIBS) \ + $(P11_KIT_LIBS) \ + $(GIO_LIBS) + +gck_TESTS = \ + test-gck-attributes \ + test-gck-module \ + test-gck-slot \ + test-gck-session \ + test-gck-object \ + test-gck-crypto \ + test-gck-uri \ + test-gck-enumerator \ + test-gck-modules + +test_gck_attributes_SOURCES = gck/test-gck-attributes.c +test_gck_attributes_CFLAGS = $(gck_CFLAGS) +test_gck_attributes_LDADD = $(gck_LIBS) +test_gck_crypto_SOURCES = gck/test-gck-crypto.c +test_gck_crypto_CFLAGS = $(gck_CFLAGS) +test_gck_crypto_LDADD = $(gck_LIBS) +test_gck_enumerator_SOURCES = gck/test-gck-enumerator.c +test_gck_enumerator_CFLAGS = $(gck_CFLAGS) +test_gck_enumerator_LDADD = libegg-test.la $(gck_LIBS) +test_gck_object_SOURCES = gck/test-gck-object.c +test_gck_object_CFLAGS = $(gck_CFLAGS) +test_gck_object_LDADD = $(gck_LIBS) +test_gck_module_SOURCES = gck/test-gck-module.c +test_gck_module_CFLAGS = $(gck_CFLAGS) +test_gck_module_LDADD = $(gck_LIBS) +test_gck_modules_SOURCES = gck/test-gck-modules.c +test_gck_modules_CFLAGS = $(gck_CFLAGS) +test_gck_modules_LDADD = $(gck_LIBS) +test_gck_session_SOURCES = gck/test-gck-session.c +test_gck_session_CFLAGS = $(gck_CFLAGS) +test_gck_session_LDADD = libegg-test.la $(gck_LIBS) +test_gck_slot_SOURCES = gck/test-gck-slot.c +test_gck_slot_CFLAGS = $(gck_CFLAGS) +test_gck_slot_LDADD = $(gck_LIBS) +test_gck_uri_SOURCES = gck/test-gck-uri.c +test_gck_uri_CFLAGS = $(gck_CFLAGS) +test_gck_uri_LDADD = $(gck_LIBS) +libmock_test_module_la_LDFLAGS = \ + -module -avoid-version -shared -rpath $(abs_builddir) + +libmock_test_module_la_CFLAGS = \ + -DGCK_API_SUBJECT_TO_CHANGE \ + $(gck_CFLAGS) + +libmock_test_module_la_SOURCES = \ + gck/mock-test-module.c + +libmock_test_module_la_LIBADD = \ + libgck-testable.la + +gcr_incdir = $(includedir)/gcr-@GCR_MAJOR@/gcr +gcr_HEADER_FILES = \ + gcr/gcr-base.h \ + gcr/gcr-certificate.h \ + gcr/gcr-certificate-chain.h \ + gcr/gcr-certificate-request.h \ + gcr/gcr-collection.h \ + gcr/gcr-column.h \ + gcr/gcr-comparable.h \ + gcr/gcr-deprecated-base.h \ + gcr/gcr-fingerprint.h \ + gcr/gcr-filter-collection.h \ + gcr/gcr-icons.h \ + gcr/gcr-importer.h \ + gcr/gcr-import-interaction.h \ + gcr/gcr-library.h \ + gcr/gcr-mock-prompter.h \ + gcr/gcr-parser.h \ + gcr/gcr-pkcs11-certificate.h \ + gcr/gcr-prompt.h \ + gcr/gcr-secret-exchange.h \ + gcr/gcr-secure-memory.h \ + gcr/gcr-simple-certificate.h \ + gcr/gcr-simple-collection.h \ + gcr/gcr-ssh-askpass.h \ + gcr/gcr-system-prompt.h \ + gcr/gcr-system-prompter.h \ + gcr/gcr-trust.h \ + gcr/gcr-types.h \ + gcr/gcr-union-collection.h \ + gcr/gcr-unlock-options.h \ + gcr/gcr-version.h + +gcr_inc_HEADERS = $(gcr_HEADER_FILES) gcr/gcr-enum-types-base.h \ + $(am__append_4) +gcr_BUILT_SOURCES = \ + gcr/gcr-marshal.c gcr/gcr-marshal.h \ + gcr/gcr-enum-types-base.c gcr/gcr-enum-types-base.h \ + gcr/gcr-oids.c gcr/gcr-oids.h \ + gcr/gcr-dbus-generated.c gcr/gcr-dbus-generated.h + +gcr_PUBLIC_FILES = \ + gcr/gcr-base.h \ + gcr/gcr-certificate.c gcr/gcr-certificate.h \ + gcr/gcr-certificate-chain.c gcr/gcr-certificate-chain.h \ + gcr/gcr-certificate-request.c gcr/gcr-certificate-request.h \ + gcr/gcr-collection.c gcr/gcr-collection.h \ + gcr/gcr-column.h \ + gcr/gcr-comparable.c gcr/gcr-comparable.h \ + gcr/gcr-filter-collection.c gcr/gcr-filter-collection.h \ + gcr/gcr-fingerprint.c gcr/gcr-fingerprint.h \ + gcr/gcr-icons.c gcr/gcr-icons.h \ + gcr/gcr-importer.c gcr/gcr-importer.h \ + gcr/gcr-import-interaction.c gcr/gcr-import-interaction.h \ + gcr/gcr-library.c gcr/gcr-library.h \ + gcr/gcr-mock-prompter.c gcr/gcr-mock-prompter.h \ + gcr/gcr-parser.c gcr/gcr-parser.h \ + gcr/gcr-pkcs11-certificate.c gcr/gcr-pkcs11-certificate.h \ + gcr/gcr-prompt.c gcr/gcr-prompt.h \ + gcr/gcr-secret-exchange.c gcr/gcr-secret-exchange.h \ + gcr/gcr-secure-memory.c gcr/gcr-secure-memory.h \ + gcr/gcr-simple-certificate.c gcr/gcr-simple-certificate.h \ + gcr/gcr-simple-collection.c gcr/gcr-simple-collection.h \ + gcr/gcr-ssh-askpass.c gcr/gcr-ssh-askpass.h \ + gcr/gcr-system-prompt.c gcr/gcr-system-prompt.h \ + gcr/gcr-system-prompter.c gcr/gcr-system-prompter.h \ + gcr/gcr-types.h \ + gcr/gcr-union-collection.c gcr/gcr-union-collection.h \ + gcr/gcr-unlock-options.h \ + gcr/gcr-version.h \ + $(NULL) + +gcr_PRIVATE_FILES = \ + gcr/gcr-callback-output-stream.c gcr/gcr-callback-output-stream.h \ + gcr/gcr-certificate-extensions.c gcr/gcr-certificate-extensions.h \ + gcr/gcr-column.c \ + gcr/gcr-dbus-constants.h \ + gcr/gcr-deprecated-base.h \ + gcr/gcr-gnupg-collection.c gcr/gcr-gnupg-collection.h \ + gcr/gcr-gnupg-importer.c gcr/gcr-gnupg-importer.h \ + gcr/gcr-gnupg-key.c gcr/gcr-gnupg-key.h \ + gcr/gcr-gnupg-process.c gcr/gcr-gnupg-process.h \ + gcr/gcr-gnupg-records.c gcr/gcr-gnupg-records.h \ + gcr/gcr-gnupg-util.c gcr/gcr-gnupg-util.h \ + gcr/gcr-internal.h \ + gcr/gcr-key-mechanisms.h gcr/gcr-key-mechanisms.c \ + gcr/gcr-memory-icon.c gcr/gcr-memory-icon.h \ + gcr/gcr-openpgp.c gcr/gcr-openpgp.h \ + gcr/gcr-openssh.c gcr/gcr-openssh.h \ + gcr/gcr-pkcs11-importer.c gcr/gcr-pkcs11-importer.h \ + gcr/gcr-record.c gcr/gcr-record.h \ + gcr/gcr-single-collection.c gcr/gcr-single-collection.h \ + gcr/gcr-subject-public-key.c gcr/gcr-subject-public-key.h \ + gcr/gcr-trust.c gcr/gcr-trust.h \ + gcr/gcr-util.c gcr/gcr-util.h \ + $(NULL) + +libgcr_base_@GCR_MAJOR@_la_SOURCES = \ + $(gcr_PUBLIC_FILES) \ + $(gcr_PRIVATE_FILES) \ + $(NULL) + +nodist_libgcr_base_@GCR_MAJOR@_la_SOURCES = \ + $(gcr_BUILT_SOURCES) + +libgcr_base_@GCR_MAJOR@_la_CFLAGS = \ + $(LIBGCRYPT_CFLAGS) \ + $(P11_KIT_CFLAGS) \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DP11_KIT_API_SUBJECT_TO_CHANGE \ + -DGCR_COMPILATION \ + -DG_LOG_DOMAIN=\"Gcr\" + +libgcr_base_@GCR_MAJOR@_la_LDFLAGS = \ + -version-info $(GCR_LT_RELEASE) \ + -no-undefined \ + -export-symbols-regex '^_gcr_.*|^gcr_.*|^SECMEM_.*' + +libgcr_base_@GCR_MAJOR@_la_LIBADD = \ + libegg.la \ + libgck-@GCK_MAJOR@.la \ + $(GLIB_LIBS) \ + $(LIBGCRYPT_LIBS) \ + $(P11_KIT_LIBS) + +DBUS_XML_DEFINITIONS = \ + gcr/org.gnome.keyring.Prompter.xml + +gcr_ssh_askpass_SOURCES = gcr/gcr-ssh-askpass.c +gcr_ssh_askpass_CFLAGS = \ + -DGCR_SSH_ASKPASS_TOOL \ + -DGCR_COMPILATION \ + $(GLIB_CFLAGS) + +gcr_ssh_askpass_LDADD = \ + libegg.la \ + $(GLIB_LIBS) + +service_in_files = \ + gcr/org.gnome.keyring.SystemPrompter.service.in \ + gcr/org.gnome.keyring.PrivatePrompter.service.in + +servicedir = $(DBUS_SERVICES_DIR) +service_DATA = $(service_in_files:.service.in=.service) +@HAVE_INTROSPECTION_TRUE@Gcr_@GCR_MAJOR@_broken_gir_PACKAGES = p11-kit-1 +@HAVE_INTROSPECTION_TRUE@Gcr_@GCR_MAJOR@_broken_gir_EXPORT_PACKAGES = gcr-base-@GCR_MAJOR@ +@HAVE_INTROSPECTION_TRUE@Gcr_@GCR_MAJOR@_broken_gir_INCLUDES = GLib-2.0 GObject-2.0 +@HAVE_INTROSPECTION_TRUE@Gcr_@GCR_MAJOR@_broken_gir_LIBS = libgcr-base-@GCR_MAJOR@.la +@HAVE_INTROSPECTION_TRUE@Gcr_@GCR_MAJOR@_broken_gir_CFLAGS = -I$(top_srcdir) -I$(top_builddir) \ +@HAVE_INTROSPECTION_TRUE@ -DGCR_COMPILATION -DGCR_API_SUBJECT_TO_CHANGE + +@HAVE_INTROSPECTION_TRUE@Gcr_@GCR_MAJOR@_broken_gir_FILES = $(gcr_PUBLIC_FILES) +@HAVE_INTROSPECTION_TRUE@Gcr_@GCR_MAJOR@_broken_gir_SCANNERFLAGS = \ +@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(top_builddir)/gck \ +@HAVE_INTROSPECTION_TRUE@ --include-uninstalled=$(builddir)/Gck-@GCK_MAJOR@.gir \ +@HAVE_INTROSPECTION_TRUE@ --c-include "gcr/gcr-base.h" \ +@HAVE_INTROSPECTION_TRUE@ --identifier-prefix Gcr \ +@HAVE_INTROSPECTION_TRUE@ --nsversion @GCR_MAJOR@ + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gcr_@GCR_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 gck-@GCK_MAJOR@ +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gcr_@GCR_MAJOR@_vapi_METADATADIRS = $(srcdir)/gcr +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gcr_@GCR_MAJOR@_vapi_VAPIDIRS = $(builddir) +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gcr_@GCR_MAJOR@_vapi_GIRDIRS = $(builddir) +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gcr_@GCR_MAJOR@_vapi_FILES = Gcr-@GCR_MAJOR@.gir +gcr_CFLAGS = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DSRCDIR="\"@abs_srcdir@\"" \ + -DGCR_API_SUBJECT_TO_CHANGE \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DGCR_COMPILATION \ + $(GLIB_CFLAGS) \ + $(LIBGCRYPT_CFLAGS) \ + $(P11_KIT_CFLAGS) + +gcr_LIBS = \ + libgcr-base-@GCR_MAJOR@.la \ + libegg.la \ + libgck-testable.la \ + $(GLIB_LIBS) \ + $(LIBGCRYPT_LIBS) \ + $(P11_KIT_LIBS) + +gcr_TESTS = \ + test-util \ + test-filter-collection \ + test-secret-exchange \ + test-simple-certificate \ + test-certificate \ + test-certificate-chain \ + test-subject-public-key \ + test-fingerprint \ + test-pkcs11-certificate \ + test-openpgp \ + test-openssh \ + test-secure-memory \ + test-trust \ + test-parser \ + test-record \ + test-memory-icon \ + test-gnupg-key \ + test-gnupg-collection \ + test-gnupg-process \ + test-system-prompt \ + test-ssh-askpass + +test_certificate_SOURCES = gcr/test-certificate.c +test_certificate_CFLAGS = $(gcr_CFLAGS) +test_certificate_LDADD = $(gcr_LIBS) +test_certificate_chain_SOURCES = gcr/test-certificate-chain.c +test_certificate_chain_CFLAGS = $(gcr_CFLAGS) +test_certificate_chain_LDADD = $(gcr_LIBS) +test_filter_collection_SOURCES = gcr/test-filter-collection.c +test_filter_collection_CFLAGS = $(gcr_CFLAGS) +test_filter_collection_LDADD = $(gcr_LIBS) +test_fingerprint_SOURCES = gcr/test-fingerprint.c +test_fingerprint_CFLAGS = $(gcr_CFLAGS) +test_fingerprint_LDADD = $(gcr_LIBS) +test_gnupg_collection_SOURCES = gcr/test-gnupg-collection.c +test_gnupg_collection_CFLAGS = $(gcr_CFLAGS) +test_gnupg_collection_LDADD = $(gcr_LIBS) +test_gnupg_key_SOURCES = gcr/test-gnupg-key.c +test_gnupg_key_CFLAGS = $(gcr_CFLAGS) +test_gnupg_key_LDADD = $(gcr_LIBS) +test_gnupg_process_SOURCES = gcr/test-gnupg-process.c +test_gnupg_process_CFLAGS = $(gcr_CFLAGS) +test_gnupg_process_LDADD = $(gcr_LIBS) +test_memory_icon_SOURCES = gcr/test-memory-icon.c +test_memory_icon_CFLAGS = $(gcr_CFLAGS) +test_memory_icon_LDADD = $(gcr_LIBS) +test_openpgp_SOURCES = gcr/test-openpgp.c +test_openpgp_CFLAGS = $(gcr_CFLAGS) +test_openpgp_LDADD = $(gcr_LIBS) +test_openssh_SOURCES = gcr/test-openssh.c +test_openssh_CFLAGS = $(gcr_CFLAGS) +test_openssh_LDADD = $(gcr_LIBS) +test_parser_SOURCES = gcr/test-parser.c +test_parser_CFLAGS = $(gcr_CFLAGS) +test_parser_LDADD = $(gcr_LIBS) +test_pkcs11_certificate_SOURCES = gcr/test-pkcs11-certificate.c +test_pkcs11_certificate_CFLAGS = $(gcr_CFLAGS) +test_pkcs11_certificate_LDADD = $(gcr_LIBS) +test_record_SOURCES = gcr/test-record.c +test_record_CFLAGS = $(gcr_CFLAGS) +test_record_LDADD = $(gcr_LIBS) +test_secret_exchange_SOURCES = gcr/test-secret-exchange.c +test_secret_exchange_CFLAGS = $(gcr_CFLAGS) +test_secret_exchange_LDADD = $(gcr_LIBS) +test_secure_memory_SOURCES = gcr/test-secure-memory.c +test_secure_memory_CFLAGS = $(gcr_CFLAGS) +test_secure_memory_LDADD = $(gcr_LIBS) +test_simple_certificate_SOURCES = gcr/test-simple-certificate.c +test_simple_certificate_CFLAGS = $(gcr_CFLAGS) +test_simple_certificate_LDADD = $(gcr_LIBS) +test_ssh_askpass_SOURCES = gcr/test-ssh-askpass.c +test_ssh_askpass_CFLAGS = $(gcr_CFLAGS) +test_ssh_askpass_LDADD = libegg-test.la $(gcr_LIBS) +test_subject_public_key_SOURCES = gcr/test-subject-public-key.c +test_subject_public_key_CFLAGS = $(gcr_CFLAGS) +test_subject_public_key_LDADD = $(gcr_LIBS) +test_system_prompt_SOURCES = gcr/test-system-prompt.c +test_system_prompt_CFLAGS = $(gcr_CFLAGS) +test_system_prompt_LDADD = $(gcr_LIBS) +test_trust_SOURCES = gcr/test-trust.c +test_trust_CFLAGS = $(gcr_CFLAGS) +test_trust_LDADD = $(gcr_LIBS) +test_util_SOURCES = gcr/test-util.c +test_util_CFLAGS = $(gcr_CFLAGS) +test_util_LDADD = $(gcr_LIBS) +frob_certificate_request_SOURCES = \ + gcr/frob-certificate-request.c \ + gcr/console-interaction.c gcr/console-interaction.h + +frob_certificate_request_CFLAGS = $(gcr_CFLAGS) +frob_certificate_request_LDADD = $(gcr_LIBS) +frob_openpgp_SOURCES = gcr/frob-openpgp.c +frob_openpgp_CFLAGS = $(gcr_CFLAGS) +frob_openpgp_LDADD = $(gcr_LIBS) +frob_parser_SOURCES = gcr/frob-parser.c +frob_parser_CFLAGS = $(gcr_CFLAGS) +frob_parser_LDADD = $(gcr_LIBS) +gsettings_SCHEMAS = \ + schema/org.gnome.crypto.pgp.gschema.xml + +convert_DATA = \ + schema/org.gnome.crypto.pgp.convert \ + schema/org.gnome.crypto.pgp_keyservers.convert + +convertdir = \ + $(datarootdir)/GConf/gsettings + +@WITH_GTK_TRUE@ui_incdir = $(includedir)/gcr-@GCR_MAJOR@/ui +@WITH_GTK_TRUE@ui_BUILT_SOURCES = \ +@WITH_GTK_TRUE@ ui/gcr-enum-types.c ui/gcr-enum-types.h \ +@WITH_GTK_TRUE@ ui/gcr-resources.c ui/gcr-resources.h + +@WITH_GTK_TRUE@libgcr_ui_@GCR_MAJOR@_la_CFLAGS = \ +@WITH_GTK_TRUE@ -DGCK_API_SUBJECT_TO_CHANGE \ +@WITH_GTK_TRUE@ -DGCR_API_SUBJECT_TO_CHANGE \ +@WITH_GTK_TRUE@ -DP11_KIT_API_SUBJECT_TO_CHANGE \ +@WITH_GTK_TRUE@ -DG_LOG_DOMAIN=\"Gcr\" \ +@WITH_GTK_TRUE@ -DGCR_COMPILATION \ +@WITH_GTK_TRUE@ $(P11_KIT_CFLAGS) \ +@WITH_GTK_TRUE@ $(GTK_CFLAGS) + +@WITH_GTK_TRUE@libgcr_ui_@GCR_MAJOR@_la_LDFLAGS = \ +@WITH_GTK_TRUE@ -version-info $(GCR_LT_RELEASE) \ +@WITH_GTK_TRUE@ -no-undefined \ +@WITH_GTK_TRUE@ -export-symbols-regex '^_gcr_.*|^gcr_.*|^SECMEM_.*' + +@WITH_GTK_TRUE@libgcr_ui_@GCR_MAJOR@_la_LIBADD = \ +@WITH_GTK_TRUE@ libegg.la \ +@WITH_GTK_TRUE@ libgcr-base-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgck-@GCK_MAJOR@.la \ +@WITH_GTK_TRUE@ $(GLIB_LIBS) \ +@WITH_GTK_TRUE@ $(LIBGCRYPT_LIBS) \ +@WITH_GTK_TRUE@ $(P11_KIT_LIBS) \ +@WITH_GTK_TRUE@ $(GTK_LIBS) \ +@WITH_GTK_TRUE@ $(NULL) + +@WITH_GTK_TRUE@ui_HEADER_FILES = \ +@WITH_GTK_TRUE@ ui/gcr-ui.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-basics-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-details-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-collection-model.h \ +@WITH_GTK_TRUE@ ui/gcr-combo-selector.h \ +@WITH_GTK_TRUE@ ui/gcr-deprecated.h \ +@WITH_GTK_TRUE@ ui/gcr-failure-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-key-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-key-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-import-button.h \ +@WITH_GTK_TRUE@ ui/gcr-list-selector.h \ +@WITH_GTK_TRUE@ ui/gcr-prompt-dialog.h \ +@WITH_GTK_TRUE@ ui/gcr-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-secure-entry-buffer.h \ +@WITH_GTK_TRUE@ ui/gcr-tree-selector.h \ +@WITH_GTK_TRUE@ ui/gcr-unlock-options-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-viewer.h \ +@WITH_GTK_TRUE@ ui/gcr-viewer-widget.h + +@WITH_GTK_TRUE@ui_inc_HEADERS = \ +@WITH_GTK_TRUE@ $(ui_HEADER_FILES) \ +@WITH_GTK_TRUE@ ui/gcr-enum-types.h + +@WITH_GTK_TRUE@ui_PUBLIC_FILES = \ +@WITH_GTK_TRUE@ ui/gcr-certificate-renderer.c ui/gcr-certificate-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-widget.c ui/gcr-certificate-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-collection-model.c ui/gcr-collection-model.h \ +@WITH_GTK_TRUE@ ui/gcr-combo-selector.c ui/gcr-combo-selector.h \ +@WITH_GTK_TRUE@ ui/gcr-failure-renderer.c ui/gcr-failure-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-key-renderer.c ui/gcr-key-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-key-widget.c ui/gcr-key-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-import-button.c ui/gcr-import-button.h \ +@WITH_GTK_TRUE@ ui/gcr-list-selector.c ui/gcr-list-selector.h \ +@WITH_GTK_TRUE@ ui/gcr-prompt-dialog.c ui/gcr-prompt-dialog.h \ +@WITH_GTK_TRUE@ ui/gcr-renderer.c ui/gcr-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-secure-entry-buffer.c ui/gcr-secure-entry-buffer.h \ +@WITH_GTK_TRUE@ ui/gcr-tree-selector.c ui/gcr-tree-selector.h \ +@WITH_GTK_TRUE@ ui/gcr-unlock-options-widget.c ui/gcr-unlock-options-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-viewer.c ui/gcr-viewer.h \ +@WITH_GTK_TRUE@ ui/gcr-viewer-widget.c ui/gcr-viewer-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-ui.h \ +@WITH_GTK_TRUE@ $(NULL) + +@WITH_GTK_TRUE@ui_PRIVATE_FILES = \ +@WITH_GTK_TRUE@ ui/eggimagemenuitem.c ui/eggimagemenuitem.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-basics-widget.c ui/gcr-certificate-basics-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-details-widget.c ui/gcr-certificate-details-widget.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-exporter.c ui/gcr-certificate-exporter.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-renderer-private.h \ +@WITH_GTK_TRUE@ ui/gcr-certificate-request-renderer.c ui/gcr-certificate-request-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-deprecated.h \ +@WITH_GTK_TRUE@ ui/gcr-dialog-util.c ui/gcr-dialog-util.h \ +@WITH_GTK_TRUE@ ui/gcr-display-scrolled.c ui/gcr-display-scrolled.h \ +@WITH_GTK_TRUE@ ui/gcr-display-view.c ui/gcr-display-view.h \ +@WITH_GTK_TRUE@ ui/gcr-gnupg-renderer.c ui/gcr-gnupg-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-list-selector-private.h \ +@WITH_GTK_TRUE@ ui/gcr-live-search.c ui/gcr-live-search.h \ +@WITH_GTK_TRUE@ ui/gcr-pkcs11-import-dialog.c ui/gcr-pkcs11-import-dialog.h \ +@WITH_GTK_TRUE@ ui/gcr-pkcs11-import-interaction.c ui/gcr-pkcs11-import-interaction.h \ +@WITH_GTK_TRUE@ ui/gcr-unlock-renderer.c ui/gcr-unlock-renderer.h \ +@WITH_GTK_TRUE@ ui/gcr-viewer-window.c ui/gcr-viewer-window.h \ +@WITH_GTK_TRUE@ $(NULL) + +@WITH_GTK_TRUE@libgcr_ui_@GCR_MAJOR@_la_SOURCES = \ +@WITH_GTK_TRUE@ $(ui_PUBLIC_FILES) \ +@WITH_GTK_TRUE@ $(ui_PRIVATE_FILES) \ +@WITH_GTK_TRUE@ $(NULL) + +@WITH_GTK_TRUE@nodist_libgcr_ui_@GCR_MAJOR@_la_SOURCES = \ +@WITH_GTK_TRUE@ $(ui_BUILT_SOURCES) + +@WITH_GTK_TRUE@ui_RESOURCES = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/ui --generate-dependencies $(srcdir)/ui/gcr.gresource.xml) +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi_@GCR_MAJOR@_gir_PACKAGES = gtk+-3.0 p11-kit-1 +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi_@GCR_MAJOR@_gir_EXPORT_PACKAGES = gcr-ui-@GCR_MAJOR@ +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi_@GCR_MAJOR@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gtk-3.0 +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi_@GCR_MAJOR@_gir_LIBS = libgcr-base-@GCR_MAJOR@.la libgcr-ui-@GCR_MAJOR@.la +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi_@GCR_MAJOR@_gir_CFLAGS = -I$(srcdir) -I$(builddir) -DGCR_COMPILATION -DGCR_API_SUBJECT_TO_CHANGE +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi_@GCR_MAJOR@_gir_FILES = $(ui_PUBLIC_FILES) +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi_@GCR_MAJOR@_gir_SCANNERFLAGS = \ +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ --add-include-path=$(builddir)/gck \ +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ --add-include-path=$(builddir)/gcr \ +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ --include-uninstalled=Gck-@GCK_MAJOR@.gir \ +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ --include-uninstalled=Gcr-@GCR_MAJOR@.gir \ +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ --c-include "ui/gcr-ui.h" \ +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ --identifier-prefix Gcr --symbol-prefix gcr + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@gcr_ui_@GCR_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 gck-@GCK_MAJOR@ gcr-@GCR_MAJOR@ gtk+-3.0 +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@gcr_ui_@GCR_MAJOR@_vapi_METADATADIRS = $(srcdir)/ui +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@gcr_ui_@GCR_MAJOR@_vapi_VAPIDIRS = $(builddir) +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@gcr_ui_@GCR_MAJOR@_vapi_GIRDIRS = $(builddir) +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@gcr_ui_@GCR_MAJOR@_vapi_FILES = GcrUi-@GCR_MAJOR@.gir +@WITH_GTK_TRUE@desktopdir = $(datadir)/applications +@WITH_GTK_TRUE@desktop_in_in_files = ui/gcr-viewer.desktop.in.in ui/gcr-prompter.desktop.in.in +@WITH_GTK_TRUE@desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in) +@WITH_GTK_TRUE@desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +@WITH_GTK_TRUE@gcr_viewer_SOURCES = \ +@WITH_GTK_TRUE@ ui/gcr-viewer-tool.c + +@WITH_GTK_TRUE@gcr_viewer_CFLAGS = \ +@WITH_GTK_TRUE@ $(P11_KIT_CFLAGS) \ +@WITH_GTK_TRUE@ $(GTK_CFLAGS) \ +@WITH_GTK_TRUE@ -DGCR_API_SUBJECT_TO_CHANGE + +@WITH_GTK_TRUE@gcr_viewer_LDADD = \ +@WITH_GTK_TRUE@ libgcr-ui-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgcr-base-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgck-@GCK_MAJOR@.la \ +@WITH_GTK_TRUE@ $(GLIB_LIBS) \ +@WITH_GTK_TRUE@ $(GTK_LIBS) + +@WITH_GTK_TRUE@gcr_prompter_SOURCES = \ +@WITH_GTK_TRUE@ ui/gcr-prompter-tool.c + +@WITH_GTK_TRUE@gcr_prompter_CFLAGS = \ +@WITH_GTK_TRUE@ -DGCR_API_SUBJECT_TO_CHANGE \ +@WITH_GTK_TRUE@ $(P11_KIT_CFLAGS) \ +@WITH_GTK_TRUE@ $(GTK_CFLAGS) + +@WITH_GTK_TRUE@gcr_prompter_LDADD = \ +@WITH_GTK_TRUE@ libgcr-ui-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgcr-base-$(GCR_MAJOR).la \ +@WITH_GTK_TRUE@ libgck-@GCK_MAJOR@.la \ +@WITH_GTK_TRUE@ $(GTK_LIBS) + + +# The new mime system +@WITH_GTK_TRUE@mimedir = $(datadir)/mime/packages +@WITH_GTK_TRUE@mime_DATA = ui/gcr-crypto-types.xml +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@update_mime_database_cmd = update-mime-database $(datadir)/mime/ +@WITH_GTK_TRUE@ui_CFLAGS = \ +@WITH_GTK_TRUE@ -DGCR_API_SUBJECT_TO_CHANGE \ +@WITH_GTK_TRUE@ -DGCK_API_SUBJECT_TO_CHANGE \ +@WITH_GTK_TRUE@ -DGCR_COMPILATION \ +@WITH_GTK_TRUE@ $(LIBGCRYPT_CFLAGS) \ +@WITH_GTK_TRUE@ $(P11_KIT_CFLAGS) \ +@WITH_GTK_TRUE@ $(GTK_CFLAGS) + +@WITH_GTK_TRUE@ui_LIBS = \ +@WITH_GTK_TRUE@ libgcr-ui-@GCR_MAJOR@.la \ +@WITH_GTK_TRUE@ libgcr-base-@GCR_MAJOR@.la \ +@WITH_GTK_TRUE@ libegg.la \ +@WITH_GTK_TRUE@ libgck-testable.la \ +@WITH_GTK_TRUE@ $(LIBGCRYPT_LIBS) \ +@WITH_GTK_TRUE@ $(P11_KIT_LIBS) \ +@WITH_GTK_TRUE@ $(GTK_LIBS) + +@WITH_GTK_TRUE@frob_certificate_SOURCES = ui/frob-certificate.c +@WITH_GTK_TRUE@frob_certificate_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_certificate_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_combo_selector_SOURCES = ui/frob-combo-selector.c +@WITH_GTK_TRUE@frob_combo_selector_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_combo_selector_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_gnupg_selector_SOURCES = ui/frob-gnupg-selector.c +@WITH_GTK_TRUE@frob_gnupg_selector_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_gnupg_selector_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_import_button_SOURCES = ui/frob-import-button.c +@WITH_GTK_TRUE@frob_import_button_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_import_button_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_key_SOURCES = ui/frob-key.c +@WITH_GTK_TRUE@frob_key_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_key_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_prompt_SOURCES = ui/frob-prompt.c +@WITH_GTK_TRUE@frob_prompt_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_prompt_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_request_SOURCES = ui/frob-request.c +@WITH_GTK_TRUE@frob_request_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_request_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_system_prompt_SOURCES = ui/frob-system-prompt.c +@WITH_GTK_TRUE@frob_system_prompt_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_system_prompt_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_tree_selector_SOURCES = ui/frob-tree-selector.c +@WITH_GTK_TRUE@frob_tree_selector_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_tree_selector_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_unlock_SOURCES = \ +@WITH_GTK_TRUE@ ui/frob-unlock.c ui/gcr-viewer-window.c + +@WITH_GTK_TRUE@frob_unlock_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_unlock_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@frob_unlock_options_SOURCES = ui/frob-unlock-options.c +@WITH_GTK_TRUE@frob_unlock_options_CFLAGS = $(ui_CFLAGS) +@WITH_GTK_TRUE@frob_unlock_options_LDADD = $(ui_LIBS) +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .desktop.in .desktop.in.in .service .service.in .broken.typelib .broken.gir .gir .c .lo .log .o .obj .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/egg/Makefile.am $(srcdir)/gck/Makefile.am $(srcdir)/gcr/Makefile.am $(srcdir)/schema/Makefile.am $(srcdir)/ui/Makefile.am $(srcdir)/ui/icons/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/egg/Makefile.am $(srcdir)/gck/Makefile.am $(srcdir)/gcr/Makefile.am $(srcdir)/schema/Makefile.am $(srcdir)/ui/Makefile.am $(srcdir)/ui/icons/Makefile.am $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +gck/gck.pc: $(top_builddir)/config.status $(top_srcdir)/gck/gck.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gck/gck-version.h: $(top_builddir)/config.status $(top_srcdir)/gck/gck-version.h.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gcr/gcr-base.pc: $(top_builddir)/config.status $(top_srcdir)/gcr/gcr-base.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gcr/gcr-version.h: $(top_builddir)/config.status $(top_srcdir)/gcr/gcr-version.h.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +ui/gcr.pc: $(top_builddir)/config.status $(top_srcdir)/ui/gcr.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +ui/gcr-ui.pc: $(top_builddir)/config.status $(top_srcdir)/ui/gcr-ui.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +clean-checkLTLIBRARIES: + -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) + @list='$(check_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +egg/$(am__dirstamp): + @$(MKDIR_P) egg + @: > egg/$(am__dirstamp) +egg/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) egg/$(DEPDIR) + @: > egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_asn1x_la-egg-asn1x.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +libegg-asn1x.la: $(libegg_asn1x_la_OBJECTS) $(libegg_asn1x_la_DEPENDENCIES) $(EXTRA_libegg_asn1x_la_DEPENDENCIES) + $(AM_V_CCLD)$(libegg_asn1x_la_LINK) $(libegg_asn1x_la_OBJECTS) $(libegg_asn1x_la_LIBADD) $(LIBS) +egg/libegg_hex_la-egg-hex.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +libegg-hex.la: $(libegg_hex_la_OBJECTS) $(libegg_hex_la_DEPENDENCIES) $(EXTRA_libegg_hex_la_DEPENDENCIES) + $(AM_V_CCLD)$(libegg_hex_la_LINK) $(libegg_hex_la_OBJECTS) $(libegg_hex_la_LIBADD) $(LIBS) +egg/egg-secure-memory.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +libegg-secmem.la: $(libegg_secmem_la_OBJECTS) $(libegg_secmem_la_DEPENDENCIES) $(EXTRA_libegg_secmem_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libegg_secmem_la_OBJECTS) $(libegg_secmem_la_LIBADD) $(LIBS) +egg/libegg_test_la-egg-testing.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_test_la-mock-interaction.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +libegg-test.la: $(libegg_test_la_OBJECTS) $(libegg_test_la_DEPENDENCIES) $(EXTRA_libegg_test_la_DEPENDENCIES) + $(AM_V_CCLD)$(libegg_test_la_LINK) $(libegg_test_la_OBJECTS) $(libegg_test_la_LIBADD) $(LIBS) +egg/libegg_la-egg-armor.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-asn1x.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-asn1-defs.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-buffer.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-dh.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-dn.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-decimal.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-hex.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-hkdf.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-libgcrypt.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-oid.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-padding.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-openssl.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-secure-memory.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-symkey.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-testing.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) +egg/libegg_la-egg-timegm.lo: egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +libegg.la: $(libegg_la_OBJECTS) $(libegg_la_DEPENDENCIES) $(EXTRA_libegg_la_DEPENDENCIES) + $(AM_V_CCLD)$(libegg_la_LINK) $(libegg_la_OBJECTS) $(libegg_la_LIBADD) $(LIBS) +gck/$(am__dirstamp): + @$(MKDIR_P) gck + @: > gck/$(am__dirstamp) +gck/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) gck/$(DEPDIR) + @: > gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-attributes.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-dump.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-enumerator.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-misc.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-module.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-modules.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-object.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-object-cache.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-password.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-session.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-slot.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-uri.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-call.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-interaction.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-marshal.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_@GCK_MAJOR@_la-gck-enum-types.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +libgck-@GCK_MAJOR@.la: $(libgck_@GCK_MAJOR@_la_OBJECTS) $(libgck_@GCK_MAJOR@_la_DEPENDENCIES) $(EXTRA_libgck_@GCK_MAJOR@_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgck_@GCK_MAJOR@_la_LINK) -rpath $(libdir) $(libgck_@GCK_MAJOR@_la_OBJECTS) $(libgck_@GCK_MAJOR@_la_LIBADD) $(LIBS) +gck/libgck_testable_la-gck-mock.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) +gck/libgck_testable_la-gck-test.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +libgck-testable.la: $(libgck_testable_la_OBJECTS) $(libgck_testable_la_DEPENDENCIES) $(EXTRA_libgck_testable_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgck_testable_la_LINK) $(libgck_testable_la_OBJECTS) $(libgck_testable_la_LIBADD) $(LIBS) +gcr/$(am__dirstamp): + @$(MKDIR_P) gcr + @: > gcr/$(am__dirstamp) +gcr/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) gcr/$(DEPDIR) + @: > gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-collection.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-icons.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-importer.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-library.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-parser.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-column.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-record.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-trust.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-util.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-oids.lo: gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.lo: \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +libgcr-base-@GCR_MAJOR@.la: $(libgcr_base_@GCR_MAJOR@_la_OBJECTS) $(libgcr_base_@GCR_MAJOR@_la_DEPENDENCIES) $(EXTRA_libgcr_base_@GCR_MAJOR@_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgcr_base_@GCR_MAJOR@_la_LINK) -rpath $(libdir) $(libgcr_base_@GCR_MAJOR@_la_OBJECTS) $(libgcr_base_@GCR_MAJOR@_la_LIBADD) $(LIBS) +ui/$(am__dirstamp): + @$(MKDIR_P) ui + @: > ui/$(am__dirstamp) +ui/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/$(DEPDIR) + @: > ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.lo: \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.lo: ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +libgcr-ui-@GCR_MAJOR@.la: $(libgcr_ui_@GCR_MAJOR@_la_OBJECTS) $(libgcr_ui_@GCR_MAJOR@_la_DEPENDENCIES) $(EXTRA_libgcr_ui_@GCR_MAJOR@_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgcr_ui_@GCR_MAJOR@_la_LINK) $(am_libgcr_ui_@GCR_MAJOR@_la_rpath) $(libgcr_ui_@GCR_MAJOR@_la_OBJECTS) $(libgcr_ui_@GCR_MAJOR@_la_LIBADD) $(LIBS) +gck/libmock_test_module_la-mock-test-module.lo: gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +libmock-test-module.la: $(libmock_test_module_la_OBJECTS) $(libmock_test_module_la_DEPENDENCIES) $(EXTRA_libmock_test_module_la_DEPENDENCIES) + $(AM_V_CCLD)$(libmock_test_module_la_LINK) $(libmock_test_module_la_OBJECTS) $(libmock_test_module_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +install-libexecPROGRAMS: $(libexec_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-libexecPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libexecdir)" && rm -f $$files + +clean-libexecPROGRAMS: + @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +ui/frob_certificate-frob-certificate.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +frob-certificate$(EXEEXT): $(frob_certificate_OBJECTS) $(frob_certificate_DEPENDENCIES) $(EXTRA_frob_certificate_DEPENDENCIES) + @rm -f frob-certificate$(EXEEXT) + $(AM_V_CCLD)$(frob_certificate_LINK) $(frob_certificate_OBJECTS) $(frob_certificate_LDADD) $(LIBS) +gcr/frob_certificate_request-frob-certificate-request.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) +gcr/frob_certificate_request-console-interaction.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +frob-certificate-request$(EXEEXT): $(frob_certificate_request_OBJECTS) $(frob_certificate_request_DEPENDENCIES) $(EXTRA_frob_certificate_request_DEPENDENCIES) + @rm -f frob-certificate-request$(EXEEXT) + $(AM_V_CCLD)$(frob_certificate_request_LINK) $(frob_certificate_request_OBJECTS) $(frob_certificate_request_LDADD) $(LIBS) +ui/frob_combo_selector-frob-combo-selector.$(OBJEXT): \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) + +frob-combo-selector$(EXEEXT): $(frob_combo_selector_OBJECTS) $(frob_combo_selector_DEPENDENCIES) $(EXTRA_frob_combo_selector_DEPENDENCIES) + @rm -f frob-combo-selector$(EXEEXT) + $(AM_V_CCLD)$(frob_combo_selector_LINK) $(frob_combo_selector_OBJECTS) $(frob_combo_selector_LDADD) $(LIBS) +ui/frob_gnupg_selector-frob-gnupg-selector.$(OBJEXT): \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) + +frob-gnupg-selector$(EXEEXT): $(frob_gnupg_selector_OBJECTS) $(frob_gnupg_selector_DEPENDENCIES) $(EXTRA_frob_gnupg_selector_DEPENDENCIES) + @rm -f frob-gnupg-selector$(EXEEXT) + $(AM_V_CCLD)$(frob_gnupg_selector_LINK) $(frob_gnupg_selector_OBJECTS) $(frob_gnupg_selector_LDADD) $(LIBS) +ui/frob_import_button-frob-import-button.$(OBJEXT): \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) + +frob-import-button$(EXEEXT): $(frob_import_button_OBJECTS) $(frob_import_button_DEPENDENCIES) $(EXTRA_frob_import_button_DEPENDENCIES) + @rm -f frob-import-button$(EXEEXT) + $(AM_V_CCLD)$(frob_import_button_LINK) $(frob_import_button_OBJECTS) $(frob_import_button_LDADD) $(LIBS) +ui/frob_key-frob-key.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +frob-key$(EXEEXT): $(frob_key_OBJECTS) $(frob_key_DEPENDENCIES) $(EXTRA_frob_key_DEPENDENCIES) + @rm -f frob-key$(EXEEXT) + $(AM_V_CCLD)$(frob_key_LINK) $(frob_key_OBJECTS) $(frob_key_LDADD) $(LIBS) +gcr/frob_openpgp-frob-openpgp.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +frob-openpgp$(EXEEXT): $(frob_openpgp_OBJECTS) $(frob_openpgp_DEPENDENCIES) $(EXTRA_frob_openpgp_DEPENDENCIES) + @rm -f frob-openpgp$(EXEEXT) + $(AM_V_CCLD)$(frob_openpgp_LINK) $(frob_openpgp_OBJECTS) $(frob_openpgp_LDADD) $(LIBS) +gcr/frob_parser-frob-parser.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +frob-parser$(EXEEXT): $(frob_parser_OBJECTS) $(frob_parser_DEPENDENCIES) $(EXTRA_frob_parser_DEPENDENCIES) + @rm -f frob-parser$(EXEEXT) + $(AM_V_CCLD)$(frob_parser_LINK) $(frob_parser_OBJECTS) $(frob_parser_LDADD) $(LIBS) +ui/frob_prompt-frob-prompt.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +frob-prompt$(EXEEXT): $(frob_prompt_OBJECTS) $(frob_prompt_DEPENDENCIES) $(EXTRA_frob_prompt_DEPENDENCIES) + @rm -f frob-prompt$(EXEEXT) + $(AM_V_CCLD)$(frob_prompt_LINK) $(frob_prompt_OBJECTS) $(frob_prompt_LDADD) $(LIBS) +ui/frob_request-frob-request.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +frob-request$(EXEEXT): $(frob_request_OBJECTS) $(frob_request_DEPENDENCIES) $(EXTRA_frob_request_DEPENDENCIES) + @rm -f frob-request$(EXEEXT) + $(AM_V_CCLD)$(frob_request_LINK) $(frob_request_OBJECTS) $(frob_request_LDADD) $(LIBS) +ui/frob_system_prompt-frob-system-prompt.$(OBJEXT): \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) + +frob-system-prompt$(EXEEXT): $(frob_system_prompt_OBJECTS) $(frob_system_prompt_DEPENDENCIES) $(EXTRA_frob_system_prompt_DEPENDENCIES) + @rm -f frob-system-prompt$(EXEEXT) + $(AM_V_CCLD)$(frob_system_prompt_LINK) $(frob_system_prompt_OBJECTS) $(frob_system_prompt_LDADD) $(LIBS) +ui/frob_tree_selector-frob-tree-selector.$(OBJEXT): \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) + +frob-tree-selector$(EXEEXT): $(frob_tree_selector_OBJECTS) $(frob_tree_selector_DEPENDENCIES) $(EXTRA_frob_tree_selector_DEPENDENCIES) + @rm -f frob-tree-selector$(EXEEXT) + $(AM_V_CCLD)$(frob_tree_selector_LINK) $(frob_tree_selector_OBJECTS) $(frob_tree_selector_LDADD) $(LIBS) +ui/frob_unlock-frob-unlock.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) +ui/frob_unlock-gcr-viewer-window.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +frob-unlock$(EXEEXT): $(frob_unlock_OBJECTS) $(frob_unlock_DEPENDENCIES) $(EXTRA_frob_unlock_DEPENDENCIES) + @rm -f frob-unlock$(EXEEXT) + $(AM_V_CCLD)$(frob_unlock_LINK) $(frob_unlock_OBJECTS) $(frob_unlock_LDADD) $(LIBS) +ui/frob_unlock_options-frob-unlock-options.$(OBJEXT): \ + ui/$(am__dirstamp) ui/$(DEPDIR)/$(am__dirstamp) + +frob-unlock-options$(EXEEXT): $(frob_unlock_options_OBJECTS) $(frob_unlock_options_DEPENDENCIES) $(EXTRA_frob_unlock_options_DEPENDENCIES) + @rm -f frob-unlock-options$(EXEEXT) + $(AM_V_CCLD)$(frob_unlock_options_LINK) $(frob_unlock_options_OBJECTS) $(frob_unlock_options_LDADD) $(LIBS) +ui/gcr_prompter-gcr-prompter-tool.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +gcr-prompter$(EXEEXT): $(gcr_prompter_OBJECTS) $(gcr_prompter_DEPENDENCIES) $(EXTRA_gcr_prompter_DEPENDENCIES) + @rm -f gcr-prompter$(EXEEXT) + $(AM_V_CCLD)$(gcr_prompter_LINK) $(gcr_prompter_OBJECTS) $(gcr_prompter_LDADD) $(LIBS) +gcr/gcr_ssh_askpass-gcr-ssh-askpass.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +gcr-ssh-askpass$(EXEEXT): $(gcr_ssh_askpass_OBJECTS) $(gcr_ssh_askpass_DEPENDENCIES) $(EXTRA_gcr_ssh_askpass_DEPENDENCIES) + @rm -f gcr-ssh-askpass$(EXEEXT) + $(AM_V_CCLD)$(gcr_ssh_askpass_LINK) $(gcr_ssh_askpass_OBJECTS) $(gcr_ssh_askpass_LDADD) $(LIBS) +ui/gcr_viewer-gcr-viewer-tool.$(OBJEXT): ui/$(am__dirstamp) \ + ui/$(DEPDIR)/$(am__dirstamp) + +gcr-viewer$(EXEEXT): $(gcr_viewer_OBJECTS) $(gcr_viewer_DEPENDENCIES) $(EXTRA_gcr_viewer_DEPENDENCIES) + @rm -f gcr-viewer$(EXEEXT) + $(AM_V_CCLD)$(gcr_viewer_LINK) $(gcr_viewer_OBJECTS) $(gcr_viewer_LDADD) $(LIBS) +egg/test-armor.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-armor$(EXEEXT): $(test_armor_OBJECTS) $(test_armor_DEPENDENCIES) $(EXTRA_test_armor_DEPENDENCIES) + @rm -f test-armor$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_armor_OBJECTS) $(test_armor_LDADD) $(LIBS) +egg/test-asn1.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-asn1$(EXEEXT): $(test_asn1_OBJECTS) $(test_asn1_DEPENDENCIES) $(EXTRA_test_asn1_DEPENDENCIES) + @rm -f test-asn1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_asn1_OBJECTS) $(test_asn1_LDADD) $(LIBS) +egg/test-asn1x.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-asn1x$(EXEEXT): $(test_asn1x_OBJECTS) $(test_asn1x_DEPENDENCIES) $(EXTRA_test_asn1x_DEPENDENCIES) + @rm -f test-asn1x$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_asn1x_OBJECTS) $(test_asn1x_LDADD) $(LIBS) +gcr/test_certificate-test-certificate.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-certificate$(EXEEXT): $(test_certificate_OBJECTS) $(test_certificate_DEPENDENCIES) $(EXTRA_test_certificate_DEPENDENCIES) + @rm -f test-certificate$(EXEEXT) + $(AM_V_CCLD)$(test_certificate_LINK) $(test_certificate_OBJECTS) $(test_certificate_LDADD) $(LIBS) +gcr/test_certificate_chain-test-certificate-chain.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-certificate-chain$(EXEEXT): $(test_certificate_chain_OBJECTS) $(test_certificate_chain_DEPENDENCIES) $(EXTRA_test_certificate_chain_DEPENDENCIES) + @rm -f test-certificate-chain$(EXEEXT) + $(AM_V_CCLD)$(test_certificate_chain_LINK) $(test_certificate_chain_OBJECTS) $(test_certificate_chain_LDADD) $(LIBS) +egg/test-decimal.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-decimal$(EXEEXT): $(test_decimal_OBJECTS) $(test_decimal_DEPENDENCIES) $(EXTRA_test_decimal_DEPENDENCIES) + @rm -f test-decimal$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_decimal_OBJECTS) $(test_decimal_LDADD) $(LIBS) +egg/test-dh.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-dh$(EXEEXT): $(test_dh_OBJECTS) $(test_dh_DEPENDENCIES) $(EXTRA_test_dh_DEPENDENCIES) + @rm -f test-dh$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_dh_OBJECTS) $(test_dh_LDADD) $(LIBS) +egg/test-dn.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-dn$(EXEEXT): $(test_dn_OBJECTS) $(test_dn_DEPENDENCIES) $(EXTRA_test_dn_DEPENDENCIES) + @rm -f test-dn$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_dn_OBJECTS) $(test_dn_LDADD) $(LIBS) +gcr/test_filter_collection-test-filter-collection.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-filter-collection$(EXEEXT): $(test_filter_collection_OBJECTS) $(test_filter_collection_DEPENDENCIES) $(EXTRA_test_filter_collection_DEPENDENCIES) + @rm -f test-filter-collection$(EXEEXT) + $(AM_V_CCLD)$(test_filter_collection_LINK) $(test_filter_collection_OBJECTS) $(test_filter_collection_LDADD) $(LIBS) +gcr/test_fingerprint-test-fingerprint.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-fingerprint$(EXEEXT): $(test_fingerprint_OBJECTS) $(test_fingerprint_DEPENDENCIES) $(EXTRA_test_fingerprint_DEPENDENCIES) + @rm -f test-fingerprint$(EXEEXT) + $(AM_V_CCLD)$(test_fingerprint_LINK) $(test_fingerprint_OBJECTS) $(test_fingerprint_LDADD) $(LIBS) +gck/test_gck_attributes-test-gck-attributes.$(OBJEXT): \ + gck/$(am__dirstamp) gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-attributes$(EXEEXT): $(test_gck_attributes_OBJECTS) $(test_gck_attributes_DEPENDENCIES) $(EXTRA_test_gck_attributes_DEPENDENCIES) + @rm -f test-gck-attributes$(EXEEXT) + $(AM_V_CCLD)$(test_gck_attributes_LINK) $(test_gck_attributes_OBJECTS) $(test_gck_attributes_LDADD) $(LIBS) +gck/test_gck_crypto-test-gck-crypto.$(OBJEXT): gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-crypto$(EXEEXT): $(test_gck_crypto_OBJECTS) $(test_gck_crypto_DEPENDENCIES) $(EXTRA_test_gck_crypto_DEPENDENCIES) + @rm -f test-gck-crypto$(EXEEXT) + $(AM_V_CCLD)$(test_gck_crypto_LINK) $(test_gck_crypto_OBJECTS) $(test_gck_crypto_LDADD) $(LIBS) +gck/test_gck_enumerator-test-gck-enumerator.$(OBJEXT): \ + gck/$(am__dirstamp) gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-enumerator$(EXEEXT): $(test_gck_enumerator_OBJECTS) $(test_gck_enumerator_DEPENDENCIES) $(EXTRA_test_gck_enumerator_DEPENDENCIES) + @rm -f test-gck-enumerator$(EXEEXT) + $(AM_V_CCLD)$(test_gck_enumerator_LINK) $(test_gck_enumerator_OBJECTS) $(test_gck_enumerator_LDADD) $(LIBS) +gck/test_gck_module-test-gck-module.$(OBJEXT): gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-module$(EXEEXT): $(test_gck_module_OBJECTS) $(test_gck_module_DEPENDENCIES) $(EXTRA_test_gck_module_DEPENDENCIES) + @rm -f test-gck-module$(EXEEXT) + $(AM_V_CCLD)$(test_gck_module_LINK) $(test_gck_module_OBJECTS) $(test_gck_module_LDADD) $(LIBS) +gck/test_gck_modules-test-gck-modules.$(OBJEXT): gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-modules$(EXEEXT): $(test_gck_modules_OBJECTS) $(test_gck_modules_DEPENDENCIES) $(EXTRA_test_gck_modules_DEPENDENCIES) + @rm -f test-gck-modules$(EXEEXT) + $(AM_V_CCLD)$(test_gck_modules_LINK) $(test_gck_modules_OBJECTS) $(test_gck_modules_LDADD) $(LIBS) +gck/test_gck_object-test-gck-object.$(OBJEXT): gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-object$(EXEEXT): $(test_gck_object_OBJECTS) $(test_gck_object_DEPENDENCIES) $(EXTRA_test_gck_object_DEPENDENCIES) + @rm -f test-gck-object$(EXEEXT) + $(AM_V_CCLD)$(test_gck_object_LINK) $(test_gck_object_OBJECTS) $(test_gck_object_LDADD) $(LIBS) +gck/test_gck_session-test-gck-session.$(OBJEXT): gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-session$(EXEEXT): $(test_gck_session_OBJECTS) $(test_gck_session_DEPENDENCIES) $(EXTRA_test_gck_session_DEPENDENCIES) + @rm -f test-gck-session$(EXEEXT) + $(AM_V_CCLD)$(test_gck_session_LINK) $(test_gck_session_OBJECTS) $(test_gck_session_LDADD) $(LIBS) +gck/test_gck_slot-test-gck-slot.$(OBJEXT): gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-slot$(EXEEXT): $(test_gck_slot_OBJECTS) $(test_gck_slot_DEPENDENCIES) $(EXTRA_test_gck_slot_DEPENDENCIES) + @rm -f test-gck-slot$(EXEEXT) + $(AM_V_CCLD)$(test_gck_slot_LINK) $(test_gck_slot_OBJECTS) $(test_gck_slot_LDADD) $(LIBS) +gck/test_gck_uri-test-gck-uri.$(OBJEXT): gck/$(am__dirstamp) \ + gck/$(DEPDIR)/$(am__dirstamp) + +test-gck-uri$(EXEEXT): $(test_gck_uri_OBJECTS) $(test_gck_uri_DEPENDENCIES) $(EXTRA_test_gck_uri_DEPENDENCIES) + @rm -f test-gck-uri$(EXEEXT) + $(AM_V_CCLD)$(test_gck_uri_LINK) $(test_gck_uri_OBJECTS) $(test_gck_uri_LDADD) $(LIBS) +gcr/test_gnupg_collection-test-gnupg-collection.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-gnupg-collection$(EXEEXT): $(test_gnupg_collection_OBJECTS) $(test_gnupg_collection_DEPENDENCIES) $(EXTRA_test_gnupg_collection_DEPENDENCIES) + @rm -f test-gnupg-collection$(EXEEXT) + $(AM_V_CCLD)$(test_gnupg_collection_LINK) $(test_gnupg_collection_OBJECTS) $(test_gnupg_collection_LDADD) $(LIBS) +gcr/test_gnupg_key-test-gnupg-key.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-gnupg-key$(EXEEXT): $(test_gnupg_key_OBJECTS) $(test_gnupg_key_DEPENDENCIES) $(EXTRA_test_gnupg_key_DEPENDENCIES) + @rm -f test-gnupg-key$(EXEEXT) + $(AM_V_CCLD)$(test_gnupg_key_LINK) $(test_gnupg_key_OBJECTS) $(test_gnupg_key_LDADD) $(LIBS) +gcr/test_gnupg_process-test-gnupg-process.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-gnupg-process$(EXEEXT): $(test_gnupg_process_OBJECTS) $(test_gnupg_process_DEPENDENCIES) $(EXTRA_test_gnupg_process_DEPENDENCIES) + @rm -f test-gnupg-process$(EXEEXT) + $(AM_V_CCLD)$(test_gnupg_process_LINK) $(test_gnupg_process_OBJECTS) $(test_gnupg_process_LDADD) $(LIBS) +egg/test-hex.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-hex$(EXEEXT): $(test_hex_OBJECTS) $(test_hex_DEPENDENCIES) $(EXTRA_test_hex_DEPENDENCIES) + @rm -f test-hex$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_hex_OBJECTS) $(test_hex_LDADD) $(LIBS) +egg/test-hkdf.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-hkdf$(EXEEXT): $(test_hkdf_OBJECTS) $(test_hkdf_DEPENDENCIES) $(EXTRA_test_hkdf_DEPENDENCIES) + @rm -f test-hkdf$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_hkdf_OBJECTS) $(test_hkdf_LDADD) $(LIBS) +gcr/test_memory_icon-test-memory-icon.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-memory-icon$(EXEEXT): $(test_memory_icon_OBJECTS) $(test_memory_icon_DEPENDENCIES) $(EXTRA_test_memory_icon_DEPENDENCIES) + @rm -f test-memory-icon$(EXEEXT) + $(AM_V_CCLD)$(test_memory_icon_LINK) $(test_memory_icon_OBJECTS) $(test_memory_icon_LDADD) $(LIBS) +egg/test-oid.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-oid$(EXEEXT): $(test_oid_OBJECTS) $(test_oid_DEPENDENCIES) $(EXTRA_test_oid_DEPENDENCIES) + @rm -f test-oid$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_oid_OBJECTS) $(test_oid_LDADD) $(LIBS) +gcr/test_openpgp-test-openpgp.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-openpgp$(EXEEXT): $(test_openpgp_OBJECTS) $(test_openpgp_DEPENDENCIES) $(EXTRA_test_openpgp_DEPENDENCIES) + @rm -f test-openpgp$(EXEEXT) + $(AM_V_CCLD)$(test_openpgp_LINK) $(test_openpgp_OBJECTS) $(test_openpgp_LDADD) $(LIBS) +gcr/test_openssh-test-openssh.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-openssh$(EXEEXT): $(test_openssh_OBJECTS) $(test_openssh_DEPENDENCIES) $(EXTRA_test_openssh_DEPENDENCIES) + @rm -f test-openssh$(EXEEXT) + $(AM_V_CCLD)$(test_openssh_LINK) $(test_openssh_OBJECTS) $(test_openssh_LDADD) $(LIBS) +egg/test-openssl.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-openssl$(EXEEXT): $(test_openssl_OBJECTS) $(test_openssl_DEPENDENCIES) $(EXTRA_test_openssl_DEPENDENCIES) + @rm -f test-openssl$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_openssl_OBJECTS) $(test_openssl_LDADD) $(LIBS) +egg/test-padding.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-padding$(EXEEXT): $(test_padding_OBJECTS) $(test_padding_DEPENDENCIES) $(EXTRA_test_padding_DEPENDENCIES) + @rm -f test-padding$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_padding_OBJECTS) $(test_padding_LDADD) $(LIBS) +gcr/test_parser-test-parser.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-parser$(EXEEXT): $(test_parser_OBJECTS) $(test_parser_DEPENDENCIES) $(EXTRA_test_parser_DEPENDENCIES) + @rm -f test-parser$(EXEEXT) + $(AM_V_CCLD)$(test_parser_LINK) $(test_parser_OBJECTS) $(test_parser_LDADD) $(LIBS) +gcr/test_pkcs11_certificate-test-pkcs11-certificate.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-pkcs11-certificate$(EXEEXT): $(test_pkcs11_certificate_OBJECTS) $(test_pkcs11_certificate_DEPENDENCIES) $(EXTRA_test_pkcs11_certificate_DEPENDENCIES) + @rm -f test-pkcs11-certificate$(EXEEXT) + $(AM_V_CCLD)$(test_pkcs11_certificate_LINK) $(test_pkcs11_certificate_OBJECTS) $(test_pkcs11_certificate_LDADD) $(LIBS) +gcr/test_record-test-record.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-record$(EXEEXT): $(test_record_OBJECTS) $(test_record_DEPENDENCIES) $(EXTRA_test_record_DEPENDENCIES) + @rm -f test-record$(EXEEXT) + $(AM_V_CCLD)$(test_record_LINK) $(test_record_OBJECTS) $(test_record_LDADD) $(LIBS) +egg/test-secmem.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-secmem$(EXEEXT): $(test_secmem_OBJECTS) $(test_secmem_DEPENDENCIES) $(EXTRA_test_secmem_DEPENDENCIES) + @rm -f test-secmem$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_secmem_OBJECTS) $(test_secmem_LDADD) $(LIBS) +gcr/test_secret_exchange-test-secret-exchange.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-secret-exchange$(EXEEXT): $(test_secret_exchange_OBJECTS) $(test_secret_exchange_DEPENDENCIES) $(EXTRA_test_secret_exchange_DEPENDENCIES) + @rm -f test-secret-exchange$(EXEEXT) + $(AM_V_CCLD)$(test_secret_exchange_LINK) $(test_secret_exchange_OBJECTS) $(test_secret_exchange_LDADD) $(LIBS) +gcr/test_secure_memory-test-secure-memory.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-secure-memory$(EXEEXT): $(test_secure_memory_OBJECTS) $(test_secure_memory_DEPENDENCIES) $(EXTRA_test_secure_memory_DEPENDENCIES) + @rm -f test-secure-memory$(EXEEXT) + $(AM_V_CCLD)$(test_secure_memory_LINK) $(test_secure_memory_OBJECTS) $(test_secure_memory_LDADD) $(LIBS) +gcr/test_simple_certificate-test-simple-certificate.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-simple-certificate$(EXEEXT): $(test_simple_certificate_OBJECTS) $(test_simple_certificate_DEPENDENCIES) $(EXTRA_test_simple_certificate_DEPENDENCIES) + @rm -f test-simple-certificate$(EXEEXT) + $(AM_V_CCLD)$(test_simple_certificate_LINK) $(test_simple_certificate_OBJECTS) $(test_simple_certificate_LDADD) $(LIBS) +gcr/test_ssh_askpass-test-ssh-askpass.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-ssh-askpass$(EXEEXT): $(test_ssh_askpass_OBJECTS) $(test_ssh_askpass_DEPENDENCIES) $(EXTRA_test_ssh_askpass_DEPENDENCIES) + @rm -f test-ssh-askpass$(EXEEXT) + $(AM_V_CCLD)$(test_ssh_askpass_LINK) $(test_ssh_askpass_OBJECTS) $(test_ssh_askpass_LDADD) $(LIBS) +gcr/test_subject_public_key-test-subject-public-key.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-subject-public-key$(EXEEXT): $(test_subject_public_key_OBJECTS) $(test_subject_public_key_DEPENDENCIES) $(EXTRA_test_subject_public_key_DEPENDENCIES) + @rm -f test-subject-public-key$(EXEEXT) + $(AM_V_CCLD)$(test_subject_public_key_LINK) $(test_subject_public_key_OBJECTS) $(test_subject_public_key_LDADD) $(LIBS) +egg/test-symkey.$(OBJEXT): egg/$(am__dirstamp) \ + egg/$(DEPDIR)/$(am__dirstamp) + +test-symkey$(EXEEXT): $(test_symkey_OBJECTS) $(test_symkey_DEPENDENCIES) $(EXTRA_test_symkey_DEPENDENCIES) + @rm -f test-symkey$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_symkey_OBJECTS) $(test_symkey_LDADD) $(LIBS) +gcr/test_system_prompt-test-system-prompt.$(OBJEXT): \ + gcr/$(am__dirstamp) gcr/$(DEPDIR)/$(am__dirstamp) + +test-system-prompt$(EXEEXT): $(test_system_prompt_OBJECTS) $(test_system_prompt_DEPENDENCIES) $(EXTRA_test_system_prompt_DEPENDENCIES) + @rm -f test-system-prompt$(EXEEXT) + $(AM_V_CCLD)$(test_system_prompt_LINK) $(test_system_prompt_OBJECTS) $(test_system_prompt_LDADD) $(LIBS) +gcr/test_trust-test-trust.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-trust$(EXEEXT): $(test_trust_OBJECTS) $(test_trust_DEPENDENCIES) $(EXTRA_test_trust_DEPENDENCIES) + @rm -f test-trust$(EXEEXT) + $(AM_V_CCLD)$(test_trust_LINK) $(test_trust_OBJECTS) $(test_trust_LDADD) $(LIBS) +gcr/test_util-test-util.$(OBJEXT): gcr/$(am__dirstamp) \ + gcr/$(DEPDIR)/$(am__dirstamp) + +test-util$(EXEEXT): $(test_util_OBJECTS) $(test_util_DEPENDENCIES) $(EXTRA_test_util_DEPENDENCIES) + @rm -f test-util$(EXEEXT) + $(AM_V_CCLD)$(test_util_LINK) $(test_util_OBJECTS) $(test_util_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f egg/*.$(OBJEXT) + -rm -f egg/*.lo + -rm -f gck/*.$(OBJEXT) + -rm -f gck/*.lo + -rm -f gcr/*.$(OBJEXT) + -rm -f gcr/*.lo + -rm -f ui/*.$(OBJEXT) + -rm -f ui/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/egg-secure-memory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_asn1x_la-egg-asn1x.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_hex_la-egg-hex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-armor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-asn1-defs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-asn1x.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-decimal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-dh.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-dn.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-hex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-hkdf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-libgcrypt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-oid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-openssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-padding.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-secure-memory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-symkey.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-testing.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_la-egg-timegm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_test_la-egg-testing.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/libegg_test_la-mock-interaction.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-armor.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-asn1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-asn1x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-decimal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-dh.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-dn.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-hex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-hkdf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-oid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-openssl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-padding.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-secmem.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@egg/$(DEPDIR)/test-symkey.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-attributes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-call.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-dump.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enum-types.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enumerator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-interaction.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-module.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-modules.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object-cache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-password.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-session.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-slot.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-uri.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_testable_la-gck-mock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libgck_testable_la-gck-test.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/libmock_test_module_la-mock-test-module.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_attributes-test-gck-attributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_crypto-test-gck-crypto.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_enumerator-test-gck-enumerator.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_module-test-gck-module.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_modules-test-gck-modules.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_object-test-gck-object.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_session-test-gck-session.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_slot-test-gck-slot.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gck/$(DEPDIR)/test_gck_uri-test-gck-uri.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/frob_certificate_request-console-interaction.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/frob_certificate_request-frob-certificate-request.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/frob_openpgp-frob-openpgp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/frob_parser-frob-parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/gcr_ssh_askpass-gcr-ssh-askpass.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-collection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-column.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-icons.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-importer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-library.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-oids.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-record.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-trust.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_certificate-test-certificate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_certificate_chain-test-certificate-chain.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_filter_collection-test-filter-collection.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_fingerprint-test-fingerprint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_gnupg_collection-test-gnupg-collection.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_gnupg_key-test-gnupg-key.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_gnupg_process-test-gnupg-process.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_memory_icon-test-memory-icon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_openpgp-test-openpgp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_openssh-test-openssh.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_parser-test-parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_pkcs11_certificate-test-pkcs11-certificate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_record-test-record.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_secret_exchange-test-secret-exchange.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_secure_memory-test-secure-memory.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_simple_certificate-test-simple-certificate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_ssh_askpass-test-ssh-askpass.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_subject_public_key-test-subject-public-key.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_system_prompt-test-system-prompt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_trust-test-trust.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gcr/$(DEPDIR)/test_util-test-util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_certificate-frob-certificate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_combo_selector-frob-combo-selector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_gnupg_selector-frob-gnupg-selector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_import_button-frob-import-button.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_key-frob-key.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_prompt-frob-prompt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_request-frob-request.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_system_prompt-frob-system-prompt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_tree_selector-frob-tree-selector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_unlock-frob-unlock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_unlock-gcr-viewer-window.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/frob_unlock_options-frob-unlock-options.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/gcr_prompter-gcr-prompter-tool.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/gcr_viewer-gcr-viewer-tool.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +egg/libegg_asn1x_la-egg-asn1x.lo: egg/egg-asn1x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_asn1x_la_CFLAGS) $(CFLAGS) -MT egg/libegg_asn1x_la-egg-asn1x.lo -MD -MP -MF egg/$(DEPDIR)/libegg_asn1x_la-egg-asn1x.Tpo -c -o egg/libegg_asn1x_la-egg-asn1x.lo `test -f 'egg/egg-asn1x.c' || echo '$(srcdir)/'`egg/egg-asn1x.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_asn1x_la-egg-asn1x.Tpo egg/$(DEPDIR)/libegg_asn1x_la-egg-asn1x.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-asn1x.c' object='egg/libegg_asn1x_la-egg-asn1x.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_asn1x_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_asn1x_la-egg-asn1x.lo `test -f 'egg/egg-asn1x.c' || echo '$(srcdir)/'`egg/egg-asn1x.c + +egg/libegg_hex_la-egg-hex.lo: egg/egg-hex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_hex_la_CFLAGS) $(CFLAGS) -MT egg/libegg_hex_la-egg-hex.lo -MD -MP -MF egg/$(DEPDIR)/libegg_hex_la-egg-hex.Tpo -c -o egg/libegg_hex_la-egg-hex.lo `test -f 'egg/egg-hex.c' || echo '$(srcdir)/'`egg/egg-hex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_hex_la-egg-hex.Tpo egg/$(DEPDIR)/libegg_hex_la-egg-hex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-hex.c' object='egg/libegg_hex_la-egg-hex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_hex_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_hex_la-egg-hex.lo `test -f 'egg/egg-hex.c' || echo '$(srcdir)/'`egg/egg-hex.c + +egg/libegg_test_la-egg-testing.lo: egg/egg-testing.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_test_la_CFLAGS) $(CFLAGS) -MT egg/libegg_test_la-egg-testing.lo -MD -MP -MF egg/$(DEPDIR)/libegg_test_la-egg-testing.Tpo -c -o egg/libegg_test_la-egg-testing.lo `test -f 'egg/egg-testing.c' || echo '$(srcdir)/'`egg/egg-testing.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_test_la-egg-testing.Tpo egg/$(DEPDIR)/libegg_test_la-egg-testing.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-testing.c' object='egg/libegg_test_la-egg-testing.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_test_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_test_la-egg-testing.lo `test -f 'egg/egg-testing.c' || echo '$(srcdir)/'`egg/egg-testing.c + +egg/libegg_test_la-mock-interaction.lo: egg/mock-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_test_la_CFLAGS) $(CFLAGS) -MT egg/libegg_test_la-mock-interaction.lo -MD -MP -MF egg/$(DEPDIR)/libegg_test_la-mock-interaction.Tpo -c -o egg/libegg_test_la-mock-interaction.lo `test -f 'egg/mock-interaction.c' || echo '$(srcdir)/'`egg/mock-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_test_la-mock-interaction.Tpo egg/$(DEPDIR)/libegg_test_la-mock-interaction.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/mock-interaction.c' object='egg/libegg_test_la-mock-interaction.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_test_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_test_la-mock-interaction.lo `test -f 'egg/mock-interaction.c' || echo '$(srcdir)/'`egg/mock-interaction.c + +egg/libegg_la-egg-armor.lo: egg/egg-armor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-armor.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-armor.Tpo -c -o egg/libegg_la-egg-armor.lo `test -f 'egg/egg-armor.c' || echo '$(srcdir)/'`egg/egg-armor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-armor.Tpo egg/$(DEPDIR)/libegg_la-egg-armor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-armor.c' object='egg/libegg_la-egg-armor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-armor.lo `test -f 'egg/egg-armor.c' || echo '$(srcdir)/'`egg/egg-armor.c + +egg/libegg_la-egg-asn1x.lo: egg/egg-asn1x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-asn1x.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-asn1x.Tpo -c -o egg/libegg_la-egg-asn1x.lo `test -f 'egg/egg-asn1x.c' || echo '$(srcdir)/'`egg/egg-asn1x.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-asn1x.Tpo egg/$(DEPDIR)/libegg_la-egg-asn1x.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-asn1x.c' object='egg/libegg_la-egg-asn1x.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-asn1x.lo `test -f 'egg/egg-asn1x.c' || echo '$(srcdir)/'`egg/egg-asn1x.c + +egg/libegg_la-egg-asn1-defs.lo: egg/egg-asn1-defs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-asn1-defs.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-asn1-defs.Tpo -c -o egg/libegg_la-egg-asn1-defs.lo `test -f 'egg/egg-asn1-defs.c' || echo '$(srcdir)/'`egg/egg-asn1-defs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-asn1-defs.Tpo egg/$(DEPDIR)/libegg_la-egg-asn1-defs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-asn1-defs.c' object='egg/libegg_la-egg-asn1-defs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-asn1-defs.lo `test -f 'egg/egg-asn1-defs.c' || echo '$(srcdir)/'`egg/egg-asn1-defs.c + +egg/libegg_la-egg-buffer.lo: egg/egg-buffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-buffer.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-buffer.Tpo -c -o egg/libegg_la-egg-buffer.lo `test -f 'egg/egg-buffer.c' || echo '$(srcdir)/'`egg/egg-buffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-buffer.Tpo egg/$(DEPDIR)/libegg_la-egg-buffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-buffer.c' object='egg/libegg_la-egg-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-buffer.lo `test -f 'egg/egg-buffer.c' || echo '$(srcdir)/'`egg/egg-buffer.c + +egg/libegg_la-egg-dh.lo: egg/egg-dh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-dh.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-dh.Tpo -c -o egg/libegg_la-egg-dh.lo `test -f 'egg/egg-dh.c' || echo '$(srcdir)/'`egg/egg-dh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-dh.Tpo egg/$(DEPDIR)/libegg_la-egg-dh.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-dh.c' object='egg/libegg_la-egg-dh.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-dh.lo `test -f 'egg/egg-dh.c' || echo '$(srcdir)/'`egg/egg-dh.c + +egg/libegg_la-egg-dn.lo: egg/egg-dn.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-dn.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-dn.Tpo -c -o egg/libegg_la-egg-dn.lo `test -f 'egg/egg-dn.c' || echo '$(srcdir)/'`egg/egg-dn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-dn.Tpo egg/$(DEPDIR)/libegg_la-egg-dn.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-dn.c' object='egg/libegg_la-egg-dn.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-dn.lo `test -f 'egg/egg-dn.c' || echo '$(srcdir)/'`egg/egg-dn.c + +egg/libegg_la-egg-decimal.lo: egg/egg-decimal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-decimal.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-decimal.Tpo -c -o egg/libegg_la-egg-decimal.lo `test -f 'egg/egg-decimal.c' || echo '$(srcdir)/'`egg/egg-decimal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-decimal.Tpo egg/$(DEPDIR)/libegg_la-egg-decimal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-decimal.c' object='egg/libegg_la-egg-decimal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-decimal.lo `test -f 'egg/egg-decimal.c' || echo '$(srcdir)/'`egg/egg-decimal.c + +egg/libegg_la-egg-hex.lo: egg/egg-hex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-hex.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-hex.Tpo -c -o egg/libegg_la-egg-hex.lo `test -f 'egg/egg-hex.c' || echo '$(srcdir)/'`egg/egg-hex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-hex.Tpo egg/$(DEPDIR)/libegg_la-egg-hex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-hex.c' object='egg/libegg_la-egg-hex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-hex.lo `test -f 'egg/egg-hex.c' || echo '$(srcdir)/'`egg/egg-hex.c + +egg/libegg_la-egg-hkdf.lo: egg/egg-hkdf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-hkdf.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-hkdf.Tpo -c -o egg/libegg_la-egg-hkdf.lo `test -f 'egg/egg-hkdf.c' || echo '$(srcdir)/'`egg/egg-hkdf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-hkdf.Tpo egg/$(DEPDIR)/libegg_la-egg-hkdf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-hkdf.c' object='egg/libegg_la-egg-hkdf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-hkdf.lo `test -f 'egg/egg-hkdf.c' || echo '$(srcdir)/'`egg/egg-hkdf.c + +egg/libegg_la-egg-libgcrypt.lo: egg/egg-libgcrypt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-libgcrypt.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-libgcrypt.Tpo -c -o egg/libegg_la-egg-libgcrypt.lo `test -f 'egg/egg-libgcrypt.c' || echo '$(srcdir)/'`egg/egg-libgcrypt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-libgcrypt.Tpo egg/$(DEPDIR)/libegg_la-egg-libgcrypt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-libgcrypt.c' object='egg/libegg_la-egg-libgcrypt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-libgcrypt.lo `test -f 'egg/egg-libgcrypt.c' || echo '$(srcdir)/'`egg/egg-libgcrypt.c + +egg/libegg_la-egg-oid.lo: egg/egg-oid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-oid.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-oid.Tpo -c -o egg/libegg_la-egg-oid.lo `test -f 'egg/egg-oid.c' || echo '$(srcdir)/'`egg/egg-oid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-oid.Tpo egg/$(DEPDIR)/libegg_la-egg-oid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-oid.c' object='egg/libegg_la-egg-oid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-oid.lo `test -f 'egg/egg-oid.c' || echo '$(srcdir)/'`egg/egg-oid.c + +egg/libegg_la-egg-padding.lo: egg/egg-padding.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-padding.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-padding.Tpo -c -o egg/libegg_la-egg-padding.lo `test -f 'egg/egg-padding.c' || echo '$(srcdir)/'`egg/egg-padding.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-padding.Tpo egg/$(DEPDIR)/libegg_la-egg-padding.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-padding.c' object='egg/libegg_la-egg-padding.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-padding.lo `test -f 'egg/egg-padding.c' || echo '$(srcdir)/'`egg/egg-padding.c + +egg/libegg_la-egg-openssl.lo: egg/egg-openssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-openssl.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-openssl.Tpo -c -o egg/libegg_la-egg-openssl.lo `test -f 'egg/egg-openssl.c' || echo '$(srcdir)/'`egg/egg-openssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-openssl.Tpo egg/$(DEPDIR)/libegg_la-egg-openssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-openssl.c' object='egg/libegg_la-egg-openssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-openssl.lo `test -f 'egg/egg-openssl.c' || echo '$(srcdir)/'`egg/egg-openssl.c + +egg/libegg_la-egg-secure-memory.lo: egg/egg-secure-memory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-secure-memory.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-secure-memory.Tpo -c -o egg/libegg_la-egg-secure-memory.lo `test -f 'egg/egg-secure-memory.c' || echo '$(srcdir)/'`egg/egg-secure-memory.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-secure-memory.Tpo egg/$(DEPDIR)/libegg_la-egg-secure-memory.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-secure-memory.c' object='egg/libegg_la-egg-secure-memory.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-secure-memory.lo `test -f 'egg/egg-secure-memory.c' || echo '$(srcdir)/'`egg/egg-secure-memory.c + +egg/libegg_la-egg-symkey.lo: egg/egg-symkey.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-symkey.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-symkey.Tpo -c -o egg/libegg_la-egg-symkey.lo `test -f 'egg/egg-symkey.c' || echo '$(srcdir)/'`egg/egg-symkey.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-symkey.Tpo egg/$(DEPDIR)/libegg_la-egg-symkey.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-symkey.c' object='egg/libegg_la-egg-symkey.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-symkey.lo `test -f 'egg/egg-symkey.c' || echo '$(srcdir)/'`egg/egg-symkey.c + +egg/libegg_la-egg-testing.lo: egg/egg-testing.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-testing.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-testing.Tpo -c -o egg/libegg_la-egg-testing.lo `test -f 'egg/egg-testing.c' || echo '$(srcdir)/'`egg/egg-testing.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-testing.Tpo egg/$(DEPDIR)/libegg_la-egg-testing.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-testing.c' object='egg/libegg_la-egg-testing.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-testing.lo `test -f 'egg/egg-testing.c' || echo '$(srcdir)/'`egg/egg-testing.c + +egg/libegg_la-egg-timegm.lo: egg/egg-timegm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -MT egg/libegg_la-egg-timegm.lo -MD -MP -MF egg/$(DEPDIR)/libegg_la-egg-timegm.Tpo -c -o egg/libegg_la-egg-timegm.lo `test -f 'egg/egg-timegm.c' || echo '$(srcdir)/'`egg/egg-timegm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) egg/$(DEPDIR)/libegg_la-egg-timegm.Tpo egg/$(DEPDIR)/libegg_la-egg-timegm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egg/egg-timegm.c' object='egg/libegg_la-egg-timegm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libegg_la_CFLAGS) $(CFLAGS) -c -o egg/libegg_la-egg-timegm.lo `test -f 'egg/egg-timegm.c' || echo '$(srcdir)/'`egg/egg-timegm.c + +gck/libgck_@GCK_MAJOR@_la-gck-attributes.lo: gck/gck-attributes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-attributes.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-attributes.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-attributes.lo `test -f 'gck/gck-attributes.c' || echo '$(srcdir)/'`gck/gck-attributes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-attributes.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-attributes.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-attributes.c' object='gck/libgck_@GCK_MAJOR@_la-gck-attributes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-attributes.lo `test -f 'gck/gck-attributes.c' || echo '$(srcdir)/'`gck/gck-attributes.c + +gck/libgck_@GCK_MAJOR@_la-gck-dump.lo: gck/gck-dump.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-dump.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-dump.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-dump.lo `test -f 'gck/gck-dump.c' || echo '$(srcdir)/'`gck/gck-dump.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-dump.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-dump.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-dump.c' object='gck/libgck_@GCK_MAJOR@_la-gck-dump.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-dump.lo `test -f 'gck/gck-dump.c' || echo '$(srcdir)/'`gck/gck-dump.c + +gck/libgck_@GCK_MAJOR@_la-gck-enumerator.lo: gck/gck-enumerator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-enumerator.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enumerator.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-enumerator.lo `test -f 'gck/gck-enumerator.c' || echo '$(srcdir)/'`gck/gck-enumerator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enumerator.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enumerator.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-enumerator.c' object='gck/libgck_@GCK_MAJOR@_la-gck-enumerator.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-enumerator.lo `test -f 'gck/gck-enumerator.c' || echo '$(srcdir)/'`gck/gck-enumerator.c + +gck/libgck_@GCK_MAJOR@_la-gck-misc.lo: gck/gck-misc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-misc.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-misc.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-misc.lo `test -f 'gck/gck-misc.c' || echo '$(srcdir)/'`gck/gck-misc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-misc.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-misc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-misc.c' object='gck/libgck_@GCK_MAJOR@_la-gck-misc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-misc.lo `test -f 'gck/gck-misc.c' || echo '$(srcdir)/'`gck/gck-misc.c + +gck/libgck_@GCK_MAJOR@_la-gck-module.lo: gck/gck-module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-module.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-module.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-module.lo `test -f 'gck/gck-module.c' || echo '$(srcdir)/'`gck/gck-module.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-module.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-module.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-module.c' object='gck/libgck_@GCK_MAJOR@_la-gck-module.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-module.lo `test -f 'gck/gck-module.c' || echo '$(srcdir)/'`gck/gck-module.c + +gck/libgck_@GCK_MAJOR@_la-gck-modules.lo: gck/gck-modules.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-modules.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-modules.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-modules.lo `test -f 'gck/gck-modules.c' || echo '$(srcdir)/'`gck/gck-modules.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-modules.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-modules.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-modules.c' object='gck/libgck_@GCK_MAJOR@_la-gck-modules.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-modules.lo `test -f 'gck/gck-modules.c' || echo '$(srcdir)/'`gck/gck-modules.c + +gck/libgck_@GCK_MAJOR@_la-gck-object.lo: gck/gck-object.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-object.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-object.lo `test -f 'gck/gck-object.c' || echo '$(srcdir)/'`gck/gck-object.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-object.c' object='gck/libgck_@GCK_MAJOR@_la-gck-object.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-object.lo `test -f 'gck/gck-object.c' || echo '$(srcdir)/'`gck/gck-object.c + +gck/libgck_@GCK_MAJOR@_la-gck-object-cache.lo: gck/gck-object-cache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-object-cache.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object-cache.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-object-cache.lo `test -f 'gck/gck-object-cache.c' || echo '$(srcdir)/'`gck/gck-object-cache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object-cache.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-object-cache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-object-cache.c' object='gck/libgck_@GCK_MAJOR@_la-gck-object-cache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-object-cache.lo `test -f 'gck/gck-object-cache.c' || echo '$(srcdir)/'`gck/gck-object-cache.c + +gck/libgck_@GCK_MAJOR@_la-gck-password.lo: gck/gck-password.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-password.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-password.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-password.lo `test -f 'gck/gck-password.c' || echo '$(srcdir)/'`gck/gck-password.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-password.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-password.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-password.c' object='gck/libgck_@GCK_MAJOR@_la-gck-password.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-password.lo `test -f 'gck/gck-password.c' || echo '$(srcdir)/'`gck/gck-password.c + +gck/libgck_@GCK_MAJOR@_la-gck-session.lo: gck/gck-session.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-session.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-session.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-session.lo `test -f 'gck/gck-session.c' || echo '$(srcdir)/'`gck/gck-session.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-session.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-session.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-session.c' object='gck/libgck_@GCK_MAJOR@_la-gck-session.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-session.lo `test -f 'gck/gck-session.c' || echo '$(srcdir)/'`gck/gck-session.c + +gck/libgck_@GCK_MAJOR@_la-gck-slot.lo: gck/gck-slot.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-slot.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-slot.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-slot.lo `test -f 'gck/gck-slot.c' || echo '$(srcdir)/'`gck/gck-slot.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-slot.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-slot.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-slot.c' object='gck/libgck_@GCK_MAJOR@_la-gck-slot.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-slot.lo `test -f 'gck/gck-slot.c' || echo '$(srcdir)/'`gck/gck-slot.c + +gck/libgck_@GCK_MAJOR@_la-gck-uri.lo: gck/gck-uri.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-uri.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-uri.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-uri.lo `test -f 'gck/gck-uri.c' || echo '$(srcdir)/'`gck/gck-uri.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-uri.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-uri.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-uri.c' object='gck/libgck_@GCK_MAJOR@_la-gck-uri.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-uri.lo `test -f 'gck/gck-uri.c' || echo '$(srcdir)/'`gck/gck-uri.c + +gck/libgck_@GCK_MAJOR@_la-gck-call.lo: gck/gck-call.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-call.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-call.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-call.lo `test -f 'gck/gck-call.c' || echo '$(srcdir)/'`gck/gck-call.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-call.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-call.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-call.c' object='gck/libgck_@GCK_MAJOR@_la-gck-call.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-call.lo `test -f 'gck/gck-call.c' || echo '$(srcdir)/'`gck/gck-call.c + +gck/libgck_@GCK_MAJOR@_la-gck-interaction.lo: gck/gck-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-interaction.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-interaction.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-interaction.lo `test -f 'gck/gck-interaction.c' || echo '$(srcdir)/'`gck/gck-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-interaction.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-interaction.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-interaction.c' object='gck/libgck_@GCK_MAJOR@_la-gck-interaction.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-interaction.lo `test -f 'gck/gck-interaction.c' || echo '$(srcdir)/'`gck/gck-interaction.c + +gck/libgck_@GCK_MAJOR@_la-gck-marshal.lo: gck/gck-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-marshal.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-marshal.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-marshal.lo `test -f 'gck/gck-marshal.c' || echo '$(srcdir)/'`gck/gck-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-marshal.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-marshal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-marshal.c' object='gck/libgck_@GCK_MAJOR@_la-gck-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-marshal.lo `test -f 'gck/gck-marshal.c' || echo '$(srcdir)/'`gck/gck-marshal.c + +gck/libgck_@GCK_MAJOR@_la-gck-enum-types.lo: gck/gck-enum-types.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gck/libgck_@GCK_MAJOR@_la-gck-enum-types.lo -MD -MP -MF gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enum-types.Tpo -c -o gck/libgck_@GCK_MAJOR@_la-gck-enum-types.lo `test -f 'gck/gck-enum-types.c' || echo '$(srcdir)/'`gck/gck-enum-types.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enum-types.Tpo gck/$(DEPDIR)/libgck_@GCK_MAJOR@_la-gck-enum-types.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-enum-types.c' object='gck/libgck_@GCK_MAJOR@_la-gck-enum-types.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_@GCK_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_@GCK_MAJOR@_la-gck-enum-types.lo `test -f 'gck/gck-enum-types.c' || echo '$(srcdir)/'`gck/gck-enum-types.c + +gck/libgck_testable_la-gck-mock.lo: gck/gck-mock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_testable_la_CFLAGS) $(CFLAGS) -MT gck/libgck_testable_la-gck-mock.lo -MD -MP -MF gck/$(DEPDIR)/libgck_testable_la-gck-mock.Tpo -c -o gck/libgck_testable_la-gck-mock.lo `test -f 'gck/gck-mock.c' || echo '$(srcdir)/'`gck/gck-mock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_testable_la-gck-mock.Tpo gck/$(DEPDIR)/libgck_testable_la-gck-mock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-mock.c' object='gck/libgck_testable_la-gck-mock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_testable_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_testable_la-gck-mock.lo `test -f 'gck/gck-mock.c' || echo '$(srcdir)/'`gck/gck-mock.c + +gck/libgck_testable_la-gck-test.lo: gck/gck-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_testable_la_CFLAGS) $(CFLAGS) -MT gck/libgck_testable_la-gck-test.lo -MD -MP -MF gck/$(DEPDIR)/libgck_testable_la-gck-test.Tpo -c -o gck/libgck_testable_la-gck-test.lo `test -f 'gck/gck-test.c' || echo '$(srcdir)/'`gck/gck-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libgck_testable_la-gck-test.Tpo gck/$(DEPDIR)/libgck_testable_la-gck-test.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/gck-test.c' object='gck/libgck_testable_la-gck-test.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgck_testable_la_CFLAGS) $(CFLAGS) -c -o gck/libgck_testable_la-gck-test.lo `test -f 'gck/gck-test.c' || echo '$(srcdir)/'`gck/gck-test.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.lo: gcr/gcr-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.lo `test -f 'gcr/gcr-certificate.c' || echo '$(srcdir)/'`gcr/gcr-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-certificate.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate.lo `test -f 'gcr/gcr-certificate.c' || echo '$(srcdir)/'`gcr/gcr-certificate.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.lo: gcr/gcr-certificate-chain.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.lo `test -f 'gcr/gcr-certificate-chain.c' || echo '$(srcdir)/'`gcr/gcr-certificate-chain.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-certificate-chain.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-chain.lo `test -f 'gcr/gcr-certificate-chain.c' || echo '$(srcdir)/'`gcr/gcr-certificate-chain.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.lo: gcr/gcr-certificate-request.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.lo `test -f 'gcr/gcr-certificate-request.c' || echo '$(srcdir)/'`gcr/gcr-certificate-request.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-certificate-request.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-request.lo `test -f 'gcr/gcr-certificate-request.c' || echo '$(srcdir)/'`gcr/gcr-certificate-request.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-collection.lo: gcr/gcr-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-collection.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-collection.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-collection.lo `test -f 'gcr/gcr-collection.c' || echo '$(srcdir)/'`gcr/gcr-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-collection.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-collection.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-collection.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-collection.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-collection.lo `test -f 'gcr/gcr-collection.c' || echo '$(srcdir)/'`gcr/gcr-collection.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.lo: gcr/gcr-comparable.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.lo `test -f 'gcr/gcr-comparable.c' || echo '$(srcdir)/'`gcr/gcr-comparable.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-comparable.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-comparable.lo `test -f 'gcr/gcr-comparable.c' || echo '$(srcdir)/'`gcr/gcr-comparable.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.lo: gcr/gcr-filter-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.lo `test -f 'gcr/gcr-filter-collection.c' || echo '$(srcdir)/'`gcr/gcr-filter-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-filter-collection.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-filter-collection.lo `test -f 'gcr/gcr-filter-collection.c' || echo '$(srcdir)/'`gcr/gcr-filter-collection.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.lo: gcr/gcr-fingerprint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.lo `test -f 'gcr/gcr-fingerprint.c' || echo '$(srcdir)/'`gcr/gcr-fingerprint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-fingerprint.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-fingerprint.lo `test -f 'gcr/gcr-fingerprint.c' || echo '$(srcdir)/'`gcr/gcr-fingerprint.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-icons.lo: gcr/gcr-icons.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-icons.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-icons.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-icons.lo `test -f 'gcr/gcr-icons.c' || echo '$(srcdir)/'`gcr/gcr-icons.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-icons.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-icons.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-icons.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-icons.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-icons.lo `test -f 'gcr/gcr-icons.c' || echo '$(srcdir)/'`gcr/gcr-icons.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-importer.lo: gcr/gcr-importer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-importer.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-importer.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-importer.lo `test -f 'gcr/gcr-importer.c' || echo '$(srcdir)/'`gcr/gcr-importer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-importer.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-importer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-importer.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-importer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-importer.lo `test -f 'gcr/gcr-importer.c' || echo '$(srcdir)/'`gcr/gcr-importer.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.lo: gcr/gcr-import-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.lo `test -f 'gcr/gcr-import-interaction.c' || echo '$(srcdir)/'`gcr/gcr-import-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-import-interaction.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-import-interaction.lo `test -f 'gcr/gcr-import-interaction.c' || echo '$(srcdir)/'`gcr/gcr-import-interaction.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-library.lo: gcr/gcr-library.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-library.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-library.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-library.lo `test -f 'gcr/gcr-library.c' || echo '$(srcdir)/'`gcr/gcr-library.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-library.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-library.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-library.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-library.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-library.lo `test -f 'gcr/gcr-library.c' || echo '$(srcdir)/'`gcr/gcr-library.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.lo: gcr/gcr-mock-prompter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.lo `test -f 'gcr/gcr-mock-prompter.c' || echo '$(srcdir)/'`gcr/gcr-mock-prompter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-mock-prompter.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-mock-prompter.lo `test -f 'gcr/gcr-mock-prompter.c' || echo '$(srcdir)/'`gcr/gcr-mock-prompter.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-parser.lo: gcr/gcr-parser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-parser.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-parser.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-parser.lo `test -f 'gcr/gcr-parser.c' || echo '$(srcdir)/'`gcr/gcr-parser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-parser.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-parser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-parser.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-parser.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-parser.lo `test -f 'gcr/gcr-parser.c' || echo '$(srcdir)/'`gcr/gcr-parser.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.lo: gcr/gcr-pkcs11-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.lo `test -f 'gcr/gcr-pkcs11-certificate.c' || echo '$(srcdir)/'`gcr/gcr-pkcs11-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-pkcs11-certificate.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-certificate.lo `test -f 'gcr/gcr-pkcs11-certificate.c' || echo '$(srcdir)/'`gcr/gcr-pkcs11-certificate.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.lo: gcr/gcr-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.lo `test -f 'gcr/gcr-prompt.c' || echo '$(srcdir)/'`gcr/gcr-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-prompt.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-prompt.lo `test -f 'gcr/gcr-prompt.c' || echo '$(srcdir)/'`gcr/gcr-prompt.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.lo: gcr/gcr-secret-exchange.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.lo `test -f 'gcr/gcr-secret-exchange.c' || echo '$(srcdir)/'`gcr/gcr-secret-exchange.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-secret-exchange.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secret-exchange.lo `test -f 'gcr/gcr-secret-exchange.c' || echo '$(srcdir)/'`gcr/gcr-secret-exchange.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.lo: gcr/gcr-secure-memory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.lo `test -f 'gcr/gcr-secure-memory.c' || echo '$(srcdir)/'`gcr/gcr-secure-memory.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-secure-memory.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-secure-memory.lo `test -f 'gcr/gcr-secure-memory.c' || echo '$(srcdir)/'`gcr/gcr-secure-memory.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.lo: gcr/gcr-simple-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.lo `test -f 'gcr/gcr-simple-certificate.c' || echo '$(srcdir)/'`gcr/gcr-simple-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-simple-certificate.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-certificate.lo `test -f 'gcr/gcr-simple-certificate.c' || echo '$(srcdir)/'`gcr/gcr-simple-certificate.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.lo: gcr/gcr-simple-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.lo `test -f 'gcr/gcr-simple-collection.c' || echo '$(srcdir)/'`gcr/gcr-simple-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-simple-collection.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-simple-collection.lo `test -f 'gcr/gcr-simple-collection.c' || echo '$(srcdir)/'`gcr/gcr-simple-collection.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.lo: gcr/gcr-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.lo `test -f 'gcr/gcr-ssh-askpass.c' || echo '$(srcdir)/'`gcr/gcr-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-ssh-askpass.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-ssh-askpass.lo `test -f 'gcr/gcr-ssh-askpass.c' || echo '$(srcdir)/'`gcr/gcr-ssh-askpass.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.lo: gcr/gcr-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.lo `test -f 'gcr/gcr-system-prompt.c' || echo '$(srcdir)/'`gcr/gcr-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-system-prompt.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompt.lo `test -f 'gcr/gcr-system-prompt.c' || echo '$(srcdir)/'`gcr/gcr-system-prompt.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.lo: gcr/gcr-system-prompter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.lo `test -f 'gcr/gcr-system-prompter.c' || echo '$(srcdir)/'`gcr/gcr-system-prompter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-system-prompter.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-system-prompter.lo `test -f 'gcr/gcr-system-prompter.c' || echo '$(srcdir)/'`gcr/gcr-system-prompter.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.lo: gcr/gcr-union-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.lo `test -f 'gcr/gcr-union-collection.c' || echo '$(srcdir)/'`gcr/gcr-union-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-union-collection.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-union-collection.lo `test -f 'gcr/gcr-union-collection.c' || echo '$(srcdir)/'`gcr/gcr-union-collection.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.lo: gcr/gcr-callback-output-stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.lo `test -f 'gcr/gcr-callback-output-stream.c' || echo '$(srcdir)/'`gcr/gcr-callback-output-stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-callback-output-stream.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-callback-output-stream.lo `test -f 'gcr/gcr-callback-output-stream.c' || echo '$(srcdir)/'`gcr/gcr-callback-output-stream.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.lo: gcr/gcr-certificate-extensions.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.lo `test -f 'gcr/gcr-certificate-extensions.c' || echo '$(srcdir)/'`gcr/gcr-certificate-extensions.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-certificate-extensions.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-certificate-extensions.lo `test -f 'gcr/gcr-certificate-extensions.c' || echo '$(srcdir)/'`gcr/gcr-certificate-extensions.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-column.lo: gcr/gcr-column.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-column.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-column.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-column.lo `test -f 'gcr/gcr-column.c' || echo '$(srcdir)/'`gcr/gcr-column.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-column.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-column.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-column.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-column.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-column.lo `test -f 'gcr/gcr-column.c' || echo '$(srcdir)/'`gcr/gcr-column.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.lo: gcr/gcr-gnupg-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.lo `test -f 'gcr/gcr-gnupg-collection.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-gnupg-collection.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-collection.lo `test -f 'gcr/gcr-gnupg-collection.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-collection.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.lo: gcr/gcr-gnupg-importer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.lo `test -f 'gcr/gcr-gnupg-importer.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-importer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-gnupg-importer.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-importer.lo `test -f 'gcr/gcr-gnupg-importer.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-importer.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.lo: gcr/gcr-gnupg-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.lo `test -f 'gcr/gcr-gnupg-key.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-key.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-gnupg-key.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-key.lo `test -f 'gcr/gcr-gnupg-key.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-key.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.lo: gcr/gcr-gnupg-process.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.lo `test -f 'gcr/gcr-gnupg-process.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-process.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-gnupg-process.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-process.lo `test -f 'gcr/gcr-gnupg-process.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-process.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.lo: gcr/gcr-gnupg-records.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.lo `test -f 'gcr/gcr-gnupg-records.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-records.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-gnupg-records.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-records.lo `test -f 'gcr/gcr-gnupg-records.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-records.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.lo: gcr/gcr-gnupg-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.lo `test -f 'gcr/gcr-gnupg-util.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-gnupg-util.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-gnupg-util.lo `test -f 'gcr/gcr-gnupg-util.c' || echo '$(srcdir)/'`gcr/gcr-gnupg-util.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.lo: gcr/gcr-key-mechanisms.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.lo `test -f 'gcr/gcr-key-mechanisms.c' || echo '$(srcdir)/'`gcr/gcr-key-mechanisms.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-key-mechanisms.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-key-mechanisms.lo `test -f 'gcr/gcr-key-mechanisms.c' || echo '$(srcdir)/'`gcr/gcr-key-mechanisms.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.lo: gcr/gcr-memory-icon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.lo `test -f 'gcr/gcr-memory-icon.c' || echo '$(srcdir)/'`gcr/gcr-memory-icon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-memory-icon.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-memory-icon.lo `test -f 'gcr/gcr-memory-icon.c' || echo '$(srcdir)/'`gcr/gcr-memory-icon.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.lo: gcr/gcr-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.lo `test -f 'gcr/gcr-openpgp.c' || echo '$(srcdir)/'`gcr/gcr-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-openpgp.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openpgp.lo `test -f 'gcr/gcr-openpgp.c' || echo '$(srcdir)/'`gcr/gcr-openpgp.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.lo: gcr/gcr-openssh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.lo `test -f 'gcr/gcr-openssh.c' || echo '$(srcdir)/'`gcr/gcr-openssh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-openssh.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-openssh.lo `test -f 'gcr/gcr-openssh.c' || echo '$(srcdir)/'`gcr/gcr-openssh.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.lo: gcr/gcr-pkcs11-importer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.lo `test -f 'gcr/gcr-pkcs11-importer.c' || echo '$(srcdir)/'`gcr/gcr-pkcs11-importer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-pkcs11-importer.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-pkcs11-importer.lo `test -f 'gcr/gcr-pkcs11-importer.c' || echo '$(srcdir)/'`gcr/gcr-pkcs11-importer.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-record.lo: gcr/gcr-record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-record.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-record.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-record.lo `test -f 'gcr/gcr-record.c' || echo '$(srcdir)/'`gcr/gcr-record.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-record.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-record.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-record.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-record.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-record.lo `test -f 'gcr/gcr-record.c' || echo '$(srcdir)/'`gcr/gcr-record.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.lo: gcr/gcr-single-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.lo `test -f 'gcr/gcr-single-collection.c' || echo '$(srcdir)/'`gcr/gcr-single-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-single-collection.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-single-collection.lo `test -f 'gcr/gcr-single-collection.c' || echo '$(srcdir)/'`gcr/gcr-single-collection.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.lo: gcr/gcr-subject-public-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.lo `test -f 'gcr/gcr-subject-public-key.c' || echo '$(srcdir)/'`gcr/gcr-subject-public-key.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-subject-public-key.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-subject-public-key.lo `test -f 'gcr/gcr-subject-public-key.c' || echo '$(srcdir)/'`gcr/gcr-subject-public-key.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-trust.lo: gcr/gcr-trust.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-trust.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-trust.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-trust.lo `test -f 'gcr/gcr-trust.c' || echo '$(srcdir)/'`gcr/gcr-trust.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-trust.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-trust.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-trust.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-trust.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-trust.lo `test -f 'gcr/gcr-trust.c' || echo '$(srcdir)/'`gcr/gcr-trust.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-util.lo: gcr/gcr-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-util.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-util.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-util.lo `test -f 'gcr/gcr-util.c' || echo '$(srcdir)/'`gcr/gcr-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-util.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-util.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-util.lo `test -f 'gcr/gcr-util.c' || echo '$(srcdir)/'`gcr/gcr-util.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.lo: gcr/gcr-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.lo `test -f 'gcr/gcr-marshal.c' || echo '$(srcdir)/'`gcr/gcr-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-marshal.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-marshal.lo `test -f 'gcr/gcr-marshal.c' || echo '$(srcdir)/'`gcr/gcr-marshal.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.lo: gcr/gcr-enum-types-base.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.lo `test -f 'gcr/gcr-enum-types-base.c' || echo '$(srcdir)/'`gcr/gcr-enum-types-base.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-enum-types-base.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-enum-types-base.lo `test -f 'gcr/gcr-enum-types-base.c' || echo '$(srcdir)/'`gcr/gcr-enum-types-base.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-oids.lo: gcr/gcr-oids.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-oids.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-oids.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-oids.lo `test -f 'gcr/gcr-oids.c' || echo '$(srcdir)/'`gcr/gcr-oids.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-oids.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-oids.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-oids.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-oids.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-oids.lo `test -f 'gcr/gcr-oids.c' || echo '$(srcdir)/'`gcr/gcr-oids.c + +gcr/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.lo: gcr/gcr-dbus-generated.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT gcr/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.lo -MD -MP -MF gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.Tpo -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.lo `test -f 'gcr/gcr-dbus-generated.c' || echo '$(srcdir)/'`gcr/gcr-dbus-generated.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.Tpo gcr/$(DEPDIR)/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-dbus-generated.c' object='gcr/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_base_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o gcr/libgcr_base_@GCR_MAJOR@_la-gcr-dbus-generated.lo `test -f 'gcr/gcr-dbus-generated.c' || echo '$(srcdir)/'`gcr/gcr-dbus-generated.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.lo: ui/gcr-certificate-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.lo `test -f 'ui/gcr-certificate-renderer.c' || echo '$(srcdir)/'`ui/gcr-certificate-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-certificate-renderer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-renderer.lo `test -f 'ui/gcr-certificate-renderer.c' || echo '$(srcdir)/'`ui/gcr-certificate-renderer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.lo: ui/gcr-certificate-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.lo `test -f 'ui/gcr-certificate-widget.c' || echo '$(srcdir)/'`ui/gcr-certificate-widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-certificate-widget.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-widget.lo `test -f 'ui/gcr-certificate-widget.c' || echo '$(srcdir)/'`ui/gcr-certificate-widget.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.lo: ui/gcr-collection-model.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.lo `test -f 'ui/gcr-collection-model.c' || echo '$(srcdir)/'`ui/gcr-collection-model.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-collection-model.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-collection-model.lo `test -f 'ui/gcr-collection-model.c' || echo '$(srcdir)/'`ui/gcr-collection-model.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.lo: ui/gcr-combo-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.lo `test -f 'ui/gcr-combo-selector.c' || echo '$(srcdir)/'`ui/gcr-combo-selector.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-combo-selector.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-combo-selector.lo `test -f 'ui/gcr-combo-selector.c' || echo '$(srcdir)/'`ui/gcr-combo-selector.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.lo: ui/gcr-failure-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.lo `test -f 'ui/gcr-failure-renderer.c' || echo '$(srcdir)/'`ui/gcr-failure-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-failure-renderer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-failure-renderer.lo `test -f 'ui/gcr-failure-renderer.c' || echo '$(srcdir)/'`ui/gcr-failure-renderer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.lo: ui/gcr-key-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.lo `test -f 'ui/gcr-key-renderer.c' || echo '$(srcdir)/'`ui/gcr-key-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-key-renderer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-renderer.lo `test -f 'ui/gcr-key-renderer.c' || echo '$(srcdir)/'`ui/gcr-key-renderer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.lo: ui/gcr-key-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.lo `test -f 'ui/gcr-key-widget.c' || echo '$(srcdir)/'`ui/gcr-key-widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-key-widget.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-key-widget.lo `test -f 'ui/gcr-key-widget.c' || echo '$(srcdir)/'`ui/gcr-key-widget.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.lo: ui/gcr-import-button.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.lo `test -f 'ui/gcr-import-button.c' || echo '$(srcdir)/'`ui/gcr-import-button.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-import-button.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-import-button.lo `test -f 'ui/gcr-import-button.c' || echo '$(srcdir)/'`ui/gcr-import-button.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.lo: ui/gcr-list-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.lo `test -f 'ui/gcr-list-selector.c' || echo '$(srcdir)/'`ui/gcr-list-selector.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-list-selector.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-list-selector.lo `test -f 'ui/gcr-list-selector.c' || echo '$(srcdir)/'`ui/gcr-list-selector.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.lo: ui/gcr-prompt-dialog.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.lo `test -f 'ui/gcr-prompt-dialog.c' || echo '$(srcdir)/'`ui/gcr-prompt-dialog.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-prompt-dialog.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-prompt-dialog.lo `test -f 'ui/gcr-prompt-dialog.c' || echo '$(srcdir)/'`ui/gcr-prompt-dialog.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.lo: ui/gcr-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.lo `test -f 'ui/gcr-renderer.c' || echo '$(srcdir)/'`ui/gcr-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-renderer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-renderer.lo `test -f 'ui/gcr-renderer.c' || echo '$(srcdir)/'`ui/gcr-renderer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.lo: ui/gcr-secure-entry-buffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.lo `test -f 'ui/gcr-secure-entry-buffer.c' || echo '$(srcdir)/'`ui/gcr-secure-entry-buffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-secure-entry-buffer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-secure-entry-buffer.lo `test -f 'ui/gcr-secure-entry-buffer.c' || echo '$(srcdir)/'`ui/gcr-secure-entry-buffer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.lo: ui/gcr-tree-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.lo `test -f 'ui/gcr-tree-selector.c' || echo '$(srcdir)/'`ui/gcr-tree-selector.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-tree-selector.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-tree-selector.lo `test -f 'ui/gcr-tree-selector.c' || echo '$(srcdir)/'`ui/gcr-tree-selector.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.lo: ui/gcr-unlock-options-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.lo `test -f 'ui/gcr-unlock-options-widget.c' || echo '$(srcdir)/'`ui/gcr-unlock-options-widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-unlock-options-widget.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-options-widget.lo `test -f 'ui/gcr-unlock-options-widget.c' || echo '$(srcdir)/'`ui/gcr-unlock-options-widget.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.lo: ui/gcr-viewer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.lo `test -f 'ui/gcr-viewer.c' || echo '$(srcdir)/'`ui/gcr-viewer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-viewer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer.lo `test -f 'ui/gcr-viewer.c' || echo '$(srcdir)/'`ui/gcr-viewer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.lo: ui/gcr-viewer-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.lo `test -f 'ui/gcr-viewer-widget.c' || echo '$(srcdir)/'`ui/gcr-viewer-widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-viewer-widget.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-widget.lo `test -f 'ui/gcr-viewer-widget.c' || echo '$(srcdir)/'`ui/gcr-viewer-widget.c + +ui/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.lo: ui/eggimagemenuitem.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.lo `test -f 'ui/eggimagemenuitem.c' || echo '$(srcdir)/'`ui/eggimagemenuitem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/eggimagemenuitem.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-eggimagemenuitem.lo `test -f 'ui/eggimagemenuitem.c' || echo '$(srcdir)/'`ui/eggimagemenuitem.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.lo: ui/gcr-certificate-basics-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.lo `test -f 'ui/gcr-certificate-basics-widget.c' || echo '$(srcdir)/'`ui/gcr-certificate-basics-widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-certificate-basics-widget.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-basics-widget.lo `test -f 'ui/gcr-certificate-basics-widget.c' || echo '$(srcdir)/'`ui/gcr-certificate-basics-widget.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.lo: ui/gcr-certificate-details-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.lo `test -f 'ui/gcr-certificate-details-widget.c' || echo '$(srcdir)/'`ui/gcr-certificate-details-widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-certificate-details-widget.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-details-widget.lo `test -f 'ui/gcr-certificate-details-widget.c' || echo '$(srcdir)/'`ui/gcr-certificate-details-widget.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.lo: ui/gcr-certificate-exporter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.lo `test -f 'ui/gcr-certificate-exporter.c' || echo '$(srcdir)/'`ui/gcr-certificate-exporter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-certificate-exporter.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-exporter.lo `test -f 'ui/gcr-certificate-exporter.c' || echo '$(srcdir)/'`ui/gcr-certificate-exporter.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.lo: ui/gcr-certificate-request-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.lo `test -f 'ui/gcr-certificate-request-renderer.c' || echo '$(srcdir)/'`ui/gcr-certificate-request-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-certificate-request-renderer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-certificate-request-renderer.lo `test -f 'ui/gcr-certificate-request-renderer.c' || echo '$(srcdir)/'`ui/gcr-certificate-request-renderer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.lo: ui/gcr-dialog-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.lo `test -f 'ui/gcr-dialog-util.c' || echo '$(srcdir)/'`ui/gcr-dialog-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-dialog-util.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-dialog-util.lo `test -f 'ui/gcr-dialog-util.c' || echo '$(srcdir)/'`ui/gcr-dialog-util.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.lo: ui/gcr-display-scrolled.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.lo `test -f 'ui/gcr-display-scrolled.c' || echo '$(srcdir)/'`ui/gcr-display-scrolled.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-display-scrolled.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-scrolled.lo `test -f 'ui/gcr-display-scrolled.c' || echo '$(srcdir)/'`ui/gcr-display-scrolled.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.lo: ui/gcr-display-view.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.lo `test -f 'ui/gcr-display-view.c' || echo '$(srcdir)/'`ui/gcr-display-view.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-display-view.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-display-view.lo `test -f 'ui/gcr-display-view.c' || echo '$(srcdir)/'`ui/gcr-display-view.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.lo: ui/gcr-gnupg-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.lo `test -f 'ui/gcr-gnupg-renderer.c' || echo '$(srcdir)/'`ui/gcr-gnupg-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-gnupg-renderer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-gnupg-renderer.lo `test -f 'ui/gcr-gnupg-renderer.c' || echo '$(srcdir)/'`ui/gcr-gnupg-renderer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.lo: ui/gcr-live-search.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.lo `test -f 'ui/gcr-live-search.c' || echo '$(srcdir)/'`ui/gcr-live-search.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-live-search.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-live-search.lo `test -f 'ui/gcr-live-search.c' || echo '$(srcdir)/'`ui/gcr-live-search.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.lo: ui/gcr-pkcs11-import-dialog.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.lo `test -f 'ui/gcr-pkcs11-import-dialog.c' || echo '$(srcdir)/'`ui/gcr-pkcs11-import-dialog.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-pkcs11-import-dialog.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-dialog.lo `test -f 'ui/gcr-pkcs11-import-dialog.c' || echo '$(srcdir)/'`ui/gcr-pkcs11-import-dialog.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.lo: ui/gcr-pkcs11-import-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.lo `test -f 'ui/gcr-pkcs11-import-interaction.c' || echo '$(srcdir)/'`ui/gcr-pkcs11-import-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-pkcs11-import-interaction.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-pkcs11-import-interaction.lo `test -f 'ui/gcr-pkcs11-import-interaction.c' || echo '$(srcdir)/'`ui/gcr-pkcs11-import-interaction.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.lo: ui/gcr-unlock-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.lo `test -f 'ui/gcr-unlock-renderer.c' || echo '$(srcdir)/'`ui/gcr-unlock-renderer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-unlock-renderer.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-unlock-renderer.lo `test -f 'ui/gcr-unlock-renderer.c' || echo '$(srcdir)/'`ui/gcr-unlock-renderer.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.lo: ui/gcr-viewer-window.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.lo `test -f 'ui/gcr-viewer-window.c' || echo '$(srcdir)/'`ui/gcr-viewer-window.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-viewer-window.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-viewer-window.lo `test -f 'ui/gcr-viewer-window.c' || echo '$(srcdir)/'`ui/gcr-viewer-window.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.lo: ui/gcr-enum-types.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.lo `test -f 'ui/gcr-enum-types.c' || echo '$(srcdir)/'`ui/gcr-enum-types.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-enum-types.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-enum-types.lo `test -f 'ui/gcr-enum-types.c' || echo '$(srcdir)/'`ui/gcr-enum-types.c + +ui/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.lo: ui/gcr-resources.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -MT ui/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.lo -MD -MP -MF ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.Tpo -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.lo `test -f 'ui/gcr-resources.c' || echo '$(srcdir)/'`ui/gcr-resources.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.Tpo ui/$(DEPDIR)/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-resources.c' object='ui/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgcr_ui_@GCR_MAJOR@_la_CFLAGS) $(CFLAGS) -c -o ui/libgcr_ui_@GCR_MAJOR@_la-gcr-resources.lo `test -f 'ui/gcr-resources.c' || echo '$(srcdir)/'`ui/gcr-resources.c + +gck/libmock_test_module_la-mock-test-module.lo: gck/mock-test-module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmock_test_module_la_CFLAGS) $(CFLAGS) -MT gck/libmock_test_module_la-mock-test-module.lo -MD -MP -MF gck/$(DEPDIR)/libmock_test_module_la-mock-test-module.Tpo -c -o gck/libmock_test_module_la-mock-test-module.lo `test -f 'gck/mock-test-module.c' || echo '$(srcdir)/'`gck/mock-test-module.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/libmock_test_module_la-mock-test-module.Tpo gck/$(DEPDIR)/libmock_test_module_la-mock-test-module.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/mock-test-module.c' object='gck/libmock_test_module_la-mock-test-module.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmock_test_module_la_CFLAGS) $(CFLAGS) -c -o gck/libmock_test_module_la-mock-test-module.lo `test -f 'gck/mock-test-module.c' || echo '$(srcdir)/'`gck/mock-test-module.c + +ui/frob_certificate-frob-certificate.o: ui/frob-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_CFLAGS) $(CFLAGS) -MT ui/frob_certificate-frob-certificate.o -MD -MP -MF ui/$(DEPDIR)/frob_certificate-frob-certificate.Tpo -c -o ui/frob_certificate-frob-certificate.o `test -f 'ui/frob-certificate.c' || echo '$(srcdir)/'`ui/frob-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_certificate-frob-certificate.Tpo ui/$(DEPDIR)/frob_certificate-frob-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-certificate.c' object='ui/frob_certificate-frob-certificate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_CFLAGS) $(CFLAGS) -c -o ui/frob_certificate-frob-certificate.o `test -f 'ui/frob-certificate.c' || echo '$(srcdir)/'`ui/frob-certificate.c + +ui/frob_certificate-frob-certificate.obj: ui/frob-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_CFLAGS) $(CFLAGS) -MT ui/frob_certificate-frob-certificate.obj -MD -MP -MF ui/$(DEPDIR)/frob_certificate-frob-certificate.Tpo -c -o ui/frob_certificate-frob-certificate.obj `if test -f 'ui/frob-certificate.c'; then $(CYGPATH_W) 'ui/frob-certificate.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-certificate.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_certificate-frob-certificate.Tpo ui/$(DEPDIR)/frob_certificate-frob-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-certificate.c' object='ui/frob_certificate-frob-certificate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_CFLAGS) $(CFLAGS) -c -o ui/frob_certificate-frob-certificate.obj `if test -f 'ui/frob-certificate.c'; then $(CYGPATH_W) 'ui/frob-certificate.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-certificate.c'; fi` + +gcr/frob_certificate_request-frob-certificate-request.o: gcr/frob-certificate-request.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -MT gcr/frob_certificate_request-frob-certificate-request.o -MD -MP -MF gcr/$(DEPDIR)/frob_certificate_request-frob-certificate-request.Tpo -c -o gcr/frob_certificate_request-frob-certificate-request.o `test -f 'gcr/frob-certificate-request.c' || echo '$(srcdir)/'`gcr/frob-certificate-request.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_certificate_request-frob-certificate-request.Tpo gcr/$(DEPDIR)/frob_certificate_request-frob-certificate-request.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/frob-certificate-request.c' object='gcr/frob_certificate_request-frob-certificate-request.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -c -o gcr/frob_certificate_request-frob-certificate-request.o `test -f 'gcr/frob-certificate-request.c' || echo '$(srcdir)/'`gcr/frob-certificate-request.c + +gcr/frob_certificate_request-frob-certificate-request.obj: gcr/frob-certificate-request.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -MT gcr/frob_certificate_request-frob-certificate-request.obj -MD -MP -MF gcr/$(DEPDIR)/frob_certificate_request-frob-certificate-request.Tpo -c -o gcr/frob_certificate_request-frob-certificate-request.obj `if test -f 'gcr/frob-certificate-request.c'; then $(CYGPATH_W) 'gcr/frob-certificate-request.c'; else $(CYGPATH_W) '$(srcdir)/gcr/frob-certificate-request.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_certificate_request-frob-certificate-request.Tpo gcr/$(DEPDIR)/frob_certificate_request-frob-certificate-request.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/frob-certificate-request.c' object='gcr/frob_certificate_request-frob-certificate-request.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -c -o gcr/frob_certificate_request-frob-certificate-request.obj `if test -f 'gcr/frob-certificate-request.c'; then $(CYGPATH_W) 'gcr/frob-certificate-request.c'; else $(CYGPATH_W) '$(srcdir)/gcr/frob-certificate-request.c'; fi` + +gcr/frob_certificate_request-console-interaction.o: gcr/console-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -MT gcr/frob_certificate_request-console-interaction.o -MD -MP -MF gcr/$(DEPDIR)/frob_certificate_request-console-interaction.Tpo -c -o gcr/frob_certificate_request-console-interaction.o `test -f 'gcr/console-interaction.c' || echo '$(srcdir)/'`gcr/console-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_certificate_request-console-interaction.Tpo gcr/$(DEPDIR)/frob_certificate_request-console-interaction.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/console-interaction.c' object='gcr/frob_certificate_request-console-interaction.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -c -o gcr/frob_certificate_request-console-interaction.o `test -f 'gcr/console-interaction.c' || echo '$(srcdir)/'`gcr/console-interaction.c + +gcr/frob_certificate_request-console-interaction.obj: gcr/console-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -MT gcr/frob_certificate_request-console-interaction.obj -MD -MP -MF gcr/$(DEPDIR)/frob_certificate_request-console-interaction.Tpo -c -o gcr/frob_certificate_request-console-interaction.obj `if test -f 'gcr/console-interaction.c'; then $(CYGPATH_W) 'gcr/console-interaction.c'; else $(CYGPATH_W) '$(srcdir)/gcr/console-interaction.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_certificate_request-console-interaction.Tpo gcr/$(DEPDIR)/frob_certificate_request-console-interaction.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/console-interaction.c' object='gcr/frob_certificate_request-console-interaction.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_certificate_request_CFLAGS) $(CFLAGS) -c -o gcr/frob_certificate_request-console-interaction.obj `if test -f 'gcr/console-interaction.c'; then $(CYGPATH_W) 'gcr/console-interaction.c'; else $(CYGPATH_W) '$(srcdir)/gcr/console-interaction.c'; fi` + +ui/frob_combo_selector-frob-combo-selector.o: ui/frob-combo-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_combo_selector_CFLAGS) $(CFLAGS) -MT ui/frob_combo_selector-frob-combo-selector.o -MD -MP -MF ui/$(DEPDIR)/frob_combo_selector-frob-combo-selector.Tpo -c -o ui/frob_combo_selector-frob-combo-selector.o `test -f 'ui/frob-combo-selector.c' || echo '$(srcdir)/'`ui/frob-combo-selector.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_combo_selector-frob-combo-selector.Tpo ui/$(DEPDIR)/frob_combo_selector-frob-combo-selector.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-combo-selector.c' object='ui/frob_combo_selector-frob-combo-selector.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_combo_selector_CFLAGS) $(CFLAGS) -c -o ui/frob_combo_selector-frob-combo-selector.o `test -f 'ui/frob-combo-selector.c' || echo '$(srcdir)/'`ui/frob-combo-selector.c + +ui/frob_combo_selector-frob-combo-selector.obj: ui/frob-combo-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_combo_selector_CFLAGS) $(CFLAGS) -MT ui/frob_combo_selector-frob-combo-selector.obj -MD -MP -MF ui/$(DEPDIR)/frob_combo_selector-frob-combo-selector.Tpo -c -o ui/frob_combo_selector-frob-combo-selector.obj `if test -f 'ui/frob-combo-selector.c'; then $(CYGPATH_W) 'ui/frob-combo-selector.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-combo-selector.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_combo_selector-frob-combo-selector.Tpo ui/$(DEPDIR)/frob_combo_selector-frob-combo-selector.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-combo-selector.c' object='ui/frob_combo_selector-frob-combo-selector.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_combo_selector_CFLAGS) $(CFLAGS) -c -o ui/frob_combo_selector-frob-combo-selector.obj `if test -f 'ui/frob-combo-selector.c'; then $(CYGPATH_W) 'ui/frob-combo-selector.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-combo-selector.c'; fi` + +ui/frob_gnupg_selector-frob-gnupg-selector.o: ui/frob-gnupg-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_gnupg_selector_CFLAGS) $(CFLAGS) -MT ui/frob_gnupg_selector-frob-gnupg-selector.o -MD -MP -MF ui/$(DEPDIR)/frob_gnupg_selector-frob-gnupg-selector.Tpo -c -o ui/frob_gnupg_selector-frob-gnupg-selector.o `test -f 'ui/frob-gnupg-selector.c' || echo '$(srcdir)/'`ui/frob-gnupg-selector.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_gnupg_selector-frob-gnupg-selector.Tpo ui/$(DEPDIR)/frob_gnupg_selector-frob-gnupg-selector.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-gnupg-selector.c' object='ui/frob_gnupg_selector-frob-gnupg-selector.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_gnupg_selector_CFLAGS) $(CFLAGS) -c -o ui/frob_gnupg_selector-frob-gnupg-selector.o `test -f 'ui/frob-gnupg-selector.c' || echo '$(srcdir)/'`ui/frob-gnupg-selector.c + +ui/frob_gnupg_selector-frob-gnupg-selector.obj: ui/frob-gnupg-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_gnupg_selector_CFLAGS) $(CFLAGS) -MT ui/frob_gnupg_selector-frob-gnupg-selector.obj -MD -MP -MF ui/$(DEPDIR)/frob_gnupg_selector-frob-gnupg-selector.Tpo -c -o ui/frob_gnupg_selector-frob-gnupg-selector.obj `if test -f 'ui/frob-gnupg-selector.c'; then $(CYGPATH_W) 'ui/frob-gnupg-selector.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-gnupg-selector.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_gnupg_selector-frob-gnupg-selector.Tpo ui/$(DEPDIR)/frob_gnupg_selector-frob-gnupg-selector.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-gnupg-selector.c' object='ui/frob_gnupg_selector-frob-gnupg-selector.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_gnupg_selector_CFLAGS) $(CFLAGS) -c -o ui/frob_gnupg_selector-frob-gnupg-selector.obj `if test -f 'ui/frob-gnupg-selector.c'; then $(CYGPATH_W) 'ui/frob-gnupg-selector.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-gnupg-selector.c'; fi` + +ui/frob_import_button-frob-import-button.o: ui/frob-import-button.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_import_button_CFLAGS) $(CFLAGS) -MT ui/frob_import_button-frob-import-button.o -MD -MP -MF ui/$(DEPDIR)/frob_import_button-frob-import-button.Tpo -c -o ui/frob_import_button-frob-import-button.o `test -f 'ui/frob-import-button.c' || echo '$(srcdir)/'`ui/frob-import-button.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_import_button-frob-import-button.Tpo ui/$(DEPDIR)/frob_import_button-frob-import-button.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-import-button.c' object='ui/frob_import_button-frob-import-button.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_import_button_CFLAGS) $(CFLAGS) -c -o ui/frob_import_button-frob-import-button.o `test -f 'ui/frob-import-button.c' || echo '$(srcdir)/'`ui/frob-import-button.c + +ui/frob_import_button-frob-import-button.obj: ui/frob-import-button.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_import_button_CFLAGS) $(CFLAGS) -MT ui/frob_import_button-frob-import-button.obj -MD -MP -MF ui/$(DEPDIR)/frob_import_button-frob-import-button.Tpo -c -o ui/frob_import_button-frob-import-button.obj `if test -f 'ui/frob-import-button.c'; then $(CYGPATH_W) 'ui/frob-import-button.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-import-button.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_import_button-frob-import-button.Tpo ui/$(DEPDIR)/frob_import_button-frob-import-button.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-import-button.c' object='ui/frob_import_button-frob-import-button.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_import_button_CFLAGS) $(CFLAGS) -c -o ui/frob_import_button-frob-import-button.obj `if test -f 'ui/frob-import-button.c'; then $(CYGPATH_W) 'ui/frob-import-button.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-import-button.c'; fi` + +ui/frob_key-frob-key.o: ui/frob-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_key_CFLAGS) $(CFLAGS) -MT ui/frob_key-frob-key.o -MD -MP -MF ui/$(DEPDIR)/frob_key-frob-key.Tpo -c -o ui/frob_key-frob-key.o `test -f 'ui/frob-key.c' || echo '$(srcdir)/'`ui/frob-key.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_key-frob-key.Tpo ui/$(DEPDIR)/frob_key-frob-key.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-key.c' object='ui/frob_key-frob-key.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_key_CFLAGS) $(CFLAGS) -c -o ui/frob_key-frob-key.o `test -f 'ui/frob-key.c' || echo '$(srcdir)/'`ui/frob-key.c + +ui/frob_key-frob-key.obj: ui/frob-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_key_CFLAGS) $(CFLAGS) -MT ui/frob_key-frob-key.obj -MD -MP -MF ui/$(DEPDIR)/frob_key-frob-key.Tpo -c -o ui/frob_key-frob-key.obj `if test -f 'ui/frob-key.c'; then $(CYGPATH_W) 'ui/frob-key.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-key.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_key-frob-key.Tpo ui/$(DEPDIR)/frob_key-frob-key.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-key.c' object='ui/frob_key-frob-key.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_key_CFLAGS) $(CFLAGS) -c -o ui/frob_key-frob-key.obj `if test -f 'ui/frob-key.c'; then $(CYGPATH_W) 'ui/frob-key.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-key.c'; fi` + +gcr/frob_openpgp-frob-openpgp.o: gcr/frob-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_openpgp_CFLAGS) $(CFLAGS) -MT gcr/frob_openpgp-frob-openpgp.o -MD -MP -MF gcr/$(DEPDIR)/frob_openpgp-frob-openpgp.Tpo -c -o gcr/frob_openpgp-frob-openpgp.o `test -f 'gcr/frob-openpgp.c' || echo '$(srcdir)/'`gcr/frob-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_openpgp-frob-openpgp.Tpo gcr/$(DEPDIR)/frob_openpgp-frob-openpgp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/frob-openpgp.c' object='gcr/frob_openpgp-frob-openpgp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_openpgp_CFLAGS) $(CFLAGS) -c -o gcr/frob_openpgp-frob-openpgp.o `test -f 'gcr/frob-openpgp.c' || echo '$(srcdir)/'`gcr/frob-openpgp.c + +gcr/frob_openpgp-frob-openpgp.obj: gcr/frob-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_openpgp_CFLAGS) $(CFLAGS) -MT gcr/frob_openpgp-frob-openpgp.obj -MD -MP -MF gcr/$(DEPDIR)/frob_openpgp-frob-openpgp.Tpo -c -o gcr/frob_openpgp-frob-openpgp.obj `if test -f 'gcr/frob-openpgp.c'; then $(CYGPATH_W) 'gcr/frob-openpgp.c'; else $(CYGPATH_W) '$(srcdir)/gcr/frob-openpgp.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_openpgp-frob-openpgp.Tpo gcr/$(DEPDIR)/frob_openpgp-frob-openpgp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/frob-openpgp.c' object='gcr/frob_openpgp-frob-openpgp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_openpgp_CFLAGS) $(CFLAGS) -c -o gcr/frob_openpgp-frob-openpgp.obj `if test -f 'gcr/frob-openpgp.c'; then $(CYGPATH_W) 'gcr/frob-openpgp.c'; else $(CYGPATH_W) '$(srcdir)/gcr/frob-openpgp.c'; fi` + +gcr/frob_parser-frob-parser.o: gcr/frob-parser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_parser_CFLAGS) $(CFLAGS) -MT gcr/frob_parser-frob-parser.o -MD -MP -MF gcr/$(DEPDIR)/frob_parser-frob-parser.Tpo -c -o gcr/frob_parser-frob-parser.o `test -f 'gcr/frob-parser.c' || echo '$(srcdir)/'`gcr/frob-parser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_parser-frob-parser.Tpo gcr/$(DEPDIR)/frob_parser-frob-parser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/frob-parser.c' object='gcr/frob_parser-frob-parser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_parser_CFLAGS) $(CFLAGS) -c -o gcr/frob_parser-frob-parser.o `test -f 'gcr/frob-parser.c' || echo '$(srcdir)/'`gcr/frob-parser.c + +gcr/frob_parser-frob-parser.obj: gcr/frob-parser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_parser_CFLAGS) $(CFLAGS) -MT gcr/frob_parser-frob-parser.obj -MD -MP -MF gcr/$(DEPDIR)/frob_parser-frob-parser.Tpo -c -o gcr/frob_parser-frob-parser.obj `if test -f 'gcr/frob-parser.c'; then $(CYGPATH_W) 'gcr/frob-parser.c'; else $(CYGPATH_W) '$(srcdir)/gcr/frob-parser.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/frob_parser-frob-parser.Tpo gcr/$(DEPDIR)/frob_parser-frob-parser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/frob-parser.c' object='gcr/frob_parser-frob-parser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_parser_CFLAGS) $(CFLAGS) -c -o gcr/frob_parser-frob-parser.obj `if test -f 'gcr/frob-parser.c'; then $(CYGPATH_W) 'gcr/frob-parser.c'; else $(CYGPATH_W) '$(srcdir)/gcr/frob-parser.c'; fi` + +ui/frob_prompt-frob-prompt.o: ui/frob-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_prompt_CFLAGS) $(CFLAGS) -MT ui/frob_prompt-frob-prompt.o -MD -MP -MF ui/$(DEPDIR)/frob_prompt-frob-prompt.Tpo -c -o ui/frob_prompt-frob-prompt.o `test -f 'ui/frob-prompt.c' || echo '$(srcdir)/'`ui/frob-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_prompt-frob-prompt.Tpo ui/$(DEPDIR)/frob_prompt-frob-prompt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-prompt.c' object='ui/frob_prompt-frob-prompt.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_prompt_CFLAGS) $(CFLAGS) -c -o ui/frob_prompt-frob-prompt.o `test -f 'ui/frob-prompt.c' || echo '$(srcdir)/'`ui/frob-prompt.c + +ui/frob_prompt-frob-prompt.obj: ui/frob-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_prompt_CFLAGS) $(CFLAGS) -MT ui/frob_prompt-frob-prompt.obj -MD -MP -MF ui/$(DEPDIR)/frob_prompt-frob-prompt.Tpo -c -o ui/frob_prompt-frob-prompt.obj `if test -f 'ui/frob-prompt.c'; then $(CYGPATH_W) 'ui/frob-prompt.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-prompt.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_prompt-frob-prompt.Tpo ui/$(DEPDIR)/frob_prompt-frob-prompt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-prompt.c' object='ui/frob_prompt-frob-prompt.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_prompt_CFLAGS) $(CFLAGS) -c -o ui/frob_prompt-frob-prompt.obj `if test -f 'ui/frob-prompt.c'; then $(CYGPATH_W) 'ui/frob-prompt.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-prompt.c'; fi` + +ui/frob_request-frob-request.o: ui/frob-request.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_request_CFLAGS) $(CFLAGS) -MT ui/frob_request-frob-request.o -MD -MP -MF ui/$(DEPDIR)/frob_request-frob-request.Tpo -c -o ui/frob_request-frob-request.o `test -f 'ui/frob-request.c' || echo '$(srcdir)/'`ui/frob-request.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_request-frob-request.Tpo ui/$(DEPDIR)/frob_request-frob-request.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-request.c' object='ui/frob_request-frob-request.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_request_CFLAGS) $(CFLAGS) -c -o ui/frob_request-frob-request.o `test -f 'ui/frob-request.c' || echo '$(srcdir)/'`ui/frob-request.c + +ui/frob_request-frob-request.obj: ui/frob-request.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_request_CFLAGS) $(CFLAGS) -MT ui/frob_request-frob-request.obj -MD -MP -MF ui/$(DEPDIR)/frob_request-frob-request.Tpo -c -o ui/frob_request-frob-request.obj `if test -f 'ui/frob-request.c'; then $(CYGPATH_W) 'ui/frob-request.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-request.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_request-frob-request.Tpo ui/$(DEPDIR)/frob_request-frob-request.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-request.c' object='ui/frob_request-frob-request.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_request_CFLAGS) $(CFLAGS) -c -o ui/frob_request-frob-request.obj `if test -f 'ui/frob-request.c'; then $(CYGPATH_W) 'ui/frob-request.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-request.c'; fi` + +ui/frob_system_prompt-frob-system-prompt.o: ui/frob-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_system_prompt_CFLAGS) $(CFLAGS) -MT ui/frob_system_prompt-frob-system-prompt.o -MD -MP -MF ui/$(DEPDIR)/frob_system_prompt-frob-system-prompt.Tpo -c -o ui/frob_system_prompt-frob-system-prompt.o `test -f 'ui/frob-system-prompt.c' || echo '$(srcdir)/'`ui/frob-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_system_prompt-frob-system-prompt.Tpo ui/$(DEPDIR)/frob_system_prompt-frob-system-prompt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-system-prompt.c' object='ui/frob_system_prompt-frob-system-prompt.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_system_prompt_CFLAGS) $(CFLAGS) -c -o ui/frob_system_prompt-frob-system-prompt.o `test -f 'ui/frob-system-prompt.c' || echo '$(srcdir)/'`ui/frob-system-prompt.c + +ui/frob_system_prompt-frob-system-prompt.obj: ui/frob-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_system_prompt_CFLAGS) $(CFLAGS) -MT ui/frob_system_prompt-frob-system-prompt.obj -MD -MP -MF ui/$(DEPDIR)/frob_system_prompt-frob-system-prompt.Tpo -c -o ui/frob_system_prompt-frob-system-prompt.obj `if test -f 'ui/frob-system-prompt.c'; then $(CYGPATH_W) 'ui/frob-system-prompt.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-system-prompt.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_system_prompt-frob-system-prompt.Tpo ui/$(DEPDIR)/frob_system_prompt-frob-system-prompt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-system-prompt.c' object='ui/frob_system_prompt-frob-system-prompt.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_system_prompt_CFLAGS) $(CFLAGS) -c -o ui/frob_system_prompt-frob-system-prompt.obj `if test -f 'ui/frob-system-prompt.c'; then $(CYGPATH_W) 'ui/frob-system-prompt.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-system-prompt.c'; fi` + +ui/frob_tree_selector-frob-tree-selector.o: ui/frob-tree-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_tree_selector_CFLAGS) $(CFLAGS) -MT ui/frob_tree_selector-frob-tree-selector.o -MD -MP -MF ui/$(DEPDIR)/frob_tree_selector-frob-tree-selector.Tpo -c -o ui/frob_tree_selector-frob-tree-selector.o `test -f 'ui/frob-tree-selector.c' || echo '$(srcdir)/'`ui/frob-tree-selector.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_tree_selector-frob-tree-selector.Tpo ui/$(DEPDIR)/frob_tree_selector-frob-tree-selector.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-tree-selector.c' object='ui/frob_tree_selector-frob-tree-selector.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_tree_selector_CFLAGS) $(CFLAGS) -c -o ui/frob_tree_selector-frob-tree-selector.o `test -f 'ui/frob-tree-selector.c' || echo '$(srcdir)/'`ui/frob-tree-selector.c + +ui/frob_tree_selector-frob-tree-selector.obj: ui/frob-tree-selector.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_tree_selector_CFLAGS) $(CFLAGS) -MT ui/frob_tree_selector-frob-tree-selector.obj -MD -MP -MF ui/$(DEPDIR)/frob_tree_selector-frob-tree-selector.Tpo -c -o ui/frob_tree_selector-frob-tree-selector.obj `if test -f 'ui/frob-tree-selector.c'; then $(CYGPATH_W) 'ui/frob-tree-selector.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-tree-selector.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_tree_selector-frob-tree-selector.Tpo ui/$(DEPDIR)/frob_tree_selector-frob-tree-selector.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-tree-selector.c' object='ui/frob_tree_selector-frob-tree-selector.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_tree_selector_CFLAGS) $(CFLAGS) -c -o ui/frob_tree_selector-frob-tree-selector.obj `if test -f 'ui/frob-tree-selector.c'; then $(CYGPATH_W) 'ui/frob-tree-selector.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-tree-selector.c'; fi` + +ui/frob_unlock-frob-unlock.o: ui/frob-unlock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -MT ui/frob_unlock-frob-unlock.o -MD -MP -MF ui/$(DEPDIR)/frob_unlock-frob-unlock.Tpo -c -o ui/frob_unlock-frob-unlock.o `test -f 'ui/frob-unlock.c' || echo '$(srcdir)/'`ui/frob-unlock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_unlock-frob-unlock.Tpo ui/$(DEPDIR)/frob_unlock-frob-unlock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-unlock.c' object='ui/frob_unlock-frob-unlock.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -c -o ui/frob_unlock-frob-unlock.o `test -f 'ui/frob-unlock.c' || echo '$(srcdir)/'`ui/frob-unlock.c + +ui/frob_unlock-frob-unlock.obj: ui/frob-unlock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -MT ui/frob_unlock-frob-unlock.obj -MD -MP -MF ui/$(DEPDIR)/frob_unlock-frob-unlock.Tpo -c -o ui/frob_unlock-frob-unlock.obj `if test -f 'ui/frob-unlock.c'; then $(CYGPATH_W) 'ui/frob-unlock.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-unlock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_unlock-frob-unlock.Tpo ui/$(DEPDIR)/frob_unlock-frob-unlock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-unlock.c' object='ui/frob_unlock-frob-unlock.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -c -o ui/frob_unlock-frob-unlock.obj `if test -f 'ui/frob-unlock.c'; then $(CYGPATH_W) 'ui/frob-unlock.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-unlock.c'; fi` + +ui/frob_unlock-gcr-viewer-window.o: ui/gcr-viewer-window.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -MT ui/frob_unlock-gcr-viewer-window.o -MD -MP -MF ui/$(DEPDIR)/frob_unlock-gcr-viewer-window.Tpo -c -o ui/frob_unlock-gcr-viewer-window.o `test -f 'ui/gcr-viewer-window.c' || echo '$(srcdir)/'`ui/gcr-viewer-window.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_unlock-gcr-viewer-window.Tpo ui/$(DEPDIR)/frob_unlock-gcr-viewer-window.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-viewer-window.c' object='ui/frob_unlock-gcr-viewer-window.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -c -o ui/frob_unlock-gcr-viewer-window.o `test -f 'ui/gcr-viewer-window.c' || echo '$(srcdir)/'`ui/gcr-viewer-window.c + +ui/frob_unlock-gcr-viewer-window.obj: ui/gcr-viewer-window.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -MT ui/frob_unlock-gcr-viewer-window.obj -MD -MP -MF ui/$(DEPDIR)/frob_unlock-gcr-viewer-window.Tpo -c -o ui/frob_unlock-gcr-viewer-window.obj `if test -f 'ui/gcr-viewer-window.c'; then $(CYGPATH_W) 'ui/gcr-viewer-window.c'; else $(CYGPATH_W) '$(srcdir)/ui/gcr-viewer-window.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_unlock-gcr-viewer-window.Tpo ui/$(DEPDIR)/frob_unlock-gcr-viewer-window.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-viewer-window.c' object='ui/frob_unlock-gcr-viewer-window.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_CFLAGS) $(CFLAGS) -c -o ui/frob_unlock-gcr-viewer-window.obj `if test -f 'ui/gcr-viewer-window.c'; then $(CYGPATH_W) 'ui/gcr-viewer-window.c'; else $(CYGPATH_W) '$(srcdir)/ui/gcr-viewer-window.c'; fi` + +ui/frob_unlock_options-frob-unlock-options.o: ui/frob-unlock-options.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_options_CFLAGS) $(CFLAGS) -MT ui/frob_unlock_options-frob-unlock-options.o -MD -MP -MF ui/$(DEPDIR)/frob_unlock_options-frob-unlock-options.Tpo -c -o ui/frob_unlock_options-frob-unlock-options.o `test -f 'ui/frob-unlock-options.c' || echo '$(srcdir)/'`ui/frob-unlock-options.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_unlock_options-frob-unlock-options.Tpo ui/$(DEPDIR)/frob_unlock_options-frob-unlock-options.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-unlock-options.c' object='ui/frob_unlock_options-frob-unlock-options.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_options_CFLAGS) $(CFLAGS) -c -o ui/frob_unlock_options-frob-unlock-options.o `test -f 'ui/frob-unlock-options.c' || echo '$(srcdir)/'`ui/frob-unlock-options.c + +ui/frob_unlock_options-frob-unlock-options.obj: ui/frob-unlock-options.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_options_CFLAGS) $(CFLAGS) -MT ui/frob_unlock_options-frob-unlock-options.obj -MD -MP -MF ui/$(DEPDIR)/frob_unlock_options-frob-unlock-options.Tpo -c -o ui/frob_unlock_options-frob-unlock-options.obj `if test -f 'ui/frob-unlock-options.c'; then $(CYGPATH_W) 'ui/frob-unlock-options.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-unlock-options.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/frob_unlock_options-frob-unlock-options.Tpo ui/$(DEPDIR)/frob_unlock_options-frob-unlock-options.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/frob-unlock-options.c' object='ui/frob_unlock_options-frob-unlock-options.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(frob_unlock_options_CFLAGS) $(CFLAGS) -c -o ui/frob_unlock_options-frob-unlock-options.obj `if test -f 'ui/frob-unlock-options.c'; then $(CYGPATH_W) 'ui/frob-unlock-options.c'; else $(CYGPATH_W) '$(srcdir)/ui/frob-unlock-options.c'; fi` + +ui/gcr_prompter-gcr-prompter-tool.o: ui/gcr-prompter-tool.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_prompter_CFLAGS) $(CFLAGS) -MT ui/gcr_prompter-gcr-prompter-tool.o -MD -MP -MF ui/$(DEPDIR)/gcr_prompter-gcr-prompter-tool.Tpo -c -o ui/gcr_prompter-gcr-prompter-tool.o `test -f 'ui/gcr-prompter-tool.c' || echo '$(srcdir)/'`ui/gcr-prompter-tool.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/gcr_prompter-gcr-prompter-tool.Tpo ui/$(DEPDIR)/gcr_prompter-gcr-prompter-tool.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-prompter-tool.c' object='ui/gcr_prompter-gcr-prompter-tool.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_prompter_CFLAGS) $(CFLAGS) -c -o ui/gcr_prompter-gcr-prompter-tool.o `test -f 'ui/gcr-prompter-tool.c' || echo '$(srcdir)/'`ui/gcr-prompter-tool.c + +ui/gcr_prompter-gcr-prompter-tool.obj: ui/gcr-prompter-tool.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_prompter_CFLAGS) $(CFLAGS) -MT ui/gcr_prompter-gcr-prompter-tool.obj -MD -MP -MF ui/$(DEPDIR)/gcr_prompter-gcr-prompter-tool.Tpo -c -o ui/gcr_prompter-gcr-prompter-tool.obj `if test -f 'ui/gcr-prompter-tool.c'; then $(CYGPATH_W) 'ui/gcr-prompter-tool.c'; else $(CYGPATH_W) '$(srcdir)/ui/gcr-prompter-tool.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/gcr_prompter-gcr-prompter-tool.Tpo ui/$(DEPDIR)/gcr_prompter-gcr-prompter-tool.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-prompter-tool.c' object='ui/gcr_prompter-gcr-prompter-tool.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_prompter_CFLAGS) $(CFLAGS) -c -o ui/gcr_prompter-gcr-prompter-tool.obj `if test -f 'ui/gcr-prompter-tool.c'; then $(CYGPATH_W) 'ui/gcr-prompter-tool.c'; else $(CYGPATH_W) '$(srcdir)/ui/gcr-prompter-tool.c'; fi` + +gcr/gcr_ssh_askpass-gcr-ssh-askpass.o: gcr/gcr-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_ssh_askpass_CFLAGS) $(CFLAGS) -MT gcr/gcr_ssh_askpass-gcr-ssh-askpass.o -MD -MP -MF gcr/$(DEPDIR)/gcr_ssh_askpass-gcr-ssh-askpass.Tpo -c -o gcr/gcr_ssh_askpass-gcr-ssh-askpass.o `test -f 'gcr/gcr-ssh-askpass.c' || echo '$(srcdir)/'`gcr/gcr-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/gcr_ssh_askpass-gcr-ssh-askpass.Tpo gcr/$(DEPDIR)/gcr_ssh_askpass-gcr-ssh-askpass.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-ssh-askpass.c' object='gcr/gcr_ssh_askpass-gcr-ssh-askpass.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_ssh_askpass_CFLAGS) $(CFLAGS) -c -o gcr/gcr_ssh_askpass-gcr-ssh-askpass.o `test -f 'gcr/gcr-ssh-askpass.c' || echo '$(srcdir)/'`gcr/gcr-ssh-askpass.c + +gcr/gcr_ssh_askpass-gcr-ssh-askpass.obj: gcr/gcr-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_ssh_askpass_CFLAGS) $(CFLAGS) -MT gcr/gcr_ssh_askpass-gcr-ssh-askpass.obj -MD -MP -MF gcr/$(DEPDIR)/gcr_ssh_askpass-gcr-ssh-askpass.Tpo -c -o gcr/gcr_ssh_askpass-gcr-ssh-askpass.obj `if test -f 'gcr/gcr-ssh-askpass.c'; then $(CYGPATH_W) 'gcr/gcr-ssh-askpass.c'; else $(CYGPATH_W) '$(srcdir)/gcr/gcr-ssh-askpass.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/gcr_ssh_askpass-gcr-ssh-askpass.Tpo gcr/$(DEPDIR)/gcr_ssh_askpass-gcr-ssh-askpass.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/gcr-ssh-askpass.c' object='gcr/gcr_ssh_askpass-gcr-ssh-askpass.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_ssh_askpass_CFLAGS) $(CFLAGS) -c -o gcr/gcr_ssh_askpass-gcr-ssh-askpass.obj `if test -f 'gcr/gcr-ssh-askpass.c'; then $(CYGPATH_W) 'gcr/gcr-ssh-askpass.c'; else $(CYGPATH_W) '$(srcdir)/gcr/gcr-ssh-askpass.c'; fi` + +ui/gcr_viewer-gcr-viewer-tool.o: ui/gcr-viewer-tool.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_viewer_CFLAGS) $(CFLAGS) -MT ui/gcr_viewer-gcr-viewer-tool.o -MD -MP -MF ui/$(DEPDIR)/gcr_viewer-gcr-viewer-tool.Tpo -c -o ui/gcr_viewer-gcr-viewer-tool.o `test -f 'ui/gcr-viewer-tool.c' || echo '$(srcdir)/'`ui/gcr-viewer-tool.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/gcr_viewer-gcr-viewer-tool.Tpo ui/$(DEPDIR)/gcr_viewer-gcr-viewer-tool.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-viewer-tool.c' object='ui/gcr_viewer-gcr-viewer-tool.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_viewer_CFLAGS) $(CFLAGS) -c -o ui/gcr_viewer-gcr-viewer-tool.o `test -f 'ui/gcr-viewer-tool.c' || echo '$(srcdir)/'`ui/gcr-viewer-tool.c + +ui/gcr_viewer-gcr-viewer-tool.obj: ui/gcr-viewer-tool.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_viewer_CFLAGS) $(CFLAGS) -MT ui/gcr_viewer-gcr-viewer-tool.obj -MD -MP -MF ui/$(DEPDIR)/gcr_viewer-gcr-viewer-tool.Tpo -c -o ui/gcr_viewer-gcr-viewer-tool.obj `if test -f 'ui/gcr-viewer-tool.c'; then $(CYGPATH_W) 'ui/gcr-viewer-tool.c'; else $(CYGPATH_W) '$(srcdir)/ui/gcr-viewer-tool.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ui/$(DEPDIR)/gcr_viewer-gcr-viewer-tool.Tpo ui/$(DEPDIR)/gcr_viewer-gcr-viewer-tool.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui/gcr-viewer-tool.c' object='ui/gcr_viewer-gcr-viewer-tool.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gcr_viewer_CFLAGS) $(CFLAGS) -c -o ui/gcr_viewer-gcr-viewer-tool.obj `if test -f 'ui/gcr-viewer-tool.c'; then $(CYGPATH_W) 'ui/gcr-viewer-tool.c'; else $(CYGPATH_W) '$(srcdir)/ui/gcr-viewer-tool.c'; fi` + +gcr/test_certificate-test-certificate.o: gcr/test-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_CFLAGS) $(CFLAGS) -MT gcr/test_certificate-test-certificate.o -MD -MP -MF gcr/$(DEPDIR)/test_certificate-test-certificate.Tpo -c -o gcr/test_certificate-test-certificate.o `test -f 'gcr/test-certificate.c' || echo '$(srcdir)/'`gcr/test-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_certificate-test-certificate.Tpo gcr/$(DEPDIR)/test_certificate-test-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-certificate.c' object='gcr/test_certificate-test-certificate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_CFLAGS) $(CFLAGS) -c -o gcr/test_certificate-test-certificate.o `test -f 'gcr/test-certificate.c' || echo '$(srcdir)/'`gcr/test-certificate.c + +gcr/test_certificate-test-certificate.obj: gcr/test-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_CFLAGS) $(CFLAGS) -MT gcr/test_certificate-test-certificate.obj -MD -MP -MF gcr/$(DEPDIR)/test_certificate-test-certificate.Tpo -c -o gcr/test_certificate-test-certificate.obj `if test -f 'gcr/test-certificate.c'; then $(CYGPATH_W) 'gcr/test-certificate.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-certificate.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_certificate-test-certificate.Tpo gcr/$(DEPDIR)/test_certificate-test-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-certificate.c' object='gcr/test_certificate-test-certificate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_CFLAGS) $(CFLAGS) -c -o gcr/test_certificate-test-certificate.obj `if test -f 'gcr/test-certificate.c'; then $(CYGPATH_W) 'gcr/test-certificate.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-certificate.c'; fi` + +gcr/test_certificate_chain-test-certificate-chain.o: gcr/test-certificate-chain.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_chain_CFLAGS) $(CFLAGS) -MT gcr/test_certificate_chain-test-certificate-chain.o -MD -MP -MF gcr/$(DEPDIR)/test_certificate_chain-test-certificate-chain.Tpo -c -o gcr/test_certificate_chain-test-certificate-chain.o `test -f 'gcr/test-certificate-chain.c' || echo '$(srcdir)/'`gcr/test-certificate-chain.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_certificate_chain-test-certificate-chain.Tpo gcr/$(DEPDIR)/test_certificate_chain-test-certificate-chain.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-certificate-chain.c' object='gcr/test_certificate_chain-test-certificate-chain.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_chain_CFLAGS) $(CFLAGS) -c -o gcr/test_certificate_chain-test-certificate-chain.o `test -f 'gcr/test-certificate-chain.c' || echo '$(srcdir)/'`gcr/test-certificate-chain.c + +gcr/test_certificate_chain-test-certificate-chain.obj: gcr/test-certificate-chain.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_chain_CFLAGS) $(CFLAGS) -MT gcr/test_certificate_chain-test-certificate-chain.obj -MD -MP -MF gcr/$(DEPDIR)/test_certificate_chain-test-certificate-chain.Tpo -c -o gcr/test_certificate_chain-test-certificate-chain.obj `if test -f 'gcr/test-certificate-chain.c'; then $(CYGPATH_W) 'gcr/test-certificate-chain.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-certificate-chain.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_certificate_chain-test-certificate-chain.Tpo gcr/$(DEPDIR)/test_certificate_chain-test-certificate-chain.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-certificate-chain.c' object='gcr/test_certificate_chain-test-certificate-chain.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_certificate_chain_CFLAGS) $(CFLAGS) -c -o gcr/test_certificate_chain-test-certificate-chain.obj `if test -f 'gcr/test-certificate-chain.c'; then $(CYGPATH_W) 'gcr/test-certificate-chain.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-certificate-chain.c'; fi` + +gcr/test_filter_collection-test-filter-collection.o: gcr/test-filter-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_filter_collection_CFLAGS) $(CFLAGS) -MT gcr/test_filter_collection-test-filter-collection.o -MD -MP -MF gcr/$(DEPDIR)/test_filter_collection-test-filter-collection.Tpo -c -o gcr/test_filter_collection-test-filter-collection.o `test -f 'gcr/test-filter-collection.c' || echo '$(srcdir)/'`gcr/test-filter-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_filter_collection-test-filter-collection.Tpo gcr/$(DEPDIR)/test_filter_collection-test-filter-collection.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-filter-collection.c' object='gcr/test_filter_collection-test-filter-collection.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_filter_collection_CFLAGS) $(CFLAGS) -c -o gcr/test_filter_collection-test-filter-collection.o `test -f 'gcr/test-filter-collection.c' || echo '$(srcdir)/'`gcr/test-filter-collection.c + +gcr/test_filter_collection-test-filter-collection.obj: gcr/test-filter-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_filter_collection_CFLAGS) $(CFLAGS) -MT gcr/test_filter_collection-test-filter-collection.obj -MD -MP -MF gcr/$(DEPDIR)/test_filter_collection-test-filter-collection.Tpo -c -o gcr/test_filter_collection-test-filter-collection.obj `if test -f 'gcr/test-filter-collection.c'; then $(CYGPATH_W) 'gcr/test-filter-collection.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-filter-collection.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_filter_collection-test-filter-collection.Tpo gcr/$(DEPDIR)/test_filter_collection-test-filter-collection.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-filter-collection.c' object='gcr/test_filter_collection-test-filter-collection.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_filter_collection_CFLAGS) $(CFLAGS) -c -o gcr/test_filter_collection-test-filter-collection.obj `if test -f 'gcr/test-filter-collection.c'; then $(CYGPATH_W) 'gcr/test-filter-collection.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-filter-collection.c'; fi` + +gcr/test_fingerprint-test-fingerprint.o: gcr/test-fingerprint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_fingerprint_CFLAGS) $(CFLAGS) -MT gcr/test_fingerprint-test-fingerprint.o -MD -MP -MF gcr/$(DEPDIR)/test_fingerprint-test-fingerprint.Tpo -c -o gcr/test_fingerprint-test-fingerprint.o `test -f 'gcr/test-fingerprint.c' || echo '$(srcdir)/'`gcr/test-fingerprint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_fingerprint-test-fingerprint.Tpo gcr/$(DEPDIR)/test_fingerprint-test-fingerprint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-fingerprint.c' object='gcr/test_fingerprint-test-fingerprint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_fingerprint_CFLAGS) $(CFLAGS) -c -o gcr/test_fingerprint-test-fingerprint.o `test -f 'gcr/test-fingerprint.c' || echo '$(srcdir)/'`gcr/test-fingerprint.c + +gcr/test_fingerprint-test-fingerprint.obj: gcr/test-fingerprint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_fingerprint_CFLAGS) $(CFLAGS) -MT gcr/test_fingerprint-test-fingerprint.obj -MD -MP -MF gcr/$(DEPDIR)/test_fingerprint-test-fingerprint.Tpo -c -o gcr/test_fingerprint-test-fingerprint.obj `if test -f 'gcr/test-fingerprint.c'; then $(CYGPATH_W) 'gcr/test-fingerprint.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-fingerprint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_fingerprint-test-fingerprint.Tpo gcr/$(DEPDIR)/test_fingerprint-test-fingerprint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-fingerprint.c' object='gcr/test_fingerprint-test-fingerprint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_fingerprint_CFLAGS) $(CFLAGS) -c -o gcr/test_fingerprint-test-fingerprint.obj `if test -f 'gcr/test-fingerprint.c'; then $(CYGPATH_W) 'gcr/test-fingerprint.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-fingerprint.c'; fi` + +gck/test_gck_attributes-test-gck-attributes.o: gck/test-gck-attributes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_attributes_CFLAGS) $(CFLAGS) -MT gck/test_gck_attributes-test-gck-attributes.o -MD -MP -MF gck/$(DEPDIR)/test_gck_attributes-test-gck-attributes.Tpo -c -o gck/test_gck_attributes-test-gck-attributes.o `test -f 'gck/test-gck-attributes.c' || echo '$(srcdir)/'`gck/test-gck-attributes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_attributes-test-gck-attributes.Tpo gck/$(DEPDIR)/test_gck_attributes-test-gck-attributes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-attributes.c' object='gck/test_gck_attributes-test-gck-attributes.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_attributes_CFLAGS) $(CFLAGS) -c -o gck/test_gck_attributes-test-gck-attributes.o `test -f 'gck/test-gck-attributes.c' || echo '$(srcdir)/'`gck/test-gck-attributes.c + +gck/test_gck_attributes-test-gck-attributes.obj: gck/test-gck-attributes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_attributes_CFLAGS) $(CFLAGS) -MT gck/test_gck_attributes-test-gck-attributes.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_attributes-test-gck-attributes.Tpo -c -o gck/test_gck_attributes-test-gck-attributes.obj `if test -f 'gck/test-gck-attributes.c'; then $(CYGPATH_W) 'gck/test-gck-attributes.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-attributes.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_attributes-test-gck-attributes.Tpo gck/$(DEPDIR)/test_gck_attributes-test-gck-attributes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-attributes.c' object='gck/test_gck_attributes-test-gck-attributes.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_attributes_CFLAGS) $(CFLAGS) -c -o gck/test_gck_attributes-test-gck-attributes.obj `if test -f 'gck/test-gck-attributes.c'; then $(CYGPATH_W) 'gck/test-gck-attributes.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-attributes.c'; fi` + +gck/test_gck_crypto-test-gck-crypto.o: gck/test-gck-crypto.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_crypto_CFLAGS) $(CFLAGS) -MT gck/test_gck_crypto-test-gck-crypto.o -MD -MP -MF gck/$(DEPDIR)/test_gck_crypto-test-gck-crypto.Tpo -c -o gck/test_gck_crypto-test-gck-crypto.o `test -f 'gck/test-gck-crypto.c' || echo '$(srcdir)/'`gck/test-gck-crypto.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_crypto-test-gck-crypto.Tpo gck/$(DEPDIR)/test_gck_crypto-test-gck-crypto.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-crypto.c' object='gck/test_gck_crypto-test-gck-crypto.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_crypto_CFLAGS) $(CFLAGS) -c -o gck/test_gck_crypto-test-gck-crypto.o `test -f 'gck/test-gck-crypto.c' || echo '$(srcdir)/'`gck/test-gck-crypto.c + +gck/test_gck_crypto-test-gck-crypto.obj: gck/test-gck-crypto.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_crypto_CFLAGS) $(CFLAGS) -MT gck/test_gck_crypto-test-gck-crypto.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_crypto-test-gck-crypto.Tpo -c -o gck/test_gck_crypto-test-gck-crypto.obj `if test -f 'gck/test-gck-crypto.c'; then $(CYGPATH_W) 'gck/test-gck-crypto.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-crypto.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_crypto-test-gck-crypto.Tpo gck/$(DEPDIR)/test_gck_crypto-test-gck-crypto.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-crypto.c' object='gck/test_gck_crypto-test-gck-crypto.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_crypto_CFLAGS) $(CFLAGS) -c -o gck/test_gck_crypto-test-gck-crypto.obj `if test -f 'gck/test-gck-crypto.c'; then $(CYGPATH_W) 'gck/test-gck-crypto.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-crypto.c'; fi` + +gck/test_gck_enumerator-test-gck-enumerator.o: gck/test-gck-enumerator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_enumerator_CFLAGS) $(CFLAGS) -MT gck/test_gck_enumerator-test-gck-enumerator.o -MD -MP -MF gck/$(DEPDIR)/test_gck_enumerator-test-gck-enumerator.Tpo -c -o gck/test_gck_enumerator-test-gck-enumerator.o `test -f 'gck/test-gck-enumerator.c' || echo '$(srcdir)/'`gck/test-gck-enumerator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_enumerator-test-gck-enumerator.Tpo gck/$(DEPDIR)/test_gck_enumerator-test-gck-enumerator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-enumerator.c' object='gck/test_gck_enumerator-test-gck-enumerator.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_enumerator_CFLAGS) $(CFLAGS) -c -o gck/test_gck_enumerator-test-gck-enumerator.o `test -f 'gck/test-gck-enumerator.c' || echo '$(srcdir)/'`gck/test-gck-enumerator.c + +gck/test_gck_enumerator-test-gck-enumerator.obj: gck/test-gck-enumerator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_enumerator_CFLAGS) $(CFLAGS) -MT gck/test_gck_enumerator-test-gck-enumerator.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_enumerator-test-gck-enumerator.Tpo -c -o gck/test_gck_enumerator-test-gck-enumerator.obj `if test -f 'gck/test-gck-enumerator.c'; then $(CYGPATH_W) 'gck/test-gck-enumerator.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-enumerator.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_enumerator-test-gck-enumerator.Tpo gck/$(DEPDIR)/test_gck_enumerator-test-gck-enumerator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-enumerator.c' object='gck/test_gck_enumerator-test-gck-enumerator.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_enumerator_CFLAGS) $(CFLAGS) -c -o gck/test_gck_enumerator-test-gck-enumerator.obj `if test -f 'gck/test-gck-enumerator.c'; then $(CYGPATH_W) 'gck/test-gck-enumerator.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-enumerator.c'; fi` + +gck/test_gck_module-test-gck-module.o: gck/test-gck-module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_module_CFLAGS) $(CFLAGS) -MT gck/test_gck_module-test-gck-module.o -MD -MP -MF gck/$(DEPDIR)/test_gck_module-test-gck-module.Tpo -c -o gck/test_gck_module-test-gck-module.o `test -f 'gck/test-gck-module.c' || echo '$(srcdir)/'`gck/test-gck-module.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_module-test-gck-module.Tpo gck/$(DEPDIR)/test_gck_module-test-gck-module.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-module.c' object='gck/test_gck_module-test-gck-module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_module_CFLAGS) $(CFLAGS) -c -o gck/test_gck_module-test-gck-module.o `test -f 'gck/test-gck-module.c' || echo '$(srcdir)/'`gck/test-gck-module.c + +gck/test_gck_module-test-gck-module.obj: gck/test-gck-module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_module_CFLAGS) $(CFLAGS) -MT gck/test_gck_module-test-gck-module.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_module-test-gck-module.Tpo -c -o gck/test_gck_module-test-gck-module.obj `if test -f 'gck/test-gck-module.c'; then $(CYGPATH_W) 'gck/test-gck-module.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-module.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_module-test-gck-module.Tpo gck/$(DEPDIR)/test_gck_module-test-gck-module.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-module.c' object='gck/test_gck_module-test-gck-module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_module_CFLAGS) $(CFLAGS) -c -o gck/test_gck_module-test-gck-module.obj `if test -f 'gck/test-gck-module.c'; then $(CYGPATH_W) 'gck/test-gck-module.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-module.c'; fi` + +gck/test_gck_modules-test-gck-modules.o: gck/test-gck-modules.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_modules_CFLAGS) $(CFLAGS) -MT gck/test_gck_modules-test-gck-modules.o -MD -MP -MF gck/$(DEPDIR)/test_gck_modules-test-gck-modules.Tpo -c -o gck/test_gck_modules-test-gck-modules.o `test -f 'gck/test-gck-modules.c' || echo '$(srcdir)/'`gck/test-gck-modules.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_modules-test-gck-modules.Tpo gck/$(DEPDIR)/test_gck_modules-test-gck-modules.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-modules.c' object='gck/test_gck_modules-test-gck-modules.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_modules_CFLAGS) $(CFLAGS) -c -o gck/test_gck_modules-test-gck-modules.o `test -f 'gck/test-gck-modules.c' || echo '$(srcdir)/'`gck/test-gck-modules.c + +gck/test_gck_modules-test-gck-modules.obj: gck/test-gck-modules.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_modules_CFLAGS) $(CFLAGS) -MT gck/test_gck_modules-test-gck-modules.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_modules-test-gck-modules.Tpo -c -o gck/test_gck_modules-test-gck-modules.obj `if test -f 'gck/test-gck-modules.c'; then $(CYGPATH_W) 'gck/test-gck-modules.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-modules.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_modules-test-gck-modules.Tpo gck/$(DEPDIR)/test_gck_modules-test-gck-modules.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-modules.c' object='gck/test_gck_modules-test-gck-modules.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_modules_CFLAGS) $(CFLAGS) -c -o gck/test_gck_modules-test-gck-modules.obj `if test -f 'gck/test-gck-modules.c'; then $(CYGPATH_W) 'gck/test-gck-modules.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-modules.c'; fi` + +gck/test_gck_object-test-gck-object.o: gck/test-gck-object.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_object_CFLAGS) $(CFLAGS) -MT gck/test_gck_object-test-gck-object.o -MD -MP -MF gck/$(DEPDIR)/test_gck_object-test-gck-object.Tpo -c -o gck/test_gck_object-test-gck-object.o `test -f 'gck/test-gck-object.c' || echo '$(srcdir)/'`gck/test-gck-object.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_object-test-gck-object.Tpo gck/$(DEPDIR)/test_gck_object-test-gck-object.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-object.c' object='gck/test_gck_object-test-gck-object.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_object_CFLAGS) $(CFLAGS) -c -o gck/test_gck_object-test-gck-object.o `test -f 'gck/test-gck-object.c' || echo '$(srcdir)/'`gck/test-gck-object.c + +gck/test_gck_object-test-gck-object.obj: gck/test-gck-object.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_object_CFLAGS) $(CFLAGS) -MT gck/test_gck_object-test-gck-object.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_object-test-gck-object.Tpo -c -o gck/test_gck_object-test-gck-object.obj `if test -f 'gck/test-gck-object.c'; then $(CYGPATH_W) 'gck/test-gck-object.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-object.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_object-test-gck-object.Tpo gck/$(DEPDIR)/test_gck_object-test-gck-object.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-object.c' object='gck/test_gck_object-test-gck-object.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_object_CFLAGS) $(CFLAGS) -c -o gck/test_gck_object-test-gck-object.obj `if test -f 'gck/test-gck-object.c'; then $(CYGPATH_W) 'gck/test-gck-object.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-object.c'; fi` + +gck/test_gck_session-test-gck-session.o: gck/test-gck-session.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_session_CFLAGS) $(CFLAGS) -MT gck/test_gck_session-test-gck-session.o -MD -MP -MF gck/$(DEPDIR)/test_gck_session-test-gck-session.Tpo -c -o gck/test_gck_session-test-gck-session.o `test -f 'gck/test-gck-session.c' || echo '$(srcdir)/'`gck/test-gck-session.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_session-test-gck-session.Tpo gck/$(DEPDIR)/test_gck_session-test-gck-session.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-session.c' object='gck/test_gck_session-test-gck-session.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_session_CFLAGS) $(CFLAGS) -c -o gck/test_gck_session-test-gck-session.o `test -f 'gck/test-gck-session.c' || echo '$(srcdir)/'`gck/test-gck-session.c + +gck/test_gck_session-test-gck-session.obj: gck/test-gck-session.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_session_CFLAGS) $(CFLAGS) -MT gck/test_gck_session-test-gck-session.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_session-test-gck-session.Tpo -c -o gck/test_gck_session-test-gck-session.obj `if test -f 'gck/test-gck-session.c'; then $(CYGPATH_W) 'gck/test-gck-session.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-session.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_session-test-gck-session.Tpo gck/$(DEPDIR)/test_gck_session-test-gck-session.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-session.c' object='gck/test_gck_session-test-gck-session.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_session_CFLAGS) $(CFLAGS) -c -o gck/test_gck_session-test-gck-session.obj `if test -f 'gck/test-gck-session.c'; then $(CYGPATH_W) 'gck/test-gck-session.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-session.c'; fi` + +gck/test_gck_slot-test-gck-slot.o: gck/test-gck-slot.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_slot_CFLAGS) $(CFLAGS) -MT gck/test_gck_slot-test-gck-slot.o -MD -MP -MF gck/$(DEPDIR)/test_gck_slot-test-gck-slot.Tpo -c -o gck/test_gck_slot-test-gck-slot.o `test -f 'gck/test-gck-slot.c' || echo '$(srcdir)/'`gck/test-gck-slot.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_slot-test-gck-slot.Tpo gck/$(DEPDIR)/test_gck_slot-test-gck-slot.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-slot.c' object='gck/test_gck_slot-test-gck-slot.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_slot_CFLAGS) $(CFLAGS) -c -o gck/test_gck_slot-test-gck-slot.o `test -f 'gck/test-gck-slot.c' || echo '$(srcdir)/'`gck/test-gck-slot.c + +gck/test_gck_slot-test-gck-slot.obj: gck/test-gck-slot.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_slot_CFLAGS) $(CFLAGS) -MT gck/test_gck_slot-test-gck-slot.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_slot-test-gck-slot.Tpo -c -o gck/test_gck_slot-test-gck-slot.obj `if test -f 'gck/test-gck-slot.c'; then $(CYGPATH_W) 'gck/test-gck-slot.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-slot.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_slot-test-gck-slot.Tpo gck/$(DEPDIR)/test_gck_slot-test-gck-slot.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-slot.c' object='gck/test_gck_slot-test-gck-slot.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_slot_CFLAGS) $(CFLAGS) -c -o gck/test_gck_slot-test-gck-slot.obj `if test -f 'gck/test-gck-slot.c'; then $(CYGPATH_W) 'gck/test-gck-slot.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-slot.c'; fi` + +gck/test_gck_uri-test-gck-uri.o: gck/test-gck-uri.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_uri_CFLAGS) $(CFLAGS) -MT gck/test_gck_uri-test-gck-uri.o -MD -MP -MF gck/$(DEPDIR)/test_gck_uri-test-gck-uri.Tpo -c -o gck/test_gck_uri-test-gck-uri.o `test -f 'gck/test-gck-uri.c' || echo '$(srcdir)/'`gck/test-gck-uri.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_uri-test-gck-uri.Tpo gck/$(DEPDIR)/test_gck_uri-test-gck-uri.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-uri.c' object='gck/test_gck_uri-test-gck-uri.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_uri_CFLAGS) $(CFLAGS) -c -o gck/test_gck_uri-test-gck-uri.o `test -f 'gck/test-gck-uri.c' || echo '$(srcdir)/'`gck/test-gck-uri.c + +gck/test_gck_uri-test-gck-uri.obj: gck/test-gck-uri.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_uri_CFLAGS) $(CFLAGS) -MT gck/test_gck_uri-test-gck-uri.obj -MD -MP -MF gck/$(DEPDIR)/test_gck_uri-test-gck-uri.Tpo -c -o gck/test_gck_uri-test-gck-uri.obj `if test -f 'gck/test-gck-uri.c'; then $(CYGPATH_W) 'gck/test-gck-uri.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-uri.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gck/$(DEPDIR)/test_gck_uri-test-gck-uri.Tpo gck/$(DEPDIR)/test_gck_uri-test-gck-uri.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gck/test-gck-uri.c' object='gck/test_gck_uri-test-gck-uri.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gck_uri_CFLAGS) $(CFLAGS) -c -o gck/test_gck_uri-test-gck-uri.obj `if test -f 'gck/test-gck-uri.c'; then $(CYGPATH_W) 'gck/test-gck-uri.c'; else $(CYGPATH_W) '$(srcdir)/gck/test-gck-uri.c'; fi` + +gcr/test_gnupg_collection-test-gnupg-collection.o: gcr/test-gnupg-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_collection_CFLAGS) $(CFLAGS) -MT gcr/test_gnupg_collection-test-gnupg-collection.o -MD -MP -MF gcr/$(DEPDIR)/test_gnupg_collection-test-gnupg-collection.Tpo -c -o gcr/test_gnupg_collection-test-gnupg-collection.o `test -f 'gcr/test-gnupg-collection.c' || echo '$(srcdir)/'`gcr/test-gnupg-collection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_gnupg_collection-test-gnupg-collection.Tpo gcr/$(DEPDIR)/test_gnupg_collection-test-gnupg-collection.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-gnupg-collection.c' object='gcr/test_gnupg_collection-test-gnupg-collection.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_collection_CFLAGS) $(CFLAGS) -c -o gcr/test_gnupg_collection-test-gnupg-collection.o `test -f 'gcr/test-gnupg-collection.c' || echo '$(srcdir)/'`gcr/test-gnupg-collection.c + +gcr/test_gnupg_collection-test-gnupg-collection.obj: gcr/test-gnupg-collection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_collection_CFLAGS) $(CFLAGS) -MT gcr/test_gnupg_collection-test-gnupg-collection.obj -MD -MP -MF gcr/$(DEPDIR)/test_gnupg_collection-test-gnupg-collection.Tpo -c -o gcr/test_gnupg_collection-test-gnupg-collection.obj `if test -f 'gcr/test-gnupg-collection.c'; then $(CYGPATH_W) 'gcr/test-gnupg-collection.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-gnupg-collection.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_gnupg_collection-test-gnupg-collection.Tpo gcr/$(DEPDIR)/test_gnupg_collection-test-gnupg-collection.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-gnupg-collection.c' object='gcr/test_gnupg_collection-test-gnupg-collection.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_collection_CFLAGS) $(CFLAGS) -c -o gcr/test_gnupg_collection-test-gnupg-collection.obj `if test -f 'gcr/test-gnupg-collection.c'; then $(CYGPATH_W) 'gcr/test-gnupg-collection.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-gnupg-collection.c'; fi` + +gcr/test_gnupg_key-test-gnupg-key.o: gcr/test-gnupg-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_key_CFLAGS) $(CFLAGS) -MT gcr/test_gnupg_key-test-gnupg-key.o -MD -MP -MF gcr/$(DEPDIR)/test_gnupg_key-test-gnupg-key.Tpo -c -o gcr/test_gnupg_key-test-gnupg-key.o `test -f 'gcr/test-gnupg-key.c' || echo '$(srcdir)/'`gcr/test-gnupg-key.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_gnupg_key-test-gnupg-key.Tpo gcr/$(DEPDIR)/test_gnupg_key-test-gnupg-key.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-gnupg-key.c' object='gcr/test_gnupg_key-test-gnupg-key.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_key_CFLAGS) $(CFLAGS) -c -o gcr/test_gnupg_key-test-gnupg-key.o `test -f 'gcr/test-gnupg-key.c' || echo '$(srcdir)/'`gcr/test-gnupg-key.c + +gcr/test_gnupg_key-test-gnupg-key.obj: gcr/test-gnupg-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_key_CFLAGS) $(CFLAGS) -MT gcr/test_gnupg_key-test-gnupg-key.obj -MD -MP -MF gcr/$(DEPDIR)/test_gnupg_key-test-gnupg-key.Tpo -c -o gcr/test_gnupg_key-test-gnupg-key.obj `if test -f 'gcr/test-gnupg-key.c'; then $(CYGPATH_W) 'gcr/test-gnupg-key.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-gnupg-key.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_gnupg_key-test-gnupg-key.Tpo gcr/$(DEPDIR)/test_gnupg_key-test-gnupg-key.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-gnupg-key.c' object='gcr/test_gnupg_key-test-gnupg-key.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_key_CFLAGS) $(CFLAGS) -c -o gcr/test_gnupg_key-test-gnupg-key.obj `if test -f 'gcr/test-gnupg-key.c'; then $(CYGPATH_W) 'gcr/test-gnupg-key.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-gnupg-key.c'; fi` + +gcr/test_gnupg_process-test-gnupg-process.o: gcr/test-gnupg-process.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_process_CFLAGS) $(CFLAGS) -MT gcr/test_gnupg_process-test-gnupg-process.o -MD -MP -MF gcr/$(DEPDIR)/test_gnupg_process-test-gnupg-process.Tpo -c -o gcr/test_gnupg_process-test-gnupg-process.o `test -f 'gcr/test-gnupg-process.c' || echo '$(srcdir)/'`gcr/test-gnupg-process.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_gnupg_process-test-gnupg-process.Tpo gcr/$(DEPDIR)/test_gnupg_process-test-gnupg-process.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-gnupg-process.c' object='gcr/test_gnupg_process-test-gnupg-process.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_process_CFLAGS) $(CFLAGS) -c -o gcr/test_gnupg_process-test-gnupg-process.o `test -f 'gcr/test-gnupg-process.c' || echo '$(srcdir)/'`gcr/test-gnupg-process.c + +gcr/test_gnupg_process-test-gnupg-process.obj: gcr/test-gnupg-process.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_process_CFLAGS) $(CFLAGS) -MT gcr/test_gnupg_process-test-gnupg-process.obj -MD -MP -MF gcr/$(DEPDIR)/test_gnupg_process-test-gnupg-process.Tpo -c -o gcr/test_gnupg_process-test-gnupg-process.obj `if test -f 'gcr/test-gnupg-process.c'; then $(CYGPATH_W) 'gcr/test-gnupg-process.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-gnupg-process.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_gnupg_process-test-gnupg-process.Tpo gcr/$(DEPDIR)/test_gnupg_process-test-gnupg-process.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-gnupg-process.c' object='gcr/test_gnupg_process-test-gnupg-process.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gnupg_process_CFLAGS) $(CFLAGS) -c -o gcr/test_gnupg_process-test-gnupg-process.obj `if test -f 'gcr/test-gnupg-process.c'; then $(CYGPATH_W) 'gcr/test-gnupg-process.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-gnupg-process.c'; fi` + +gcr/test_memory_icon-test-memory-icon.o: gcr/test-memory-icon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_memory_icon_CFLAGS) $(CFLAGS) -MT gcr/test_memory_icon-test-memory-icon.o -MD -MP -MF gcr/$(DEPDIR)/test_memory_icon-test-memory-icon.Tpo -c -o gcr/test_memory_icon-test-memory-icon.o `test -f 'gcr/test-memory-icon.c' || echo '$(srcdir)/'`gcr/test-memory-icon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_memory_icon-test-memory-icon.Tpo gcr/$(DEPDIR)/test_memory_icon-test-memory-icon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-memory-icon.c' object='gcr/test_memory_icon-test-memory-icon.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_memory_icon_CFLAGS) $(CFLAGS) -c -o gcr/test_memory_icon-test-memory-icon.o `test -f 'gcr/test-memory-icon.c' || echo '$(srcdir)/'`gcr/test-memory-icon.c + +gcr/test_memory_icon-test-memory-icon.obj: gcr/test-memory-icon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_memory_icon_CFLAGS) $(CFLAGS) -MT gcr/test_memory_icon-test-memory-icon.obj -MD -MP -MF gcr/$(DEPDIR)/test_memory_icon-test-memory-icon.Tpo -c -o gcr/test_memory_icon-test-memory-icon.obj `if test -f 'gcr/test-memory-icon.c'; then $(CYGPATH_W) 'gcr/test-memory-icon.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-memory-icon.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_memory_icon-test-memory-icon.Tpo gcr/$(DEPDIR)/test_memory_icon-test-memory-icon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-memory-icon.c' object='gcr/test_memory_icon-test-memory-icon.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_memory_icon_CFLAGS) $(CFLAGS) -c -o gcr/test_memory_icon-test-memory-icon.obj `if test -f 'gcr/test-memory-icon.c'; then $(CYGPATH_W) 'gcr/test-memory-icon.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-memory-icon.c'; fi` + +gcr/test_openpgp-test-openpgp.o: gcr/test-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openpgp_CFLAGS) $(CFLAGS) -MT gcr/test_openpgp-test-openpgp.o -MD -MP -MF gcr/$(DEPDIR)/test_openpgp-test-openpgp.Tpo -c -o gcr/test_openpgp-test-openpgp.o `test -f 'gcr/test-openpgp.c' || echo '$(srcdir)/'`gcr/test-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_openpgp-test-openpgp.Tpo gcr/$(DEPDIR)/test_openpgp-test-openpgp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-openpgp.c' object='gcr/test_openpgp-test-openpgp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openpgp_CFLAGS) $(CFLAGS) -c -o gcr/test_openpgp-test-openpgp.o `test -f 'gcr/test-openpgp.c' || echo '$(srcdir)/'`gcr/test-openpgp.c + +gcr/test_openpgp-test-openpgp.obj: gcr/test-openpgp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openpgp_CFLAGS) $(CFLAGS) -MT gcr/test_openpgp-test-openpgp.obj -MD -MP -MF gcr/$(DEPDIR)/test_openpgp-test-openpgp.Tpo -c -o gcr/test_openpgp-test-openpgp.obj `if test -f 'gcr/test-openpgp.c'; then $(CYGPATH_W) 'gcr/test-openpgp.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-openpgp.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_openpgp-test-openpgp.Tpo gcr/$(DEPDIR)/test_openpgp-test-openpgp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-openpgp.c' object='gcr/test_openpgp-test-openpgp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openpgp_CFLAGS) $(CFLAGS) -c -o gcr/test_openpgp-test-openpgp.obj `if test -f 'gcr/test-openpgp.c'; then $(CYGPATH_W) 'gcr/test-openpgp.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-openpgp.c'; fi` + +gcr/test_openssh-test-openssh.o: gcr/test-openssh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openssh_CFLAGS) $(CFLAGS) -MT gcr/test_openssh-test-openssh.o -MD -MP -MF gcr/$(DEPDIR)/test_openssh-test-openssh.Tpo -c -o gcr/test_openssh-test-openssh.o `test -f 'gcr/test-openssh.c' || echo '$(srcdir)/'`gcr/test-openssh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_openssh-test-openssh.Tpo gcr/$(DEPDIR)/test_openssh-test-openssh.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-openssh.c' object='gcr/test_openssh-test-openssh.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openssh_CFLAGS) $(CFLAGS) -c -o gcr/test_openssh-test-openssh.o `test -f 'gcr/test-openssh.c' || echo '$(srcdir)/'`gcr/test-openssh.c + +gcr/test_openssh-test-openssh.obj: gcr/test-openssh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openssh_CFLAGS) $(CFLAGS) -MT gcr/test_openssh-test-openssh.obj -MD -MP -MF gcr/$(DEPDIR)/test_openssh-test-openssh.Tpo -c -o gcr/test_openssh-test-openssh.obj `if test -f 'gcr/test-openssh.c'; then $(CYGPATH_W) 'gcr/test-openssh.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-openssh.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_openssh-test-openssh.Tpo gcr/$(DEPDIR)/test_openssh-test-openssh.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-openssh.c' object='gcr/test_openssh-test-openssh.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_openssh_CFLAGS) $(CFLAGS) -c -o gcr/test_openssh-test-openssh.obj `if test -f 'gcr/test-openssh.c'; then $(CYGPATH_W) 'gcr/test-openssh.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-openssh.c'; fi` + +gcr/test_parser-test-parser.o: gcr/test-parser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_parser_CFLAGS) $(CFLAGS) -MT gcr/test_parser-test-parser.o -MD -MP -MF gcr/$(DEPDIR)/test_parser-test-parser.Tpo -c -o gcr/test_parser-test-parser.o `test -f 'gcr/test-parser.c' || echo '$(srcdir)/'`gcr/test-parser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_parser-test-parser.Tpo gcr/$(DEPDIR)/test_parser-test-parser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-parser.c' object='gcr/test_parser-test-parser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_parser_CFLAGS) $(CFLAGS) -c -o gcr/test_parser-test-parser.o `test -f 'gcr/test-parser.c' || echo '$(srcdir)/'`gcr/test-parser.c + +gcr/test_parser-test-parser.obj: gcr/test-parser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_parser_CFLAGS) $(CFLAGS) -MT gcr/test_parser-test-parser.obj -MD -MP -MF gcr/$(DEPDIR)/test_parser-test-parser.Tpo -c -o gcr/test_parser-test-parser.obj `if test -f 'gcr/test-parser.c'; then $(CYGPATH_W) 'gcr/test-parser.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-parser.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_parser-test-parser.Tpo gcr/$(DEPDIR)/test_parser-test-parser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-parser.c' object='gcr/test_parser-test-parser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_parser_CFLAGS) $(CFLAGS) -c -o gcr/test_parser-test-parser.obj `if test -f 'gcr/test-parser.c'; then $(CYGPATH_W) 'gcr/test-parser.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-parser.c'; fi` + +gcr/test_pkcs11_certificate-test-pkcs11-certificate.o: gcr/test-pkcs11-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_pkcs11_certificate_CFLAGS) $(CFLAGS) -MT gcr/test_pkcs11_certificate-test-pkcs11-certificate.o -MD -MP -MF gcr/$(DEPDIR)/test_pkcs11_certificate-test-pkcs11-certificate.Tpo -c -o gcr/test_pkcs11_certificate-test-pkcs11-certificate.o `test -f 'gcr/test-pkcs11-certificate.c' || echo '$(srcdir)/'`gcr/test-pkcs11-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_pkcs11_certificate-test-pkcs11-certificate.Tpo gcr/$(DEPDIR)/test_pkcs11_certificate-test-pkcs11-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-pkcs11-certificate.c' object='gcr/test_pkcs11_certificate-test-pkcs11-certificate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_pkcs11_certificate_CFLAGS) $(CFLAGS) -c -o gcr/test_pkcs11_certificate-test-pkcs11-certificate.o `test -f 'gcr/test-pkcs11-certificate.c' || echo '$(srcdir)/'`gcr/test-pkcs11-certificate.c + +gcr/test_pkcs11_certificate-test-pkcs11-certificate.obj: gcr/test-pkcs11-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_pkcs11_certificate_CFLAGS) $(CFLAGS) -MT gcr/test_pkcs11_certificate-test-pkcs11-certificate.obj -MD -MP -MF gcr/$(DEPDIR)/test_pkcs11_certificate-test-pkcs11-certificate.Tpo -c -o gcr/test_pkcs11_certificate-test-pkcs11-certificate.obj `if test -f 'gcr/test-pkcs11-certificate.c'; then $(CYGPATH_W) 'gcr/test-pkcs11-certificate.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-pkcs11-certificate.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_pkcs11_certificate-test-pkcs11-certificate.Tpo gcr/$(DEPDIR)/test_pkcs11_certificate-test-pkcs11-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-pkcs11-certificate.c' object='gcr/test_pkcs11_certificate-test-pkcs11-certificate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_pkcs11_certificate_CFLAGS) $(CFLAGS) -c -o gcr/test_pkcs11_certificate-test-pkcs11-certificate.obj `if test -f 'gcr/test-pkcs11-certificate.c'; then $(CYGPATH_W) 'gcr/test-pkcs11-certificate.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-pkcs11-certificate.c'; fi` + +gcr/test_record-test-record.o: gcr/test-record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_record_CFLAGS) $(CFLAGS) -MT gcr/test_record-test-record.o -MD -MP -MF gcr/$(DEPDIR)/test_record-test-record.Tpo -c -o gcr/test_record-test-record.o `test -f 'gcr/test-record.c' || echo '$(srcdir)/'`gcr/test-record.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_record-test-record.Tpo gcr/$(DEPDIR)/test_record-test-record.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-record.c' object='gcr/test_record-test-record.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_record_CFLAGS) $(CFLAGS) -c -o gcr/test_record-test-record.o `test -f 'gcr/test-record.c' || echo '$(srcdir)/'`gcr/test-record.c + +gcr/test_record-test-record.obj: gcr/test-record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_record_CFLAGS) $(CFLAGS) -MT gcr/test_record-test-record.obj -MD -MP -MF gcr/$(DEPDIR)/test_record-test-record.Tpo -c -o gcr/test_record-test-record.obj `if test -f 'gcr/test-record.c'; then $(CYGPATH_W) 'gcr/test-record.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-record.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_record-test-record.Tpo gcr/$(DEPDIR)/test_record-test-record.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-record.c' object='gcr/test_record-test-record.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_record_CFLAGS) $(CFLAGS) -c -o gcr/test_record-test-record.obj `if test -f 'gcr/test-record.c'; then $(CYGPATH_W) 'gcr/test-record.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-record.c'; fi` + +gcr/test_secret_exchange-test-secret-exchange.o: gcr/test-secret-exchange.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secret_exchange_CFLAGS) $(CFLAGS) -MT gcr/test_secret_exchange-test-secret-exchange.o -MD -MP -MF gcr/$(DEPDIR)/test_secret_exchange-test-secret-exchange.Tpo -c -o gcr/test_secret_exchange-test-secret-exchange.o `test -f 'gcr/test-secret-exchange.c' || echo '$(srcdir)/'`gcr/test-secret-exchange.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_secret_exchange-test-secret-exchange.Tpo gcr/$(DEPDIR)/test_secret_exchange-test-secret-exchange.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-secret-exchange.c' object='gcr/test_secret_exchange-test-secret-exchange.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secret_exchange_CFLAGS) $(CFLAGS) -c -o gcr/test_secret_exchange-test-secret-exchange.o `test -f 'gcr/test-secret-exchange.c' || echo '$(srcdir)/'`gcr/test-secret-exchange.c + +gcr/test_secret_exchange-test-secret-exchange.obj: gcr/test-secret-exchange.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secret_exchange_CFLAGS) $(CFLAGS) -MT gcr/test_secret_exchange-test-secret-exchange.obj -MD -MP -MF gcr/$(DEPDIR)/test_secret_exchange-test-secret-exchange.Tpo -c -o gcr/test_secret_exchange-test-secret-exchange.obj `if test -f 'gcr/test-secret-exchange.c'; then $(CYGPATH_W) 'gcr/test-secret-exchange.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-secret-exchange.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_secret_exchange-test-secret-exchange.Tpo gcr/$(DEPDIR)/test_secret_exchange-test-secret-exchange.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-secret-exchange.c' object='gcr/test_secret_exchange-test-secret-exchange.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secret_exchange_CFLAGS) $(CFLAGS) -c -o gcr/test_secret_exchange-test-secret-exchange.obj `if test -f 'gcr/test-secret-exchange.c'; then $(CYGPATH_W) 'gcr/test-secret-exchange.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-secret-exchange.c'; fi` + +gcr/test_secure_memory-test-secure-memory.o: gcr/test-secure-memory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secure_memory_CFLAGS) $(CFLAGS) -MT gcr/test_secure_memory-test-secure-memory.o -MD -MP -MF gcr/$(DEPDIR)/test_secure_memory-test-secure-memory.Tpo -c -o gcr/test_secure_memory-test-secure-memory.o `test -f 'gcr/test-secure-memory.c' || echo '$(srcdir)/'`gcr/test-secure-memory.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_secure_memory-test-secure-memory.Tpo gcr/$(DEPDIR)/test_secure_memory-test-secure-memory.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-secure-memory.c' object='gcr/test_secure_memory-test-secure-memory.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secure_memory_CFLAGS) $(CFLAGS) -c -o gcr/test_secure_memory-test-secure-memory.o `test -f 'gcr/test-secure-memory.c' || echo '$(srcdir)/'`gcr/test-secure-memory.c + +gcr/test_secure_memory-test-secure-memory.obj: gcr/test-secure-memory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secure_memory_CFLAGS) $(CFLAGS) -MT gcr/test_secure_memory-test-secure-memory.obj -MD -MP -MF gcr/$(DEPDIR)/test_secure_memory-test-secure-memory.Tpo -c -o gcr/test_secure_memory-test-secure-memory.obj `if test -f 'gcr/test-secure-memory.c'; then $(CYGPATH_W) 'gcr/test-secure-memory.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-secure-memory.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_secure_memory-test-secure-memory.Tpo gcr/$(DEPDIR)/test_secure_memory-test-secure-memory.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-secure-memory.c' object='gcr/test_secure_memory-test-secure-memory.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_secure_memory_CFLAGS) $(CFLAGS) -c -o gcr/test_secure_memory-test-secure-memory.obj `if test -f 'gcr/test-secure-memory.c'; then $(CYGPATH_W) 'gcr/test-secure-memory.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-secure-memory.c'; fi` + +gcr/test_simple_certificate-test-simple-certificate.o: gcr/test-simple-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_simple_certificate_CFLAGS) $(CFLAGS) -MT gcr/test_simple_certificate-test-simple-certificate.o -MD -MP -MF gcr/$(DEPDIR)/test_simple_certificate-test-simple-certificate.Tpo -c -o gcr/test_simple_certificate-test-simple-certificate.o `test -f 'gcr/test-simple-certificate.c' || echo '$(srcdir)/'`gcr/test-simple-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_simple_certificate-test-simple-certificate.Tpo gcr/$(DEPDIR)/test_simple_certificate-test-simple-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-simple-certificate.c' object='gcr/test_simple_certificate-test-simple-certificate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_simple_certificate_CFLAGS) $(CFLAGS) -c -o gcr/test_simple_certificate-test-simple-certificate.o `test -f 'gcr/test-simple-certificate.c' || echo '$(srcdir)/'`gcr/test-simple-certificate.c + +gcr/test_simple_certificate-test-simple-certificate.obj: gcr/test-simple-certificate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_simple_certificate_CFLAGS) $(CFLAGS) -MT gcr/test_simple_certificate-test-simple-certificate.obj -MD -MP -MF gcr/$(DEPDIR)/test_simple_certificate-test-simple-certificate.Tpo -c -o gcr/test_simple_certificate-test-simple-certificate.obj `if test -f 'gcr/test-simple-certificate.c'; then $(CYGPATH_W) 'gcr/test-simple-certificate.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-simple-certificate.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_simple_certificate-test-simple-certificate.Tpo gcr/$(DEPDIR)/test_simple_certificate-test-simple-certificate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-simple-certificate.c' object='gcr/test_simple_certificate-test-simple-certificate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_simple_certificate_CFLAGS) $(CFLAGS) -c -o gcr/test_simple_certificate-test-simple-certificate.obj `if test -f 'gcr/test-simple-certificate.c'; then $(CYGPATH_W) 'gcr/test-simple-certificate.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-simple-certificate.c'; fi` + +gcr/test_ssh_askpass-test-ssh-askpass.o: gcr/test-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_ssh_askpass_CFLAGS) $(CFLAGS) -MT gcr/test_ssh_askpass-test-ssh-askpass.o -MD -MP -MF gcr/$(DEPDIR)/test_ssh_askpass-test-ssh-askpass.Tpo -c -o gcr/test_ssh_askpass-test-ssh-askpass.o `test -f 'gcr/test-ssh-askpass.c' || echo '$(srcdir)/'`gcr/test-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_ssh_askpass-test-ssh-askpass.Tpo gcr/$(DEPDIR)/test_ssh_askpass-test-ssh-askpass.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-ssh-askpass.c' object='gcr/test_ssh_askpass-test-ssh-askpass.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_ssh_askpass_CFLAGS) $(CFLAGS) -c -o gcr/test_ssh_askpass-test-ssh-askpass.o `test -f 'gcr/test-ssh-askpass.c' || echo '$(srcdir)/'`gcr/test-ssh-askpass.c + +gcr/test_ssh_askpass-test-ssh-askpass.obj: gcr/test-ssh-askpass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_ssh_askpass_CFLAGS) $(CFLAGS) -MT gcr/test_ssh_askpass-test-ssh-askpass.obj -MD -MP -MF gcr/$(DEPDIR)/test_ssh_askpass-test-ssh-askpass.Tpo -c -o gcr/test_ssh_askpass-test-ssh-askpass.obj `if test -f 'gcr/test-ssh-askpass.c'; then $(CYGPATH_W) 'gcr/test-ssh-askpass.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-ssh-askpass.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_ssh_askpass-test-ssh-askpass.Tpo gcr/$(DEPDIR)/test_ssh_askpass-test-ssh-askpass.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-ssh-askpass.c' object='gcr/test_ssh_askpass-test-ssh-askpass.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_ssh_askpass_CFLAGS) $(CFLAGS) -c -o gcr/test_ssh_askpass-test-ssh-askpass.obj `if test -f 'gcr/test-ssh-askpass.c'; then $(CYGPATH_W) 'gcr/test-ssh-askpass.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-ssh-askpass.c'; fi` + +gcr/test_subject_public_key-test-subject-public-key.o: gcr/test-subject-public-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_subject_public_key_CFLAGS) $(CFLAGS) -MT gcr/test_subject_public_key-test-subject-public-key.o -MD -MP -MF gcr/$(DEPDIR)/test_subject_public_key-test-subject-public-key.Tpo -c -o gcr/test_subject_public_key-test-subject-public-key.o `test -f 'gcr/test-subject-public-key.c' || echo '$(srcdir)/'`gcr/test-subject-public-key.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_subject_public_key-test-subject-public-key.Tpo gcr/$(DEPDIR)/test_subject_public_key-test-subject-public-key.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-subject-public-key.c' object='gcr/test_subject_public_key-test-subject-public-key.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_subject_public_key_CFLAGS) $(CFLAGS) -c -o gcr/test_subject_public_key-test-subject-public-key.o `test -f 'gcr/test-subject-public-key.c' || echo '$(srcdir)/'`gcr/test-subject-public-key.c + +gcr/test_subject_public_key-test-subject-public-key.obj: gcr/test-subject-public-key.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_subject_public_key_CFLAGS) $(CFLAGS) -MT gcr/test_subject_public_key-test-subject-public-key.obj -MD -MP -MF gcr/$(DEPDIR)/test_subject_public_key-test-subject-public-key.Tpo -c -o gcr/test_subject_public_key-test-subject-public-key.obj `if test -f 'gcr/test-subject-public-key.c'; then $(CYGPATH_W) 'gcr/test-subject-public-key.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-subject-public-key.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_subject_public_key-test-subject-public-key.Tpo gcr/$(DEPDIR)/test_subject_public_key-test-subject-public-key.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-subject-public-key.c' object='gcr/test_subject_public_key-test-subject-public-key.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_subject_public_key_CFLAGS) $(CFLAGS) -c -o gcr/test_subject_public_key-test-subject-public-key.obj `if test -f 'gcr/test-subject-public-key.c'; then $(CYGPATH_W) 'gcr/test-subject-public-key.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-subject-public-key.c'; fi` + +gcr/test_system_prompt-test-system-prompt.o: gcr/test-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_system_prompt_CFLAGS) $(CFLAGS) -MT gcr/test_system_prompt-test-system-prompt.o -MD -MP -MF gcr/$(DEPDIR)/test_system_prompt-test-system-prompt.Tpo -c -o gcr/test_system_prompt-test-system-prompt.o `test -f 'gcr/test-system-prompt.c' || echo '$(srcdir)/'`gcr/test-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_system_prompt-test-system-prompt.Tpo gcr/$(DEPDIR)/test_system_prompt-test-system-prompt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-system-prompt.c' object='gcr/test_system_prompt-test-system-prompt.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_system_prompt_CFLAGS) $(CFLAGS) -c -o gcr/test_system_prompt-test-system-prompt.o `test -f 'gcr/test-system-prompt.c' || echo '$(srcdir)/'`gcr/test-system-prompt.c + +gcr/test_system_prompt-test-system-prompt.obj: gcr/test-system-prompt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_system_prompt_CFLAGS) $(CFLAGS) -MT gcr/test_system_prompt-test-system-prompt.obj -MD -MP -MF gcr/$(DEPDIR)/test_system_prompt-test-system-prompt.Tpo -c -o gcr/test_system_prompt-test-system-prompt.obj `if test -f 'gcr/test-system-prompt.c'; then $(CYGPATH_W) 'gcr/test-system-prompt.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-system-prompt.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_system_prompt-test-system-prompt.Tpo gcr/$(DEPDIR)/test_system_prompt-test-system-prompt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-system-prompt.c' object='gcr/test_system_prompt-test-system-prompt.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_system_prompt_CFLAGS) $(CFLAGS) -c -o gcr/test_system_prompt-test-system-prompt.obj `if test -f 'gcr/test-system-prompt.c'; then $(CYGPATH_W) 'gcr/test-system-prompt.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-system-prompt.c'; fi` + +gcr/test_trust-test-trust.o: gcr/test-trust.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_trust_CFLAGS) $(CFLAGS) -MT gcr/test_trust-test-trust.o -MD -MP -MF gcr/$(DEPDIR)/test_trust-test-trust.Tpo -c -o gcr/test_trust-test-trust.o `test -f 'gcr/test-trust.c' || echo '$(srcdir)/'`gcr/test-trust.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_trust-test-trust.Tpo gcr/$(DEPDIR)/test_trust-test-trust.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-trust.c' object='gcr/test_trust-test-trust.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_trust_CFLAGS) $(CFLAGS) -c -o gcr/test_trust-test-trust.o `test -f 'gcr/test-trust.c' || echo '$(srcdir)/'`gcr/test-trust.c + +gcr/test_trust-test-trust.obj: gcr/test-trust.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_trust_CFLAGS) $(CFLAGS) -MT gcr/test_trust-test-trust.obj -MD -MP -MF gcr/$(DEPDIR)/test_trust-test-trust.Tpo -c -o gcr/test_trust-test-trust.obj `if test -f 'gcr/test-trust.c'; then $(CYGPATH_W) 'gcr/test-trust.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-trust.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_trust-test-trust.Tpo gcr/$(DEPDIR)/test_trust-test-trust.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-trust.c' object='gcr/test_trust-test-trust.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_trust_CFLAGS) $(CFLAGS) -c -o gcr/test_trust-test-trust.obj `if test -f 'gcr/test-trust.c'; then $(CYGPATH_W) 'gcr/test-trust.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-trust.c'; fi` + +gcr/test_util-test-util.o: gcr/test-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_util_CFLAGS) $(CFLAGS) -MT gcr/test_util-test-util.o -MD -MP -MF gcr/$(DEPDIR)/test_util-test-util.Tpo -c -o gcr/test_util-test-util.o `test -f 'gcr/test-util.c' || echo '$(srcdir)/'`gcr/test-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_util-test-util.Tpo gcr/$(DEPDIR)/test_util-test-util.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-util.c' object='gcr/test_util-test-util.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_util_CFLAGS) $(CFLAGS) -c -o gcr/test_util-test-util.o `test -f 'gcr/test-util.c' || echo '$(srcdir)/'`gcr/test-util.c + +gcr/test_util-test-util.obj: gcr/test-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_util_CFLAGS) $(CFLAGS) -MT gcr/test_util-test-util.obj -MD -MP -MF gcr/$(DEPDIR)/test_util-test-util.Tpo -c -o gcr/test_util-test-util.obj `if test -f 'gcr/test-util.c'; then $(CYGPATH_W) 'gcr/test-util.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-util.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) gcr/$(DEPDIR)/test_util-test-util.Tpo gcr/$(DEPDIR)/test_util-test-util.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcr/test-util.c' object='gcr/test_util-test-util.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_util_CFLAGS) $(CFLAGS) -c -o gcr/test_util-test-util.obj `if test -f 'gcr/test-util.c'; then $(CYGPATH_W) 'gcr/test-util.c'; else $(CYGPATH_W) '$(srcdir)/gcr/test-util.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf egg/.libs egg/_libs + -rm -rf gck/.libs gck/_libs + -rm -rf gcr/.libs gcr/_libs + -rm -rf ui/.libs ui/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-convertDATA: $(convert_DATA) + @$(NORMAL_INSTALL) + @list='$(convert_DATA)'; test -n "$(convertdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(convertdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(convertdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(convertdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(convertdir)" || exit $$?; \ + done + +uninstall-convertDATA: + @$(NORMAL_UNINSTALL) + @list='$(convert_DATA)'; test -n "$(convertdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(convertdir)'; $(am__uninstall_files_from_dir) +install-desktopDATA: $(desktop_DATA) + @$(NORMAL_INSTALL) + @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(desktopdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(desktopdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ + done + +uninstall-desktopDATA: + @$(NORMAL_UNINSTALL) + @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir) +install-girDATA: $(gir_DATA) + @$(NORMAL_INSTALL) + @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \ + done + +uninstall-girDATA: + @$(NORMAL_UNINSTALL) + @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir) +install-mimeDATA: $(mime_DATA) + @$(NORMAL_INSTALL) + @list='$(mime_DATA)'; test -n "$(mimedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(mimedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mimedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mimedir)" || exit $$?; \ + done + +uninstall-mimeDATA: + @$(NORMAL_UNINSTALL) + @list='$(mime_DATA)'; test -n "$(mimedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(mimedir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-serviceDATA: $(service_DATA) + @$(NORMAL_INSTALL) + @list='$(service_DATA)'; test -n "$(servicedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(servicedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(servicedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(servicedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(servicedir)" || exit $$?; \ + done + +uninstall-serviceDATA: + @$(NORMAL_UNINSTALL) + @list='$(service_DATA)'; test -n "$(servicedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(servicedir)'; $(am__uninstall_files_from_dir) +install-typelibsDATA: $(typelibs_DATA) + @$(NORMAL_INSTALL) + @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(typelibsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(typelibsdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \ + done + +uninstall-typelibsDATA: + @$(NORMAL_UNINSTALL) + @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(typelibsdir)'; $(am__uninstall_files_from_dir) +install-vapiDATA: $(vapi_DATA) + @$(NORMAL_INSTALL) + @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(vapidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(vapidir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(vapidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(vapidir)" || exit $$?; \ + done + +uninstall-vapiDATA: + @$(NORMAL_UNINSTALL) + @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(vapidir)'; $(am__uninstall_files_from_dir) +install-gck_incHEADERS: $(gck_inc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(gck_inc_HEADERS)'; test -n "$(gck_incdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(gck_incdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(gck_incdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(gck_incdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(gck_incdir)" || exit $$?; \ + done + +uninstall-gck_incHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(gck_inc_HEADERS)'; test -n "$(gck_incdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(gck_incdir)'; $(am__uninstall_files_from_dir) +install-gcr_incHEADERS: $(gcr_inc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(gcr_inc_HEADERS)'; test -n "$(gcr_incdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(gcr_incdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(gcr_incdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(gcr_incdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(gcr_incdir)" || exit $$?; \ + done + +uninstall-gcr_incHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(gcr_inc_HEADERS)'; test -n "$(gcr_incdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(gcr_incdir)'; $(am__uninstall_files_from_dir) +install-ui_incHEADERS: $(ui_inc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(ui_inc_HEADERS)'; test -n "$(ui_incdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(ui_incdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(ui_incdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(ui_incdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(ui_incdir)" || exit $$?; \ + done + +uninstall-ui_incHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(ui_inc_HEADERS)'; test -n "$(ui_incdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(ui_incdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_LTLIBRARIES) $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test-asn1.log: test-asn1$(EXEEXT) + @p='test-asn1$(EXEEXT)'; \ + b='test-asn1'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-asn1x.log: test-asn1x$(EXEEXT) + @p='test-asn1x$(EXEEXT)'; \ + b='test-asn1x'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-dn.log: test-dn$(EXEEXT) + @p='test-dn$(EXEEXT)'; \ + b='test-dn'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-decimal.log: test-decimal$(EXEEXT) + @p='test-decimal$(EXEEXT)'; \ + b='test-decimal'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-hex.log: test-hex$(EXEEXT) + @p='test-hex$(EXEEXT)'; \ + b='test-hex'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-hkdf.log: test-hkdf$(EXEEXT) + @p='test-hkdf$(EXEEXT)'; \ + b='test-hkdf'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-oid.log: test-oid$(EXEEXT) + @p='test-oid$(EXEEXT)'; \ + b='test-oid'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-secmem.log: test-secmem$(EXEEXT) + @p='test-secmem$(EXEEXT)'; \ + b='test-secmem'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-padding.log: test-padding$(EXEEXT) + @p='test-padding$(EXEEXT)'; \ + b='test-padding'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-symkey.log: test-symkey$(EXEEXT) + @p='test-symkey$(EXEEXT)'; \ + b='test-symkey'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-armor.log: test-armor$(EXEEXT) + @p='test-armor$(EXEEXT)'; \ + b='test-armor'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-openssl.log: test-openssl$(EXEEXT) + @p='test-openssl$(EXEEXT)'; \ + b='test-openssl'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-dh.log: test-dh$(EXEEXT) + @p='test-dh$(EXEEXT)'; \ + b='test-dh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-attributes.log: test-gck-attributes$(EXEEXT) + @p='test-gck-attributes$(EXEEXT)'; \ + b='test-gck-attributes'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-module.log: test-gck-module$(EXEEXT) + @p='test-gck-module$(EXEEXT)'; \ + b='test-gck-module'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-slot.log: test-gck-slot$(EXEEXT) + @p='test-gck-slot$(EXEEXT)'; \ + b='test-gck-slot'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-session.log: test-gck-session$(EXEEXT) + @p='test-gck-session$(EXEEXT)'; \ + b='test-gck-session'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-object.log: test-gck-object$(EXEEXT) + @p='test-gck-object$(EXEEXT)'; \ + b='test-gck-object'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-crypto.log: test-gck-crypto$(EXEEXT) + @p='test-gck-crypto$(EXEEXT)'; \ + b='test-gck-crypto'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-uri.log: test-gck-uri$(EXEEXT) + @p='test-gck-uri$(EXEEXT)'; \ + b='test-gck-uri'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-enumerator.log: test-gck-enumerator$(EXEEXT) + @p='test-gck-enumerator$(EXEEXT)'; \ + b='test-gck-enumerator'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gck-modules.log: test-gck-modules$(EXEEXT) + @p='test-gck-modules$(EXEEXT)'; \ + b='test-gck-modules'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-util.log: test-util$(EXEEXT) + @p='test-util$(EXEEXT)'; \ + b='test-util'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-filter-collection.log: test-filter-collection$(EXEEXT) + @p='test-filter-collection$(EXEEXT)'; \ + b='test-filter-collection'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-secret-exchange.log: test-secret-exchange$(EXEEXT) + @p='test-secret-exchange$(EXEEXT)'; \ + b='test-secret-exchange'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-simple-certificate.log: test-simple-certificate$(EXEEXT) + @p='test-simple-certificate$(EXEEXT)'; \ + b='test-simple-certificate'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-certificate.log: test-certificate$(EXEEXT) + @p='test-certificate$(EXEEXT)'; \ + b='test-certificate'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-certificate-chain.log: test-certificate-chain$(EXEEXT) + @p='test-certificate-chain$(EXEEXT)'; \ + b='test-certificate-chain'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-subject-public-key.log: test-subject-public-key$(EXEEXT) + @p='test-subject-public-key$(EXEEXT)'; \ + b='test-subject-public-key'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-fingerprint.log: test-fingerprint$(EXEEXT) + @p='test-fingerprint$(EXEEXT)'; \ + b='test-fingerprint'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-pkcs11-certificate.log: test-pkcs11-certificate$(EXEEXT) + @p='test-pkcs11-certificate$(EXEEXT)'; \ + b='test-pkcs11-certificate'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-openpgp.log: test-openpgp$(EXEEXT) + @p='test-openpgp$(EXEEXT)'; \ + b='test-openpgp'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-openssh.log: test-openssh$(EXEEXT) + @p='test-openssh$(EXEEXT)'; \ + b='test-openssh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-secure-memory.log: test-secure-memory$(EXEEXT) + @p='test-secure-memory$(EXEEXT)'; \ + b='test-secure-memory'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-trust.log: test-trust$(EXEEXT) + @p='test-trust$(EXEEXT)'; \ + b='test-trust'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-parser.log: test-parser$(EXEEXT) + @p='test-parser$(EXEEXT)'; \ + b='test-parser'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-record.log: test-record$(EXEEXT) + @p='test-record$(EXEEXT)'; \ + b='test-record'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-memory-icon.log: test-memory-icon$(EXEEXT) + @p='test-memory-icon$(EXEEXT)'; \ + b='test-memory-icon'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gnupg-key.log: test-gnupg-key$(EXEEXT) + @p='test-gnupg-key$(EXEEXT)'; \ + b='test-gnupg-key'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gnupg-collection.log: test-gnupg-collection$(EXEEXT) + @p='test-gnupg-collection$(EXEEXT)'; \ + b='test-gnupg-collection'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-gnupg-process.log: test-gnupg-process$(EXEEXT) + @p='test-gnupg-process$(EXEEXT)'; \ + b='test-gnupg-process'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-system-prompt.log: test-system-prompt$(EXEEXT) + @p='test-system-prompt$(EXEEXT)'; \ + b='test-system-prompt'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-ssh-askpass.log: test-ssh-askpass$(EXEEXT) + @p='test-ssh-askpass$(EXEEXT)'; \ + b='test-ssh-askpass'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) \ + config.h +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(convertdir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(mimedir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(servicedir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(vapidir)" "$(DESTDIR)$(gck_incdir)" "$(DESTDIR)$(gcr_incdir)" "$(DESTDIR)$(ui_incdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f egg/$(DEPDIR)/$(am__dirstamp) + -rm -f egg/$(am__dirstamp) + -rm -f gck/$(DEPDIR)/$(am__dirstamp) + -rm -f gck/$(am__dirstamp) + -rm -f gcr/$(DEPDIR)/$(am__dirstamp) + -rm -f gcr/$(am__dirstamp) + -rm -f ui/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/$(am__dirstamp) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +@WITH_GTK_FALSE@install-exec-hook: +@WITH_GTK_FALSE@install-data-hook: +@WITH_UPDATE_ICON_CACHE_FALSE@@WITH_UPDATE_MIME_FALSE@install-data-hook: +@WITH_GTK_FALSE@uninstall-hook: +@WITH_UPDATE_MIME_FALSE@uninstall-hook: +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-checkLTLIBRARIES clean-checkPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \ + clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf egg/$(DEPDIR) gck/$(DEPDIR) gcr/$(DEPDIR) ui/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-convertDATA install-desktopDATA \ + install-gck_incHEADERS install-gcr_incHEADERS install-girDATA \ + install-mimeDATA install-pkgconfigDATA install-serviceDATA \ + install-typelibsDATA install-ui_incHEADERS install-vapiDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES \ + install-libexecPROGRAMS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf egg/$(DEPDIR) gck/$(DEPDIR) gcr/$(DEPDIR) ui/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-convertDATA \ + uninstall-desktopDATA uninstall-gck_incHEADERS \ + uninstall-gcr_incHEADERS uninstall-girDATA \ + uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \ + uninstall-mimeDATA uninstall-pkgconfigDATA \ + uninstall-serviceDATA uninstall-typelibsDATA \ + uninstall-ui_incHEADERS uninstall-vapiDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-data-am install-exec-am install-strip uninstall-am + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-TESTS check-am check-local clean \ + clean-binPROGRAMS clean-checkLTLIBRARIES clean-checkPROGRAMS \ + clean-cscope clean-generic clean-libLTLIBRARIES \ + clean-libexecPROGRAMS clean-libtool clean-noinstLTLIBRARIES \ + clean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-convertDATA \ + install-data install-data-am install-data-hook \ + install-desktopDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-hook install-gck_incHEADERS \ + install-gcr_incHEADERS install-girDATA install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-libexecPROGRAMS install-man \ + install-mimeDATA install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am \ + install-serviceDATA install-strip install-typelibsDATA \ + install-ui_incHEADERS install-vapiDATA installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-convertDATA \ + uninstall-desktopDATA uninstall-gck_incHEADERS \ + uninstall-gcr_incHEADERS uninstall-girDATA uninstall-hook \ + uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \ + uninstall-mimeDATA uninstall-pkgconfigDATA \ + uninstall-serviceDATA uninstall-typelibsDATA \ + uninstall-ui_incHEADERS uninstall-vapiDATA + +.PRECIOUS: Makefile + + +dist-hook: + @if test -d "$(srcdir)/.git"; \ + then \ + echo Creating ChangeLog && \ + ( cd "$(top_srcdir)" && \ + echo '# Generate automatically. Do not edit.'; echo; \ + $(top_srcdir)/missing --run git log --stat --date=short ) > ChangeLog.tmp \ + && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \ + || ( rm -f ChangeLog.tmp ; \ + echo Failed to generate ChangeLog >&2 ); \ + else \ + echo A git clone is required to generate a ChangeLog >&2; \ + fi + +check-local: check-gck-symbols check-gcr-symbols check-ui-symbols + +upload-release: $(DIST_ARCHIVES) + scp $(DIST_ARCHIVES) master.gnome.org: + ssh master.gnome.org ftpadmin install $(DIST_ARCHIVES) + +valgrind-suppressions: $(VALGRIND_SUPPRESSIONS) + $(AM_V_GEN) cat $^ > $@ + +check-memory: valgrind-suppressions + $(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \ + $(AM_MAKEFLAGS) check +recheck-memory: valgrind-suppressions + $(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \ + $(AM_MAKEFLAGS) recheck + +.desktop.in.in.desktop.in: + $(V_SED) $(SED_SUBST) $< > $@ + +@INTLTOOL_DESKTOP_RULE@ + +.service.in.service: + $(V_SED) $(SED_SUBST) $< > $@ + +.broken.gir.gir: + $(V_XSLTPROC) xsltproc -o $@ $(FIX_GIR) $< +.broken.typelib.typelib: + $(AM_V_GEN) cp $< $@ + +@HAVE_INTROSPECTION_TRUE@include $(INTROSPECTION_MAKEFILE) + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@include $(VAPIGEN_MAKEFILE) + +asn: + for asn in $(ASN_SRCS); do \ + asn1Parser -o $(srcdir)/$$asn.h.tmp $(srcdir)/$$asn && \ + sed 's|#include.*|/* \0 */|' < $(srcdir)/$$asn.h.tmp > $(srcdir)/$$asn.h.tmp2 && \ + mv $(srcdir)/$$asn.h.tmp2 $(srcdir)/$$asn.h && \ + rm -f $(srcdir)/$$asn.h.tmp $(srcdir)/$$asn.h.tmp2; \ + done + +gck/gck-marshal.h: gck/gck-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=_gck_marshal > $@ + +gck/gck-marshal.c: gck/gck-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) echo "#include \"gck/gck-marshal.h\"" > $@ && \ + $(GLIB_GENMARSHAL) $< --body --prefix=_gck_marshal >> $@ + +gck/gck-enum-types.h: $(ENUM_TEMPLATE_H) $(gck_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +gck/gck-enum-types.c: $(ENUM_TEMPLATE_C) $(gck_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +@HAVE_INTROSPECTION_TRUE@Gck-@GCK_MAJOR@.gir: libgck-@GCK_MAJOR@.la + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gck-@GCK_MAJOR@.vapi: Gck-@GCK_MAJOR@.gir gck/Gck-@GCK_MAJOR@.metadata gck-@GCK_MAJOR@.deps + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gck-$(GCK_MAJOR).deps: Makefile.am +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN) echo $(gck_@GCK_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ + +gck-$(GCK_MAJOR).pc: gck/gck.pc + $(AM_V_GEN) cp gck/gck.pc gck-$(GCK_MAJOR).pc + +gck-expected.abi: gck/gck.symbols + $(AM_V_GEN) cpp -P $< | sort > $@ + +gck-actual.abi: $(builddir)/.libs/libgck-@GCK_MAJOR@.so + $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ + cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end)' | sort > $@ + +check-gck-symbols: gck-expected.abi gck-actual.abi + $(AM_V_GEN) diff -U0 --ignore-blank-lines gck-expected.abi gck-actual.abi || \ + (echo "check-symbols: Symbols have CHANGED. Fix gck.symbols"; exit 1) + +gcr/gcr-marshal.h: gcr/gcr-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=_gcr_marshal > $@ + +gcr/gcr-marshal.c: gcr/gcr-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) ( echo "#include \"gcr/gcr-marshal.h\"" > $@ && \ + $(GLIB_GENMARSHAL) $< --body --prefix=_gcr_marshal >> $@ ) + +gcr/gcr-enum-types-base.h: $(ENUM_TEMPLATE_H) $(gcr_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ +gcr/gcr-enum-types-base.c: $(ENUM_TEMPLATE_C) $(gcr_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +gcr/gcr-oids.c: gcr/gcr-oids.list gcr/gcr-mkoids + $(AM_V_GEN) sh $(srcdir)/gcr/gcr-mkoids -p GCR -c gcr/gcr-oids.c -h gcr/gcr-oids.h $(srcdir)/gcr/gcr-oids.list + +gcr/gcr-oids.h: gcr/gcr-oids.c + +gcr/gcr-dbus-generated.c: $(DBUS_XML_DEFINITIONS) + $(AM_V_GEN) $(GDBUS_CODEGEN) --interface-prefix org.gnome.keyring.internal. \ + --generate-c-code gcr/gcr-dbus-generated --c-namespace GcrDBus $^ + $(AM_V_GEN) sed -e 's/gcr_dbus/_gcr_dbus/g' \ + gcr/gcr-dbus-generated.c > gcr/gcr-dbus-generated.c.tmp && \ + mv gcr/gcr-dbus-generated.c.tmp gcr/gcr-dbus-generated.c + $(AM_V_GEN) sed -e 's/gcr_dbus/_gcr_dbus/g' \ + gcr/gcr-dbus-generated.h > gcr/gcr-dbus-generated.h.tmp && \ + mv gcr/gcr-dbus-generated.h.tmp gcr/gcr-dbus-generated.h + +gcr/gcr-dbus-generated.h: gcr/gcr-dbus-generated.c + +gcr-base-$(GCR_MAJOR).pc: gcr/gcr-base.pc + $(AM_V_GEN) cp gcr/gcr-base.pc gcr-base-$(GCR_MAJOR).pc + +@HAVE_INTROSPECTION_TRUE@Gcr-@GCR_MAJOR@.gir: Gcr-@GCR_MAJOR@.broken.gir $(FIX_GIR) + +@HAVE_INTROSPECTION_TRUE@Gcr-@GCR_MAJOR@.broken.gir: libgcr-base-@GCR_MAJOR@.la Gck-@GCK_MAJOR@.gir + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gcr-@GCR_MAJOR@.vapi: Gcr-@GCR_MAJOR@.gir gcr/Gcr-@GCR_MAJOR@.metadata gcr-@GCR_MAJOR@.deps gck-@GCK_MAJOR@.vapi + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@gcr-$(GCR_MAJOR).deps: Makefile.am +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN) echo $(gcr_@GCR_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ + +# ---------------------------------------------------------------- + +gcr-base-expected.abi: gcr/gcr-base.symbols + $(AM_V_GEN) cpp -P $< | sort > $@ + +gcr-base-actual.abi: $(builddir)/.libs/libgcr-base-@GCR_MAJOR@.so + $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ + cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end|_gcr_)' | sort > $@ + +check-gcr-symbols: gcr-base-expected.abi gcr-base-actual.abi + $(AM_V_GEN) diff -U0 --ignore-blank-lines gcr-base-expected.abi gcr-base-actual.abi || \ + (echo "check-symbols: Symbols have CHANGED. Fix gcr-base.symbols"; exit 1) + +@GSETTINGS_RULES@ + +@WITH_GTK_TRUE@check-ui-symbols: gcr-ui-expected.abi gcr-ui-actual.abi +@WITH_GTK_TRUE@ $(AM_V_GEN) diff -U0 --ignore-blank-lines gcr-ui-expected.abi gcr-ui-actual.abi || \ +@WITH_GTK_TRUE@ (echo "check-symbols: Symbols have CHANGED. Fix gcr-ui.symbols"; exit 1) + +# libgcr-3.so (and friends) symlink to libgcr-ui-3.so for compatibility raisons +@WITH_GTK_TRUE@install-exec-hook: +@WITH_GTK_TRUE@ $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so +@WITH_GTK_TRUE@ $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so.@GCR_CURRENT@ +@WITH_GTK_TRUE@ $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so.@GCR_CURRENT@.0.0 + +@WITH_GTK_TRUE@ui/gcr-enum-types.h: $(ENUM_TEMPLATE_H) $(ui_HEADER_FILES) +@WITH_GTK_TRUE@ $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +@WITH_GTK_TRUE@ui/gcr-enum-types.c: $(ENUM_TEMPLATE_C) $(ui_HEADER_FILES) +@WITH_GTK_TRUE@ $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +@WITH_GTK_TRUE@ui/gcr-resources.h: ui/gcr.gresource.xml +@WITH_GTK_TRUE@ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/ui --generate-header --internal + +@WITH_GTK_TRUE@ui/gcr-resources.c: ui/gcr.gresource.xml $(ui_RESOURCES) +@WITH_GTK_TRUE@ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/ui --generate-source --internal + +@WITH_GTK_TRUE@gcr-ui-$(GCR_MAJOR).pc: ui/gcr-ui.pc +@WITH_GTK_TRUE@ $(AM_V_GEN) cp ui/gcr-ui.pc gcr-ui-$(GCR_MAJOR).pc +@WITH_GTK_TRUE@gcr-$(GCR_MAJOR).pc: ui/gcr.pc +@WITH_GTK_TRUE@ $(AM_V_GEN) cp ui/gcr.pc gcr-$(GCR_MAJOR).pc + +@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@GcrUi-@GCR_MAJOR@.gir: libgcr-ui-@GCR_MAJOR@.la Gcr-@GCR_MAJOR@.gir + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@gcr-ui-@GCR_MAJOR@.vapi: GcrUi-@GCR_MAJOR@.gir ui/GcrUi-@GCR_MAJOR@.metadata gcr-ui-@GCR_MAJOR@.deps gck-@GCK_MAJOR@.vapi gcr-@GCR_MAJOR@.vapi + +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@gcr-ui-$(GCR_MAJOR).deps: Makefile.am +@ENABLE_VAPIGEN_TRUE@@HAVE_INTROSPECTION_TRUE@@WITH_GTK_TRUE@ $(AM_V_GEN) echo $(gcr_ui_@GCR_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ + +@WITH_GTK_TRUE@gcr-ui-expected.abi: ui/gcr-ui.symbols +@WITH_GTK_TRUE@ $(AM_V_GEN) cpp -P $< | sort > $@ + +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@install-data-hook: update_mime_database +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@uninstall-hook: update_mime_database + +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@update_mime_database: +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@ @-if test -z "$(DESTDIR)"; then \ +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@ echo "Updating MIME database."; \ +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@ $(update_mime_database_cmd); \ +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@ else \ +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@ echo "*** MIME database not updated. After (un)install, run this:"; \ +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@ echo "*** $(update_mime_database_cmd)"; \ +@WITH_GTK_TRUE@@WITH_UPDATE_MIME_TRUE@ fi + +@WITH_GTK_TRUE@gcr-ui-actual.abi: .libs/libgcr-ui-@GCR_MAJOR@.so +@WITH_GTK_TRUE@ $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ +@WITH_GTK_TRUE@ cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end|_gcr_)' | sort > $@ + +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@install-data-hook: +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@ @-if test -z "$(DESTDIR)"; then \ +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@ echo "Updating Gtk icon cache."; \ +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@ $(gtk_update_icon_cache); \ +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@ else \ +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@ echo "*** Icon cache not updated. After install, run this:"; \ +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@ echo "*** $(gtk_update_icon_cache)"; \ +@WITH_GTK_TRUE@@WITH_UPDATE_ICON_CACHE_TRUE@ fi + +@WITH_GTK_TRUE@render: +@WITH_GTK_TRUE@ cd $(srcdir) && python ui/icons/render-icons.py + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..6dd8b8b --- /dev/null +++ b/NEWS @@ -0,0 +1,266 @@ +gcr 3.28.0: +- Fix year 2038 workaround in ASN.1 decoder [#787963] +- Fix test errors when ssh-keygen is not found +- Updated translations + +gcr 3.27.92: +- Provide API for reliably calling ssh programs [#735873] +- Updated translations + +gcr 3.27.4: +- Fix encoding of EC parameters [#785234] +- Fix hang in certificate export dialog [#789804] +- Fix failure case in gcr_secure_memory_try_realloc() [#775685] +- Switch to using GLib resources +- Build fixes [#771052, #775685, #775966, #774312, #774311, #764562, #764569] +- Updated translations + +gcr 3.20.0: +- Build fixes [#763488 #766301 +- Updated translations + +gcr 3.19.4: +- Build fixes [#756235 #755873] +- Updated translations + +gcr 3.18.0: +- Updated translations + +gcr 3.17.4: +- Bump up the GTK+ deps +- Build fixes +- Updated translations + +gcr 3.16.0: +- No changes from 3.15.92 + +gcr 3.15.92: + - Updated translations + - Build fixes [#745629] + +gcr 3.15.90: + - Fix memory leaks [#738508 #739239] + - Updated translations + - Build fixes [#743201 #739449 #737622] + +gcr 3.14.0: + - Updated translations + +gcr 3.13.91: + - Add support for parsing EC keys [#672137] + - Add support for EC keys to key renderer + - Parser support for PEM 'PUBLIC KEY' files + - Parser support for parsing ECDSA OpenSSH keys + - Fix use of libgcrypt 1.6+ + - Fix for deprecations in Gtk 3.13.x + - Updated translations + - Use g_debug() instead of our own debug wrappers + - Bump required GLib version to 2.38.x + - Don't include deprecated library in our pkg-config file [#732082] + - Don't use non-portable 'sed -i' shell command [#728506] + - Change CVS to Git in error message [#730340] + - Build fixes + +gcr 3.12.0: + - Use /usr/bin/env to find python [#726909] + - Updated translations + +gcr 3.11.91: + - Parallel tests, non-recursive Makefile, and TAP + - Add gck_enumerator_set_object_type_full() function + - Add an accessor for GckAttribute raw value data + - Add gcr_certificate_get_markup() function + - Store imported key filename in GcrParsed & GcrParser [#705225] + - Allow using GBytes with GcrParser [#708736] + - Lots of VAPI and GIR fixes [#720504 ...] + - Deprecation fixes + - Updated translations + - Valgrind fix and update headers [#710983 #702648] + - Build fixes + +gcr 3.10.0: + - Fix annotations [#705225] + - Updated translations + +gcr 3.9.91: + - Translation fixes [#707077, #707078] + - Updated translations + +gcr 3.9.90: + - GcrCertificateWidget: inherit from GtkBin, not GtkWidget [#701048] + - Made gcr-certificate-renderer close the dialog when clicking okay [#699543] + - Port to new p11-kit managed style functions + - Testing fixes [#705139] + - Build fixes [#695973, ...] + +gcr 3.9.1: + - Vapi bindings [#689685] + - Don't import to 'xdg' module in the importer + - Add appropriate icon for p11-kit trust module + - Handle cases where no certificate data is available + - Build fixes + +gcr 3.8.2: + - Build certificate chains when intermediates are wrong order [#699026] + - Don't try to import certificates to gnome-keyring xdg module + - Add appropriate icon for p11-kit trust module + - Make gcr build on both pre GTK+ 3.8 and later versions + - Update for recent changes in libtasn1 + - Handle cases where no certificate data is available + - Fix for GTK+ 3.8 deprecations + - Build fixes + +gcr 3.8.1: + - Fix erroneously cancelled prompts + - Updated translations + +gcr 3.8.0: + - Fix crash when hashing an unsupported attributes [#696305] + - Updated translations + +gcr 3.7.92: + - Have the gcr-prompter replace the running prompter + - Fix segfault when prompt is dismissed immediately\ + - Updated translations + +gcr 3.7.91: + - Updated translations + - Translation fixes [#692536] + - Build fixes [#693591, #693440, #687980] + +gcr 3.7.5: + - Separate the base and ui parts of the Gcr library more thoroughly + - Fix crasher in armor parsing code + - Build fixes + - Updated translations + +gcr 3.7.2: + - Fix corner case in DER parsing + - Fix crash when parsing invalid DER + - More complete test coverage + - Other minor fixes + - Build fixes + +gcr 3.7.1: + - Allow system prompts to be cancelled while in 'checking' state + - Cancel system prompts when the prompter goes away + - Use gnome-common code coverage macros + - Translation fixes + - Build fixes + +gcr 3.6.1: + - Remove unneeded translation + - Clear and focus password entry in gcr-viewer when invalid password + - Keep enumerating if getting info about one slot fails. + - Updated translations + - Testing fixes + +gcr 3.6.0: + - Updated translations + +gcr 3.5.92: + - Updated transaltions + +gcr 3.5.90: + - Updated translations + - Don't fail preconditions when pkcs11 isn't initialized in gcr + - Fix regression in ASN.1 parsing + - Build fixes + +gcr 3.5.5: + - Use p11-kit/pkcs11.h instead of shipping a copy with gck. + - Documentation fixes + - Updated translations + +gcr 3.5.4: + - Add debug output to GcrSecretExchange + - Fix invalid warning when sending a secret exchange + - Remove support code for old glib versions + - Updated translations + - Documentation fixes + +gcr 3.5.3: + - Rework DER parsing so we can parse odd PKCS#12 files + - Use GBytes, bump glib dependency + - Enable gnome2 keyring storage + - Documentation fixes + - Updated translations + +gcr 3.4.1: + - Fix more issues disabling grabs during password prompts + - More debug messages to GcrSystemPrompter + - Fix up GCR_DEBUG and GCK_DEBUG environment variables + - Updated translations + - Build fixes + +gcr 3.4.0: + (no changes since last release) + +gcr 3.3.92: + - Fix up copyright headers + - Updated translations + - Build fix + +gcr 3.3.90: + - Expose the secure memory API + +gcr 3.3.5: + - Add way to specify button labels for a GcrPrompt + - Reenable grabs for password prompts + +gcr 3.3.4 + - Display an appropriate title in gcr-viewer + - Include GcrPrompt documentation + - Add 'new-prompt' signal to GcrSystemPrompter for use with javascript + - Fix build for glib 2.31 deprecations + - Build fixes + +gcr 3.3.3.1 + - Fix build issues + +gcr 3.3.3 + - Add support for parsing PKCS#10 and SPKAC formats in GcrParser + - Add support for viewing certificate requests in GcrViewer + - Support for dynamically loading private key data from PKCS#11 + - Add GcrCertificateRequest class for requesting certificates + - Add function to retrieve basic constraints from a certificate + - Show import errors in an info bar under the viewer + - Don't show empty dates in gnupg key renderer + - Make secure memory pool shared across modules + - Add GckBuilder as a mutable attribute set + - Add floating references to GckAttributes + - Rename GckObjectAttributes to GckObjectCache + - Expose GcrSecureEntryBuffer as a public class + - Add system prompt and prompter + - Expose uri in GcrImporter + - Fix build for glib 2.31 deprecations + - Licensing fixes + - Build fixes, internal bug fixes, documentation, etc. + +gcr 3.3.2.1 + - Fix build issues + +gcr 3.3.2 + - Allow changing collection on a GcrCollectionModel, add tree/list + mode to GcrCollectionModel + - Allow chaining of GckEnumerator objects, so that when objects from + one is listed, then chained enumerator is enumerated. + - Integrate GTlsInteraction into libgck for logging in or key auth. + - Refactor internal DER parsing to use reference counted memory + using the prototyped GBytes API. + - Build fixes, documentation fixes, testing fixes, memory leak fixes + +gcr 3.3.1.1 + - Fix build issues + +gcr 3.3.1 + - Add function to get elements of union collection + - Add gck_slot_enumerate_objects() function + - Enumerator can now retrieve object attributes + - Add gck_session_find_handles() and friends + - Add gnupg and password icons + - Function to notify that certificate changed + - Update glib dependency for 2.30.0 + - Build, translation and documentation fixes + +Versions 3.2.2 and prior were released as part of gnome-keyring diff --git a/README b/README new file mode 100644 index 0000000..77993d6 --- /dev/null +++ b/README @@ -0,0 +1,43 @@ +GCR is a library for displaying certificates, and crypto UI, accessing +key stores. It also provides the viewer for crypto files on the GNOME +desktop. + +GCK is a library for accessing PKCS#11 modules like smart cards, in a +(G)object oriented way. + + +DEBUG TRACING +============== + +The Gcr and Gck libraries contain statements which help debug flow +and logic. In many cases these help you track down problems. + +Use the environment variable GCR_DEBUG='all' or GCR_HELP='xxx' to +display either all messages or a specific category of debug messages. +To figure out what you can use in place of the 'xxx' category above, +use GCR_DEBUG='help' and you'll see a list of all the messages. + +Example to display all debug messages: + + $ GCR_DEBUG=all gcr-viewer /path/to/certificate.crt + (gcr-viewer:9418): Gcr-DEBUG: gcr_pkcs11_initialize_async: starting initialize of registered modules + ... + +Example to display the various debug categories: + + $ GCR_DEBUG=help gcr-viewer /path/to/certificate.crt + Supported debug values: library certificate-chain parse gnupg trust import key prompt all help + +Example to display debug messages for a specific category: + + $ GCR_DEBUG=library gcr-viewer /path/to/certificate.crt + (gcr-viewer:9503): Gcr-DEBUG: gcr_pkcs11_initialize_async: starting initialize of registered modules + ... + +If you wish to permanently enable certain debug messages, include compiler +directives like this when configuring this library: + + $ CFLAGS='-DGCR_DEBUG=library' ./configure ... + +For the Gck debug messages simply replace 'GCR_DEBUG' with 'GCK_DEBUG' +in the above examples. diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..2fad1c8 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1202 @@ +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([build/m4/glib-gettext.m4]) +m4_include([build/m4/gsettings.m4]) +m4_include([build/m4/gtk-doc.m4]) +m4_include([build/m4/intltool.m4]) +m4_include([build/m4/introspection.m4]) +m4_include([build/m4/libgcrypt.m4]) +m4_include([build/m4/libtool.m4]) +m4_include([build/m4/ltoptions.m4]) +m4_include([build/m4/ltsugar.m4]) +m4_include([build/m4/ltversion.m4]) +m4_include([build/m4/lt~obsolete.m4]) +m4_include([build/m4/nls.m4]) +m4_include([build/m4/pkg.m4]) +m4_include([build/m4/vapigen.m4]) diff --git a/build/compile b/build/compile new file mode 100755 index 0000000..2ab71e4 --- /dev/null +++ b/build/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/config.guess b/build/config.guess new file mode 100755 index 0000000..a744844 --- /dev/null +++ b/build/config.guess @@ -0,0 +1,1476 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2017 Free Software Foundation, Inc. + +timestamp='2017-08-08' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2017 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; + *:Redox:*:*) + echo ${UNAME_MACHINE}-unknown-redox + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = hppa2.0w ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +cat >&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` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build/config.sub b/build/config.sub new file mode 100755 index 0000000..932128b --- /dev/null +++ b/build/config.sub @@ -0,0 +1,1836 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2017 Free Software Foundation, Inc. + +timestamp='2017-04-02' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2017 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | wasm32-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + wasm32) + basic_machine=wasm32-unknown + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + pru-*) + os=-elf + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build/depcomp b/build/depcomp new file mode 100755 index 0000000..b39f98f --- /dev/null +++ b/build/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/enum-template.c b/build/enum-template.c new file mode 100644 index 0000000..a4a4ee7 --- /dev/null +++ b/build/enum-template.c @@ -0,0 +1,39 @@ +/*** BEGIN file-header ***/ + +#include + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +#include "@filename@" +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType @enum_name@_get_type (void) G_GNUC_CONST; + +GType +@enum_name@_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY(etype == 0)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + } + return etype; +} + +/*** END value-tail ***/ + +/*** BEGIN file-tail ***/ + /**/ +/*** END file-tail ***/ diff --git a/build/enum-template.h b/build/enum-template.h new file mode 100644 index 0000000..edb428b --- /dev/null +++ b/build/enum-template.h @@ -0,0 +1,24 @@ +/*** BEGIN file-header ***/ + +#include + +G_BEGIN_DECLS +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +#ifndef @ENUMPREFIX@_TYPE_@ENUMSHORT@ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) +#endif + +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ +G_END_DECLS + +/*** END file-tail ***/ diff --git a/build/g-ir-unbreak.xsl b/build/g-ir-unbreak.xsl new file mode 100644 index 0000000..0734e4e --- /dev/null +++ b/build/g-ir-unbreak.xsl @@ -0,0 +1,23 @@ + + + + + + get_der_data + + + + + + + + + + + diff --git a/build/gcr.supp b/build/gcr.supp new file mode 100644 index 0000000..69b6701 --- /dev/null +++ b/build/gcr.supp @@ -0,0 +1,14 @@ +{ + gcr_pkcs11_set_trust_store_uri + Memcheck:Leak + ... + fun:g_strdup + fun:gcr_pkcs11_set_trust_store_uri +} +{ + gcr_pkcs11_set_trust_lookup_uris + Memcheck:Leak + ... + fun:g_strdupv + fun:gcr_pkcs11_set_trust_lookup_uris +} diff --git a/build/gcrypt.supp b/build/gcrypt.supp new file mode 100644 index 0000000..05ff395 --- /dev/null +++ b/build/gcrypt.supp @@ -0,0 +1,39 @@ +{ + gpg_err_init + Memcheck:Leak + ... + fun:gpg_err_init +} +{ + _gcry_module_add + Memcheck:Leak + ... + fun:_gcry_module_add +} +{ + _gcry_rngcsprng_create_nonce + Memcheck:Leak + ... + fun:_gcry_malloc + ... + fun:initialize + fun:_gcry_rngcsprng_create_nonce +} +{ + _gcry_rngcsprng_create_nonce + Memcheck:Leak + ... + fun:_gcry_malloc + ... + fun:initialize + fun:_gcry_rngcsprng_randomize +} +{ + gcry_control__init + Memcheck:Leak + ... + fun:glib_thread_mutex_init + ... + fun:_gcry_vcontrol + fun:gcry_control +} diff --git a/build/gdbus-unbreak-codegen b/build/gdbus-unbreak-codegen new file mode 100755 index 0000000..7ea6c22 --- /dev/null +++ b/build/gdbus-unbreak-codegen @@ -0,0 +1,36 @@ +#!/bin/sh + +set -uef + +generate_c_code= +next_arg_is_name="no" + +for arg in "$@"; do + if [ "$next_arg_is_name" = "yes" ]; then + generate_c_code="$arg" + next_arg_is_name="no" + continue + fi + case "$arg" in + --generate-c-code) + next_arg_is_name="yes" + ;; + --generate-c-code=*) + generate_c_code="${arg#--generate-c-code=}" + ;; + esac +done + +gdbus-codegen "$@" + +if [ -n "$generate_c_code" ]; then + # HACK: This is a work around for gdbus-codegen crashing when + # we build with GLIB_VERSION_MAX_ALLOWED. See: + # https://bugzilla.gnome.org/show_bug.cgi?id=710133 + sed -e '1i\ +#ifdef GLIB_VERSION_MAX_ALLOWED\ +#undef GLIB_VERSION_MAX_ALLOWED\ +#endif' \ + "$generate_c_code.c" > "$generate_c_code.$$" + mv "$generate_c_code.$$" "$generate_c_code.c" +fi diff --git a/build/glib.supp b/build/glib.supp new file mode 100644 index 0000000..194b1e8 --- /dev/null +++ b/build/glib.supp @@ -0,0 +1,419 @@ +{ + g_type_register_static_1 + Memcheck:Leak + ... + fun:g_type_register_static +} +{ + g_type_register_fundamental + Memcheck:Leak + ... + fun:g_type_register_fundamental +} +{ + g_type_init_with_debug_flags + Memcheck:Leak + ... + fun:g_type_init_with_debug_flags +} +{ + g_type_class_ref + Memcheck:Leak + ... + fun:g_type_class_ref +} +{ + g_type_add_interface_static + Memcheck:Leak + ... + fun:g_type_add_interface_static +} +{ + g_param_spec_internal + Memcheck:Leak + ... + fun:g_type_class_ref + fun:g_type_create_instance + fun:g_param_spec_internal +} +{ + g_param_spec_enum + Memcheck:Leak + ... + fun:g_type_class_ref + fun:g_param_spec_enum +} +{ + g_param_spec_flags + Memcheck:Leak + ... + fun:g_type_class_ref + fun:g_param_spec_flags +} +{ + g_quark_from_static_string + Memcheck:Leak + ... + fun:g_quark_from_static_string +} +{ + g_quark_from_string + Memcheck:Leak + ... + fun:g_quark_from_string +} +{ + g_value_register_transform_func + Memcheck:Leak + ... + fun:g_value_register_transform_func +} +{ + test_run_seed + Memcheck:Leak + ... + fun:g_rand_new_with_seed_array + fun:test_run_seed + ... + fun:g_test_run_suite +} +{ + g_test_init + Memcheck:Leak + ... + fun:g_test_init +} +{ + g_intern_static_string + Memcheck:Leak + ... + fun:g_intern_static_string +} +{ + g_main_context_push_thread_default + Memcheck:Leak + ... + fun:g_queue_new + fun:g_main_context_push_thread_default +} +{ + g_dbus_error_register_error + Memcheck:Leak + ... + fun:g_dbus_error_register_error +} +{ + g_param_spec_pool_insert + Memcheck:Leak + ... + fun:g_param_spec_pool_insert +} +{ + g_main_context_default + Memcheck:Leak + ... + fun:g_main_context_default +} +{ + g_main_context_check + Memcheck:Leak + ... + fun:g_ptr_array_add + fun:g_main_context_check +} +{ + g_test_run_suite + Memcheck:Leak + ... + fun:g_slist_copy + fun:g_test_run_suite_internal + fun:g_test_run_suite +} +{ + g_dbus_interface_info_cache_build + Memcheck:Leak + ... + fun:g_dbus_interface_info_cache_build +} +{ + g_cancellable_push_current + Memcheck:Leak + ... + fun:thread_memory_from_self + ... + fun:g_cancellable_push_current +} +{ + g_io_scheduler_push_job + Memcheck:Leak + ... + fun:init_scheduler + fun:g_once_impl + fun:g_io_scheduler_push_job +} +{ + g_io_scheduler_push_job_2 + Memcheck:Leak + ... + fun:g_system_thread_new + ... + fun:g_io_scheduler_push_job +} +{ + g_bus_get_sync__available_connections + Memcheck:Leak + ... + fun:g_hash_table_new + fun:initable_init + fun:g_initable_init + fun:g_bus_get_sync +} +{ + g_socket_connection_factory_register_type + Memcheck:Leak + ... + fun:g_socket_connection_factory_register_type +} +{ + g_test_add_vtable + Memcheck:Leak + ... + fun:g_test_add_vtable +} +{ + g_mutex_lock + Memcheck:Leak + ... + fun:g_mutex_impl_new + fun:g_mutex_get_impl + fun:g_mutex_lock +} +{ + g_thread_self + Memcheck:Leak + ... + fun:g_thread_self +} +{ + g_rec_mutex_lock + Memcheck:Leak + ... + fun:g_rec_mutex_impl_new + fun:g_rec_mutex_get_impl + fun:g_rec_mutex_lock +} +{ + test_case_run + Memcheck:Leak + ... + fun:g_malloc0 + fun:test_case_run + ... + fun:g_test_run_suite +} +{ + g_get_charset + Memcheck:Leak + ... + fun:g_get_charset +} +{ + g_test_run_suite__timer_new + Memcheck:Leak + ... + fun:g_timer_new + fun:test_case_run + ... + fun:g_test_run_suite +} +{ + g_test_run_suite__timer_new2 + Memcheck:Leak + ... + fun:g_timer_new + fun:test_case_run* + ... + fun:g_test_run_suite +} +{ + g_test_run_suite__strconcat + Memcheck:Leak + ... + fun:g_strconcat + fun:test_case_run + ... + fun:g_test_run_suite + fun:g_test_run +} +{ + g_type_interface_add_prerequisite + Memcheck:Leak + ... + fun:g_type_interface_add_prerequisite +} +{ + g_test_run_suite_2 + Memcheck:Leak + ... + fun:g_slist_copy + fun:g_test_run_suite_internal + ... + fun:g_test_run_suite +} +{ + g_test_run_suite_3 + Memcheck:Leak + ... + fun:g_malloc0 + fun:g_test_run_suite_internal + ... + fun:g_test_run_suite +} +{ + g_set_prgname + Memcheck:Leak + ... + fun:g_set_prgname +} +{ + g_test_run_suite__strconcat_2 + Memcheck:Leak + ... + fun:g_strconcat + fun:g_test_run_suite_internal +} +{ + g_test_run_suite__strdup + Memcheck:Leak + ... + fun:g_strdup + fun:g_test_run_suite_internal +} +{ + g_private_get + Memcheck:Leak + ... + fun:g_private_get +} +{ + g_private_set + Memcheck:Leak + ... + fun:g_private_set +} +{ + g_static_private_set_1 + Memcheck:Leak + ... + fun:g_array_set_size + fun:g_static_private_set +} +{ + g_static_private_set_2 + Memcheck:Leak + ... + fun:g_array_sized_new + fun:g_static_private_set +} +{ + g_static_mutex_get_mutex_impl + Memcheck:Leak + ... + fun:g_static_mutex_get_mutex_impl +} +{ + g_variant_type_info_unref + Memcheck:Leak + ... + fun:g_hash_table_remove + fun:g_variant_type_info_unref +} +{ + g_get_filename_charsets + Memcheck:Leak + ... + fun:g_get_filename_charsets +} +{ + g_intern_string + Memcheck:Leak + ... + fun:g_intern_string +} +{ + g_main_context_iterate + Memcheck:Leak + ... + fun:g_malloc + fun:g_main_context_iterate +} +{ + g_main_context_dispatch + Memcheck:Leak + ... + fun:get_dispatch + fun:g_main_context_dispatch +} +{ + g_log_set_handler + Memcheck:Leak + ... + fun:g_log_set_handler +} +{ + g_simple_async_result_complete + Memcheck:Leak + ... + fun:g_main_context_push_thread_default + fun:g_simple_async_result_complete +} +{ + + Memcheck:Leak + ... + fun:g_static_private_set + fun:g_module_open +} +{ + g_child_watch_source_new + Memcheck:Leak + ... + fun:ensure_unix_signal_handler_installed_unlocked + fun:g_child_watch_source_new +} +{ + g_thread_pool_thread_proxy + Memcheck:Leak + ... + fun:g_malloc + fun:g_cond_new_posix_impl + ... + fun:g_async_queue_timed_pop + fun:g_thread_pool_thread_proxy +} +{ + g_module_open + Memcheck:Leak + ... + fun:g_private_impl_new + ... + fun:g_module_open +} +{ + g_system_thread_new + Memcheck:Leak + ... + fun:g_system_thread_new +} +{ + thread_memory_from_self + Memcheck:Leak + ... + fun:thread_memory_from_self +} +{ + g_get_language_names + Memcheck:Leak + ... + fun:g_get_language_names +} diff --git a/build/glibc.supp b/build/glibc.supp new file mode 100644 index 0000000..34e68bf --- /dev/null +++ b/build/glibc.supp @@ -0,0 +1,13 @@ +{ + dlclose + Memcheck:Leak + ... + fun:dlclose +} +{ + dlopen + Memcheck:Leak + ... + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} diff --git a/build/install-sh b/build/install-sh new file mode 100755 index 0000000..0360b79 --- /dev/null +++ b/build/install-sh @@ -0,0 +1,501 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2016-01-11.22; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/ltmain.sh b/build/ltmain.sh new file mode 100644 index 0000000..0f0a2da --- /dev/null +++ b/build/ltmain.sh @@ -0,0 +1,11147 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +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 + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +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 + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs 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 +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/build/m4/glib-gettext.m4 b/build/m4/glib-gettext.m4 new file mode 100644 index 0000000..df6fbf0 --- /dev/null +++ b/build/m4/glib-gettext.m4 @@ -0,0 +1,486 @@ +# Copyright (C) 1995-2002 Free Software Foundation, Inc. +# Copyright (C) 2001-2003,2004 Red Hat, Inc. +# +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995, 1996 +# +# Modified to never use included libintl. +# Owen Taylor , 12/15/1998 +# +# Major rework to remove unused code +# Owen Taylor , 12/11/2002 +# +# Added better handling of ALL_LINGUAS from GNU gettext version +# written by Bruno Haible, Owen Taylor 5/30/3002 +# +# Modified to require ngettext +# Matthias Clasen 08/06/2004 + +# Increment this whenever this file is changed. +#serial 1 + +# We need this here as well, since someone might use autoconf-2.5x +# to configure GLib then an older version to configure a package +# using AM_GLIB_GNU_GETTEXT +AC_PREREQ(2.53) + +dnl +dnl We go to great lengths to make sure that aclocal won't +dnl try to pull in the installed version of these macros +dnl when running aclocal in the glib directory. +dnl +m4_copy([AC_DEFUN],[glib_DEFUN]) +m4_copy([AC_REQUIRE],[glib_REQUIRE]) +dnl +dnl At the end, if we're not within glib, we'll define the public +dnl definitions in terms of our private definitions. +dnl + +# GLIB_LC_MESSAGES +#-------------------- +glib_DEFUN([GLIB_LC_MESSAGES], + [AC_CHECK_HEADERS([locale.h]) + if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) + +# GLIB_PATH_PROG_WITH_TEST +#---------------------------- +dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +dnl Checks for special options needed on Mac OS X. +dnl Defines INTL_MACOSX_LIBS. +dnl +dnl Copied from intlmacosx.m4 in gettext, GPL. +dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. +glib_DEFUN([glib_gt_INTL_MACOSX], +[ + dnl Check for API introduced in Mac OS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + [gt_cv_func_CFPreferencesCopyAppValue], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[CFPreferencesCopyAppValue(NULL, NULL)]])], + [gt_cv_func_CFPreferencesCopyAppValue=yes], + [gt_cv_func_CFPreferencesCopyAppValue=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], + [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in Mac OS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[CFLocaleCopyCurrent();]])], + [gt_cv_func_CFLocaleCopyCurrent=yes], + [gt_cv_func_CFLocaleCopyCurrent=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], + [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) + +# GLIB_WITH_NLS +#----------------- +glib_DEFUN([GLIB_WITH_NLS], + dnl NLS is obligatory + [USE_NLS=yes + AC_SUBST(USE_NLS) + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + glib_gt_INTL_MACOSX + + AC_CHECK_HEADER(libintl.h, + [gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, + [AC_TRY_LINK([ +#include +], + [return !ngettext ("","", 1)], + gt_cv_func_ngettext_libc=yes, + gt_cv_func_ngettext_libc=no) + ]) + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, + [AC_TRY_LINK([ +#include +], + [return !dgettext ("","")], + gt_cv_func_dgettext_libc=yes, + gt_cv_func_dgettext_libc=no) + ]) + fi + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CHECK_FUNCS(bind_textdomain_codeset) + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$gt_cv_func_ngettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dgettext, + gt_cv_func_dgettext_libintl=yes)])]) + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + AC_MSG_CHECKING([if -liconv is needed to use gettext]) + AC_MSG_RESULT([]) + AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dcgettext, + [gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv], + :,-liconv)], + :,-liconv) + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext and ngettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + AC_CHECK_FUNCS(bind_textdomain_codeset) + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes" \ + && test "$gt_cv_func_ngettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + AC_DEFINE(HAVE_GETTEXT,1, + [Define if the GNU gettext() function is already present or preinstalled.]) + GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + AC_CHECK_FUNCS(dcgettext) + MSGFMT_OPTS= + AC_MSG_CHECKING([if msgfmt accepts -c]) + GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: test 1.0\n" +"PO-Revision-Date: 2007-02-15 12:01+0100\n" +"Last-Translator: test \n" +"Language-Team: C \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) + AC_SUBST(MSGFMT_OPTS) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [case $host in + *-*-solaris*) + dnl On Solaris, if bind_textdomain_codeset is in libc, + dnl GNU format message catalog is always supported, + dnl since both are added to the libc all together. + dnl Hence, we'd like to go with DATADIRNAME=share and + dnl and CATOBJEXT=.gmo in this case. + AC_CHECK_FUNC(bind_textdomain_codeset, + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + ;; + *-*-openbsd*) + CATOBJEXT=.mo + DATADIRNAME=share + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac]) + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + ]) + + if test "$gt_cv_have_gettext" = "yes" ; then + AC_DEFINE(ENABLE_NLS, 1, + [always defined to indicate that i18n is enabled]) + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is not GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + AC_OUTPUT_COMMANDS( + [case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac]) + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.ac. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLLIBS) + AC_SUBST(PO_IN_DATADIR_TRUE) + AC_SUBST(PO_IN_DATADIR_FALSE) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +# AM_GLIB_GNU_GETTEXT +# ------------------- +# Do checks necessary for use of gettext. If a suitable implementation +# of gettext is found in either in libintl or in the C library, +# it will set INTLLIBS to the libraries needed for use of gettext +# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable +# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() +# on various variables needed by the Makefile.in.in installed by +# glib-gettextize. +dnl +AU_DEFUN([GLIB_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_CC])dnl + + GLIB_LC_MESSAGES + GLIB_WITH_NLS + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ], + [[$0: This macro is deprecated. You should use upstream gettext instead.]]) + +# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) +# ------------------------------- +# Define VARIABLE to the location where catalog files will +# be installed by po/Makefile. +glib_DEFUN([GLIB_DEFINE_LOCALEDIR], +[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl +glib_save_prefix="$prefix" +glib_save_exec_prefix="$exec_prefix" +glib_save_datarootdir="$datarootdir" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +datarootdir=`eval echo "${datarootdir}"` +if test "x$CATOBJEXT" = "x.mo" ; then + localedir=`eval echo "${libdir}/locale"` +else + localedir=`eval echo "${datadir}/locale"` +fi +prefix="$glib_save_prefix" +exec_prefix="$glib_save_exec_prefix" +datarootdir="$glib_save_datarootdir" +AC_DEFINE_UNQUOTED($1, "$localedir", + [Define the location where the catalogs will be installed]) +]) + +dnl +dnl Now the definitions that aclocal will find +dnl +ifdef(glib_configure_ac,[],[ +AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) +AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) +])dnl + +# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) +# +# Create a temporary file with TEST-FILE as its contents and pass the +# file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with +# 0 and perform ACTION-IF-FAIL for any other exit status. +AC_DEFUN([GLIB_RUN_PROG], +[cat >conftest.foo <<_ACEOF +$2 +_ACEOF +if AC_RUN_LOG([$1 conftest.foo]); then + m4_ifval([$3], [$3], [:]) +m4_ifvaln([$4], [else $4])dnl +echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD +sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD +fi]) + diff --git a/build/m4/gsettings.m4 b/build/m4/gsettings.m4 new file mode 100644 index 0000000..03c16fb --- /dev/null +++ b/build/m4/gsettings.m4 @@ -0,0 +1,86 @@ +# Increment this whenever this file is changed. +#serial 1 + +dnl GLIB_GSETTINGS +dnl Defines GSETTINGS_SCHEMAS_INSTALL which controls whether +dnl the schema should be compiled +dnl + +AC_DEFUN([GLIB_GSETTINGS], +[ + m4_pattern_allow([AM_V_GEN]) + AC_ARG_ENABLE(schemas-compile, + AS_HELP_STRING([--disable-schemas-compile], + [Disable regeneration of gschemas.compiled on install]), + [case ${enableval} in + yes) GSETTINGS_DISABLE_SCHEMAS_COMPILE="" ;; + no) GSETTINGS_DISABLE_SCHEMAS_COMPILE="1" ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-schemas-compile]) ;; + esac]) + AC_SUBST([GSETTINGS_DISABLE_SCHEMAS_COMPILE]) + PKG_PROG_PKG_CONFIG([0.16]) + AC_SUBST(gsettingsschemadir, [${datadir}/glib-2.0/schemas]) + if test x$cross_compiling != xyes; then + GLIB_COMPILE_SCHEMAS=`$PKG_CONFIG --variable glib_compile_schemas gio-2.0` + else + AC_PATH_PROG(GLIB_COMPILE_SCHEMAS, glib-compile-schemas) + fi + AC_SUBST(GLIB_COMPILE_SCHEMAS) + if test "x$GLIB_COMPILE_SCHEMAS" = "x"; then + ifelse([$2],,[AC_MSG_ERROR([glib-compile-schemas not found.])],[$2]) + else + ifelse([$1],,[:],[$1]) + fi + + GSETTINGS_RULES=' +.PHONY : uninstall-gsettings-schemas install-gsettings-schemas clean-gsettings-schemas + +mostlyclean-am: clean-gsettings-schemas + +gsettings__enum_file = $(addsuffix .enums.xml,$(gsettings_ENUM_NAMESPACE)) + +%.gschema.valid: %.gschema.xml $(gsettings__enum_file) + $(AM_V_GEN) $(GLIB_COMPILE_SCHEMAS) --strict --dry-run $(addprefix --schema-file=,$(gsettings__enum_file)) --schema-file=$< && mkdir -p [$](@D) && touch [$]@ + +all-am: $(gsettings_SCHEMAS:.xml=.valid) +uninstall-am: uninstall-gsettings-schemas +install-data-am: install-gsettings-schemas + +.SECONDARY: $(gsettings_SCHEMAS) + +install-gsettings-schemas: $(gsettings_SCHEMAS) $(gsettings__enum_file) + @$(NORMAL_INSTALL) + if test -n "$^"; then \ + test -z "$(gsettingsschemadir)" || $(MKDIR_P) "$(DESTDIR)$(gsettingsschemadir)"; \ + $(INSTALL_DATA) $^ "$(DESTDIR)$(gsettingsschemadir)"; \ + test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); \ + fi + +uninstall-gsettings-schemas: + @$(NORMAL_UNINSTALL) + @list='\''$(gsettings_SCHEMAS) $(gsettings__enum_file)'\''; test -n "$(gsettingsschemadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e '\''s|^.*/||'\''`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '\''$(DESTDIR)$(gsettingsschemadir)'\'' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(gsettingsschemadir)" && rm -f $$files + test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir) + +clean-gsettings-schemas: + rm -f $(gsettings_SCHEMAS:.xml=.valid) $(gsettings__enum_file) + +ifdef gsettings_ENUM_NAMESPACE +$(gsettings__enum_file): $(gsettings_ENUM_FILES) + $(AM_V_GEN) glib-mkenums --comments '\'''\'' --fhead "" --vhead " <@type@ id='\''$(gsettings_ENUM_NAMESPACE).@EnumName@'\''>" --vprod " " --vtail " " --ftail "" [$]^ > [$]@.tmp && mv [$]@.tmp [$]@ +endif +' + _GSETTINGS_SUBST(GSETTINGS_RULES) +]) + +dnl _GSETTINGS_SUBST(VARIABLE) +dnl Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST +AC_DEFUN([_GSETTINGS_SUBST], +[ +AC_SUBST([$1]) +m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) +] +) diff --git a/build/m4/gtk-doc.m4 b/build/m4/gtk-doc.m4 new file mode 100644 index 0000000..2d12f01 --- /dev/null +++ b/build/m4/gtk-doc.m4 @@ -0,0 +1,113 @@ +# -*- mode: autoconf -*- +# +# gtk-doc.m4 - configure macro to check for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2007-2017 Stefan Sauer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# As a special exception, the above copyright owner gives unlimited +# permission to copy, distribute and modify the configure scripts that +# are the output of Autoconf when processing the Macro. You need not +# follow the terms of the GNU General Public License when using or +# distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. + +# serial 2 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + + ifelse([$1],[],[gtk_doc_requires="gtk-doc"],[gtk_doc_requires="gtk-doc >= $1"]) + AC_MSG_CHECKING([for gtk-doc]) + PKG_CHECK_EXISTS([$gtk_doc_requires],[have_gtk_doc=yes],[have_gtk_doc=no]) + AC_MSG_RESULT($have_gtk_doc) + + if test "$have_gtk_doc" = "no"; then + AC_MSG_WARN([ + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found.]) + fi + + dnl check for tools we added during development + dnl Use AC_CHECK_PROG to avoid the check target using an absolute path that + dnl may not be writable by the user. Currently, automake requires that the + dnl test name must end in '.test'. + dnl https://bugzilla.gnome.org/show_bug.cgi?id=701638 + AC_CHECK_PROG([GTKDOC_CHECK],[gtkdoc-check],[gtkdoc-check.test]) + AC_PATH_PROG([GTKDOC_CHECK_PATH],[gtkdoc-check]) + AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) + AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) + + dnl for overriding the documentation installation directory + AC_ARG_WITH([html-dir], + AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST([HTML_DIR]) + + dnl enable/disable documentation building + AC_ARG_ENABLE([gtk-doc], + AS_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [[default=no]]]),, + [enable_gtk_doc=no]) + + AC_MSG_CHECKING([whether to build gtk-doc documentation]) + AC_MSG_RESULT($enable_gtk_doc) + + if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then + AC_MSG_ERROR([ + You must have $gtk_doc_requires installed to build documentation for + $PACKAGE_NAME. Please install gtk-doc or disable building the + documentation by adding '--disable-gtk-doc' to '[$]0'.]) + fi + + dnl don't check for glib if we build glib + if test "x$PACKAGE_NAME" != "xglib"; then + dnl don't fail if someone does not have glib + PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,[:]) + fi + + dnl enable/disable output formats + AC_ARG_ENABLE([gtk-doc-html], + AS_HELP_STRING([--enable-gtk-doc-html], + [build documentation in html format [[default=yes]]]),, + [enable_gtk_doc_html=yes]) + AC_ARG_ENABLE([gtk-doc-pdf], + AS_HELP_STRING([--enable-gtk-doc-pdf], + [build documentation in pdf format [[default=no]]]),, + [enable_gtk_doc_pdf=no]) + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + AC_SUBST([AM_DEFAULT_VERBOSITY]) + + AM_CONDITIONAL([HAVE_GTK_DOC], [test x$have_gtk_doc = xyes]) + AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) + AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) + AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) +]) diff --git a/build/m4/intltool.m4 b/build/m4/intltool.m4 new file mode 100644 index 0000000..c25b7b1 --- /dev/null +++ b/build/m4/intltool.m4 @@ -0,0 +1,212 @@ +## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- +## Copyright (C) 2001 Eazel, Inc. +## Author: Maciej Stachowiak +## Kenneth Christiansen +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +## +## As a special exception to the GNU General Public License, if you +## distribute this file as part of a program that contains a +## configuration script generated by Autoconf, you may include it under +## the same distribution terms that you use for the rest of that program. + +dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) +# serial 42 IT_PROG_INTLTOOL +AC_DEFUN([IT_PROG_INTLTOOL], [ +AC_PREREQ([2.50])dnl +AC_REQUIRE([AM_NLS])dnl + +case "$am__api_version" in + 1.[01234]) + AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) + ;; + *) + ;; +esac + +INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` +INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +if test -n "$1"; then + AC_MSG_CHECKING([for intltool >= $1]) + AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) + test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || + AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) +fi + +AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) +AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) +AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) +if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then + AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) +fi + +if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 +fi +AC_SUBST([AM_DEFAULT_VERBOSITY]) + +INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' +INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' +INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' +AC_SUBST(INTLTOOL_V_MERGE) +AC_SUBST(INTLTOOL__v_MERGE_) +AC_SUBST(INTLTOOL__v_MERGE_0) + +INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' +intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' +intltool__v_merge_options_0='-q' +AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) +AC_SUBST(intltool__v_merge_options_) +AC_SUBST(intltool__v_merge_options_0) + + INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' + INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' +else + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' +fi + INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + +_IT_SUBST(INTLTOOL_DESKTOP_RULE) +_IT_SUBST(INTLTOOL_DIRECTORY_RULE) +_IT_SUBST(INTLTOOL_KEYS_RULE) +_IT_SUBST(INTLTOOL_PROP_RULE) +_IT_SUBST(INTLTOOL_OAF_RULE) +_IT_SUBST(INTLTOOL_PONG_RULE) +_IT_SUBST(INTLTOOL_SERVER_RULE) +_IT_SUBST(INTLTOOL_SHEET_RULE) +_IT_SUBST(INTLTOOL_SOUNDLIST_RULE) +_IT_SUBST(INTLTOOL_UI_RULE) +_IT_SUBST(INTLTOOL_XAM_RULE) +_IT_SUBST(INTLTOOL_KBD_RULE) +_IT_SUBST(INTLTOOL_XML_RULE) +_IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) +_IT_SUBST(INTLTOOL_CAVES_RULE) +_IT_SUBST(INTLTOOL_SCHEMAS_RULE) +_IT_SUBST(INTLTOOL_THEME_RULE) +_IT_SUBST(INTLTOOL_SERVICE_RULE) +_IT_SUBST(INTLTOOL_POLICY_RULE) + +# Check the gettext tools to make sure they are GNU +AC_PATH_PROG(XGETTEXT, xgettext) +AC_PATH_PROG(MSGMERGE, msgmerge) +AC_PATH_PROG(MSGFMT, msgfmt) +AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) +if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then + AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) +fi +xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" +mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" +mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" +if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then + AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) +fi + +AC_PATH_PROG(INTLTOOL_PERL, perl) +if test -z "$INTLTOOL_PERL"; then + AC_MSG_ERROR([perl not found]) +fi +AC_MSG_CHECKING([for perl >= 5.8.1]) +$INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 +if test $? -ne 0; then + AC_MSG_ERROR([perl 5.8.1 is required for intltool]) +else + IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` + AC_MSG_RESULT([$IT_PERL_VERSION]) +fi +if test "x$2" != "xno-xml"; then + AC_MSG_CHECKING([for XML::Parser]) + if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then + AC_MSG_RESULT([ok]) + else + AC_MSG_ERROR([XML::Parser perl module is required for intltool]) + fi +fi + +# Substitute ALL_LINGUAS so we can use it in po/Makefile +AC_SUBST(ALL_LINGUAS) + +IT_PO_SUBDIR([po]) + +]) + + +# IT_PO_SUBDIR(DIRNAME) +# --------------------- +# All po subdirs have to be declared with this macro; the subdir "po" is +# declared by IT_PROG_INTLTOOL. +# +AC_DEFUN([IT_PO_SUBDIR], +[AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. +dnl +dnl The following CONFIG_COMMANDS should be executed at the very end +dnl of config.status. +AC_CONFIG_COMMANDS_PRE([ + AC_CONFIG_COMMANDS([$1/stamp-it], [ + if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then + AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) + fi + rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" + >"$1/stamp-it.tmp" + [sed '/^#/d + s/^[[].*] *// + /^[ ]*$/d + '"s|^| $ac_top_srcdir/|" \ + "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" + ] + [sed '/^POTFILES =/,/[^\\]$/ { + /^POTFILES =/!d + r $1/POTFILES + } + ' "$1/Makefile.in" >"$1/Makefile"] + rm -f "$1/Makefile.tmp" + mv "$1/stamp-it.tmp" "$1/stamp-it" + ]) +])dnl +]) + +# _IT_SUBST(VARIABLE) +# ------------------- +# Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST +# +AC_DEFUN([_IT_SUBST], +[ +AC_SUBST([$1]) +m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) +] +) + +# deprecated macros +AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) +# A hint is needed for aclocal from Automake <= 1.9.4: +# AC_DEFUN([AC_PROG_INTLTOOL], ...) + diff --git a/build/m4/introspection.m4 b/build/m4/introspection.m4 new file mode 100644 index 0000000..d89c3d9 --- /dev/null +++ b/build/m4/introspection.m4 @@ -0,0 +1,96 @@ +dnl -*- mode: autoconf -*- +dnl Copyright 2009 Johan Dahlin +dnl +dnl This file is free software; the author(s) gives unlimited +dnl permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl + +# serial 1 + +m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], +[ + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([LT_INIT],[$0])dnl setup libtool first + + dnl enable/disable introspection + m4_if([$2], [require], + [dnl + enable_introspection=yes + ],[dnl + AC_ARG_ENABLE(introspection, + AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]], + [Enable introspection for this build]),, + [enable_introspection=auto]) + ])dnl + + AC_MSG_CHECKING([for gobject-introspection]) + + dnl presence/version checking + AS_CASE([$enable_introspection], + [no], [dnl + found_introspection="no (disabled, use --enable-introspection to enable)" + ],dnl + [yes],[dnl + PKG_CHECK_EXISTS([gobject-introspection-1.0],, + AC_MSG_ERROR([gobject-introspection-1.0 is not installed])) + PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], + found_introspection=yes, + AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME])) + ],dnl + [auto],[dnl + PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no) + dnl Canonicalize enable_introspection + enable_introspection=$found_introspection + ],dnl + [dnl + AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@]) + ])dnl + + AC_MSG_RESULT([$found_introspection]) + + INTROSPECTION_SCANNER= + INTROSPECTION_COMPILER= + INTROSPECTION_GENERATE= + INTROSPECTION_GIRDIR= + INTROSPECTION_TYPELIBDIR= + if test "x$found_introspection" = "xyes"; then + INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` + INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` + INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` + INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` + INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" + INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` + INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` + INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection + fi + AC_SUBST(INTROSPECTION_SCANNER) + AC_SUBST(INTROSPECTION_COMPILER) + AC_SUBST(INTROSPECTION_GENERATE) + AC_SUBST(INTROSPECTION_GIRDIR) + AC_SUBST(INTROSPECTION_TYPELIBDIR) + AC_SUBST(INTROSPECTION_CFLAGS) + AC_SUBST(INTROSPECTION_LIBS) + AC_SUBST(INTROSPECTION_MAKEFILE) + + AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") +]) + + +dnl Usage: +dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version]) + +AC_DEFUN([GOBJECT_INTROSPECTION_CHECK], +[ + _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1]) +]) + +dnl Usage: +dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version]) + + +AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE], +[ + _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require]) +]) diff --git a/build/m4/libgcrypt.m4 b/build/m4/libgcrypt.m4 new file mode 100644 index 0000000..c67cfec --- /dev/null +++ b/build/m4/libgcrypt.m4 @@ -0,0 +1,143 @@ +# libgcrypt.m4 - Autoconf macros to detect libgcrypt +# Copyright (C) 2002, 2003, 2004, 2011, 2014 g10 Code GmbH +# +# 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. +# +# Last-changed: 2014-10-02 + + +dnl AM_PATH_LIBGCRYPT([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libgcrypt and define LIBGCRYPT_CFLAGS and LIBGCRYPT_LIBS. +dnl MINIMUN-VERSION is a string with the version number optionalliy prefixed +dnl with the API version to also check the API compatibility. Example: +dnl a MINIMUN-VERSION of 1:1.2.5 won't pass the test unless the installed +dnl version of libgcrypt is at least 1.2.5 *and* the API number is 1. Using +dnl this features allows to prevent build against newer versions of libgcrypt +dnl with a changed API. +dnl +dnl If a prefix option is not used, the config script is first +dnl searched in $SYSROOT/bin and then along $PATH. If the used +dnl config script does not match the host specification the script +dnl is added to the gpg_config_script_warn variable. +dnl +AC_DEFUN([AM_PATH_LIBGCRYPT], +[ AC_REQUIRE([AC_CANONICAL_HOST]) + AC_ARG_WITH(libgcrypt-prefix, + AC_HELP_STRING([--with-libgcrypt-prefix=PFX], + [prefix where LIBGCRYPT is installed (optional)]), + libgcrypt_config_prefix="$withval", libgcrypt_config_prefix="") + if test x"${LIBGCRYPT_CONFIG}" = x ; then + if test x"${libgcrypt_config_prefix}" != x ; then + LIBGCRYPT_CONFIG="${libgcrypt_config_prefix}/bin/libgcrypt-config" + else + case "${SYSROOT}" in + /*) + if test -x "${SYSROOT}/bin/libgcrypt-config" ; then + LIBGCRYPT_CONFIG="${SYSROOT}/bin/libgcrypt-config" + fi + ;; + '') + ;; + *) + AC_MSG_WARN([Ignoring \$SYSROOT as it is not an absolute path.]) + ;; + esac + fi + fi + + AC_PATH_PROG(LIBGCRYPT_CONFIG, libgcrypt-config, no) + tmp=ifelse([$1], ,1:1.2.0,$1) + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_libgcrypt_api=0 + min_libgcrypt_version="$tmp" + fi + + AC_MSG_CHECKING(for LIBGCRYPT - version >= $min_libgcrypt_version) + ok=no + if test "$LIBGCRYPT_CONFIG" != "no" ; then + req_major=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version` + major=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + micro=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + AC_MSG_RESULT([yes ($libgcrypt_config_version)]) + else + AC_MSG_RESULT(no) + fi + if test $ok = yes; then + # If we have a recent libgcrypt, we should also check that the + # API is compatible + if test "$req_libgcrypt_api" -gt 0 ; then + tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + AC_MSG_CHECKING([LIBGCRYPT API version]) + if test "$req_libgcrypt_api" -eq "$tmp" ; then + AC_MSG_RESULT([okay]) + else + ok=no + AC_MSG_RESULT([does not match. want=$req_libgcrypt_api got=$tmp]) + fi + fi + fi + fi + if test $ok = yes; then + LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` + LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` + ifelse([$2], , :, [$2]) + libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none` + if test x"$libgcrypt_config_host" != xnone ; then + if test x"$libgcrypt_config_host" != x"$host" ; then + AC_MSG_WARN([[ +*** +*** The config script $LIBGCRYPT_CONFIG was +*** built for $libgcrypt_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-libgcrypt-prefix +*** to specify a matching config script or use \$SYSROOT. +***]]) + gpg_config_script_warn="$gpg_config_script_warn libgcrypt" + fi + fi + else + LIBGCRYPT_CFLAGS="" + LIBGCRYPT_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(LIBGCRYPT_CFLAGS) + AC_SUBST(LIBGCRYPT_LIBS) +]) diff --git a/build/m4/libtool.m4 b/build/m4/libtool.m4 new file mode 100644 index 0000000..a644432 --- /dev/null +++ b/build/m4/libtool.m4 @@ -0,0 +1,8372 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/build/m4/ltoptions.m4 b/build/m4/ltoptions.m4 new file mode 100644 index 0000000..94b0829 --- /dev/null +++ b/build/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/build/m4/ltsugar.m4 b/build/m4/ltsugar.m4 new file mode 100644 index 0000000..48bc934 --- /dev/null +++ b/build/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/build/m4/ltversion.m4 b/build/m4/ltversion.m4 new file mode 100644 index 0000000..fa04b52 --- /dev/null +++ b/build/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/build/m4/lt~obsolete.m4 b/build/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c6b26f8 --- /dev/null +++ b/build/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/build/m4/nls.m4 b/build/m4/nls.m4 new file mode 100644 index 0000000..afdb9ca --- /dev/null +++ b/build/m4/nls.m4 @@ -0,0 +1,32 @@ +# nls.m4 serial 5 (gettext-0.18) +dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software +dnl Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ([2.50]) + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE([nls], + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT([$USE_NLS]) + AC_SUBST([USE_NLS]) +]) diff --git a/build/m4/pkg.m4 b/build/m4/pkg.m4 new file mode 100644 index 0000000..d8549a4 --- /dev/null +++ b/build/m4/pkg.m4 @@ -0,0 +1,343 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES diff --git a/build/m4/vapigen.m4 b/build/m4/vapigen.m4 new file mode 100644 index 0000000..2c435e7 --- /dev/null +++ b/build/m4/vapigen.m4 @@ -0,0 +1,101 @@ +dnl vapigen.m4 +dnl +dnl Copyright 2012 Evan Nemerson +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# VAPIGEN_CHECK([VERSION], [API_VERSION], [FOUND_INTROSPECTION], [DEFAULT]) +# -------------------------------------- +# Check vapigen existence and version +# +# See http://live.gnome.org/Vala/UpstreamGuide for detailed documentation +AC_DEFUN([VAPIGEN_CHECK], +[ + AS_IF([test "x$3" != "xyes"], [ + m4_provide_if([GOBJECT_INTROSPECTION_CHECK], [], [ + m4_provide_if([GOBJECT_INTROSPECTION_REQUIRE], [], [ + AC_MSG_ERROR([[You must call GOBJECT_INTROSPECTION_CHECK or GOBJECT_INTROSPECTION_REQUIRE before using VAPIGEN_CHECK unless using the FOUND_INTROSPECTION argument is "yes"]]) + ]) + ]) + ]) + + AC_ARG_ENABLE([vala], + [AS_HELP_STRING([--enable-vala[=@<:@no/auto/yes@:>@]],[build Vala bindings @<:@default=]ifelse($4,,auto,$4)[@:>@])],,[ + AS_IF([test "x$4" = "x"], [ + enable_vala=auto + ], [ + enable_vala=$4 + ]) + ]) + + AS_CASE([$enable_vala], [no], [enable_vala=no], + [yes], [ + AS_IF([test "x$3" != "xyes" -a "x$found_introspection" != "xyes"], [ + AC_MSG_ERROR([Vala bindings require GObject Introspection]) + ]) + ], [auto], [ + AS_IF([test "x$3" != "xyes" -a "x$found_introspection" != "xyes"], [ + enable_vala=no + ]) + ], [ + AC_MSG_ERROR([Invalid argument passed to --enable-vala, should be one of @<:@no/auto/yes@:>@]) + ]) + + AS_IF([test "x$2" = "x"], [ + vapigen_pkg_name=vapigen + ], [ + vapigen_pkg_name=vapigen-$2 + ]) + AS_IF([test "x$1" = "x"], [ + vapigen_pkg="$vapigen_pkg_name" + ], [ + vapigen_pkg="$vapigen_pkg_name >= $1" + ]) + + PKG_PROG_PKG_CONFIG + + PKG_CHECK_EXISTS([$vapigen_pkg], [ + AS_IF([test "$enable_vala" = "auto"], [ + enable_vala=yes + ]) + ], [ + AS_CASE([$enable_vala], [yes], [ + AC_MSG_ERROR([$vapigen_pkg not found]) + ], [auto], [ + enable_vala=no + ]) + ]) + + AC_MSG_CHECKING([for vapigen]) + + AS_CASE([$enable_vala], + [yes], [ + VAPIGEN=`$PKG_CONFIG --variable=vapigen $vapigen_pkg_name` + VAPIGEN_MAKEFILE=`$PKG_CONFIG --variable=datadir $vapigen_pkg_name`/vala/Makefile.vapigen + AS_IF([test "x$2" = "x"], [ + VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir $vapigen_pkg_name` + ], [ + VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir_versioned $vapigen_pkg_name` + ]) + ]) + + AC_MSG_RESULT([$enable_vala]) + + AC_SUBST([VAPIGEN]) + AC_SUBST([VAPIGEN_VAPIDIR]) + AC_SUBST([VAPIGEN_MAKEFILE]) + + AM_CONDITIONAL(ENABLE_VAPIGEN, test "x$enable_vala" = "xyes") +]) diff --git a/build/missing b/build/missing new file mode 100755 index 0000000..c6e3795 --- /dev/null +++ b/build/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/p11-kit.supp b/build/p11-kit.supp new file mode 100644 index 0000000..ad8b928 --- /dev/null +++ b/build/p11-kit.supp @@ -0,0 +1,6 @@ +{ + _p11_library_get_thread_local + Memcheck:Leak + ... + fun:_p11_library_get_thread_local +} diff --git a/build/pixman.supp b/build/pixman.supp new file mode 100644 index 0000000..a384e0e --- /dev/null +++ b/build/pixman.supp @@ -0,0 +1,6 @@ +{ + pixman + Memcheck:Leak + fun:malloc + obj:/usr/lib64/libpixman-1.so.0.22.2 +} diff --git a/build/pthread.supp b/build/pthread.supp new file mode 100644 index 0000000..a04bfc1 --- /dev/null +++ b/build/pthread.supp @@ -0,0 +1,7 @@ +{ + _dl_allocate_tls + Memcheck:Leak + ... + fun:_dl_allocate_tls + fun:pthread_create* +} diff --git a/build/tap-driver b/build/tap-driver new file mode 100755 index 0000000..e0490ae --- /dev/null +++ b/build/tap-driver @@ -0,0 +1,363 @@ +#!/usr/bin/env python + +# Copyright (C) 2013 Red Hat, Inc. +# +# Cockpit is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# Cockpit is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Cockpit; If not, see . + +# +# This is a TAP driver for automake +# +# In particular it leaves stderr untouched, and is cleaner than the +# one implemented in shell that is making the rounds. +# +# This implements the automake "Custom Test Driver" protocol: +# https://www.gnu.org/software/automake/manual/html_node/Custom-Test-Drivers.html +# +# This consumes the Test Anything Protocol (ie: TAP) +# https://metacpan.org/pod/release/PETDANCE/Test-Harness-2.64/lib/Test/Harness/TAP.pod +# + +import argparse +import os +import select +import subprocess +import sys + +class Driver: + def __init__(self, args): + self.argv = args.command + self.test_name = args.test_name + self.log = open(args.log_file, "w") + self.log.write("# %s\n" % " ".join(sys.argv)) + self.trs = open(args.trs_file, "w") + self.color_tests = args.color_tests + self.expect_failure = args.expect_failure + + def report(self, code, *args): + CODES = { + "XPASS": '\x1b[0;31m', # red + "FAIL": '\x1b[0;31m', # red + "PASS": '\x1b[0;32m', # grn + "XFAIL": '\x1b[1;32m', # lgn + "SKIP": '\x1b[1;34m', # blu + "ERROR": '\x1b[0;35m', # mgn + } + + # Print out to console + if self.color_tests: + if code in CODES: + sys.stdout.write(CODES[code]) + sys.stdout.write(code) + if self.color_tests: + sys.stdout.write('\x1b[m') + sys.stdout.write(": ") + sys.stdout.write(self.test_name) + sys.stdout.write(" ") + for arg in args: + sys.stdout.write(str(arg)) + sys.stdout.write("\n") + sys.stdout.flush() + + # Book keeping + if code in CODES: + self.trs.write(":test-result: %s\n" % code) + + def result_pass(self, *args): + if self.expect_failure: + self.report("XPASS", *args) + else: + self.report("PASS", *args) + + def result_fail(self, *args): + if self.expect_failure: + self.report("XFAIL", *args) + else: + self.report("FAIL", *args) + + def result_skip(self, *args): + if self.expect_failure: + self.report("XFAIL", *args) + else: + self.report("SKIP", *args) + + def report_error(self, description=""): + self.report("ERROR", "", description) + + def process(self, output): + pass + + def execute(self): + try: + proc = subprocess.Popen(self.argv, close_fds=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except OSError, ex: + self.report_error("Couldn't run %s: %s" % (self.argv[0], str(ex))) + return + + outf = proc.stdout.fileno() + errf = proc.stderr.fileno() + rset = [outf, errf] + while len(rset) > 0: + ret = select.select(rset, [], [], 10) + if outf in ret[0]: + data = os.read(outf, 1024) + if data == "": + rset.remove(outf) + self.log.write(data) + self.process(data) + if errf in ret[0]: + data = os.read(errf, 1024) + if data == "": + rset.remove(errf) + self.log.write(data) + sys.stderr.write(data) + + proc.wait() + return proc.returncode + + +class TapDriver(Driver): + def __init__(self, args): + Driver.__init__(self, args) + self.output = "" + self.reported = { } + self.test_plan = None + self.late_plan = False + self.errored = False + self.bail_out = False + + def report(self, code, num, *args): + if num: + Driver.report(self, code, num, " ", *args) + self.reported[num] = code + else: + Driver.report(self, code, *args) + if code == "ERROR": + self.errored = True + + def consume_test_line(self, ok, data): + # It's an error if the caller sends a test plan in the middle of tests + if self.late_plan: + self.report_error("Got tests after late TAP test plan") + self.late_plan = False + + # Parse out a number and then description + (num, unused, description) = data.partition(" ") + try: + num = int(num) + except ValueError: + self.report_error("Invalid test number: %s" % data) + return + description = description.lstrip() + + # Parse out a directive from description, if any + (description, unused, directive) = description.partition("#") + + # Special case if directive starts with this, then skip + if directive.lstrip().lower().startswith("skip"): + self.result_skip(num, description) + elif ok: + self.result_pass(num, description) + else: + self.result_fail(num, description) + + def consume_test_plan(self, first, last): + # Only one test plan is supported + if self.test_plan: + self.report_error("Get a second TAP test plan") + return + + try: + first = int(first) + last = int(last) + except ValueError: + self.report_error("Invalid test plan: %s..%s" % (first, last)) + return + + self.test_plan = (first, last) + self.late_plan = self.reported and True or False + + def consume_bail_out(self, line): + self.bail_out = True + self.report("SKIP", 0, line) + + def process(self, output): + if output: + self.output += output + elif self.output: + self.output += "\n" + (ready, unused, self.output) = self.output.rpartition("\n") + for line in ready.split("\n"): + if line.startswith("ok "): + self.consume_test_line(True, line[3:]) + elif line.startswith("not ok "): + self.consume_test_line(False, line[7:]) + elif line and line[0].isdigit() and ".." in line: + (first, unused, last) = line.partition("..") + self.consume_test_plan(first, last) + elif line.lower().startswith("bail out!"): + self.consume_bail_out(line) + + def run(self): + returncode = self.execute() + + failed = False + skipped = True + + # Basic collation of results + for (num, code) in self.reported.items(): + if code == "ERROR": + self.errored = True + elif code == "FAIL" or code == "XPASS": + failed = True + if code != "SKIP": + skipped = False + + if not self.errored: + if returncode == 77: + skipped = True + elif returncode: + self.report_error("process failed: %d" % returncode) + self.errored = True + + # Check the plan + if not self.errored: + if not self.test_plan: + if not self.bail_out: + self.report_error("Didn't receive a TAP test plan") + else: + for i in range(self.test_plan[0], self.test_plan[1] + 1): + if i not in self.reported: + if self.bail_out: + self.report("SKIP", i, "- bailed out") + else: + self.report("ERROR", i, "- missing test") + skipped = False + self.errored = True + + if self.errored: + self.trs.write(":global-test-result: ERROR\n") + self.trs.write(":test-global-result: ERROR\n") + self.trs.write(":recheck: yes\n") + elif failed: + self.trs.write(":global-test-result: FAIL\n") + self.trs.write(":test-global-result: FAIL\n") + self.trs.write(":recheck: yes\n") + elif skipped: + self.trs.write(":global-test-result: SKIP\n") + self.trs.write(":test-global-result: SKIP\n") + self.trs.write(":recheck: no\n") + else: + self.trs.write(":global-test-result: PASS\n") + self.trs.write(":test-global-result: PASS\n") + self.trs.write(":recheck: no\n") + if self.errored or failed: + self.trs.write(":copy-in-global-log: yes\n") + + # Process result code + return 0 + + +class SimpleDriver(Driver): + def __init__(self, args): + Driver.__init__(self, args) + + def run(self): + returncode = self.execute() + if returncode == 0: + self.result_pass() + self.trs.write(":global-test-result: PASS\n") + self.trs.write(":test-global-result: PASS\n") + self.trs.write(":recheck: no\n") + elif returncode == 77: + self.result_skip() + self.trs.write(":global-test-result: SKIP\n") + self.trs.write(":test-global-result: SKIP\n") + self.trs.write(":recheck: no\n") + elif returncode == 99: + self.report_error() + self.trs.write(":global-test-result: ERROR\n") + self.trs.write(":test-global-result: ERROR\n") + self.trs.write(":copy-in-global-log: yes\n") + self.trs.write(":recheck: yes\n") + else: + self.result_fail() + self.trs.write(":global-test-result: FAIL\n") + self.trs.write(":test-global-result: FAIL\n") + self.trs.write(":copy-in-global-log: yes\n") + self.trs.write(":recheck: yes\n") + + # Process result code + return 0 + + +class MissingDriver(Driver): + def __init__(self, args): + Driver.__init__(self, args) + self.missing = args.missing + + def run(self): + self.result_skip("skipping due to: ", self.missing) + self.trs.write(":global-test-result: SKIP\n") + self.trs.write(":test-global-result: SKIP\n") + self.trs.write(":recheck: no\n") + return 0 + + +class YesNoAction(argparse.Action): + def __init__(self, option_strings, dest, **kwargs): + argparse.Action.__init__(self, option_strings, dest, **kwargs) + self.metavar = "[yes|no]" + def __call__(self, parser, namespace, values, option_string=None): + if not values or "yes" in values: + setattr(namespace, self.dest, True) + else: + setattr(namespace, self.dest, False) + + +def main(argv): + parser = argparse.ArgumentParser(description='Automake TAP driver') + parser.add_argument('--format', metavar='FORMAT', choices=[ "simple", "tap" ], + default="simple", help='The type of test to drive') + parser.add_argument('--missing', metavar="TOOL", nargs='?', + help="Force the test to skip due to missing tool") + parser.add_argument('--test-name', metavar='NAME', + help='The name of the test') + parser.add_argument('--log-file', metavar='PATH.log', required=True, + help='The .log file the driver creates') + parser.add_argument('--trs-file', metavar='PATH.trs', required=True, + help='The .trs file the driver creates') + parser.add_argument('--color-tests', default=True, action=YesNoAction, + help='Whether the console output should be colorized or not') + parser.add_argument('--expect-failure', default=False, action=YesNoAction, + help="Whether the tested program is expected to fail") + parser.add_argument('--enable-hard-errors', default=False, action=YesNoAction, + help="Whether hard errors in the tested program are treated differently") + parser.add_argument('command', nargs='+', + help="A test command line to run") + args = parser.parse_args(argv[1:]) + + if not args.test_name: + args.test_name = os.path.basename(args.command[0]) + if args.missing: + driver = MissingDriver(args) + elif args.format == "simple": + driver = SimpleDriver(args) + elif args.format == "tap": + driver = TapDriver(args) + return driver.run() + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/build/tap-gtester b/build/tap-gtester new file mode 100755 index 0000000..8949f4d --- /dev/null +++ b/build/tap-gtester @@ -0,0 +1,181 @@ +#!/usr/bin/env python + +# Copyright (C) 2014 Red Hat, Inc. +# +# Cockpit is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# Cockpit is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Cockpit; If not, see . + +# +# This is a test output compiler which produces TAP from GTest output +# if GTest output is detected. +# +# Versions of glib later than 2.38.x output TAP natively when tests are +# run with the --tap option. However we can't depend on such a recent +# version of glib for our purposes. +# +# This implements the Test Anything Protocol (ie: TAP) +# https://metacpan.org/pod/release/PETDANCE/Test-Harness-2.64/lib/Test/Harness/TAP.pod +# + +import argparse +import os +import select +import subprocess +import sys + +class NullCompiler: + def __init__(self, command): + self.command = command + + def input(self, line): + sys.stdout.write(line) + + def process(self, proc): + while True: + line = proc.stdout.readline() + if not line: + break + self.input(line) + proc.wait() + return proc.returncode + + def run(self, proc, line=None): + if line: + self.input(line) + return self.process(proc) + + +class GTestCompiler(NullCompiler): + def __init__(self, filename): + NullCompiler.__init__(self, filename) + self.test_num = 0 + self.test_name = None + self.test_remaining = [] + + def input(self, line): + line = line.strip() + if line.startswith("GTest: "): + (cmd, unused, data) = line[7:].partition(": ") + cmd = cmd.strip() + data = data.strip() + if cmd == "run": + self.test_name = data + assert self.test_name in self.test_remaining, "%s %s" % (self.test_name, repr(self.test_remaining)) + self.test_remaining.remove(self.test_name) + self.test_num += 1 + elif cmd == "result": + if self.test_name: + if data == "OK": + print "ok %d %s" % (self.test_num, self.test_name) + if data == "FAIL": + print "not ok %d %s", (self.test_num, self.test_name) + if data == "SKIP": + print "ok %d %s # skip" % (self.test_num, self.test_name) + self.test_name = None + elif cmd == "skipping": + if "/subprocess" not in data: + print "ok %d # skip -- %s" % (self.test_num, data) + self.test_name = None + elif data: + print "# %s: %s" % (cmd, data) + else: + print "# %s" % cmd + elif line.startswith("(MSG: "): + print "# %s" % line[6:-1] + elif line: + print "# %s" % line + sys.stdout.flush() + + def run(self, proc, output=""): + # Complete retrieval of the list of tests + output += proc.stdout.read() + proc.wait() + if proc.returncode: + sys.stderr.write("tap-gtester: listing GTest tests failed: %d\n" % proc.returncode) + return proc.returncode + self.test_remaining = [] + for line in output.split("\n"): + if line.startswith("/"): + self.test_remaining.append(line.strip()) + if not self.test_remaining: + print "Bail out! No tests found in GTest: %s" % self.command[0] + return 0 + + print "1..%d" % len(self.test_remaining) + + # First try to run all the tests in a batch + proc = subprocess.Popen(self.command + ["--verbose" ], close_fds=True, stdout=subprocess.PIPE) + result = self.process(proc) + if result == 0: + return 0 + + # Now pick up any stragglers due to failures + while True: + # Assume that the last test failed + if self.test_name: + print "not ok %d %s" % (self.test_num, self.test_name) + self.test_name = None + + # Run any tests which didn't get run + if not self.test_remaining: + break + + proc = subprocess.Popen(self.command + ["--verbose", "-p", self.test_remaining[0]], + close_fds=True, stdout=subprocess.PIPE) + result = self.process(proc) + + # The various exit codes and signals we continue for + if result not in [ 0, 1, -4, -5, -6, -7, -8, -11, 33 ]: + break + + return result + +def main(argv): + parser = argparse.ArgumentParser(description='Automake TAP compiler') + parser.add_argument('--format', metavar='FORMAT', choices=[ "auto", "gtest", "tap" ], + default="auto", help='The input format to compile') + parser.add_argument('--verbose', action='store_true', + default=True, help='Verbose mode (ignored)') + parser.add_argument('command', nargs='+', help="A test command to run") + args = parser.parse_args(argv[1:]) + + output = None + format = args.format + cmd = args.command + proc = None + + os.environ['HARNESS_ACTIVE'] = '1' + + if format in ["auto", "gtest"]: + list_cmd = cmd + ["-l", "--verbose"] + proc = subprocess.Popen(list_cmd, close_fds=True, stdout=subprocess.PIPE) + output = proc.stdout.readline() + # Smell whether we're dealing with GTest list output from first line + if "random seed" in output or "GTest" in output or output.startswith("/"): + format = "gtest" + else: + format = "tap" + else: + proc = subprocess.Popen(cmd, close_fds=True, stdout=subprocess.PIPE) + + if format == "gtest": + compiler = GTestCompiler(cmd) + elif format == "tap": + compiler = NullCompiler(cmd) + else: + assert False, "not reached" + + return compiler.run(proc, output) + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/build/test-driver b/build/test-driver new file mode 100755 index 0000000..0218a01 --- /dev/null +++ b/build/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 2011-2017 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/unknown.supp b/build/unknown.supp new file mode 100644 index 0000000..bc7eea1 --- /dev/null +++ b/build/unknown.supp @@ -0,0 +1,420 @@ +{ + _g_dbus_shared_thread_ref + Memcheck:Leak + ... + fun:_g_dbus_shared_thread_ref +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:g_type_create_instance + fun:g_object_constructor + fun:g_object_newv + fun:g_object_new + fun:g_dbus_message_new + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb + fun:g_simple_async_result_complete + fun:complete_in_idle_cb + fun:g_idle_dispatch + fun:g_main_dispatch +} +{ + + Memcheck:Leak + fun:malloc + ... + obj:/lib64/libgcrypt.so.11.7.0 + fun:egg_dh_gen_pair +} +{ + + Memcheck:Leak + ... + fun:parse_value_from_blob + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:g_dbus_message_new + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb + fun:g_simple_async_result_complete + fun:complete_in_idle_cb + fun:g_idle_dispatch +} +{ + + Memcheck:Leak + ... + fun:g_variant_get + fun:g_dbus_message_to_gerror + fun:decode_method_reply + fun:g_dbus_connection_call_done +} +{ + + Memcheck:Leak + ... + fun:g_dbus_message_set_header + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_malloc_n + fun:g_main_context_iterate + fun:g_main_loop_run + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_list_prepend + fun:g_queue_push_head + fun:g_main_context_push_thread_default + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_dispatch + fun:g_main_context_dispatch + fun:g_main_context_iterate + fun:g_main_loop_run + fun:g_dbus_connection_send_message_with_reply_sync + fun:g_dbus_connection_call_sync_internal + fun:g_dbus_connection_call_sync + fun:initable_init + fun:g_initable_init + fun:g_bus_get_sync +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_dispatch + fun:g_main_context_dispatch + fun:g_main_context_iterate + fun:g_main_loop_run + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_malloc_n + fun:g_main_context_iterate +} +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:standard_realloc + fun:g_realloc + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_initial_read +} +{ + + Memcheck:Leak + ... + fun:_g_socket_output_stream_new + fun:g_socket_connection_get_output_stream + fun:g_io_stream_get_output_stream + fun:_g_dbus_auth_run_client +} +{ + _g_dbus_worker_do_initial_read + Memcheck:Leak + ... + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_initial_read +} +{ + + Memcheck:Leak + ... + fun:g_unix_socket_address_new_with_type + fun:g_dbus_address_connect + fun:g_dbus_address_try_connect_one + fun:g_dbus_address_get_stream_sync +} +{ + + Memcheck:Leak + ... + fun:_g_socket_input_stream_new + fun:g_socket_connection_get_input_stream + fun:g_io_stream_get_input_stream + fun:_g_dbus_auth_run_client +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_worker_close + fun:_g_dbus_worker_stop +} +{ + + Memcheck:Leak + ... + fun:g_simple_async_result_complete_in_idle + fun:_g_socket_read_with_control_messages_ready + fun:_g_socket_read_with_control_messages + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:g_source_new + fun:g_idle_source_new + fun:g_simple_async_result_complete_in_idle + fun:g_socket_connection_close_async + fun:g_io_stream_close_async + ... + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + ... + fun:g_simple_async_result_new + fun:g_socket_connection_close_async + fun:g_io_stream_close_async + fun:maybe_write_next_message + fun:write_message_in_idle_cb +} +{ + + Memcheck:Leak + ... + fun:g_socket_connection_factory_create_connection + ... + fun:initable_init +} +{ + + Memcheck:Leak + ... + fun:g_socket_client_connect + fun:g_dbus_address_connect + fun:g_dbus_address_try_connect_one +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_worker_new +} +{ + + Memcheck:Leak + ... + fun:_g_socket_read_with_control_messages + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:g_socket_receive_message + fun:_g_socket_read_with_control_messages_ready + fun:_g_socket_read_with_control_messages + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:maybe_write_next_message + ... + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + ... + fun:remove_match_rule + fun:unsubscribe_id_internal +} +{ + + Memcheck:Leak + ... + fun:g_object_new + fun:get_uninitialized_connection + fun:g_bus_get_sync +} +{ + + Memcheck:Leak + ... + fun:g_dbus_connection_signal_subscribe + fun:async_initable_init_first +} +{ + + Memcheck:Leak + ... + fun:g_dbus_connection_send_message_with_reply_unlocked + fun:g_dbus_connection_send_message_with_reply + fun:g_dbus_connection_send_message_with_reply_sync + fun:g_dbus_connection_call_sync_internal + fun:g_dbus_connection_call_sync +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_auth_new +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_auth_run_client +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_auth_init +} +{ + + Memcheck:Leak + ... + fun:g_variant_dup_string + ... + fun:g_variant_get + ... + fun:g_initable_init + fun:g_bus_get_sync +} +{ + + Memcheck:Leak + ... + fun:g_main_context_push_thread_default + ... + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + ... + fun:g_main_context_add_poll_unlocked + ... + fun:g_main_loop_run + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_memdup + fun:g_hash_table_insert_node + fun:handler_insert + fun:g_signal_connect_data +} +{ + + Memcheck:Leak + ... + fun:g_cond_new_posix_impl + fun:g_async_queue_pop_intern_unlocked + fun:g_thread_pool_thread_proxy + fun:g_thread_create_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + ... + fun:g_thread_create_full + fun:g_thread_pool_start_thread + fun:g_thread_pool_push +} +{ + thread_memory_from_self + Memcheck:Leak + ... + fun:thread_memory_from_self + ... + fun:g_object_new +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_dispatch + fun:g_main_context_dispatch + fun:g_main_context_iterate + fun:g_main_loop_run +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_memdup + fun:g_hash_table_insert_node + fun:g_hash_table_insert_internal + fun:g_hash_table_insert + fun:handler_list_ensure + fun:handler_insert + fun:g_signal_connect_data +} diff --git a/build/valgrind/memcheck.h b/build/valgrind/memcheck.h new file mode 100644 index 0000000..c22458d --- /dev/null +++ b/build/valgrind/memcheck.h @@ -0,0 +1,287 @@ + +/* + ---------------------------------------------------------------- + + Notice that the following BSD-style license applies to this one + file (memcheck.h) only. The rest of Valgrind is licensed under the + terms of the GNU General Public License, version 2, unless + otherwise indicated. See the COPYING file in the source + distribution for details. + + ---------------------------------------------------------------- + + This file is part of MemCheck, a heavyweight Valgrind tool for + detecting memory errors. + + Copyright (C) 2000-2013 Julian Seward. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + ---------------------------------------------------------------- + + Notice that the above BSD-style license applies to this one file + (memcheck.h) only. The entire rest of Valgrind is licensed under + the terms of the GNU General Public License, version 2. See the + COPYING file in the source distribution for details. + + ---------------------------------------------------------------- +*/ + + +#ifndef __MEMCHECK_H +#define __MEMCHECK_H + + +/* This file is for inclusion into client (your!) code. + + You can use these macros to manipulate and query memory permissions + inside your own programs. + + See comment near the top of valgrind.h on how to use them. +*/ + +#include "valgrind.h" + +/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! + This enum comprises an ABI exported by Valgrind to programs + which use client requests. DO NOT CHANGE THE ORDER OF THESE + ENTRIES, NOR DELETE ANY -- add new ones at the end. */ +typedef + enum { + VG_USERREQ__MAKE_MEM_NOACCESS = VG_USERREQ_TOOL_BASE('M','C'), + VG_USERREQ__MAKE_MEM_UNDEFINED, + VG_USERREQ__MAKE_MEM_DEFINED, + VG_USERREQ__DISCARD, + VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE, + VG_USERREQ__CHECK_MEM_IS_DEFINED, + VG_USERREQ__DO_LEAK_CHECK, + VG_USERREQ__COUNT_LEAKS, + + VG_USERREQ__GET_VBITS, + VG_USERREQ__SET_VBITS, + + VG_USERREQ__CREATE_BLOCK, + + VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, + + /* Not next to VG_USERREQ__COUNT_LEAKS because it was added later. */ + VG_USERREQ__COUNT_LEAK_BLOCKS, + + /* This is just for memcheck's internal use - don't use it */ + _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR + = VG_USERREQ_TOOL_BASE('M','C') + 256 + } Vg_MemCheckClientRequest; + + + +/* Client-code macros to manipulate the state of memory. */ + +/* Mark memory at _qzz_addr as unaddressable for _qzz_len bytes. */ +#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_NOACCESS, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Similarly, mark memory at _qzz_addr as addressable but undefined + for _qzz_len bytes. */ +#define VALGRIND_MAKE_MEM_UNDEFINED(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_UNDEFINED, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Similarly, mark memory at _qzz_addr as addressable and defined + for _qzz_len bytes. */ +#define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_DEFINED, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Similar to VALGRIND_MAKE_MEM_DEFINED except that addressability is + not altered: bytes which are addressable are marked as defined, + but those which are not addressable are left unchanged. */ +#define VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Create a block-description handle. The description is an ascii + string which is included in any messages pertaining to addresses + within the specified memory range. Has no other effect on the + properties of the memory range. */ +#define VALGRIND_CREATE_BLOCK(_qzz_addr,_qzz_len, _qzz_desc) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CREATE_BLOCK, \ + (_qzz_addr), (_qzz_len), (_qzz_desc), \ + 0, 0) + +/* Discard a block-description-handle. Returns 1 for an + invalid handle, 0 for a valid handle. */ +#define VALGRIND_DISCARD(_qzz_blkindex) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__DISCARD, \ + 0, (_qzz_blkindex), 0, 0, 0) + + +/* Client-code macros to check the state of memory. */ + +/* Check that memory at _qzz_addr is addressable for _qzz_len bytes. + If suitable addressibility is not established, Valgrind prints an + error message and returns the address of the first offending byte. + Otherwise it returns zero. */ +#define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Check that memory at _qzz_addr is addressable and defined for + _qzz_len bytes. If suitable addressibility and definedness are not + established, Valgrind prints an error message and returns the + address of the first offending byte. Otherwise it returns zero. */ +#define VALGRIND_CHECK_MEM_IS_DEFINED(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__CHECK_MEM_IS_DEFINED, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Use this macro to force the definedness and addressibility of an + lvalue to be checked. If suitable addressibility and definedness + are not established, Valgrind prints an error message and returns + the address of the first offending byte. Otherwise it returns + zero. */ +#define VALGRIND_CHECK_VALUE_IS_DEFINED(__lvalue) \ + VALGRIND_CHECK_MEM_IS_DEFINED( \ + (volatile unsigned char *)&(__lvalue), \ + (unsigned long)(sizeof (__lvalue))) + + +/* Do a full memory leak check (like --leak-check=full) mid-execution. */ +#define VALGRIND_DO_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 0, 0, 0, 0, 0) + +/* Same as VALGRIND_DO_LEAK_CHECK but only showing the entries for + which there was an increase in leaked bytes or leaked nr of blocks + since the previous leak search. */ +#define VALGRIND_DO_ADDED_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 0, 1, 0, 0, 0) + +/* Same as VALGRIND_DO_ADDED_LEAK_CHECK but showing entries with + increased or decreased leaked bytes/blocks since previous leak + search. */ +#define VALGRIND_DO_CHANGED_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 0, 2, 0, 0, 0) + +/* Do a summary memory leak check (like --leak-check=summary) mid-execution. */ +#define VALGRIND_DO_QUICK_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 1, 0, 0, 0, 0) + +/* Return number of leaked, dubious, reachable and suppressed bytes found by + all previous leak checks. They must be lvalues. */ +#define VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed) \ + /* For safety on 64-bit platforms we assign the results to private + unsigned long variables, then assign these to the lvalues the user + specified, which works no matter what type 'leaked', 'dubious', etc + are. We also initialise '_qzz_leaked', etc because + VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as + defined. */ \ + { \ + unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \ + unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \ + VALGRIND_DO_CLIENT_REQUEST_STMT( \ + VG_USERREQ__COUNT_LEAKS, \ + &_qzz_leaked, &_qzz_dubious, \ + &_qzz_reachable, &_qzz_suppressed, 0); \ + leaked = _qzz_leaked; \ + dubious = _qzz_dubious; \ + reachable = _qzz_reachable; \ + suppressed = _qzz_suppressed; \ + } + +/* Return number of leaked, dubious, reachable and suppressed bytes found by + all previous leak checks. They must be lvalues. */ +#define VALGRIND_COUNT_LEAK_BLOCKS(leaked, dubious, reachable, suppressed) \ + /* For safety on 64-bit platforms we assign the results to private + unsigned long variables, then assign these to the lvalues the user + specified, which works no matter what type 'leaked', 'dubious', etc + are. We also initialise '_qzz_leaked', etc because + VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as + defined. */ \ + { \ + unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \ + unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \ + VALGRIND_DO_CLIENT_REQUEST_STMT( \ + VG_USERREQ__COUNT_LEAK_BLOCKS, \ + &_qzz_leaked, &_qzz_dubious, \ + &_qzz_reachable, &_qzz_suppressed, 0); \ + leaked = _qzz_leaked; \ + dubious = _qzz_dubious; \ + reachable = _qzz_reachable; \ + suppressed = _qzz_suppressed; \ + } + + +/* Get the validity data for addresses [zza..zza+zznbytes-1] and copy it + into the provided zzvbits array. Return values: + 0 if not running on valgrind + 1 success + 2 [previously indicated unaligned arrays; these are now allowed] + 3 if any parts of zzsrc/zzvbits are not addressable. + The metadata is not copied in cases 0, 2 or 3 so it should be + impossible to segfault your system by using this call. +*/ +#define VALGRIND_GET_VBITS(zza,zzvbits,zznbytes) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__GET_VBITS, \ + (const char*)(zza), \ + (char*)(zzvbits), \ + (zznbytes), 0, 0) + +/* Set the validity data for addresses [zza..zza+zznbytes-1], copying it + from the provided zzvbits array. Return values: + 0 if not running on valgrind + 1 success + 2 [previously indicated unaligned arrays; these are now allowed] + 3 if any parts of zza/zzvbits are not addressable. + The metadata is not copied in cases 0, 2 or 3 so it should be + impossible to segfault your system by using this call. +*/ +#define VALGRIND_SET_VBITS(zza,zzvbits,zznbytes) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__SET_VBITS, \ + (const char*)(zza), \ + (const char*)(zzvbits), \ + (zznbytes), 0, 0 ) + +#endif + diff --git a/build/valgrind/valgrind.h b/build/valgrind/valgrind.h new file mode 100644 index 0000000..ab9dd04 --- /dev/null +++ b/build/valgrind/valgrind.h @@ -0,0 +1,5413 @@ +/* -*- c -*- + ---------------------------------------------------------------- + + Notice that the following BSD-style license applies to this one + file (valgrind.h) only. The rest of Valgrind is licensed under the + terms of the GNU General Public License, version 2, unless + otherwise indicated. See the COPYING file in the source + distribution for details. + + ---------------------------------------------------------------- + + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2013 Julian Seward. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + ---------------------------------------------------------------- + + Notice that the above BSD-style license applies to this one file + (valgrind.h) only. The entire rest of Valgrind is licensed under + the terms of the GNU General Public License, version 2. See the + COPYING file in the source distribution for details. + + ---------------------------------------------------------------- +*/ + + +/* This file is for inclusion into client (your!) code. + + You can use these macros to manipulate and query Valgrind's + execution inside your own programs. + + The resulting executables will still run without Valgrind, just a + little bit more slowly than they otherwise would, but otherwise + unchanged. When not running on valgrind, each client request + consumes very few (eg. 7) instructions, so the resulting performance + loss is negligible unless you plan to execute client requests + millions of times per second. Nevertheless, if that is still a + problem, you can compile with the NVALGRIND symbol defined (gcc + -DNVALGRIND) so that client requests are not even compiled in. */ + +#ifndef __VALGRIND_H +#define __VALGRIND_H + + +/* ------------------------------------------------------------------ */ +/* VERSION NUMBER OF VALGRIND */ +/* ------------------------------------------------------------------ */ + +/* Specify Valgrind's version number, so that user code can + conditionally compile based on our version number. Note that these + were introduced at version 3.6 and so do not exist in version 3.5 + or earlier. The recommended way to use them to check for "version + X.Y or later" is (eg) + +#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__) \ + && (__VALGRIND_MAJOR__ > 3 \ + || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) +*/ +#define __VALGRIND_MAJOR__ 3 +#define __VALGRIND_MINOR__ 8 + + +#include + +/* Nb: this file might be included in a file compiled with -ansi. So + we can't use C++ style "//" comments nor the "asm" keyword (instead + use "__asm__"). */ + +/* Derive some tags indicating what the target platform is. Note + that in this file we're using the compiler's CPP symbols for + identifying architectures, which are different to the ones we use + within the rest of Valgrind. Note, __powerpc__ is active for both + 32 and 64-bit PPC, whereas __powerpc64__ is only active for the + latter (on Linux, that is). + + Misc note: how to find out what's predefined in gcc by default: + gcc -Wp,-dM somefile.c +*/ +#undef PLAT_x86_darwin +#undef PLAT_amd64_darwin +#undef PLAT_x86_win32 +#undef PLAT_amd64_win64 +#undef PLAT_x86_linux +#undef PLAT_amd64_linux +#undef PLAT_ppc32_linux +#undef PLAT_ppc64_linux +#undef PLAT_arm_linux +#undef PLAT_s390x_linux +#undef PLAT_mips32_linux +#undef PLAT_mips64_linux + + +#if defined(__APPLE__) && defined(__i386__) +# define PLAT_x86_darwin 1 +#elif defined(__APPLE__) && defined(__x86_64__) +# define PLAT_amd64_darwin 1 +#elif defined(__MINGW32__) || defined(__CYGWIN32__) \ + || (defined(_WIN32) && defined(_M_IX86)) +# define PLAT_x86_win32 1 +#elif defined(__MINGW64__) || (defined(_WIN64) && defined(_M_X64)) +# define PLAT_amd64_win64 1 +#elif defined(__linux__) && defined(__i386__) +# define PLAT_x86_linux 1 +#elif defined(__linux__) && defined(__x86_64__) +# define PLAT_amd64_linux 1 +#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__) +# define PLAT_ppc32_linux 1 +#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) +# define PLAT_ppc64_linux 1 +#elif defined(__linux__) && defined(__arm__) +# define PLAT_arm_linux 1 +#elif defined(__linux__) && defined(__s390__) && defined(__s390x__) +# define PLAT_s390x_linux 1 +#elif defined(__linux__) && defined(__mips__) +#if (__mips==64) +# define PLAT_mips64_linux 1 +#else +# define PLAT_mips32_linux 1 +#endif +#else +/* If we're not compiling for our target platform, don't generate + any inline asms. */ +# if !defined(NVALGRIND) +# define NVALGRIND 1 +# endif +#endif + + +/* ------------------------------------------------------------------ */ +/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */ +/* in here of use to end-users -- skip to the next section. */ +/* ------------------------------------------------------------------ */ + +/* + * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client + * request. Accepts both pointers and integers as arguments. + * + * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind + * client request that does not return a value. + + * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind + * client request and whose value equals the client request result. Accepts + * both pointers and integers as arguments. Note that such calls are not + * necessarily pure functions -- they may have side effects. + */ + +#define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \ + _zzq_request, _zzq_arg1, _zzq_arg2, \ + _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \ + (_zzq_request), (_zzq_arg1), (_zzq_arg2), \ + (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0) + +#define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \ + _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + (_zzq_request), (_zzq_arg1), (_zzq_arg2), \ + (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0) + +#if defined(NVALGRIND) + +/* Define NVALGRIND to completely remove the Valgrind magic sequence + from the compiled code (analogous to NDEBUG's effects on + assert()) */ +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + (_zzq_default) + +#else /* ! NVALGRIND */ + +/* The following defines the magic code sequences which the JITter + spots and handles magically. Don't look too closely at them as + they will rot your brain. + + The assembly code sequences for all architectures is in this one + file. This is because this file must be stand-alone, and we don't + want to have multiple files. + + For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default + value gets put in the return slot, so that everything works when + this is executed not under Valgrind. Args are passed in a memory + block, and so there's no intrinsic limit to the number that could + be passed, but it's currently five. + + The macro args are: + _zzq_rlval result lvalue + _zzq_default default value (result returned when running on real CPU) + _zzq_request request code + _zzq_arg1..5 request params + + The other two macros are used to support function wrapping, and are + a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the + guest's NRADDR pseudo-register and whatever other information is + needed to safely run the call original from the wrapper: on + ppc64-linux, the R2 value at the divert point is also needed. This + information is abstracted into a user-visible type, OrigFn. + + VALGRIND_CALL_NOREDIR_* behaves the same as the following on the + guest, but guarantees that the branch instruction will not be + redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64: + branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a + complete inline asm, since it needs to be combined with more magic + inline asm stuff to be useful. +*/ + +/* ------------------------- x86-{linux,darwin} ---------------- */ + +#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \ + || (defined(PLAT_x86_win32) && defined(__GNUC__)) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "roll $3, %%edi ; roll $13, %%edi\n\t" \ + "roll $29, %%edi ; roll $19, %%edi\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({volatile unsigned int _zzq_args[6]; \ + volatile unsigned int _zzq_result; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %EDX = client_request ( %EAX ) */ \ + "xchgl %%ebx,%%ebx" \ + : "=d" (_zzq_result) \ + : "a" (&_zzq_args[0]), "0" (_zzq_default) \ + : "cc", "memory" \ + ); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %EAX = guest_NRADDR */ \ + "xchgl %%ecx,%%ecx" \ + : "=a" (__addr) \ + : \ + : "cc", "memory" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_EAX \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir *%EAX */ \ + "xchgl %%edx,%%edx\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "xchgl %%edi,%%edi\n\t" \ + : : : "cc", "memory" \ + ); \ + } while (0) + +#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */ + +/* ------------------------- x86-Win32 ------------------------- */ + +#if defined(PLAT_x86_win32) && !defined(__GNUC__) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#if defined(_MSC_VER) + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + __asm rol edi, 3 __asm rol edi, 13 \ + __asm rol edi, 29 __asm rol edi, 19 + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \ + (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \ + (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \ + (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5)) + +static __inline uintptr_t +valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request, + uintptr_t _zzq_arg1, uintptr_t _zzq_arg2, + uintptr_t _zzq_arg3, uintptr_t _zzq_arg4, + uintptr_t _zzq_arg5) +{ + volatile uintptr_t _zzq_args[6]; + volatile unsigned int _zzq_result; + _zzq_args[0] = (uintptr_t)(_zzq_request); + _zzq_args[1] = (uintptr_t)(_zzq_arg1); + _zzq_args[2] = (uintptr_t)(_zzq_arg2); + _zzq_args[3] = (uintptr_t)(_zzq_arg3); + _zzq_args[4] = (uintptr_t)(_zzq_arg4); + _zzq_args[5] = (uintptr_t)(_zzq_arg5); + __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default + __SPECIAL_INSTRUCTION_PREAMBLE + /* %EDX = client_request ( %EAX ) */ + __asm xchg ebx,ebx + __asm mov _zzq_result, edx + } + return _zzq_result; +} + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned int __addr; \ + __asm { __SPECIAL_INSTRUCTION_PREAMBLE \ + /* %EAX = guest_NRADDR */ \ + __asm xchg ecx,ecx \ + __asm mov __addr, eax \ + } \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_EAX ERROR + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm { __SPECIAL_INSTRUCTION_PREAMBLE \ + __asm xchg edi,edi \ + } \ + } while (0) + +#else +#error Unsupported compiler. +#endif + +#endif /* PLAT_x86_win32 */ + +/* ------------------------ amd64-{linux,darwin} --------------- */ + +#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ + "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({ volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %RDX = client_request ( %RAX ) */ \ + "xchgq %%rbx,%%rbx" \ + : "=d" (_zzq_result) \ + : "a" (&_zzq_args[0]), "0" (_zzq_default) \ + : "cc", "memory" \ + ); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %RAX = guest_NRADDR */ \ + "xchgq %%rcx,%%rcx" \ + : "=a" (__addr) \ + : \ + : "cc", "memory" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_RAX \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir *%RAX */ \ + "xchgq %%rdx,%%rdx\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "xchgq %%rdi,%%rdi\n\t" \ + : : : "cc", "memory" \ + ); \ + } while (0) + +#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ + +/* ------------------------ ppc32-linux ------------------------ */ + +#if defined(PLAT_ppc32_linux) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ + "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({ unsigned int _zzq_args[6]; \ + unsigned int _zzq_result; \ + unsigned int* _zzq_ptr; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + _zzq_ptr = _zzq_args; \ + __asm__ volatile("mr 3,%1\n\t" /*default*/ \ + "mr 4,%2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = client_request ( %R4 ) */ \ + "or 1,1,1\n\t" \ + "mr %0,3" /*result*/ \ + : "=b" (_zzq_result) \ + : "b" (_zzq_default), "b" (_zzq_ptr) \ + : "cc", "memory", "r3", "r4", "r0"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR */ \ + "or 2,2,2\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3", "r0" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir *%R11 */ \ + "or 3,3,3\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or 5,5,5\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_ppc32_linux */ + +/* ------------------------ ppc64-linux ------------------------ */ + +#if defined(PLAT_ppc64_linux) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + unsigned long long int r2; /* what tocptr do we need? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ + "rotldi 0,0,61 ; rotldi 0,0,51\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({ unsigned long long int _zzq_args[6]; \ + unsigned long long int _zzq_result; \ + unsigned long long int* _zzq_ptr; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + _zzq_ptr = _zzq_args; \ + __asm__ volatile("mr 3,%1\n\t" /*default*/ \ + "mr 4,%2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = client_request ( %R4 ) */ \ + "or 1,1,1\n\t" \ + "mr %0,3" /*result*/ \ + : "=b" (_zzq_result) \ + : "b" (_zzq_default), "b" (_zzq_ptr) \ + : "cc", "memory", "r3", "r4", "r0"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR */ \ + "or 2,2,2\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3", "r0" \ + ); \ + _zzq_orig->nraddr = __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR_GPR2 */ \ + "or 4,4,4\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3", "r0" \ + ); \ + _zzq_orig->r2 = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir *%R11 */ \ + "or 3,3,3\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or 5,5,5\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_ppc64_linux */ + +/* ------------------------- arm-linux ------------------------- */ + +#if defined(PLAT_arm_linux) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \ + "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({volatile unsigned int _zzq_args[6]; \ + volatile unsigned int _zzq_result; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + __asm__ volatile("mov r3, %1\n\t" /*default*/ \ + "mov r4, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* R3 = client_request ( R4 ) */ \ + "orr r10, r10, r10\n\t" \ + "mov %0, r3" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "cc","memory", "r3", "r4"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* R3 = guest_NRADDR */ \ + "orr r11, r11, r11\n\t" \ + "mov %0, r3" \ + : "=r" (__addr) \ + : \ + : "cc", "memory", "r3" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir *%R4 */ \ + "orr r12, r12, r12\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "orr r9, r9, r9\n\t" \ + : : : "cc", "memory" \ + ); \ + } while (0) + +#endif /* PLAT_arm_linux */ + +/* ------------------------ s390x-linux ------------------------ */ + +#if defined(PLAT_s390x_linux) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + } + OrigFn; + +/* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific + * code. This detection is implemented in platform specific toIR.c + * (e.g. VEX/priv/guest_s390_decoder.c). + */ +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "lr 15,15\n\t" \ + "lr 1,1\n\t" \ + "lr 2,2\n\t" \ + "lr 3,3\n\t" + +#define __CLIENT_REQUEST_CODE "lr 2,2\n\t" +#define __GET_NR_CONTEXT_CODE "lr 3,3\n\t" +#define __CALL_NO_REDIR_CODE "lr 4,4\n\t" +#define __VEX_INJECT_IR_CODE "lr 5,5\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile(/* r2 = args */ \ + "lgr 2,%1\n\t" \ + /* r3 = default */ \ + "lgr 3,%2\n\t" \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + __CLIENT_REQUEST_CODE \ + /* results = r3 */ \ + "lgr %0, 3\n\t" \ + : "=d" (_zzq_result) \ + : "a" (&_zzq_args[0]), "0" (_zzq_default) \ + : "cc", "2", "3", "memory" \ + ); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + __GET_NR_CONTEXT_CODE \ + "lgr %0, 3\n\t" \ + : "=a" (__addr) \ + : \ + : "cc", "3", "memory" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_R1 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + __CALL_NO_REDIR_CODE + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + __VEX_INJECT_IR_CODE); \ + } while (0) + +#endif /* PLAT_s390x_linux */ + +/* ------------------------- mips32-linux ---------------- */ + +#if defined(PLAT_mips32_linux) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +/* .word 0x342 + * .word 0x742 + * .word 0xC2 + * .word 0x4C2*/ +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "srl $0, $0, 13\n\t" \ + "srl $0, $0, 29\n\t" \ + "srl $0, $0, 3\n\t" \ + "srl $0, $0, 19\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({ volatile unsigned int _zzq_args[6]; \ + volatile unsigned int _zzq_result; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + __asm__ volatile("move $11, %1\n\t" /*default*/ \ + "move $12, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* T3 = client_request ( T4 ) */ \ + "or $13, $13, $13\n\t" \ + "move %0, $11\n\t" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "$11", "$12"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %t9 = guest_NRADDR */ \ + "or $14, $14, $14\n\t" \ + "move %0, $11" /*result*/ \ + : "=r" (__addr) \ + : \ + : "$11" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_T9 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir *%t9 */ \ + "or $15, $15, $15\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or $11, $11, $11\n\t" \ + ); \ + } while (0) + + +#endif /* PLAT_mips32_linux */ + +/* ------------------------- mips64-linux ---------------- */ + +#if defined(PLAT_mips64_linux) + +typedef + struct { + unsigned long long nraddr; /* where's the code? */ + } + OrigFn; + +/* dsll $0,$0, 3 + * dsll $0,$0, 13 + * dsll $0,$0, 29 + * dsll $0,$0, 19*/ +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \ + "dsll $0,$0,29 ; dsll $0,$0,19\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({ volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile("move $11, %1\n\t" /*default*/ \ + "move $12, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* $11 = client_request ( $12 ) */ \ + "or $13, $13, $13\n\t" \ + "move %0, $11\n\t" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "$11", "$12"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* $11 = guest_NRADDR */ \ + "or $14, $14, $14\n\t" \ + "move %0, $11" /*result*/ \ + : "=r" (__addr) \ + : \ + : "$11"); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_T9 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir $25 */ \ + "or $15, $15, $15\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or $11, $11, $11\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_mips64_linux */ + +/* Insert assembly code for other platforms here... */ + +#endif /* NVALGRIND */ + + +/* ------------------------------------------------------------------ */ +/* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */ +/* ugly. It's the least-worst tradeoff I can think of. */ +/* ------------------------------------------------------------------ */ + +/* This section defines magic (a.k.a appalling-hack) macros for doing + guaranteed-no-redirection macros, so as to get from function + wrappers to the functions they are wrapping. The whole point is to + construct standard call sequences, but to do the call itself with a + special no-redirect call pseudo-instruction that the JIT + understands and handles specially. This section is long and + repetitious, and I can't see a way to make it shorter. + + The naming scheme is as follows: + + CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc} + + 'W' stands for "word" and 'v' for "void". Hence there are + different macros for calling arity 0, 1, 2, 3, 4, etc, functions, + and for each, the possibility of returning a word-typed result, or + no result. +*/ + +/* Use these to write the name of your wrapper. NOTE: duplicates + VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. NOTE also: inserts + the default behaviour equivalance class tag "0000" into the name. + See pub_tool_redir.h for details -- normally you don't need to + think about this, though. */ + +/* Use an extra level of macroisation so as to ensure the soname/fnname + args are fully macro-expanded before pasting them together. */ +#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd + +#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \ + VG_CONCAT4(_vgw00000ZU_,soname,_,fnname) + +#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \ + VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname) + +/* Use this macro from within a wrapper function to collect the + context (address and possibly other info) of the original function. + Once you have that you can then use it in one of the CALL_FN_ + macros. The type of the argument _lval is OrigFn. */ +#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval) + +/* Also provide end-user facilities for function replacement, rather + than wrapping. A replacement function differs from a wrapper in + that it has no way to get hold of the original function being + called, and hence no way to call onwards to it. In a replacement + function, VALGRIND_GET_ORIG_FN always returns zero. */ + +#define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname) \ + VG_CONCAT4(_vgr00000ZU_,soname,_,fnname) + +#define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname) \ + VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname) + +/* Derivatives of the main macros below, for calling functions + returning void. */ + +#define CALL_FN_v_v(fnptr) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_v(_junk,fnptr); } while (0) + +#define CALL_FN_v_W(fnptr, arg1) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_W(_junk,fnptr,arg1); } while (0) + +#define CALL_FN_v_WW(fnptr, arg1,arg2) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0) + +#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0) + +#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0) + +#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0) + +#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0) + +#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0) + +/* ------------------------- x86-{linux,darwin} ---------------- */ + +#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) + +/* These regs are trashed by the hidden call. No need to mention eax + as gcc can already see that, plus causes gcc to bomb. */ +#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "movl %%esp,%%edi\n\t" \ + "andl $0xfffffff0,%%esp\n\t" +#define VALGRIND_RESTORE_STACK \ + "movl %%edi,%%esp\n\t" + +/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $12, %%esp\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $8, %%esp\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $4, %%esp\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $12, %%esp\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $8, %%esp\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $4, %%esp\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $12, %%esp\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $8, %%esp\n\t" \ + "pushl 40(%%eax)\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $4, %%esp\n\t" \ + "pushl 44(%%eax)\n\t" \ + "pushl 40(%%eax)\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "pushl 48(%%eax)\n\t" \ + "pushl 44(%%eax)\n\t" \ + "pushl 40(%%eax)\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_x86_linux || PLAT_x86_darwin */ + +/* ------------------------ amd64-{linux,darwin} --------------- */ + +#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) + +/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \ + "rdi", "r8", "r9", "r10", "r11" + +/* This is all pretty complex. It's so as to make stack unwinding + work reliably. See bug 243270. The basic problem is the sub and + add of 128 of %rsp in all of the following macros. If gcc believes + the CFA is in %rsp, then unwinding may fail, because what's at the + CFA is not what gcc "expected" when it constructs the CFIs for the + places where the macros are instantiated. + + But we can't just add a CFI annotation to increase the CFA offset + by 128, to match the sub of 128 from %rsp, because we don't know + whether gcc has chosen %rsp as the CFA at that point, or whether it + has chosen some other register (eg, %rbp). In the latter case, + adding a CFI annotation to change the CFA offset is simply wrong. + + So the solution is to get hold of the CFA using + __builtin_dwarf_cfa(), put it in a known register, and add a + CFI annotation to say what the register is. We choose %rbp for + this (perhaps perversely), because: + + (1) %rbp is already subject to unwinding. If a new register was + chosen then the unwinder would have to unwind it in all stack + traces, which is expensive, and + + (2) %rbp is already subject to precise exception updates in the + JIT. If a new register was chosen, we'd have to have precise + exceptions for it too, which reduces performance of the + generated code. + + However .. one extra complication. We can't just whack the result + of __builtin_dwarf_cfa() into %rbp and then add %rbp to the + list of trashed registers at the end of the inline assembly + fragments; gcc won't allow %rbp to appear in that list. Hence + instead we need to stash %rbp in %r15 for the duration of the asm, + and say that %r15 is trashed instead. gcc seems happy to go with + that. + + Oh .. and this all needs to be conditionalised so that it is + unchanged from before this commit, when compiled with older gccs + that don't support __builtin_dwarf_cfa. Furthermore, since + this header file is freestanding, it has to be independent of + config.h, and so the following conditionalisation cannot depend on + configure time checks. + + Although it's not clear from + 'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)', + this expression excludes Darwin. + .cfi directives in Darwin assembly appear to be completely + different and I haven't investigated how they work. + + For even more entertainment value, note we have to use the + completely undocumented __builtin_dwarf_cfa(), which appears to + really compute the CFA, whereas __builtin_frame_address(0) claims + to but actually doesn't. See + https://bugs.kde.org/show_bug.cgi?id=243270#c47 +*/ +#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM) +# define __FRAME_POINTER \ + ,"r"(__builtin_dwarf_cfa()) +# define VALGRIND_CFI_PROLOGUE \ + "movq %%rbp, %%r15\n\t" \ + "movq %2, %%rbp\n\t" \ + ".cfi_remember_state\n\t" \ + ".cfi_def_cfa rbp, 0\n\t" +# define VALGRIND_CFI_EPILOGUE \ + "movq %%r15, %%rbp\n\t" \ + ".cfi_restore_state\n\t" +#else +# define __FRAME_POINTER +# define VALGRIND_CFI_PROLOGUE +# define VALGRIND_CFI_EPILOGUE +#endif + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "movq %%rsp,%%r14\n\t" \ + "andq $0xfffffffffffffff0,%%rsp\n\t" +#define VALGRIND_RESTORE_STACK \ + "movq %%r14,%%rsp\n\t" + +/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned + long) == 8. */ + +/* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_ + macros. In order not to trash the stack redzone, we need to drop + %rsp by 128 before the hidden call, and restore afterwards. The + nastyness is that it is only by luck that the stack still appears + to be unwindable during the hidden call - since then the behaviour + of any routine using this macro does not match what the CFI data + says. Sigh. + + Why is this important? Imagine that a wrapper has a stack + allocated local, and passes to the hidden call, a pointer to it. + Because gcc does not know about the hidden call, it may allocate + that local in the redzone. Unfortunately the hidden call may then + trash it before it comes to use it. So we must step clear of the + redzone, for the duration of the hidden call, to make it safe. + + Probably the same problem afflicts the other redzone-style ABIs too + (ppc64-linux); but for those, the stack is + self describing (none of this CFI nonsense) so at least messing + with the stack pointer doesn't give a danger of non-unwindable + stack. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $136,%%rsp\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $136,%%rsp\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "pushq 80(%%rax)\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $136,%%rsp\n\t" \ + "pushq 88(%%rax)\n\t" \ + "pushq 80(%%rax)\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "pushq 96(%%rax)\n\t" \ + "pushq 88(%%rax)\n\t" \ + "pushq 80(%%rax)\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ + +/* ------------------------ ppc32-linux ------------------------ */ + +#if defined(PLAT_ppc32_linux) + +/* This is useful for finding out about the on-stack stuff: + + extern int f9 ( int,int,int,int,int,int,int,int,int ); + extern int f10 ( int,int,int,int,int,int,int,int,int,int ); + extern int f11 ( int,int,int,int,int,int,int,int,int,int,int ); + extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int ); + + int g9 ( void ) { + return f9(11,22,33,44,55,66,77,88,99); + } + int g10 ( void ) { + return f10(11,22,33,44,55,66,77,88,99,110); + } + int g11 ( void ) { + return f11(11,22,33,44,55,66,77,88,99,110,121); + } + int g12 ( void ) { + return f12(11,22,33,44,55,66,77,88,99,110,121,132); + } +*/ + +/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS \ + "lr", "ctr", "xer", \ + "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ + "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ + "r11", "r12", "r13" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "mr 28,1\n\t" \ + "rlwinm 1,1,0,0,27\n\t" +#define VALGRIND_RESTORE_STACK \ + "mr 1,28\n\t" + +/* These CALL_FN_ macros assume that on ppc32-linux, + sizeof(unsigned long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-16\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-16\n\t" \ + /* arg10 */ \ + "lwz 3,40(11)\n\t" \ + "stw 3,12(1)\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-32\n\t" \ + /* arg11 */ \ + "lwz 3,44(11)\n\t" \ + "stw 3,16(1)\n\t" \ + /* arg10 */ \ + "lwz 3,40(11)\n\t" \ + "stw 3,12(1)\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + _argvec[12] = (unsigned long)arg12; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-32\n\t" \ + /* arg12 */ \ + "lwz 3,48(11)\n\t" \ + "stw 3,20(1)\n\t" \ + /* arg11 */ \ + "lwz 3,44(11)\n\t" \ + "stw 3,16(1)\n\t" \ + /* arg10 */ \ + "lwz 3,40(11)\n\t" \ + "stw 3,12(1)\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_ppc32_linux */ + +/* ------------------------ ppc64-linux ------------------------ */ + +#if defined(PLAT_ppc64_linux) + +/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS \ + "lr", "ctr", "xer", \ + "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ + "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ + "r11", "r12", "r13" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "mr 28,1\n\t" \ + "rldicr 1,1,0,59\n\t" +#define VALGRIND_RESTORE_STACK \ + "mr 1,28\n\t" + +/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned + long) == 8. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+0]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+1]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+2]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+3]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+4]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+5]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+6]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+7]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+8]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+9]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-128\n\t" /* expand stack frame */ \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+10]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-128\n\t" /* expand stack frame */ \ + /* arg10 */ \ + "ld 3,80(11)\n\t" \ + "std 3,120(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+11]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + _argvec[2+11] = (unsigned long)arg11; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-144\n\t" /* expand stack frame */ \ + /* arg11 */ \ + "ld 3,88(11)\n\t" \ + "std 3,128(1)\n\t" \ + /* arg10 */ \ + "ld 3,80(11)\n\t" \ + "std 3,120(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+12]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + _argvec[2+11] = (unsigned long)arg11; \ + _argvec[2+12] = (unsigned long)arg12; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-144\n\t" /* expand stack frame */ \ + /* arg12 */ \ + "ld 3,96(11)\n\t" \ + "std 3,136(1)\n\t" \ + /* arg11 */ \ + "ld 3,88(11)\n\t" \ + "std 3,128(1)\n\t" \ + /* arg10 */ \ + "ld 3,80(11)\n\t" \ + "std 3,120(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_ppc64_linux */ + +/* ------------------------- arm-linux ------------------------- */ + +#if defined(PLAT_arm_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +/* This is a bit tricky. We store the original stack pointer in r10 + as it is callee-saves. gcc doesn't allow the use of r11 for some + reason. Also, we can't directly "bic" the stack pointer in thumb + mode since r13 isn't an allowed register number in that context. + So use r4 as a temporary, since that is about to get trashed + anyway, just after each use of this macro. Side effect is we need + to be very careful about any future changes, since + VALGRIND_ALIGN_STACK simply assumes r4 is usable. */ +#define VALGRIND_ALIGN_STACK \ + "mov r10, sp\n\t" \ + "mov r4, sp\n\t" \ + "bic r4, r4, #7\n\t" \ + "mov sp, r4\n\t" +#define VALGRIND_RESTORE_STACK \ + "mov sp, r10\n\t" + +/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "push {r0} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "push {r0, r1} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "push {r0, r1, r2} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "push {r0, r1, r2, r3} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #40] \n\t" \ + "push {r0} \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #40] \n\t" \ + "ldr r1, [%1, #44] \n\t" \ + "push {r0, r1} \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #40] \n\t" \ + "ldr r1, [%1, #44] \n\t" \ + "ldr r2, [%1, #48] \n\t" \ + "push {r0, r1, r2} \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_arm_linux */ + +/* ------------------------- s390x-linux ------------------------- */ + +#if defined(PLAT_s390x_linux) + +/* Similar workaround as amd64 (see above), but we use r11 as frame + pointer and save the old r11 in r7. r11 might be used for + argvec, therefore we copy argvec in r1 since r1 is clobbered + after the call anyway. */ +#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM) +# define __FRAME_POINTER \ + ,"d"(__builtin_dwarf_cfa()) +# define VALGRIND_CFI_PROLOGUE \ + ".cfi_remember_state\n\t" \ + "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */ \ + "lgr 7,11\n\t" \ + "lgr 11,%2\n\t" \ + ".cfi_def_cfa r11, 0\n\t" +# define VALGRIND_CFI_EPILOGUE \ + "lgr 11, 7\n\t" \ + ".cfi_restore_state\n\t" +#else +# define __FRAME_POINTER +# define VALGRIND_CFI_PROLOGUE \ + "lgr 1,%1\n\t" +# define VALGRIND_CFI_EPILOGUE +#endif + +/* Nb: On s390 the stack pointer is properly aligned *at all times* + according to the s390 GCC maintainer. (The ABI specification is not + precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and + VALGRIND_RESTORE_STACK are not defined here. */ + +/* These regs are trashed by the hidden call. Note that we overwrite + r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the + function a proper return address. All others are ABI defined call + clobbers. */ +#define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \ + "f0","f1","f2","f3","f4","f5","f6","f7" + +/* Nb: Although r11 is modified in the asm snippets below (inside + VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for + two reasons: + (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not + modified + (2) GCC will complain that r11 cannot appear inside a clobber section, + when compiled with -O -fno-omit-frame-pointer + */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 1, 0(1)\n\t" /* target->r1 */ \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "d" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +/* The call abi has the arguments in r2-r6 and stack */ +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1, arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-168\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,168\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-176\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,176\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-184\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,184\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-192\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,192\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9, arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-200\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "mvc 192(8,15), 80(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,200\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9, arg10, arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-208\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "mvc 192(8,15), 80(1)\n\t" \ + "mvc 200(8,15), 88(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,208\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + _argvec[12] = (unsigned long)arg12; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-216\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "mvc 192(8,15), 80(1)\n\t" \ + "mvc 200(8,15), 88(1)\n\t" \ + "mvc 208(8,15), 96(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,216\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + + +#endif /* PLAT_s390x_linux */ + +/* ------------------------- mips32-linux ----------------------- */ + +#if defined(PLAT_mips32_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ +"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ +"$25", "$31" + +/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16\n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" /* arg1*/ \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 24\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 24 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 32\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "nop\n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 32 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 32\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 32 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 40\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 40 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 40\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 40 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 48\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 48 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 48\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 44(%1) \n\t" \ + "sw $4, 40($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 48 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 56\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 44(%1) \n\t" \ + "sw $4, 40($29) \n\t" \ + "lw $4, 48(%1) \n\t" \ + "sw $4, 44($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 56 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_mips32_linux */ + +/* ------------------------- mips64-linux ------------------------- */ + +#if defined(PLAT_mips64_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ +"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ +"$25", "$31" + +/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" /* arg1*/ \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + "dsubu $29, $29, 8\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 8\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + "dsubu $29, $29, 16\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 16\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + "dsubu $29, $29, 24\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 88(%1)\n\t" \ + "sd $4, 16($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 24\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + "dsubu $29, $29, 32\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 88(%1)\n\t" \ + "sd $4, 16($29)\n\t" \ + "ld $4, 96(%1)\n\t" \ + "sd $4, 24($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 32\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_mips64_linux */ + + +/* ------------------------------------------------------------------ */ +/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ +/* */ +/* ------------------------------------------------------------------ */ + +/* Some request codes. There are many more of these, but most are not + exposed to end-user view. These are the public ones, all of the + form 0x1000 + small_number. + + Core ones are in the range 0x00000000--0x0000ffff. The non-public + ones start at 0x2000. +*/ + +/* These macros are used by tools -- they must be public, but don't + embed them into other programs. */ +#define VG_USERREQ_TOOL_BASE(a,b) \ + ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) +#define VG_IS_TOOL_USERREQ(a, b, v) \ + (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) + +/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! + This enum comprises an ABI exported by Valgrind to programs + which use client requests. DO NOT CHANGE THE ORDER OF THESE + ENTRIES, NOR DELETE ANY -- add new ones at the end. */ +typedef + enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, + VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, + + /* These allow any function to be called from the simulated + CPU but run on the real CPU. Nb: the first arg passed to + the function is always the ThreadId of the running + thread! So CLIENT_CALL0 actually requires a 1 arg + function, etc. */ + VG_USERREQ__CLIENT_CALL0 = 0x1101, + VG_USERREQ__CLIENT_CALL1 = 0x1102, + VG_USERREQ__CLIENT_CALL2 = 0x1103, + VG_USERREQ__CLIENT_CALL3 = 0x1104, + + /* Can be useful in regression testing suites -- eg. can + send Valgrind's output to /dev/null and still count + errors. */ + VG_USERREQ__COUNT_ERRORS = 0x1201, + + /* Allows the client program and/or gdbserver to execute a monitor + command. */ + VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202, + + /* These are useful and can be interpreted by any tool that + tracks malloc() et al, by using vg_replace_malloc.c. */ + VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301, + VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b, + VG_USERREQ__FREELIKE_BLOCK = 0x1302, + /* Memory pool support. */ + VG_USERREQ__CREATE_MEMPOOL = 0x1303, + VG_USERREQ__DESTROY_MEMPOOL = 0x1304, + VG_USERREQ__MEMPOOL_ALLOC = 0x1305, + VG_USERREQ__MEMPOOL_FREE = 0x1306, + VG_USERREQ__MEMPOOL_TRIM = 0x1307, + VG_USERREQ__MOVE_MEMPOOL = 0x1308, + VG_USERREQ__MEMPOOL_CHANGE = 0x1309, + VG_USERREQ__MEMPOOL_EXISTS = 0x130a, + + /* Allow printfs to valgrind log. */ + /* The first two pass the va_list argument by value, which + assumes it is the same size as or smaller than a UWord, + which generally isn't the case. Hence are deprecated. + The second two pass the vargs by reference and so are + immune to this problem. */ + /* both :: char* fmt, va_list vargs (DEPRECATED) */ + VG_USERREQ__PRINTF = 0x1401, + VG_USERREQ__PRINTF_BACKTRACE = 0x1402, + /* both :: char* fmt, va_list* vargs */ + VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403, + VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404, + + /* Stack support. */ + VG_USERREQ__STACK_REGISTER = 0x1501, + VG_USERREQ__STACK_DEREGISTER = 0x1502, + VG_USERREQ__STACK_CHANGE = 0x1503, + + /* Wine support */ + VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601, + + /* Querying of debug info. */ + VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701, + + /* Disable/enable error reporting level. Takes a single + Word arg which is the delta to this thread's error + disablement indicator. Hence 1 disables or further + disables errors, and -1 moves back towards enablement. + Other values are not allowed. */ + VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801, + + /* Initialise IR injection */ + VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901 + } Vg_ClientRequest; + +#if !defined(__GNUC__) +# define __extension__ /* */ +#endif + + +/* Returns the number of Valgrinds this code is running under. That + is, 0 if running natively, 1 if running under Valgrind, 2 if + running under Valgrind which is running under another Valgrind, + etc. */ +#define RUNNING_ON_VALGRIND \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */, \ + VG_USERREQ__RUNNING_ON_VALGRIND, \ + 0, 0, 0, 0, 0) \ + + +/* Discard translation of code in the range [_qzz_addr .. _qzz_addr + + _qzz_len - 1]. Useful if you are debugging a JITter or some such, + since it provides a way to make sure valgrind will retranslate the + invalidated area. Returns no value. */ +#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \ + _qzz_addr, _qzz_len, 0, 0, 0) + + +/* These requests are for getting Valgrind itself to print something. + Possibly with a backtrace. This is a really ugly hack. The return value + is the number of characters printed, excluding the "**** " part at the + start and the backtrace (if present). */ + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER) +/* Modern GCC will optimize the static routine out if unused, + and unused attribute will shut down warnings about it. */ +static int VALGRIND_PRINTF(const char *format, ...) + __attribute__((format(__printf__, 1, 2), __unused__)); +#endif +static int +#if defined(_MSC_VER) +__inline +#endif +VALGRIND_PRINTF(const char *format, ...) +{ +#if defined(NVALGRIND) + return 0; +#else /* NVALGRIND */ +#if defined(_MSC_VER) || defined(__MINGW64__) + uintptr_t _qzz_res; +#else + unsigned long _qzz_res; +#endif + va_list vargs; + va_start(vargs, format); +#if defined(_MSC_VER) || defined(__MINGW64__) + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_VALIST_BY_REF, + (uintptr_t)format, + (uintptr_t)&vargs, + 0, 0, 0); +#else + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_VALIST_BY_REF, + (unsigned long)format, + (unsigned long)&vargs, + 0, 0, 0); +#endif + va_end(vargs); + return (int)_qzz_res; +#endif /* NVALGRIND */ +} + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER) +static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) + __attribute__((format(__printf__, 1, 2), __unused__)); +#endif +static int +#if defined(_MSC_VER) +__inline +#endif +VALGRIND_PRINTF_BACKTRACE(const char *format, ...) +{ +#if defined(NVALGRIND) + return 0; +#else /* NVALGRIND */ +#if defined(_MSC_VER) || defined(__MINGW64__) + uintptr_t _qzz_res; +#else + unsigned long _qzz_res; +#endif + va_list vargs; + va_start(vargs, format); +#if defined(_MSC_VER) || defined(__MINGW64__) + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, + (uintptr_t)format, + (uintptr_t)&vargs, + 0, 0, 0); +#else + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, + (unsigned long)format, + (unsigned long)&vargs, + 0, 0, 0); +#endif + va_end(vargs); + return (int)_qzz_res; +#endif /* NVALGRIND */ +} + + +/* These requests allow control to move from the simulated CPU to the + real CPU, calling an arbitary function. + + Note that the current ThreadId is inserted as the first argument. + So this call: + + VALGRIND_NON_SIMD_CALL2(f, arg1, arg2) + + requires f to have this signature: + + Word f(Word tid, Word arg1, Word arg2) + + where "Word" is a word-sized type. + + Note that these client requests are not entirely reliable. For example, + if you call a function with them that subsequently calls printf(), + there's a high chance Valgrind will crash. Generally, your prospects of + these working are made higher if the called function does not refer to + any global variables, and does not refer to any libc or other functions + (printf et al). Any kind of entanglement with libc or dynamic linking is + likely to have a bad outcome, for tricky reasons which we've grappled + with a lot in the past. +*/ +#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL0, \ + _qyy_fn, \ + 0, 0, 0, 0) + +#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL1, \ + _qyy_fn, \ + _qyy_arg1, 0, 0, 0) + +#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL2, \ + _qyy_fn, \ + _qyy_arg1, _qyy_arg2, 0, 0) + +#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL3, \ + _qyy_fn, \ + _qyy_arg1, _qyy_arg2, \ + _qyy_arg3, 0) + + +/* Counts the number of errors that have been recorded by a tool. Nb: + the tool must record the errors with VG_(maybe_record_error)() or + VG_(unique_error)() for them to be counted. */ +#define VALGRIND_COUNT_ERRORS \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + 0 /* default return */, \ + VG_USERREQ__COUNT_ERRORS, \ + 0, 0, 0, 0, 0) + +/* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing + when heap blocks are allocated in order to give accurate results. This + happens automatically for the standard allocator functions such as + malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete, + delete[], etc. + + But if your program uses a custom allocator, this doesn't automatically + happen, and Valgrind will not do as well. For example, if you allocate + superblocks with mmap() and then allocates chunks of the superblocks, all + Valgrind's observations will be at the mmap() level and it won't know that + the chunks should be considered separate entities. In Memcheck's case, + that means you probably won't get heap block overrun detection (because + there won't be redzones marked as unaddressable) and you definitely won't + get any leak detection. + + The following client requests allow a custom allocator to be annotated so + that it can be handled accurately by Valgrind. + + VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated + by a malloc()-like function. For Memcheck (an illustrative case), this + does two things: + + - It records that the block has been allocated. This means any addresses + within the block mentioned in error messages will be + identified as belonging to the block. It also means that if the block + isn't freed it will be detected by the leak checker. + + - It marks the block as being addressable and undefined (if 'is_zeroed' is + not set), or addressable and defined (if 'is_zeroed' is set). This + controls how accesses to the block by the program are handled. + + 'addr' is the start of the usable block (ie. after any + redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator + can apply redzones -- these are blocks of padding at the start and end of + each block. Adding redzones is recommended as it makes it much more likely + Valgrind will spot block overruns. `is_zeroed' indicates if the memory is + zeroed (or filled with another predictable value), as is the case for + calloc(). + + VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a + heap block -- that will be used by the client program -- is allocated. + It's best to put it at the outermost level of the allocator if possible; + for example, if you have a function my_alloc() which calls + internal_alloc(), and the client request is put inside internal_alloc(), + stack traces relating to the heap block will contain entries for both + my_alloc() and internal_alloc(), which is probably not what you want. + + For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out + custom blocks from within a heap block, B, that has been allocated with + malloc/calloc/new/etc, then block B will be *ignored* during leak-checking + -- the custom blocks will take precedence. + + VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK. For + Memcheck, it does two things: + + - It records that the block has been deallocated. This assumes that the + block was annotated as having been allocated via + VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued. + + - It marks the block as being unaddressable. + + VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a + heap block is deallocated. + + VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For + Memcheck, it does four things: + + - It records that the size of a block has been changed. This assumes that + the block was annotated as having been allocated via + VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued. + + - If the block shrunk, it marks the freed memory as being unaddressable. + + - If the block grew, it marks the new area as undefined and defines a red + zone past the end of the new block. + + - The V-bits of the overlap between the old and the new block are preserved. + + VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block + and before deallocation of the old block. + + In many cases, these three client requests will not be enough to get your + allocator working well with Memcheck. More specifically, if your allocator + writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call + will be necessary to mark the memory as addressable just before the zeroing + occurs, otherwise you'll get a lot of invalid write errors. For example, + you'll need to do this if your allocator recycles freed blocks, but it + zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK). + Alternatively, if your allocator reuses freed blocks for allocator-internal + data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary. + + Really, what's happening is a blurring of the lines between the client + program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the + memory should be considered unaddressable to the client program, but the + allocator knows more than the rest of the client program and so may be able + to safely access it. Extra client requests are necessary for Valgrind to + understand the distinction between the allocator and the rest of the + program. + + Ignored if addr == 0. +*/ +#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \ + addr, sizeB, rzB, is_zeroed, 0) + +/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details. + Ignored if addr == 0. +*/ +#define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \ + addr, oldSizeB, newSizeB, rzB, 0) + +/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details. + Ignored if addr == 0. +*/ +#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \ + addr, rzB, 0, 0, 0) + +/* Create a memory pool. */ +#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \ + pool, rzB, is_zeroed, 0, 0) + +/* Destroy a memory pool. */ +#define VALGRIND_DESTROY_MEMPOOL(pool) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \ + pool, 0, 0, 0, 0) + +/* Associate a piece of memory with a memory pool. */ +#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \ + pool, addr, size, 0, 0) + +/* Disassociate a piece of memory from a memory pool. */ +#define VALGRIND_MEMPOOL_FREE(pool, addr) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \ + pool, addr, 0, 0, 0) + +/* Disassociate any pieces outside a particular range. */ +#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \ + pool, addr, size, 0, 0) + +/* Resize and/or move a piece associated with a memory pool. */ +#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \ + poolA, poolB, 0, 0, 0) + +/* Resize and/or move a piece associated with a memory pool. */ +#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \ + pool, addrA, addrB, size, 0) + +/* Return 1 if a mempool exists, else 0. */ +#define VALGRIND_MEMPOOL_EXISTS(pool) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__MEMPOOL_EXISTS, \ + pool, 0, 0, 0, 0) + +/* Mark a piece of memory as being a stack. Returns a stack id. */ +#define VALGRIND_STACK_REGISTER(start, end) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__STACK_REGISTER, \ + start, end, 0, 0, 0) + +/* Unmark the piece of memory associated with a stack id as being a + stack. */ +#define VALGRIND_STACK_DEREGISTER(id) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \ + id, 0, 0, 0, 0) + +/* Change the start and end address of the stack id. */ +#define VALGRIND_STACK_CHANGE(id, start, end) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \ + id, start, end, 0, 0) + +/* Load PDB debug info for Wine PE image_map. */ +#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \ + fd, ptr, total_size, delta, 0) + +/* Map a code address to a source file name and line number. buf64 + must point to a 64-byte buffer in the caller's address space. The + result will be dumped in there and is guaranteed to be zero + terminated. If no info is found, the first byte is set to zero. */ +#define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__MAP_IP_TO_SRCLOC, \ + addr, buf64, 0, 0, 0) + +/* Disable error reporting for this thread. Behaves in a stack like + way, so you can safely call this multiple times provided that + VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times + to re-enable reporting. The first call of this macro disables + reporting. Subsequent calls have no effect except to increase the + number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable + reporting. Child threads do not inherit this setting from their + parents -- they are always created with reporting enabled. */ +#define VALGRIND_DISABLE_ERROR_REPORTING \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ + 1, 0, 0, 0, 0) + +/* Re-enable error reporting, as per comments on + VALGRIND_DISABLE_ERROR_REPORTING. */ +#define VALGRIND_ENABLE_ERROR_REPORTING \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ + -1, 0, 0, 0, 0) + +/* Execute a monitor command from the client program. + If a connection is opened with GDB, the output will be sent + according to the output mode set for vgdb. + If no connection is opened, output will go to the log output. + Returns 1 if command not recognised, 0 otherwise. */ +#define VALGRIND_MONITOR_COMMAND(command) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \ + command, 0, 0, 0, 0) + + +#undef PLAT_x86_darwin +#undef PLAT_amd64_darwin +#undef PLAT_x86_win32 +#undef PLAT_amd64_win64 +#undef PLAT_x86_linux +#undef PLAT_amd64_linux +#undef PLAT_ppc32_linux +#undef PLAT_ppc64_linux +#undef PLAT_arm_linux +#undef PLAT_s390x_linux +#undef PLAT_mips32_linux +#undef PLAT_mips64_linux + +#endif /* __VALGRIND_H */ diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..059bc06 --- /dev/null +++ b/config.h.in @@ -0,0 +1,152 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* always defined to indicate that i18n is enabled */ +#undef ENABLE_NLS + +/* Disable grabs */ +#undef GCR_DISABLE_GRABS + +/* The gettext domain name */ +#undef GETTEXT_PACKAGE + +/* Path to gpg executable. */ +#undef GPG_EXECUTABLE + +/* Disable glib assertions */ +#undef G_DISABLE_ASSERT + +/* Define to 1 if you have the `bind_textdomain_codeset' function. */ +#undef HAVE_BIND_TEXTDOMAIN_CODESET + +/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +#undef HAVE_CFLOCALECOPYCURRENT + +/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#undef HAVE_CFPREFERENCESCOPYAPPVALUE + +/* Define to 1 if you have the `dcgettext' function. */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if your file defines LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mlock' function. */ +#undef HAVE_MLOCK + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the `timegm' function. */ +#undef HAVE_TIMEGM + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Version of GCRYPT we expect */ +#undef LIBGCRYPT_VERSION + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Version number of package */ +#undef VERSION + +/* Print debug output */ +#undef WITH_DEBUG + +/* More strict checks */ +#undef WITH_STRICT + +/* Run under valgrind */ +#undef WITH_VALGRIND + +/* In debug mode */ +#undef _DEBUG + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE diff --git a/configure b/configure new file mode 100755 index 0000000..92c4508 --- /dev/null +++ b/configure @@ -0,0 +1,19530 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for gcr 3.28.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 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. +as_myself= +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 + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # 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. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +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 +test -x / || 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 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || 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 : + export CONFIG_SHELL + # 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. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +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: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&component=gcr +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: 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_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_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; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # 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 -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +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 + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# 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'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &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='gcr' +PACKAGE_TARNAME='gcr' +PACKAGE_VERSION='3.28.0' +PACKAGE_STRING='gcr 3.28.0' +PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&component=gcr' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +GCR_MICRO +GCR_MINOR +GCR_MAJOR +GCR_LT_RELEASE +GCR_CURRENT +GCK_MINOR +GCK_MAJOR +GCK_LT_RELEASE +WITH_COVERAGE_FALSE +WITH_COVERAGE_TRUE +GCOV +TEST_MODE +INTROSPECTION_FLAGS +DBUS_SERVICES_DIR +WITH_UPDATE_ICON_CACHE_FALSE +WITH_UPDATE_ICON_CACHE_TRUE +WITH_UPDATE_MIME_FALSE +WITH_UPDATE_MIME_TRUE +LIBGCRYPT_LIBS +LIBGCRYPT_CFLAGS +LIBGCRYPT_CONFIG +GNUPG +pkcs11standalonedir +P11_MODULE_PATH +P11_SYSTEM_CONFIG_MODULES +P11_KIT_LIBS +P11_KIT_CFLAGS +HAVE_VALAC_FALSE +HAVE_VALAC_TRUE +VALAC +ENABLE_VAPIGEN_FALSE +ENABLE_VAPIGEN_TRUE +VAPIGEN_MAKEFILE +VAPIGEN_VAPIDIR +VAPIGEN +GTK_LIBS +GTK_CFLAGS +WITH_GTK_FALSE +WITH_GTK_TRUE +XSLTPROC +HAVE_INTROSPECTION_FALSE +HAVE_INTROSPECTION_TRUE +INTROSPECTION_MAKEFILE +INTROSPECTION_LIBS +INTROSPECTION_CFLAGS +INTROSPECTION_TYPELIBDIR +INTROSPECTION_GIRDIR +INTROSPECTION_GENERATE +INTROSPECTION_COMPILER +INTROSPECTION_SCANNER +GTK_DOC_USE_REBASE_FALSE +GTK_DOC_USE_REBASE_TRUE +GTK_DOC_USE_LIBTOOL_FALSE +GTK_DOC_USE_LIBTOOL_TRUE +GTK_DOC_BUILD_PDF_FALSE +GTK_DOC_BUILD_PDF_TRUE +GTK_DOC_BUILD_HTML_FALSE +GTK_DOC_BUILD_HTML_TRUE +ENABLE_GTK_DOC_FALSE +ENABLE_GTK_DOC_TRUE +HAVE_GTK_DOC_FALSE +HAVE_GTK_DOC_TRUE +GTKDOC_DEPS_LIBS +GTKDOC_DEPS_CFLAGS +HTML_DIR +GTKDOC_MKPDF +GTKDOC_REBASE +GTKDOC_CHECK_PATH +GTKDOC_CHECK +GLIB_COMPILE_RESOURCES +GLIB_MKENUMS +GLIB_GENMARSHAL +GSETTINGS_RULES +GLIB_COMPILE_SCHEMAS +gsettingsschemadir +GSETTINGS_DISABLE_SCHEMAS_COMPILE +GLIB_LIBS +GLIB_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +MKINSTALLDIRS +POSUB +POFILES +PO_IN_DATADIR_FALSE +PO_IN_DATADIR_TRUE +INTLLIBS +INSTOBJEXT +GMOFILES +DATADIRNAME +CATOBJEXT +CATALOGS +MSGFMT_OPTS +INTL_MACOSX_LIBS +GETTEXT_PACKAGE +PKG_CONFIG +ALL_LINGUAS +INTLTOOL_PERL +GMSGFMT +MSGFMT +MSGMERGE +XGETTEXT +INTLTOOL_POLICY_RULE +INTLTOOL_SERVICE_RULE +INTLTOOL_THEME_RULE +INTLTOOL_SCHEMAS_RULE +INTLTOOL_CAVES_RULE +INTLTOOL_XML_NOMERGE_RULE +INTLTOOL_XML_RULE +INTLTOOL_KBD_RULE +INTLTOOL_XAM_RULE +INTLTOOL_UI_RULE +INTLTOOL_SOUNDLIST_RULE +INTLTOOL_SHEET_RULE +INTLTOOL_SERVER_RULE +INTLTOOL_PONG_RULE +INTLTOOL_OAF_RULE +INTLTOOL_PROP_RULE +INTLTOOL_KEYS_RULE +INTLTOOL_DIRECTORY_RULE +INTLTOOL_DESKTOP_RULE +intltool__v_merge_options_0 +intltool__v_merge_options_ +INTLTOOL_V_MERGE_OPTIONS +INTLTOOL__v_MERGE_0 +INTLTOOL__v_MERGE_ +INTLTOOL_V_MERGE +INTLTOOL_EXTRACT +INTLTOOL_MERGE +INTLTOOL_UPDATE +USE_NLS +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +LN_S +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +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 +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_static +enable_shared +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_nls +enable_schemas_compile +with_html_dir +enable_gtk_doc +enable_gtk_doc_html +enable_gtk_doc_pdf +enable_introspection +with_gtk +enable_vala +with_pkcs11_modules +with_libgcrypt_prefix +enable_update_mime +enable_update_icon_cache +with_dbus_services +enable_debug +enable_strict +enable_coverage +enable_valgrind +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +LT_SYS_LIBRARY_PATH +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +GLIB_CFLAGS +GLIB_LIBS +GTKDOC_DEPS_CFLAGS +GTKDOC_DEPS_LIBS +GTK_CFLAGS +GTK_LIBS +P11_KIT_CFLAGS +P11_KIT_LIBS' + + +# 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 + 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 gcr 3.28.0 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/gcr] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of gcr 3.28.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --disable-maintainer-mode + disable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-static[=PKGS] build static libraries [default=no] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-nls do not use Native Language Support + --disable-schemas-compile + Disable regeneration of gschemas.compiled on install + --enable-gtk-doc use gtk-doc to build documentation [[default=no]] + --enable-gtk-doc-html build documentation in html format [[default=yes]] + --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] + --enable-introspection=[no/auto/yes] + Enable introspection for this build + --enable-vala=[no/auto/yes] + build Vala bindings [default=auto] + --disable-update-mime don't run update-mime-database utility (useful for + packages) + --disable-update-icon-cache + don't run gtk-update-icon-cache utility (useful for + packages) + --enable-debug=no/default/yes + Turn on or off debugging + + --enable-strict Strict code compilation + + --enable-coverage Whether to enable coverage testing + --enable-valgrind=[yes/no] + Run gcr using valgrind + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-html-dir=PATH path to installed docs + + --without-gtk do not build code that uses GTK+, + + + --with-pkcs11-modules= + directory to install PKCS#11 modules + + --with-libgcrypt-prefix=PFX + prefix where LIBGCRYPT is installed (optional) + --with-dbus-services= + where D-BUS session services directory is + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + 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 + GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config + GLIB_LIBS linker flags for GLIB, overriding pkg-config + GTKDOC_DEPS_CFLAGS + C compiler flags for GTKDOC_DEPS, overriding pkg-config + GTKDOC_DEPS_LIBS + linker flags for GTKDOC_DEPS, overriding pkg-config + GTK_CFLAGS C compiler flags for GTK, overriding pkg-config + GTK_LIBS linker flags for GTK, overriding pkg-config + P11_KIT_CFLAGS + C compiler flags for P11_KIT, overriding pkg-config + P11_KIT_LIBS + linker flags for P11_KIT, overriding pkg-config + +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 . +_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 +gcr configure 3.28.0 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 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_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_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_c_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; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_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_c_preproc_warn_flag$ac_c_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; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_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_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; 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_c_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_c_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_c_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 http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&component=gcr ## +## ------------------------------------------------------------------------------------------ ##" + ) | 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 \${$3+:} false; 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; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_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; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_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_c_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 \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_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; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_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_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + 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; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + 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 \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* 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 $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext 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; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func +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 gcr $as_me 3.28.0, which was +generated by GNU Autoconf 2.69. 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 + + + + +GLIB_REQ=2.38.0 +GLIB_MIN=GLIB_VERSION_2_38 +GLIB_MAX=GLIB_VERSION_2_38 + +GCRYPT_VERSION=1.4.5 + +GTK_REQ=3.12 + + +# GCK package versioning +GCK_MAJOR=1 +GCK_MINOR=0 +GCK_MICRO=0 + +# GCK libtool versioning +GCK_CURRENT=0 +GCK_REVISION=0 +GCK_AGE=0 + +# GCR package versioning +GCR_MAJOR=3 +GCR_MINOR=28 +GCR_MICRO=0 + +# GCR libtool versioning +GCR_CURRENT=1 +GCR_REVISION=0 +GCR_AGE=0 + + + +ac_aux_dir= +for ac_dir in build "$srcdir"/build; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build \"$srcdir\"/build" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +am__api_version='1.15' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + 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 ${ac_cv_prog_STRIP+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_STRIP+:} false; 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 as_fn_executable_p "$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 + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +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 ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$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 +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='gcr' + VERSION='3.28.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar plaintar pax cpio none' + +# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 +$as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } + if test $am_uid -le $am_max_uid; 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; } + _am_tools=none + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 +$as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } + if test $am_gid -le $am_max_gid; 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; } + _am_tools=none + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 +$as_echo_n "checking how to create a ustar tar archive... " >&6; } + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_ustar-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + { echo "$as_me:$LINENO: $_am_tar --version" >&5 + ($_am_tar --version) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && break + done + am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x ustar -w "$$tardir"' + am__tar_='pax -L -x ustar -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H ustar -L' + am__tar_='find "$tardir" -print | cpio -o -H ustar -L' + am__untar='cpio -i -H ustar -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_ustar}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 + (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + rm -rf conftest.dir + if test -s conftest.tar; then + { echo "$as_me:$LINENO: $am__untar &5 + ($am__untar &5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 + (cat conftest.dir/file) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + if ${am_cv_prog_tar_ustar+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_prog_tar_ustar=$_am_tool +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 +$as_echo "$am_cv_prog_tar_ustar" >&6; } + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +ac_config_headers="$ac_config_headers config.h" + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# ----------------------------------------------------------------------------- +# Basic tools + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +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 +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $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_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $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 + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + 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 ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +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 ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$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_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# 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 +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 ${ac_cv_objext+:} false; 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 ${ac_cv_c_compiler_gnu+:} false; 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_c_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_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_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_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +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=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}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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 + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +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 +{ $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; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # 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 +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_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 +_ACEOF +if ac_fn_c_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_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # 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 +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_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 +_ACEOF +if ac_fn_c_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 \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +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 + + +{ $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 ${ac_cv_path_GREP+:} false; 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" + as_fn_executable_p "$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 ${ac_cv_path_EGREP+:} false; 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" + as_fn_executable_p "$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 ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_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 + +_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 + +_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 +#include +#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_c_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_c_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_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if ${ac_cv_search_strerror+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$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 strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' cposix; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_strerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_strerror+:} false; then : + break +fi +done +if ${ac_cv_search_strerror+:} false; then : + +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 +$as_echo "$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +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 +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $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_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $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 + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + 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 ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +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 ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$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_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# 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 + +{ $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 ${ac_cv_c_compiler_gnu+:} false; 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_c_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_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_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_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +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=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}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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 + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +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 +{ $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; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # 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 +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_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 +_ACEOF +if ac_fn_c_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_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # 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 +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_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 +_ACEOF +if ac_fn_c_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 \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +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 + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; 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, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=no +fi + + + + + + + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_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 +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_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 '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "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_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_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_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_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 fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "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_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_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_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + 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 ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$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 +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +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 ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$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_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + 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 + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $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 +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $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_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + 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 + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $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 +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + 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 + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + 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 ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$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 +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +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 ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$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_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + 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 + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +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 ${ac_cv_prog_STRIP+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_STRIP+:} false; 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 as_fn_executable_p "$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 + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $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 +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $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_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + 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 + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_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 +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + 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 + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + 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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $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 +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $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_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + 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 + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $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 +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $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_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + 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 + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $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 +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $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_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + 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 + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $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 +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $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_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + 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 + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $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 +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $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_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + 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 + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $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 +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $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_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + 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 + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +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 + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_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_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=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_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_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_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $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 dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_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_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=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_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $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; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +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 + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + +case "$am__api_version" in + 1.01234) + as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 + ;; + *) + ;; +esac + +INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.35.0 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` +INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +if test -n "0.35.0"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.35.0" >&5 +$as_echo_n "checking for intltool >= 0.35.0... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 +$as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } + test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || + as_fn_error $? "Your intltool is too old. You need intltool 0.35.0 or later." "$LINENO" 5 +fi + +# Extract the first word of "intltool-update", so it can be a program name with args. +set dummy intltool-update; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_UPDATE in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_UPDATE="$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 +INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE +if test -n "$INTLTOOL_UPDATE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 +$as_echo "$INTLTOOL_UPDATE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "intltool-merge", so it can be a program name with args. +set dummy intltool-merge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_MERGE in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_MERGE="$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 +INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE +if test -n "$INTLTOOL_MERGE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 +$as_echo "$INTLTOOL_MERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "intltool-extract", so it can be a program name with args. +set dummy intltool-extract; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_EXTRACT in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_EXTRACT="$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 +INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT +if test -n "$INTLTOOL_EXTRACT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 +$as_echo "$INTLTOOL_EXTRACT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then + as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 +fi + +if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 +fi + + +INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' +INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' +INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' + + + + +INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' +intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' +intltool__v_merge_options_0='-q' + + + + + INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' +INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' + INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' +INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' +if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' +else + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' +fi + INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Check the gettext tools to make sure they are GNU +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XGETTEXT in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XGETTEXT="$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 +XGETTEXT=$ac_cv_path_XGETTEXT +if test -n "$XGETTEXT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MSGMERGE in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MSGMERGE="$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 +MSGMERGE=$ac_cv_path_MSGMERGE +if test -n "$MSGMERGE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MSGFMT="$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 +MSGFMT=$ac_cv_path_MSGFMT +if test -n "$MSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GMSGFMT="$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_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then + as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 +fi +xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" +mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" +mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" +if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then + as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 +fi + +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_PERL="$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 +INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL +if test -n "$INTLTOOL_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 +$as_echo "$INTLTOOL_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$INTLTOOL_PERL"; then + as_fn_error $? "perl not found" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 +$as_echo_n "checking for perl >= 5.8.1... " >&6; } +$INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 +if test $? -ne 0; then + as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 +else + IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 +$as_echo "$IT_PERL_VERSION" >&6; } +fi +if test "x" != "xno-xml"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 +$as_echo_n "checking for XML::Parser... " >&6; } + if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + else + as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 + fi +fi + +# Substitute ALL_LINGUAS so we can use it in po/Makefile + + + + + +# 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 ${ac_cv_path_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 + + test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" + ;; +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 + + + +GETTEXT_PACKAGE=gcr + +cat >>confdefs.h <<_ACEOF +#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" +_ACEOF + + + + for ac_header in locale.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOCALE_H 1 +_ACEOF + +fi + +done + + if test $ac_cv_header_locale_h = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 +$as_echo_n "checking for LC_MESSAGES... " >&6; } +if ${am_cv_val_LC_MESSAGES+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return LC_MESSAGES + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_val_LC_MESSAGES=yes +else + am_cv_val_LC_MESSAGES=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 +$as_echo "$am_cv_val_LC_MESSAGES" >&6; } + if test $am_cv_val_LC_MESSAGES = yes; then + +$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h + + fi + fi + USE_NLS=yes + + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 +$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } +if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFPreferencesCopyAppValue(NULL, NULL) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFPreferencesCopyAppValue=yes +else + gt_cv_func_CFPreferencesCopyAppValue=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 +$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + +$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 +$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } +if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFLocaleCopyCurrent(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFLocaleCopyCurrent=yes +else + gt_cv_func_CFLocaleCopyCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 +$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + +$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h + + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + + + + ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" +if test "x$ac_cv_header_libintl_h" = xyes; then : + gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 +$as_echo_n "checking for ngettext in libc... " >&6; } +if ${gt_cv_func_ngettext_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ +return !ngettext ("","", 1) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_ngettext_libc=yes +else + gt_cv_func_ngettext_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 +$as_echo "$gt_cv_func_ngettext_libc" >&6; } + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 +$as_echo_n "checking for dgettext in libc... " >&6; } +if ${gt_cv_func_dgettext_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ +return !dgettext ("","") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_dgettext_libc=yes +else + gt_cv_func_dgettext_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 +$as_echo "$gt_cv_func_dgettext_libc" >&6; } + fi + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + for ac_func in bind_textdomain_codeset +do : + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 +_ACEOF + +fi +done + + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$gt_cv_func_ngettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 +$as_echo_n "checking for bindtextdomain in -lintl... " >&6; } +if ${ac_cv_lib_intl_bindtextdomain+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 bindtextdomain (); +int +main () +{ +return bindtextdomain (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_bindtextdomain=yes +else + ac_cv_lib_intl_bindtextdomain=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_intl_bindtextdomain" >&5 +$as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } +if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 +$as_echo_n "checking for ngettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_ngettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 ngettext (); +int +main () +{ +return ngettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_ngettext=yes +else + ac_cv_lib_intl_ngettext=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_intl_ngettext" >&5 +$as_echo "$ac_cv_lib_intl_ngettext" >&6; } +if test "x$ac_cv_lib_intl_ngettext" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 +$as_echo_n "checking for dgettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_dgettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 dgettext (); +int +main () +{ +return dgettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_dgettext=yes +else + ac_cv_lib_intl_dgettext=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_intl_dgettext" >&5 +$as_echo "$ac_cv_lib_intl_dgettext" >&6; } +if test "x$ac_cv_lib_intl_dgettext" = xyes; then : + gt_cv_func_dgettext_libintl=yes +fi + +fi + +fi + + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 +$as_echo_n "checking if -liconv is needed to use gettext... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 +$as_echo_n "checking for ngettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_ngettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl -liconv $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 ngettext (); +int +main () +{ +return ngettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_ngettext=yes +else + ac_cv_lib_intl_ngettext=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_intl_ngettext" >&5 +$as_echo "$ac_cv_lib_intl_ngettext" >&6; } +if test "x$ac_cv_lib_intl_ngettext" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 +$as_echo_n "checking for dcgettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_dcgettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl -liconv $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 dcgettext (); +int +main () +{ +return dcgettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_dcgettext=yes +else + ac_cv_lib_intl_dcgettext=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_intl_dcgettext" >&5 +$as_echo "$ac_cv_lib_intl_dcgettext" >&6; } +if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : + gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv +else + : +fi + +else + : +fi + + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext and ngettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + for ac_func in bind_textdomain_codeset +do : + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 +_ACEOF + +fi +done + + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes" \ + && test "$gt_cv_func_ngettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + for ac_func in dcgettext +do : + ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" +if test "x$ac_cv_func_dcgettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DCGETTEXT 1 +_ACEOF + +fi +done + + MSGFMT_OPTS= + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 +$as_echo_n "checking if msgfmt accepts -c... " >&6; } + cat >conftest.foo <<_ACEOF + +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: test 1.0\n" +"PO-Revision-Date: 2007-02-15 12:01+0100\n" +"Last-Translator: test \n" +"Language-Team: C \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +_ACEOF +if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 + ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + MSGFMT_OPTS=-c; { $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; } +echo "$as_me: failed input was:" >&5 +sed 's/^/| /' conftest.foo >&5 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GMSGFMT="$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_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CATOBJEXT=.gmo + DATADIRNAME=share +else + case $host in + *-*-solaris*) + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : + CATOBJEXT=.gmo + DATADIRNAME=share +else + CATOBJEXT=.mo + DATADIRNAME=lib +fi + + ;; + *-*-openbsd*) + CATOBJEXT=.mo + DATADIRNAME=share + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + +fi + + + + if test "$gt_cv_have_gettext" = "yes" ; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 +$as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + ac_config_commands="$ac_config_commands default-1" + + + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + + + + + + + + + + + + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 +$as_echo_n "checking for catalogs to be installed... " >&6; } + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 +$as_echo "$LINGUAS" >&6; } + fi + + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + + +# ----------------------------------------------------------------------------- +# GLib and GTK+ stuff + + + + + + + + +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 ${ac_cv_path_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 GLIB" >&5 +$as_echo_n "checking for GLIB... " >&6; } + +if test -n "$GLIB_CFLAGS"; then + pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GLIB_LIBS"; then + pkg_cv_GLIB_LIBS="$GLIB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +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 + GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0" 2>&1` + else + GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GLIB_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0) were not met: + +$GLIB_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables GLIB_CFLAGS +and GLIB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables GLIB_CFLAGS +and GLIB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS + GLIB_LIBS=$pkg_cv_GLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=$GLIB_MIN" +GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MAX_ALLOWED=$GLIB_MAX" + + + + + + # Check whether --enable-schemas-compile was given. +if test "${enable_schemas_compile+set}" = set; then : + enableval=$enable_schemas_compile; case ${enableval} in + yes) GSETTINGS_DISABLE_SCHEMAS_COMPILE="" ;; + no) GSETTINGS_DISABLE_SCHEMAS_COMPILE="1" ;; + *) as_fn_error $? "bad value ${enableval} for --enable-schemas-compile" "$LINENO" 5 ;; + esac +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 ${ac_cv_path_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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.16 + { $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 + gsettingsschemadir=${datadir}/glib-2.0/schemas + + if test x$cross_compiling != xyes; then + GLIB_COMPILE_SCHEMAS=`$PKG_CONFIG --variable glib_compile_schemas gio-2.0` + else + # Extract the first word of "glib-compile-schemas", so it can be a program name with args. +set dummy glib-compile-schemas; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GLIB_COMPILE_SCHEMAS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GLIB_COMPILE_SCHEMAS in + [\\/]* | ?:[\\/]*) + ac_cv_path_GLIB_COMPILE_SCHEMAS="$GLIB_COMPILE_SCHEMAS" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GLIB_COMPILE_SCHEMAS="$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 +GLIB_COMPILE_SCHEMAS=$ac_cv_path_GLIB_COMPILE_SCHEMAS +if test -n "$GLIB_COMPILE_SCHEMAS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_COMPILE_SCHEMAS" >&5 +$as_echo "$GLIB_COMPILE_SCHEMAS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi + + if test "x$GLIB_COMPILE_SCHEMAS" = "x"; then + as_fn_error $? "glib-compile-schemas not found." "$LINENO" 5 + else + : + fi + + GSETTINGS_RULES=' +.PHONY : uninstall-gsettings-schemas install-gsettings-schemas clean-gsettings-schemas + +mostlyclean-am: clean-gsettings-schemas + +gsettings__enum_file = $(addsuffix .enums.xml,$(gsettings_ENUM_NAMESPACE)) + +%.gschema.valid: %.gschema.xml $(gsettings__enum_file) + $(AM_V_GEN) $(GLIB_COMPILE_SCHEMAS) --strict --dry-run $(addprefix --schema-file=,$(gsettings__enum_file)) --schema-file=$< && mkdir -p $(@D) && touch $@ + +all-am: $(gsettings_SCHEMAS:.xml=.valid) +uninstall-am: uninstall-gsettings-schemas +install-data-am: install-gsettings-schemas + +.SECONDARY: $(gsettings_SCHEMAS) + +install-gsettings-schemas: $(gsettings_SCHEMAS) $(gsettings__enum_file) + @$(NORMAL_INSTALL) + if test -n "$^"; then \ + test -z "$(gsettingsschemadir)" || $(MKDIR_P) "$(DESTDIR)$(gsettingsschemadir)"; \ + $(INSTALL_DATA) $^ "$(DESTDIR)$(gsettingsschemadir)"; \ + test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); \ + fi + +uninstall-gsettings-schemas: + @$(NORMAL_UNINSTALL) + @list='\''$(gsettings_SCHEMAS) $(gsettings__enum_file)'\''; test -n "$(gsettingsschemadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e '\''s|^.*/||'\''`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '\''$(DESTDIR)$(gsettingsschemadir)'\'' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(gsettingsschemadir)" && rm -f $$files + test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir) + +clean-gsettings-schemas: + rm -f $(gsettings_SCHEMAS:.xml=.valid) $(gsettings__enum_file) + +ifdef gsettings_ENUM_NAMESPACE +$(gsettings__enum_file): $(gsettings_ENUM_FILES) + $(AM_V_GEN) glib-mkenums --comments '\'''\'' --fhead "" --vhead " <@type@ id='\''$(gsettings_ENUM_NAMESPACE).@EnumName@'\''>" --vprod " " --vtail " " --ftail "" $^ > $@.tmp && mv $@.tmp $@ +endif +' + + + + + + +# Extract the first word of "glib-genmarshal", so it can be a program name with args. +set dummy glib-genmarshal; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GLIB_GENMARSHAL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GLIB_GENMARSHAL in + [\\/]* | ?:[\\/]*) + ac_cv_path_GLIB_GENMARSHAL="$GLIB_GENMARSHAL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GLIB_GENMARSHAL="$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 +GLIB_GENMARSHAL=$ac_cv_path_GLIB_GENMARSHAL +if test -n "$GLIB_GENMARSHAL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL" >&5 +$as_echo "$GLIB_GENMARSHAL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "glib-mkenums", so it can be a program name with args. +set dummy glib-mkenums; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GLIB_MKENUMS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GLIB_MKENUMS in + [\\/]* | ?:[\\/]*) + ac_cv_path_GLIB_MKENUMS="$GLIB_MKENUMS" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GLIB_MKENUMS="$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 +GLIB_MKENUMS=$ac_cv_path_GLIB_MKENUMS +if test -n "$GLIB_MKENUMS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_MKENUMS" >&5 +$as_echo "$GLIB_MKENUMS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "glib-compile-resources", so it can be a program name with args. +set dummy glib-compile-resources; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GLIB_COMPILE_RESOURCES+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GLIB_COMPILE_RESOURCES in + [\\/]* | ?:[\\/]*) + ac_cv_path_GLIB_COMPILE_RESOURCES="$GLIB_COMPILE_RESOURCES" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GLIB_COMPILE_RESOURCES="$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 +GLIB_COMPILE_RESOURCES=$ac_cv_path_GLIB_COMPILE_RESOURCES +if test -n "$GLIB_COMPILE_RESOURCES"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_COMPILE_RESOURCES" >&5 +$as_echo "$GLIB_COMPILE_RESOURCES" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + + + gtk_doc_requires="gtk-doc >= 1.9" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk-doc" >&5 +$as_echo_n "checking for gtk-doc... " >&6; } + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gtk_doc_requires\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gtk_doc_requires") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + have_gtk_doc=yes +else + have_gtk_doc=no +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gtk_doc" >&5 +$as_echo "$have_gtk_doc" >&6; } + + if test "$have_gtk_doc" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found." >&5 +$as_echo "$as_me: WARNING: + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found." >&2;} + fi + + # Extract the first word of "gtkdoc-check", so it can be a program name with args. +set dummy gtkdoc-check; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_GTKDOC_CHECK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$GTKDOC_CHECK"; then + ac_cv_prog_GTKDOC_CHECK="$GTKDOC_CHECK" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GTKDOC_CHECK="gtkdoc-check.test" + $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 +GTKDOC_CHECK=$ac_cv_prog_GTKDOC_CHECK +if test -n "$GTKDOC_CHECK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 +$as_echo "$GTKDOC_CHECK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "gtkdoc-check", so it can be a program name with args. +set dummy gtkdoc-check; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_CHECK_PATH+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_CHECK_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_CHECK_PATH="$GTKDOC_CHECK_PATH" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_CHECK_PATH="$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 +GTKDOC_CHECK_PATH=$ac_cv_path_GTKDOC_CHECK_PATH +if test -n "$GTKDOC_CHECK_PATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK_PATH" >&5 +$as_echo "$GTKDOC_CHECK_PATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + for ac_prog in gtkdoc-rebase +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 ${ac_cv_path_GTKDOC_REBASE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_REBASE in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_REBASE="$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 +GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE +if test -n "$GTKDOC_REBASE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5 +$as_echo "$GTKDOC_REBASE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$GTKDOC_REBASE" && break +done +test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true" + + # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args. +set dummy gtkdoc-mkpdf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_MKPDF+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_MKPDF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_MKPDF="$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 +GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF +if test -n "$GTKDOC_MKPDF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5 +$as_echo "$GTKDOC_MKPDF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Check whether --with-html-dir was given. +if test "${with_html_dir+set}" = set; then : + withval=$with_html_dir; +else + with_html_dir='${datadir}/gtk-doc/html' +fi + + HTML_DIR="$with_html_dir" + + + # Check whether --enable-gtk-doc was given. +if test "${enable_gtk_doc+set}" = set; then : + enableval=$enable_gtk_doc; +else + enable_gtk_doc=no +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 +$as_echo_n "checking whether to build gtk-doc documentation... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 +$as_echo "$enable_gtk_doc" >&6; } + + if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then + as_fn_error $? " + You must have $gtk_doc_requires installed to build documentation for + $PACKAGE_NAME. Please install gtk-doc or disable building the + documentation by adding '--disable-gtk-doc' to '$0'." "$LINENO" 5 + fi + + if test "x$PACKAGE_NAME" != "xglib"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5 +$as_echo_n "checking for GTKDOC_DEPS... " >&6; } + +if test -n "$GTKDOC_DEPS_CFLAGS"; then + pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTKDOC_DEPS_LIBS"; then + pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +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 + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + else + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 + + : +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + : +else + GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS + GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + fi + + # Check whether --enable-gtk-doc-html was given. +if test "${enable_gtk_doc_html+set}" = set; then : + enableval=$enable_gtk_doc_html; +else + enable_gtk_doc_html=yes +fi + + # Check whether --enable-gtk-doc-pdf was given. +if test "${enable_gtk_doc_pdf+set}" = set; then : + enableval=$enable_gtk_doc_pdf; +else + enable_gtk_doc_pdf=no +fi + + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + + + if test x$have_gtk_doc = xyes; then + HAVE_GTK_DOC_TRUE= + HAVE_GTK_DOC_FALSE='#' +else + HAVE_GTK_DOC_TRUE='#' + HAVE_GTK_DOC_FALSE= +fi + + if test x$enable_gtk_doc = xyes; then + ENABLE_GTK_DOC_TRUE= + ENABLE_GTK_DOC_FALSE='#' +else + ENABLE_GTK_DOC_TRUE='#' + ENABLE_GTK_DOC_FALSE= +fi + + if test x$enable_gtk_doc_html = xyes; then + GTK_DOC_BUILD_HTML_TRUE= + GTK_DOC_BUILD_HTML_FALSE='#' +else + GTK_DOC_BUILD_HTML_TRUE='#' + GTK_DOC_BUILD_HTML_FALSE= +fi + + if test x$enable_gtk_doc_pdf = xyes; then + GTK_DOC_BUILD_PDF_TRUE= + GTK_DOC_BUILD_PDF_FALSE='#' +else + GTK_DOC_BUILD_PDF_TRUE='#' + GTK_DOC_BUILD_PDF_FALSE= +fi + + if test -n "$LIBTOOL"; then + GTK_DOC_USE_LIBTOOL_TRUE= + GTK_DOC_USE_LIBTOOL_FALSE='#' +else + GTK_DOC_USE_LIBTOOL_TRUE='#' + GTK_DOC_USE_LIBTOOL_FALSE= +fi + + if test -n "$GTKDOC_REBASE"; then + GTK_DOC_USE_REBASE_TRUE= + GTK_DOC_USE_REBASE_FALSE='#' +else + GTK_DOC_USE_REBASE_TRUE='#' + GTK_DOC_USE_REBASE_FALSE= +fi + + + + + + + # Check whether --enable-introspection was given. +if test "${enable_introspection+set}" = set; then : + enableval=$enable_introspection; +else + enable_introspection=auto +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5 +$as_echo_n "checking for gobject-introspection... " >&6; } + + case $enable_introspection in #( + no) : + found_introspection="no (disabled, use --enable-introspection to enable)" + ;; #( + yes) : + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + : +else + as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5 +fi + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.34\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.34") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + found_introspection=yes +else + as_fn_error $? "You need to have gobject-introspection >= 1.34 installed to build gcr" "$LINENO" 5 +fi + ;; #( + auto) : + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.34\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.34") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + found_introspection=yes +else + found_introspection=no +fi + enable_introspection=$found_introspection + ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5 +$as_echo "$found_introspection" >&6; } + + INTROSPECTION_SCANNER= + INTROSPECTION_COMPILER= + INTROSPECTION_GENERATE= + INTROSPECTION_GIRDIR= + INTROSPECTION_TYPELIBDIR= + if test "x$found_introspection" = "xyes"; then + INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` + INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` + INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` + INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` + INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" + INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` + INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` + INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection + fi + + + + + + + + + + if test "x$found_introspection" = "xyes"; then + HAVE_INTROSPECTION_TRUE= + HAVE_INTROSPECTION_FALSE='#' +else + HAVE_INTROSPECTION_TRUE='#' + HAVE_INTROSPECTION_FALSE= +fi + + + +if test "$enable_introspection" = "yes"; then + # Extract the first word of "xsltproc", so it can be a program name with args. +set dummy xsltproc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XSLTPROC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XSLTPROC in + [\\/]* | ?:[\\/]*) + ac_cv_path_XSLTPROC="$XSLTPROC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XSLTPROC="$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_XSLTPROC" && ac_cv_path_XSLTPROC="as_fn_error $? "Need xsltproc in order to build with gobject introspection" "$LINENO" 5 + " + ;; +esac +fi +XSLTPROC=$ac_cv_path_XSLTPROC +if test -n "$XSLTPROC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 +$as_echo "$XSLTPROC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi + +# -------------------------------------------------------------------- +# Optional GTK+ widgets build, avoid building gtk-doc wihtout GTK+ +# + +# Check whether --with-gtk was given. +if test "${with_gtk+set}" = set; then : + withval=$with_gtk; +else + with_gtk=yes +fi + + if test "$with_gtk" != "no"; then + WITH_GTK_TRUE= + WITH_GTK_FALSE='#' +else + WITH_GTK_TRUE='#' + WITH_GTK_FALSE= +fi + + +if test "x$with_gtk" != "xno"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 +$as_echo_n "checking for GTK... " >&6; } + +if test -n "$GTK_CFLAGS"; then + pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_REQ gtk+-x11-3.0 >= \$GTK_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTK_LIBS"; then + pkg_cv_GTK_LIBS="$GTK_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_REQ gtk+-x11-3.0 >= \$GTK_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +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 + GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ" 2>&1` + else + GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTK_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ) were not met: + +$GTK_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables GTK_CFLAGS +and GTK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables GTK_CFLAGS +and GTK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + GTK_CFLAGS=$pkg_cv_GTK_CFLAGS + GTK_LIBS=$pkg_cv_GTK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + + +fi + +if test "x$enable_gtk_doc" = "xyes"; then + if test "x$with_gtk" = "xno"; then + as_fn_error $? "Cannot build documentation if building GTK+ widgets is disabled" "$LINENO" 5 + fi +fi + +# -------------------------------------------------------------------- +# Vala + +VALA_REQUIRED=0.18.0.22 + + + if test "x" != "xyes"; then : + + + +fi + + # Check whether --enable-vala was given. +if test "${enable_vala+set}" = set; then : + enableval=$enable_vala; +else + + if test "x" = "x"; then : + + enable_vala=auto + +else + + enable_vala= + +fi + +fi + + + case $enable_vala in #( + no) : + enable_vala=no ;; #( + yes) : + + if test "x" != "xyes" -a "x$found_introspection" != "xyes"; then : + + as_fn_error $? "Vala bindings require GObject Introspection" "$LINENO" 5 + +fi + ;; #( + auto) : + + if test "x" != "xyes" -a "x$found_introspection" != "xyes"; then : + + enable_vala=no + +fi + ;; #( + *) : + + as_fn_error $? "Invalid argument passed to --enable-vala, should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + + if test "x" = "x"; then : + + vapigen_pkg_name=vapigen + +else + + vapigen_pkg_name=vapigen- + +fi + if test "x$VALA_REQUIRED" = "x"; then : + + vapigen_pkg="$vapigen_pkg_name" + +else + + vapigen_pkg="$vapigen_pkg_name >= $VALA_REQUIRED" + +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 ${ac_cv_path_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 + + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$vapigen_pkg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$vapigen_pkg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + + if test "$enable_vala" = "auto"; then : + + enable_vala=yes + +fi + +else + + case $enable_vala in #( + yes) : + + as_fn_error $? "$vapigen_pkg not found" "$LINENO" 5 + ;; #( + auto) : + + enable_vala=no + ;; #( + *) : + ;; +esac + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vapigen" >&5 +$as_echo_n "checking for vapigen... " >&6; } + + case $enable_vala in #( + yes) : + + VAPIGEN=`$PKG_CONFIG --variable=vapigen $vapigen_pkg_name` + VAPIGEN_MAKEFILE=`$PKG_CONFIG --variable=datadir $vapigen_pkg_name`/vala/Makefile.vapigen + if test "x" = "x"; then : + + VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir $vapigen_pkg_name` + +else + + VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir_versioned $vapigen_pkg_name` + +fi + ;; #( + *) : + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_vala" >&5 +$as_echo "$enable_vala" >&6; } + + + + + + if test "x$enable_vala" = "xyes"; then + ENABLE_VAPIGEN_TRUE= + ENABLE_VAPIGEN_FALSE='#' +else + ENABLE_VAPIGEN_TRUE='#' + ENABLE_VAPIGEN_FALSE= +fi + + + +if test "$enable_vala" != "no"; then + # Extract the first word of "valac", so it can be a program name with args. +set dummy valac; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_VALAC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $VALAC in + [\\/]* | ?:[\\/]*) + ac_cv_path_VALAC="$VALAC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_VALAC="$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 +VALAC=$ac_cv_path_VALAC +if test -n "$VALAC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALAC" >&5 +$as_echo "$VALAC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi + if test "x$VALAC" != "x"; then + HAVE_VALAC_TRUE= + HAVE_VALAC_FALSE='#' +else + HAVE_VALAC_TRUE='#' + HAVE_VALAC_FALSE= +fi + + +# -------------------------------------------------------------------- +# Checks for functions +# + +for ac_func in timegm +do : + ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" +if test "x$ac_cv_func_timegm" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TIMEGM 1 +_ACEOF + +$as_echo "#define HAVE_TIMEGM 1" >>confdefs.h + +fi +done + +for ac_func in mlock +do : + ac_fn_c_check_func "$LINENO" "mlock" "ac_cv_func_mlock" +if test "x$ac_cv_func_mlock" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MLOCK 1 +_ACEOF + +fi +done + + +# -------------------------------------------------------------------- +# p11-kit + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for P11_KIT" >&5 +$as_echo_n "checking for P11_KIT... " >&6; } + +if test -n "$P11_KIT_CFLAGS"; then + pkg_cv_P11_KIT_CFLAGS="$P11_KIT_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"p11-kit-1 >= 0.19.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "p11-kit-1 >= 0.19.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_P11_KIT_CFLAGS=`$PKG_CONFIG --cflags "p11-kit-1 >= 0.19.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$P11_KIT_LIBS"; then + pkg_cv_P11_KIT_LIBS="$P11_KIT_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"p11-kit-1 >= 0.19.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "p11-kit-1 >= 0.19.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_P11_KIT_LIBS=`$PKG_CONFIG --libs "p11-kit-1 >= 0.19.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +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 + P11_KIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "p11-kit-1 >= 0.19.0" 2>&1` + else + P11_KIT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "p11-kit-1 >= 0.19.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$P11_KIT_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (p11-kit-1 >= 0.19.0) were not met: + +$P11_KIT_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables P11_KIT_CFLAGS +and P11_KIT_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables P11_KIT_CFLAGS +and P11_KIT_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + P11_KIT_CFLAGS=$pkg_cv_P11_KIT_CFLAGS + P11_KIT_LIBS=$pkg_cv_P11_KIT_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to put pkcs11 module configuration" >&5 +$as_echo_n "checking where to put pkcs11 module configuration... " >&6; } +P11_SYSTEM_CONFIG_MODULES=$($PKG_CONFIG p11-kit-1 --variable=p11_system_config_modules) +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $P11_SYSTEM_CONFIG_MODULES" >&5 +$as_echo "$P11_SYSTEM_CONFIG_MODULES" >&6; } + + +if test "$P11_SYSTEM_CONFIG_MODULES" = ""; then + as_fn_error $? "Could not find location for pkcs11 module config" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking module path to install pkcs11 modules" >&5 +$as_echo_n "checking module path to install pkcs11 modules... " >&6; } + +# Check whether --with-pkcs11-modules was given. +if test "${with_pkcs11_modules+set}" = set; then : + withval=$with_pkcs11_modules; +fi + +if test -z "$with_pkcs11_modules" ; then + P11_MODULE_PATH=$($PKG_CONFIG p11-kit-1 --variable=p11_module_path) +else + P11_MODULE_PATH="$with_pkcs11_modules" +fi +if test "$P11_MODULE_PATH" = ""; then + as_fn_error $? "Could not find directory to install pkcs11 modules" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $P11_MODULE_PATH" >&5 +$as_echo "$P11_MODULE_PATH" >&6; } + + +pkcs11standalonedir="${libdir}/gnome-keyring/devel" + + +# -------------------------------------------------------------------- +# GPG support + +for ac_prog in gpg gpg2 +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 ${ac_cv_path_GNUPG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GNUPG in + [\\/]* | ?:[\\/]*) + ac_cv_path_GNUPG="$GNUPG" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GNUPG="$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 +GNUPG=$ac_cv_path_GNUPG +if test -n "$GNUPG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUPG" >&5 +$as_echo "$GNUPG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$GNUPG" && break +done +test -n "$GNUPG" || GNUPG=""gpg"" + + +cat >>confdefs.h <<_ACEOF +#define GPG_EXECUTABLE "$GNUPG" +_ACEOF + + +# -------------------------------------------------------------------- +# libgcrypt +# + +GCRYPT_LIBVER=1 + + + +# Check whether --with-libgcrypt-prefix was given. +if test "${with_libgcrypt_prefix+set}" = set; then : + withval=$with_libgcrypt_prefix; libgcrypt_config_prefix="$withval" +else + libgcrypt_config_prefix="" +fi + + if test x"${LIBGCRYPT_CONFIG}" = x ; then + if test x"${libgcrypt_config_prefix}" != x ; then + LIBGCRYPT_CONFIG="${libgcrypt_config_prefix}/bin/libgcrypt-config" + else + case "${SYSROOT}" in + /*) + if test -x "${SYSROOT}/bin/libgcrypt-config" ; then + LIBGCRYPT_CONFIG="${SYSROOT}/bin/libgcrypt-config" + fi + ;; + '') + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring \$SYSROOT as it is not an absolute path." >&5 +$as_echo "$as_me: WARNING: Ignoring \$SYSROOT as it is not an absolute path." >&2;} + ;; + esac + fi + fi + + # Extract the first word of "libgcrypt-config", so it can be a program name with args. +set dummy libgcrypt-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 ${ac_cv_path_LIBGCRYPT_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LIBGCRYPT_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LIBGCRYPT_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 + + test -z "$ac_cv_path_LIBGCRYPT_CONFIG" && ac_cv_path_LIBGCRYPT_CONFIG="no" + ;; +esac +fi +LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG +if test -n "$LIBGCRYPT_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT_CONFIG" >&5 +$as_echo "$LIBGCRYPT_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + tmp=$GCRYPT_LIBVER:$GCRYPT_VERSION + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_libgcrypt_api=0 + min_libgcrypt_version="$tmp" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGCRYPT - version >= $min_libgcrypt_version" >&5 +$as_echo_n "checking for LIBGCRYPT - version >= $min_libgcrypt_version... " >&6; } + ok=no + if test "$LIBGCRYPT_CONFIG" != "no" ; then + req_major=`echo $min_libgcrypt_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'` + req_minor=`echo $min_libgcrypt_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'` + req_micro=`echo $min_libgcrypt_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` + libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version` + major=`echo $libgcrypt_config_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'` + minor=`echo $libgcrypt_config_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'` + micro=`echo $libgcrypt_config_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($libgcrypt_config_version)" >&5 +$as_echo "yes ($libgcrypt_config_version)" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test $ok = yes; then + # If we have a recent libgcrypt, we should also check that the + # API is compatible + if test "$req_libgcrypt_api" -gt 0 ; then + tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking LIBGCRYPT API version" >&5 +$as_echo_n "checking LIBGCRYPT API version... " >&6; } + if test "$req_libgcrypt_api" -eq "$tmp" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5 +$as_echo "okay" >&6; } + else + ok=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: does not match. want=$req_libgcrypt_api got=$tmp" >&5 +$as_echo "does not match. want=$req_libgcrypt_api got=$tmp" >&6; } + fi + fi + fi + fi + if test $ok = yes; then + LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` + LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` + : + libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none` + if test x"$libgcrypt_config_host" != xnone ; then + if test x"$libgcrypt_config_host" != x"$host" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +*** +*** The config script $LIBGCRYPT_CONFIG was +*** built for $libgcrypt_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-libgcrypt-prefix +*** to specify a matching config script or use \$SYSROOT. +***" >&5 +$as_echo "$as_me: WARNING: +*** +*** The config script $LIBGCRYPT_CONFIG was +*** built for $libgcrypt_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-libgcrypt-prefix +*** to specify a matching config script or use \$SYSROOT. +***" >&2;} + gpg_config_script_warn="$gpg_config_script_warn libgcrypt" + fi + fi + else + LIBGCRYPT_CFLAGS="" + LIBGCRYPT_LIBS="" + as_fn_error $? " +*** +*** libgcrypt was not found. You may want to get it from +*** ftp://ftp.gnupg.org/gcrypt/libgcrypt/ +*** +" "$LINENO" 5 + fi + + + +libgcrypt=yes + +cat >>confdefs.h <<_ACEOF +#define LIBGCRYPT_VERSION "$GCRYPT_VERSION" +_ACEOF + + + + + +# ---------------------------------------------------------------------- +# mime-database + +# Check whether --enable-update-mime was given. +if test "${enable_update_mime+set}" = set; then : + enableval=$enable_update_mime; +fi + + if test "$enable_update_mime" != "no"; then + WITH_UPDATE_MIME_TRUE= + WITH_UPDATE_MIME_FALSE='#' +else + WITH_UPDATE_MIME_TRUE='#' + WITH_UPDATE_MIME_FALSE= +fi + + +# Check whether --enable-update-icon-cache was given. +if test "${enable_update_icon_cache+set}" = set; then : + enableval=$enable_update_icon_cache; +fi + + if test "$enable_update_icon_cache" != "no"; then + WITH_UPDATE_ICON_CACHE_TRUE= + WITH_UPDATE_ICON_CACHE_FALSE='#' +else + WITH_UPDATE_ICON_CACHE_TRUE='#' + WITH_UPDATE_ICON_CACHE_FALSE= +fi + + +# ---------------------------------------------------------------------- +# DBus services + + +# Check whether --with-dbus-services was given. +if test "${with_dbus_services+set}" = set; then : + withval=$with_dbus_services; +fi + +if ! test -z "$with_dbus_services" ; then + DBUS_SERVICES_DIR="$with_dbus_services" +else + DBUS_SERVICES_DIR="$datadir/dbus-1/services" +fi + + + +# -------------------------------------------------------------------- +# Compilation and linking options +# + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for debug mode" >&5 +$as_echo_n "checking for debug mode... " >&6; } +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +fi + + +if test "$enable_debug" != "no"; then + +cat >>confdefs.h <<_ACEOF +#define WITH_DEBUG 1 +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define _DEBUG 1 +_ACEOF + + CFLAGS="$CFLAGS -g" +fi + +if test "$enable_debug" = "yes"; then + debug_status="yes (-g, -O0, debug output, testable)" + +cat >>confdefs.h <<_ACEOF +#define GCR_DISABLE_GRABS 1 +_ACEOF + + CFLAGS="$CFLAGS -O0" +elif test "$enable_debug" = "no"; then + debug_status="no (no debug output, not testable, G_DISABLE_ASSERT)" + +cat >>confdefs.h <<_ACEOF +#define G_DISABLE_ASSERT 1 +_ACEOF + +else + debug_status="default (-g, debug output, testable)" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $debug_status" >&5 +$as_echo "$debug_status" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for more warnings" >&5 +$as_echo_n "checking for more warnings... " >&6; } +if test "$GCC" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="\ + -Wall \ + -Wchar-subscripts -Wmissing-declarations -Wmissing-prototypes \ + -Wnested-externs -Wpointer-arith \ + -Wcast-align -Wsign-compare \ + $CFLAGS" + + # Disable -Werror for now, because of issues with + # strange gtk-doc programs not building cleanly. + # -Werror \ + + for option in -Wno-strict-aliasing -Wno-sign-compare; do + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $option" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc understands $option" >&5 +$as_echo_n "checking whether gcc understands $option... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + has_option=yes +else + has_option=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $has_option = no; then + CFLAGS="$SAVE_CFLAGS" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_option" >&5 +$as_echo "$has_option" >&6; } + unset has_option + unset SAVE_CFLAGS + done + unset option +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +# Check whether --enable-strict was given. +if test "${enable_strict+set}" = set; then : + enableval=$enable_strict; +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build strict" >&5 +$as_echo_n "checking build strict... " >&6; } + +if test "$enable_strict" = "yes"; then + CFLAGS="$CFLAGS -Werror \ + -DGTK_DISABLE_DEPRECATED \ + -DGDK_DISABLE_DEPRECATED \ + -DG_DISABLE_DEPRECATED \ + -DGDK_PIXBUF_DISABLE_DEPRECATED" + TEST_MODE="thorough" + # HACK: Only set strict introspection if gir is greater than 1.39 + # https://bugzilla.gnome.org/show_bug.cgi?id=698367 + case $(pkg-config --modversion gobject-introspection-1.0) in + 1.3[45678]*) + INTROSPECTION_FLAGS="" + ;; + *) + INTROSPECTION_FLAGS="--warn-error" + ;; + esac + +cat >>confdefs.h <<_ACEOF +#define WITH_STRICT 1 +_ACEOF + + strict_status="yes (-Werror, thorough tests, fatals, no deprecations)" +else + TEST_MODE="quick" + INTROSPECTION_FLAGS="" + strict_status="no (quick tests, non-fatal warnings)" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $strict_status" >&5 +$as_echo "$strict_status" >&6; } + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with gcov testing" >&5 +$as_echo_n "checking whether to build with gcov testing... " >&6; } +# Check whether --enable-coverage was given. +if test "${enable_coverage+set}" = set; then : + enableval=$enable_coverage; +else + enable_coverage=no +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_coverage" >&5 +$as_echo "$enable_coverage" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking code coverage" >&5 +$as_echo_n "checking code coverage... " >&6; } + +if test "$enable_coverage" = "yes"; then + if test "$GCC" != "yes"; then + as_fn_error $? "Coverage testing requires GCC" "$LINENO" 5 + fi + + # Extract the first word of "gcov", so it can be a program name with args. +set dummy gcov; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GCOV+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GCOV in + [\\/]* | ?:[\\/]*) + ac_cv_path_GCOV="$GCOV" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GCOV="$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_GCOV" && ac_cv_path_GCOV="no" + ;; +esac +fi +GCOV=$ac_cv_path_GCOV +if test -n "$GCOV"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5 +$as_echo "$GCOV" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$GCOV" = "no" ; then + as_fn_error $? "gcov tool is not available" "$LINENO" 5 + fi + + CFLAGS="$CFLAGS -O0 -g --coverage" + LDFLAGS="$LDFLAGS --coverage" +fi + + if test "$enable_coverage" = "yes"; then + WITH_COVERAGE_TRUE= + WITH_COVERAGE_FALSE='#' +else + WITH_COVERAGE_TRUE='#' + WITH_COVERAGE_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_coverage" >&5 +$as_echo "$enable_coverage" >&6; } + +# Check whether --enable-valgrind was given. +if test "${enable_valgrind+set}" = set; then : + enableval=$enable_valgrind; +else + enable_valgrind=yes +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking valgrind" >&5 +$as_echo_n "checking valgrind... " >&6; } +valgrind_status="yes" + +# Build valgrind support into code +if test "$enable_valgrind" = "yes"; then + CPPFLAGS_saved="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I${srcdir}/build" + ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h" "ac_cv_header_valgrind_valgrind_h" "$ac_includes_default" +if test "x$ac_cv_header_valgrind_valgrind_h" = xyes; then : + have_valgrind=yes +else + have_valgrind=no +fi + + + CPPFLAGS="$CPPFLAGS_saved" + if test "$have_valgrind" = "no"; then + as_fn_error $? "The valgrind headers are missing" "$LINENO" 5 + fi + +cat >>confdefs.h <<_ACEOF +#define WITH_VALGRIND 1 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +# No valgrind +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + valgrind_status="no" +fi + +# ---------------------------------------------------------------------- + +GCK_LT_RELEASE=$GCK_CURRENT:$GCK_REVISION:$GCK_AGE + + + + +GCR_LT_RELEASE=$GCR_CURRENT:$GCR_REVISION:$GCR_AGE + + + + + + +ac_config_files="$ac_config_files Makefile docs/reference/gck/Makefile docs/reference/gck/version.xml docs/reference/gcr/Makefile docs/reference/gcr/version.xml gck/gck.pc gck/gck-version.h gcr/gcr-base.pc gcr/gcr-version.h po/Makefile.in ui/gcr.pc ui/gcr-ui.pc ui/icons/16x16/Makefile ui/icons/22x22/Makefile ui/icons/24x24/Makefile ui/icons/32x32/Makefile ui/icons/48x48/Makefile ui/icons/256x256/Makefile" + +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 + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + 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 + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + + ac_config_commands="$ac_config_commands po/stamp-it" + + +if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then + as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_GTK_TRUE}" && test -z "${WITH_GTK_FALSE}"; then + as_fn_error $? "conditional \"WITH_GTK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_VAPIGEN_TRUE}" && test -z "${ENABLE_VAPIGEN_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_VAPIGEN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_VALAC_TRUE}" && test -z "${HAVE_VALAC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_VALAC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_UPDATE_MIME_TRUE}" && test -z "${WITH_UPDATE_MIME_FALSE}"; then + as_fn_error $? "conditional \"WITH_UPDATE_MIME\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_UPDATE_ICON_CACHE_TRUE}" && test -z "${WITH_UPDATE_ICON_CACHE_FALSE}"; then + as_fn_error $? "conditional \"WITH_UPDATE_ICON_CACHE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_COVERAGE_TRUE}" && test -z "${WITH_COVERAGE_FALSE}"; then + as_fn_error $? "conditional \"WITH_COVERAGE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${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. +as_myself= +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 -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +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 + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# 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 gcr $as_me 3.28.0, which was +generated by GNU Autoconf 2.69. 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_commands="$ac_config_commands" + +_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 commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +gcr config.status 3.28.0 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 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' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +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 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + +_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 + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "docs/reference/gck/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/gck/Makefile" ;; + "docs/reference/gck/version.xml") CONFIG_FILES="$CONFIG_FILES docs/reference/gck/version.xml" ;; + "docs/reference/gcr/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/gcr/Makefile" ;; + "docs/reference/gcr/version.xml") CONFIG_FILES="$CONFIG_FILES docs/reference/gcr/version.xml" ;; + "gck/gck.pc") CONFIG_FILES="$CONFIG_FILES gck/gck.pc" ;; + "gck/gck-version.h") CONFIG_FILES="$CONFIG_FILES gck/gck-version.h" ;; + "gcr/gcr-base.pc") CONFIG_FILES="$CONFIG_FILES gcr/gcr-base.pc" ;; + "gcr/gcr-version.h") CONFIG_FILES="$CONFIG_FILES gcr/gcr-version.h" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "ui/gcr.pc") CONFIG_FILES="$CONFIG_FILES ui/gcr.pc" ;; + "ui/gcr-ui.pc") CONFIG_FILES="$CONFIG_FILES ui/gcr-ui.pc" ;; + "ui/icons/16x16/Makefile") CONFIG_FILES="$CONFIG_FILES ui/icons/16x16/Makefile" ;; + "ui/icons/22x22/Makefile") CONFIG_FILES="$CONFIG_FILES ui/icons/22x22/Makefile" ;; + "ui/icons/24x24/Makefile") CONFIG_FILES="$CONFIG_FILES ui/icons/24x24/Makefile" ;; + "ui/icons/32x32/Makefile") CONFIG_FILES="$CONFIG_FILES ui/icons/32x32/Makefile" ;; + "ui/icons/48x48/Makefile") CONFIG_FILES="$CONFIG_FILES ui/icons/48x48/Makefile" ;; + "ui/icons/256x256/Makefile") CONFIG_FILES="$CONFIG_FILES ui/icons/256x256/Makefile" ;; + "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; + + *) 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_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +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= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_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 -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# 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` +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 {' >"$ac_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 >>"\$ac_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 +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_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 < "$ac_tmp/subs1.awk" > "$ac_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 >"$ac_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_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; 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 +' >$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 :C $CONFIG_COMMANDS" +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="$ac_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 >"$ac_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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_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 +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_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' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_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 "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_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 "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_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 "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac ;; + "po/stamp-it":C) + if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then + as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 + fi + rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" + >"po/stamp-it.tmp" + sed '/^#/d + s/^[[].*] *// + /^[ ]*$/d + '"s|^| $ac_top_srcdir/|" \ + "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" + + sed '/^POTFILES =/,/[^\\]$/ { + /^POTFILES =/!d + r po/POTFILES + } + ' "po/Makefile.in" >"po/Makefile" + rm -f "po/Makefile.tmp" + mv "po/stamp-it.tmp" "po/stamp-it" + ;; + + 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 + + +# ------------------------------------------------------------------------------ +# Summary +# + +echo +echo "BUILD" +echo " Debug Build: $debug_status" +echo " Strict Compilation: $strict_status" +echo " GTK+ Widgets: $with_gtk" +echo " Introspection: $found_introspection" +echo " Vala: $enable_vala" +echo " Valgrind: $valgrind_status" +echo " Test Coverage: ${enable_coverage:-no}" +echo diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..06dfc0c --- /dev/null +++ b/configure.ac @@ -0,0 +1,435 @@ + +m4_define([gcr_major], [3]) +m4_define([gcr_minor], [28]) +m4_define([gcr_micro], [0]) + +AC_PREREQ([2.63]) +AC_INIT([gcr], [gcr_major.gcr_minor.gcr_micro], + [http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&component=gcr], + [gcr]) + +dnl **************************************************************************** +dnl Dependency versions + +GLIB_REQ=2.38.0 +GLIB_MIN=GLIB_VERSION_2_38 +GLIB_MAX=GLIB_VERSION_2_38 + +GCRYPT_VERSION=1.4.5 + +GTK_REQ=3.12 + +dnl **************************************************************************** +dnl Library package and libtool versioning +dnl +dnl Updating the libtool versions, follow these instructions sequentially: +dnl 1. If the library source code has changed at all since the last update, then increment revision (‘c:r:a’ becomes ‘c:r+1:a’). +dnl 2. If any interfaces have been added, removed, or changed since the last update, increment current, and set revision to 0. +dnl 3. If any interfaces have been added since the last public release, then increment age. +dnl 4. If any interfaces have been removed or changed since the last public release, then set age to 0. + +# GCK package versioning +GCK_MAJOR=1 +GCK_MINOR=0 +GCK_MICRO=0 + +# GCK libtool versioning +GCK_CURRENT=0 +GCK_REVISION=0 +GCK_AGE=0 + +# GCR package versioning +GCR_MAJOR=gcr_major +GCR_MINOR=gcr_minor +GCR_MICRO=gcr_micro + +# GCR libtool versioning +GCR_CURRENT=1 +GCR_REVISION=0 +GCR_AGE=0 + +dnl **************************************************************************** + +AC_CONFIG_MACRO_DIR([build/m4]) +AC_CONFIG_AUX_DIR([build]) +AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar foreign -Wno-portability subdir-objects]) +AM_SANITY_CHECK +AC_CONFIG_HEADERS(config.h) +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) +AM_MAINTAINER_MODE([enable]) + +# ----------------------------------------------------------------------------- +# Basic tools + +AC_GNU_SOURCE +AC_ISC_POSIX +AC_PROG_CC +AC_PROG_CPP +AM_PROG_CC_C_O +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AM_DISABLE_STATIC +AM_PROG_LIBTOOL +IT_PROG_INTLTOOL([0.35.0]) +AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + +GETTEXT_PACKAGE=gcr +AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [The gettext domain name]) +AC_SUBST(GETTEXT_PACKAGE) +AM_GLIB_GNU_GETTEXT + +# ----------------------------------------------------------------------------- +# GLib and GTK+ stuff + +PKG_CHECK_MODULES(GLIB, + glib-2.0 >= $GLIB_REQ + gmodule-no-export-2.0 + gthread-2.0 + gobject-2.0 + gio-2.0 gio-unix-2.0) +GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=$GLIB_MIN" +GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MAX_ALLOWED=$GLIB_MAX" +AC_SUBST(GLIB_CFLAGS) +AC_SUBST(GLIB_LIBS) + +GLIB_GSETTINGS +AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal) +AC_PATH_PROG(GLIB_MKENUMS, glib-mkenums) +AC_PATH_PROG(GLIB_COMPILE_RESOURCES, glib-compile-resources) + +GTK_DOC_CHECK(1.9) + +GOBJECT_INTROSPECTION_CHECK([1.34]) +if test "$enable_introspection" = "yes"; then + AC_PATH_PROG(XSLTPROC, xsltproc, + AC_MSG_ERROR([Need xsltproc in order to build with gobject introspection]) + ) +fi + +# -------------------------------------------------------------------- +# Optional GTK+ widgets build, avoid building gtk-doc wihtout GTK+ +# +AC_ARG_WITH(gtk, [ + AC_HELP_STRING([--without-gtk], + [do not build code that uses GTK+]), + ], [], [with_gtk=yes]) +AM_CONDITIONAL(WITH_GTK, test "$with_gtk" != "no") + +if test "x$with_gtk" != "xno"; then + PKG_CHECK_MODULES(GTK, gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ) + AC_SUBST(GTK_CFLAGS) + AC_SUBST(GTK_LIBS) +fi + +if test "x$enable_gtk_doc" = "xyes"; then + if test "x$with_gtk" = "xno"; then + AC_MSG_ERROR([Cannot build documentation if building GTK+ widgets is disabled]) + fi +fi + +# -------------------------------------------------------------------- +# Vala + +VALA_REQUIRED=0.18.0.22 + +VAPIGEN_CHECK($VALA_REQUIRED) + +if test "$enable_vala" != "no"; then + AC_PATH_PROG([VALAC], [valac], []) +fi +AM_CONDITIONAL(HAVE_VALAC, test "x$VALAC" != "x") + +# -------------------------------------------------------------------- +# Checks for functions +# + +AC_CHECK_FUNCS(timegm, AC_DEFINE(HAVE_TIMEGM,1,[Have timegm])) +AC_CHECK_FUNCS(mlock) + +# -------------------------------------------------------------------- +# p11-kit + +PKG_CHECK_MODULES([P11_KIT], p11-kit-1 >= 0.19.0) +AC_SUBST(P11_KIT_CFLAGS) +AC_SUBST(P11_KIT_LIBS) + +AC_MSG_CHECKING([where to put pkcs11 module configuration]) +P11_SYSTEM_CONFIG_MODULES=$($PKG_CONFIG p11-kit-1 --variable=p11_system_config_modules) +AC_MSG_RESULT($P11_SYSTEM_CONFIG_MODULES) +AC_SUBST(P11_SYSTEM_CONFIG_MODULES) + +if test "$P11_SYSTEM_CONFIG_MODULES" = ""; then + AC_MSG_ERROR([Could not find location for pkcs11 module config]) +fi + +AC_MSG_CHECKING([module path to install pkcs11 modules]) +AC_ARG_WITH(pkcs11-modules, [ + AC_HELP_STRING([--with-pkcs11-modules=], + [directory to install PKCS#11 modules]) + ]) +if test -z "$with_pkcs11_modules" ; then + P11_MODULE_PATH=$($PKG_CONFIG p11-kit-1 --variable=p11_module_path) +else + P11_MODULE_PATH="$with_pkcs11_modules" +fi +if test "$P11_MODULE_PATH" = ""; then + AC_MSG_ERROR([Could not find directory to install pkcs11 modules]) +fi +AC_MSG_RESULT($P11_MODULE_PATH) +AC_SUBST(P11_MODULE_PATH) + +pkcs11standalonedir="${libdir}/gnome-keyring/devel" +AC_SUBST(pkcs11standalonedir) + +# -------------------------------------------------------------------- +# GPG support + +AC_PATH_PROGS([GNUPG], [gpg gpg2], ["gpg"]) +AC_DEFINE_UNQUOTED([GPG_EXECUTABLE], ["$GNUPG"], [Path to gpg executable.]) + +# -------------------------------------------------------------------- +# libgcrypt +# + +GCRYPT_LIBVER=1 + +AM_PATH_LIBGCRYPT($GCRYPT_LIBVER:$GCRYPT_VERSION,, + AC_MSG_ERROR([[ +*** +*** libgcrypt was not found. You may want to get it from +*** ftp://ftp.gnupg.org/gcrypt/libgcrypt/ +*** +]])) +libgcrypt=yes +AC_DEFINE_UNQUOTED(LIBGCRYPT_VERSION, "$GCRYPT_VERSION", [Version of GCRYPT we expect]) + +AC_SUBST([LIBGCRYPT_CFLAGS]) +AC_SUBST([LIBGCRYPT_LIBS]) + +# ---------------------------------------------------------------------- +# mime-database + +AC_ARG_ENABLE(update-mime, + AC_HELP_STRING([--disable-update-mime], + [don't run update-mime-database utility (useful for packages) ])) +AM_CONDITIONAL(WITH_UPDATE_MIME, test "$enable_update_mime" != "no") + +AC_ARG_ENABLE(update-icon-cache, + AC_HELP_STRING([--disable-update-icon-cache], + [don't run gtk-update-icon-cache utility (useful for packages) ])) +AM_CONDITIONAL(WITH_UPDATE_ICON_CACHE, test "$enable_update_icon_cache" != "no") + +# ---------------------------------------------------------------------- +# DBus services + +AC_ARG_WITH(dbus-services, + [AC_HELP_STRING([--with-dbus-services=], + [where D-BUS session services directory is])]) +if ! test -z "$with_dbus_services" ; then + DBUS_SERVICES_DIR="$with_dbus_services" +else + DBUS_SERVICES_DIR="$datadir/dbus-1/services" +fi + +AC_SUBST(DBUS_SERVICES_DIR) + +# -------------------------------------------------------------------- +# Compilation and linking options +# + +AC_MSG_CHECKING([for debug mode]) +AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug=no/default/yes], + [Turn on or off debugging])) + +if test "$enable_debug" != "no"; then + AC_DEFINE_UNQUOTED(WITH_DEBUG, 1, [Print debug output]) + AC_DEFINE_UNQUOTED(_DEBUG, 1, [In debug mode]) + CFLAGS="$CFLAGS -g" +fi + +if test "$enable_debug" = "yes"; then + debug_status="yes (-g, -O0, debug output, testable)" + AC_DEFINE_UNQUOTED(GCR_DISABLE_GRABS, 1, [Disable grabs]) + CFLAGS="$CFLAGS -O0" +elif test "$enable_debug" = "no"; then + debug_status="no (no debug output, not testable, G_DISABLE_ASSERT)" + AC_DEFINE_UNQUOTED(G_DISABLE_ASSERT, 1, [Disable glib assertions]) +else + debug_status="default (-g, debug output, testable)" +fi + +AC_MSG_RESULT($debug_status) + +AC_MSG_CHECKING(for more warnings) +if test "$GCC" = "yes"; then + AC_MSG_RESULT(yes) + CFLAGS="\ + -Wall \ + -Wchar-subscripts -Wmissing-declarations -Wmissing-prototypes \ + -Wnested-externs -Wpointer-arith \ + -Wcast-align -Wsign-compare \ + $CFLAGS" + + # Disable -Werror for now, because of issues with + # strange gtk-doc programs not building cleanly. + # -Werror \ + + for option in -Wno-strict-aliasing -Wno-sign-compare; do + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $option" + AC_MSG_CHECKING([whether gcc understands $option]) + AC_TRY_COMPILE([], [], + has_option=yes, + has_option=no,) + if test $has_option = no; then + CFLAGS="$SAVE_CFLAGS" + fi + AC_MSG_RESULT($has_option) + unset has_option + unset SAVE_CFLAGS + done + unset option +else + AC_MSG_RESULT(no) +fi + +AC_ARG_ENABLE(strict, [ + AS_HELP_STRING([--enable-strict], [Strict code compilation]) + ]) + +AC_MSG_CHECKING([build strict]) + +if test "$enable_strict" = "yes"; then + CFLAGS="$CFLAGS -Werror \ + -DGTK_DISABLE_DEPRECATED \ + -DGDK_DISABLE_DEPRECATED \ + -DG_DISABLE_DEPRECATED \ + -DGDK_PIXBUF_DISABLE_DEPRECATED" + TEST_MODE="thorough" + # HACK: Only set strict introspection if gir is greater than 1.39 + # https://bugzilla.gnome.org/show_bug.cgi?id=698367 + case $(pkg-config --modversion gobject-introspection-1.0) in + 1.3[[45678]]*) + INTROSPECTION_FLAGS="" + ;; + *) + INTROSPECTION_FLAGS="--warn-error" + ;; + esac + AC_DEFINE_UNQUOTED(WITH_STRICT, 1, [More strict checks]) + strict_status="yes (-Werror, thorough tests, fatals, no deprecations)" +else + TEST_MODE="quick" + INTROSPECTION_FLAGS="" + strict_status="no (quick tests, non-fatal warnings)" +fi + +AC_MSG_RESULT($strict_status) +AC_SUBST(INTROSPECTION_FLAGS) +AC_SUBST(TEST_MODE) + +AC_MSG_CHECKING([whether to build with gcov testing]) +AC_ARG_ENABLE([coverage], + [AS_HELP_STRING([--enable-coverage], [Whether to enable coverage testing ])], + [], + [enable_coverage=no]) + +AC_MSG_RESULT([$enable_coverage]) + +AC_MSG_CHECKING([code coverage]) + +if test "$enable_coverage" = "yes"; then + if test "$GCC" != "yes"; then + AC_MSG_ERROR(Coverage testing requires GCC) + fi + + AC_PATH_PROG(GCOV, gcov, no) + if test "$GCOV" = "no" ; then + AC_MSG_ERROR(gcov tool is not available) + fi + + CFLAGS="$CFLAGS -O0 -g --coverage" + LDFLAGS="$LDFLAGS --coverage" +fi + +AM_CONDITIONAL([WITH_COVERAGE], [test "$enable_coverage" = "yes"]) + +AC_MSG_RESULT($enable_coverage) + +AC_ARG_ENABLE(valgrind, + AC_HELP_STRING([--enable-valgrind[=@<:@yes/no@:>@]], + [Run gcr using valgrind]), ,enable_valgrind=yes) + +AC_MSG_CHECKING([valgrind]) +valgrind_status="yes" + +# Build valgrind support into code +if test "$enable_valgrind" = "yes"; then + CPPFLAGS_saved="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I${srcdir}/build" + AC_CHECK_HEADER([valgrind/valgrind.h], have_valgrind=yes, have_valgrind=no) + CPPFLAGS="$CPPFLAGS_saved" + if test "$have_valgrind" = "no"; then + AC_MSG_ERROR(The valgrind headers are missing) + fi + AC_DEFINE_UNQUOTED(WITH_VALGRIND, 1, [Run under valgrind]) + AC_MSG_RESULT(yes) + + +# No valgrind +else + AC_MSG_RESULT(no) + valgrind_status="no" +fi + +# ---------------------------------------------------------------------- + +GCK_LT_RELEASE=$GCK_CURRENT:$GCK_REVISION:$GCK_AGE +AC_SUBST(GCK_LT_RELEASE) +AC_SUBST(GCK_MAJOR) +AC_SUBST(GCK_MINOR) + +GCR_LT_RELEASE=$GCR_CURRENT:$GCR_REVISION:$GCR_AGE +AC_SUBST(GCR_CURRENT) +AC_SUBST(GCR_LT_RELEASE) +AC_SUBST(GCR_MAJOR) +AC_SUBST(GCR_MINOR) +AC_SUBST(GCR_MICRO) + +AC_OUTPUT([ +Makefile +docs/reference/gck/Makefile +docs/reference/gck/version.xml +docs/reference/gcr/Makefile +docs/reference/gcr/version.xml +gck/gck.pc +gck/gck-version.h +gcr/gcr-base.pc +gcr/gcr-version.h +po/Makefile.in +ui/gcr.pc +ui/gcr-ui.pc +ui/icons/16x16/Makefile +ui/icons/22x22/Makefile +ui/icons/24x24/Makefile +ui/icons/32x32/Makefile +ui/icons/48x48/Makefile +ui/icons/256x256/Makefile +]) + +# ------------------------------------------------------------------------------ +# Summary +# + +echo +echo "BUILD" +echo " Debug Build: $debug_status" +echo " Strict Compilation: $strict_status" +echo " GTK+ Widgets: $with_gtk" +echo " Introspection: $found_introspection" +echo " Vala: $enable_vala" +echo " Valgrind: $valgrind_status" +echo " Test Coverage: ${enable_coverage:-no}" +echo diff --git a/docs/reference/gck/Makefile.am b/docs/reference/gck/Makefile.am new file mode 100644 index 0000000..ec57541 --- /dev/null +++ b/docs/reference/gck/Makefile.am @@ -0,0 +1,105 @@ +## Process this file with automake to produce Makefile.in + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# The name of the module, e.g. 'glib'. +DOC_MODULE=gck + +# Uncomment for versioned docs and specify the version of the module, e.g. '2'. +#DOC_MODULE_VERSION=2 + + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR=$(top_srcdir)/gck $(top_builddir)/gck + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS=--deprecated-guards="GCK_DISABLE_DEPRECATED" + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS=--sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS= + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB=$(top_srcdir)/$(DOC_MODULE)/*.h +CFILE_GLOB=$(top_srcdir)/$(DOC_MODULE)/*.c + +# Extra header to include when scanning, which are not under DOC_SOURCE_DIR +# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h +EXTRA_HFILES= + +# Header files to ignore when scanning. Use base file name, no paths +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES= \ + gck-private.h \ + test-suite.h \ + gck-mock.h \ + gck-test.h \ + pkcs11-trust-assertions.h \ + pkcs11.h \ + pkcs11n.h \ + pkcs11x.h \ + pkcs11i.h + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files= \ + gck-pkcs11-links.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS= -I$(top_srcdir) -I$(top_builddir) $(GLIB_CFLAGS) -Wno-error \ + -Wno-deprecated-declarations +GTKDOC_LIBS= $(GLIB_LIBS) \ + $(top_builddir)/lib$(DOC_MODULE)-@GCK_MAJOR@.la + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST += + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +DISTCLEANFILES = tmpl/gck-unused.sgml + +# Comment this out if you want your docs-status tested during 'make check' +#TESTS_ENVIRONMENT = cd $(srcsrc) +#TESTS = $(GTKDOC_CHECK) diff --git a/docs/reference/gck/Makefile.in b/docs/reference/gck/Makefile.in new file mode 100644 index 0000000..f10b8b6 --- /dev/null +++ b/docs/reference/gck/Makefile.in @@ -0,0 +1,939 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +# -*- mode: makefile -*- +# +# gtk-doc.make - make rules for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2004-2007 Damon Chaplin +# 2007-2017 Stefan Sauer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = docs/reference/gck +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = version.xml +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/version.xml.in \ + $(top_srcdir)/gtk-doc.make +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# The name of the module, e.g. 'glib'. +DOC_MODULE = gck + +# Uncomment for versioned docs and specify the version of the module, e.g. '2'. +#DOC_MODULE_VERSION=2 + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR = $(top_srcdir)/gck $(top_builddir)/gck + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS = + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS = --deprecated-guards="GCK_DISABLE_DEPRECATED" + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS = --sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS = + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS = + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS = + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB = $(top_srcdir)/$(DOC_MODULE)/*.h +CFILE_GLOB = $(top_srcdir)/$(DOC_MODULE)/*.c + +# Extra header to include when scanning, which are not under DOC_SOURCE_DIR +# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h +EXTRA_HFILES = + +# Header files to ignore when scanning. Use base file name, no paths +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES = \ + gck-private.h \ + test-suite.h \ + gck-mock.h \ + gck-test.h \ + pkcs11-trust-assertions.h \ + pkcs11.h \ + pkcs11n.h \ + pkcs11x.h \ + pkcs11i.h + + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES = + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files = \ + gck-pkcs11-links.xml + + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files = + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS = -I$(top_srcdir) -I$(top_builddir) $(GLIB_CFLAGS) -Wno-error \ + -Wno-deprecated-declarations + +GTKDOC_LIBS = $(GLIB_LIBS) \ + $(top_builddir)/lib$(DOC_MODULE)-@GCK_MAJOR@.la + +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +SETUP_FILES = \ + $(content_files) \ + $(expand_content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + + +# This includes the standard gtk-doc make rules, copied by gtkdocize. + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) +DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test +@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = +@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp +@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = +@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp + +#### setup #### +GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_@AM_V@) +GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_@AM_DEFAULT_V@) +GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; + +#### scan #### +GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_@AM_V@) +GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_@AM_DEFAULT_V@) +GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; +GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_@AM_V@) +GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_@AM_DEFAULT_V@) +GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; + +#### xml #### +GTK_DOC_V_XML = $(GTK_DOC_V_XML_@AM_V@) +GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_@AM_DEFAULT_V@) +GTK_DOC_V_XML_0 = @echo " DOC Building XML"; + +#### html #### +GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_@AM_V@) +GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_@AM_DEFAULT_V@) +GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; +GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_@AM_V@) +GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_@AM_DEFAULT_V@) +GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; + +#### pdf #### +GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_@AM_V@) +GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_@AM_DEFAULT_V@) +GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +DISTCLEANFILES = tmpl/gck-unused.sgml +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/reference/gck/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/reference/gck/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/gtk-doc.make $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +@ENABLE_GTK_DOC_FALSE@all-local: +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool clean-local cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distclean-local \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-local + +.PRECIOUS: Makefile + + +gtkdoc-check.test: Makefile + $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ + echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ + chmod +x $@ + +all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +.PHONY: all-gtk-doc + +@ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + destdir=`dirname $(abs_builddir)/$$file`; \ + test -d "$$destdir" || mkdir -p "$$destdir"; \ + test -f $(abs_srcdir)/$$file && \ + cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + fi + $(AM_V_at)touch setup-build.stamp + +scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent + $(GTK_DOC_V_XML)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +$(DOC_MAIN_SGML_FILE): sgml-build.stamp + @true + +xml/gtkdocentities.ent: Makefile + $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + ) > $@ + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ + mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$$?" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + test -f $(abs_srcdir)/$$file && cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + test -f $(abs_builddir)/$$file && cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + done; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ + mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ + rm -f $(DOC_MODULE).types; \ + fi + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ + rm -f $(DOC_MODULE)-sections.txt; \ + fi + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ + fi + +maintainer-clean-local: + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +@HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs +@HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: +@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" +@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" +@HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" +@HAVE_GTK_DOC_FALSE@ @false + +dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local + @mkdir $(distdir)/html + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +# Comment this out if you want your docs-status tested during 'make check' +#TESTS_ENVIRONMENT = cd $(srcsrc) +#TESTS = $(GTKDOC_CHECK) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/docs/reference/gck/gck-docs.sgml b/docs/reference/gck/gck-docs.sgml new file mode 100644 index 0000000..7e8beec --- /dev/null +++ b/docs/reference/gck/gck-docs.sgml @@ -0,0 +1,37 @@ + + +]> + + + Gck Library Reference Manual + + For Gck &version;. + An online version of this documentation can be found at + http://developer.gnome.org/gck/stable/. + + + + + PKCS#11 GObject Bindings + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gck/gck-overrides.txt b/docs/reference/gck/gck-overrides.txt new file mode 100644 index 0000000..13f485f --- /dev/null +++ b/docs/reference/gck/gck-overrides.txt @@ -0,0 +1,2 @@ +# These are manually-edited to override or add declarations to those scanned +# from the header files. diff --git a/docs/reference/gck/gck-pkcs11-links.xml b/docs/reference/gck/gck-pkcs11-links.xml new file mode 100644 index 0000000..9341ccf --- /dev/null +++ b/docs/reference/gck/gck-pkcs11-links.xml @@ -0,0 +1,25 @@ + + + + About PKCS#11 + + + + + + + + + + + + PKCS#11 is an API for storing and using crypto objects, and performing + crypto operations on them. + + It is specified at the + RSA website + and a handy reference is also + available. + + diff --git a/docs/reference/gck/gck-sections.txt b/docs/reference/gck/gck-sections.txt new file mode 100644 index 0000000..93777f7 --- /dev/null +++ b/docs/reference/gck/gck-sections.txt @@ -0,0 +1,484 @@ +
+Library Utilities +gck-library +GCK_CHECK_VERSION +GCK_MAJOR_VERSION +GCK_MICRO_VERSION +GCK_MINOR_VERSION +
+ +
+gck-attribute +GckAttribute +gck_attribute_is_invalid +gck_attribute_get_boolean +gck_attribute_get_ulong +gck_attribute_get_string +gck_attribute_get_date +gck_attribute_get_data +gck_attribute_dump +gck_attribute_equal +gck_attribute_hash +gck_attribute_init +gck_attribute_init_boolean +gck_attribute_init_date +gck_attribute_init_string +gck_attribute_init_ulong +gck_attribute_init_empty +gck_attribute_init_invalid +gck_attribute_init_copy +gck_attribute_new +gck_attribute_new_boolean +gck_attribute_new_date +gck_attribute_new_string +gck_attribute_new_ulong +gck_attribute_new_empty +gck_attribute_new_invalid +gck_attribute_dup +gck_attribute_clear +gck_attribute_free + +GCK_TYPE_ATTRIBUTE +gck_attribute_get_type +
+ +
+gck-attributes +GckAttributes +gck_attributes_new_empty +gck_attributes_at +gck_attributes_find +gck_attributes_find_boolean +gck_attributes_find_ulong +gck_attributes_find_string +gck_attributes_find_date +gck_attributes_count +gck_attributes_ref +gck_attributes_ref_sink +gck_attributes_unref +gck_attributes_contains +gck_attributes_to_string +gck_attributes_dump +GckBuilder +GckBuilderFlags +GCK_BUILDER_INIT +gck_builder_init +gck_builder_init_full +gck_builder_new +gck_builder_add_boolean +gck_builder_set_boolean +gck_builder_add_data +gck_builder_set_data +gck_builder_take_data +gck_builder_add_date +gck_builder_set_date +gck_builder_add_string +gck_builder_set_string +gck_builder_add_ulong +gck_builder_set_ulong +gck_builder_add_empty +gck_builder_set_empty +gck_builder_add_invalid +gck_builder_set_invalid +gck_builder_add_attribute +gck_builder_add_all +gck_builder_set_all +gck_builder_add_except +gck_builder_add_exceptv +gck_builder_add_only +gck_builder_add_onlyv +gck_builder_end +gck_builder_clear +gck_builder_steal +gck_builder_ref +gck_builder_unref +gck_builder_copy +gck_builder_find +gck_builder_find_boolean +gck_builder_find_date +gck_builder_find_string +gck_builder_find_ulong +gck_attributes_new +gck_attributes_add +gck_attributes_add_all +gck_attributes_add_boolean +gck_attributes_add_data +gck_attributes_add_date +gck_attributes_add_empty +gck_attributes_add_invalid +gck_attributes_add_string +gck_attributes_add_ulong +gck_attributes_dup +gck_attributes_new_full +gck_attributes_set +gck_attributes_set_all +gck_attributes_set_boolean +gck_attributes_set_date +gck_attributes_set_string +gck_attributes_set_ulong + +GCK_TYPE_BUILDER +GCK_TYPE_BUILDER_FLAGS +GCK_TYPE_ATTRIBUTES +gck_attributes_get_type +gck_attributes_get_boxed_type +gck_builder_flags_get_type +gck_builder_get_type +GckAllocator +
+ +
+gck-module +GckModule +gck_module_initialize +gck_module_initialize_async +gck_module_initialize_finish +gck_module_new +gck_module_equal +gck_module_hash +gck_module_match +gck_module_get_path +gck_module_get_functions +gck_module_get_info +gck_module_get_slots +GckModuleInfo +gck_module_info_copy +gck_module_info_free + +GckModuleClass +gck_module_get_type +GCK_IS_MODULE +GCK_IS_MODULE_CLASS +GCK_MODULE +GCK_MODULE_CLASS +GCK_MODULE_GET_CLASS +GCK_TYPE_MODULE +GckModulePrivate +GCK_TYPE_MODULE_INFO +gck_module_info_get_type +
+ +
+gck-modules +gck_modules_initialize_registered +gck_modules_initialize_registered_async +gck_modules_initialize_registered_finish +gck_modules_enumerate_objects +gck_modules_enumerate_uri +gck_modules_get_slots +gck_modules_object_for_uri +gck_modules_objects_for_uri +gck_modules_token_for_uri +gck_modules_tokens_for_uri +
+ +
+gck-slot +GckMechanismInfo +gck_mechanism_info_copy +gck_mechanism_info_free +gck_mechanisms_length +gck_mechanisms_at +gck_mechanisms_check +GckSessionOptions +GckSlot +gck_slot_equal +gck_slot_hash +gck_slot_get_module +gck_slot_get_handle +gck_slot_get_info +gck_slot_match +gck_slot_get_token_info +gck_slot_get_mechanisms +gck_slot_get_mechanism_info +gck_slot_has_flags +gck_slot_enumerate_objects +gck_slots_enumerate_objects +gck_slot_open_session +gck_slot_open_session_full +gck_slot_open_session_full_async +gck_slot_open_session_async +gck_slot_open_session_finish +gck_slot_from_handle +GckSlotInfo +gck_slot_info_copy +gck_slot_info_free +GckTokenInfo +gck_token_info_copy +gck_token_info_free + +GckSlotClass +gck_slot_get_type +GCK_IS_SLOT +GCK_IS_SLOT_CLASS +GCK_SLOT +GCK_SLOT_CLASS +GCK_SLOT_GET_CLASS +GCK_TYPE_SLOT +GckSlotPrivate +GCK_TYPE_MECHANISM_INFO +GCK_TYPE_SLOT_INFO +GCK_TYPE_TOKEN_INFO +GckMechanisms +gck_mechanisms_free +gck_mechanism_info_get_type +gck_slot_info_get_type +gck_token_info_get_type +GCK_TYPE_SESSION_OPTIONS +gck_session_options_get_type +
+ +
+gck-session +GckSession +gck_session_from_handle +gck_session_open +gck_session_open_async +gck_session_open_finish +gck_session_get_module +gck_session_get_slot +gck_session_get_handle +gck_session_get_info +gck_session_get_interaction +gck_session_login +gck_session_login_async +gck_session_login_finish +gck_session_logout +gck_session_logout_async +gck_session_logout_finish +gck_session_create_object +gck_session_create_object_async +gck_session_create_object_finish +gck_session_enumerate_objects +gck_session_find_handles +gck_session_find_handles_async +gck_session_find_handles_finish +gck_session_find_objects +gck_session_find_objects_async +gck_session_find_objects_finish +gck_session_encrypt +gck_session_encrypt_full +gck_session_encrypt_async +gck_session_encrypt_finish +gck_session_decrypt +gck_session_decrypt_full +gck_session_decrypt_async +gck_session_decrypt_finish +gck_session_login_interactive +gck_session_login_interactive_async +gck_session_login_interactive_finish +gck_session_set_interaction +gck_session_sign +gck_session_sign_full +gck_session_sign_async +gck_session_sign_finish +gck_session_verify +gck_session_verify_full +gck_session_verify_async +gck_session_verify_finish +gck_session_derive_key +gck_session_derive_key_async +gck_session_derive_key_finish +gck_session_derive_key_full +gck_session_generate_key_pair +gck_session_generate_key_pair_async +gck_session_generate_key_pair_finish +gck_session_generate_key_pair_full +gck_session_get_options +gck_session_get_state +gck_session_init_pin +gck_session_init_pin_async +gck_session_init_pin_finish +gck_session_set_pin +gck_session_set_pin_async +gck_session_set_pin_finish +gck_session_unwrap_key +gck_session_unwrap_key_async +gck_session_unwrap_key_finish +gck_session_unwrap_key_full +gck_session_wrap_key +gck_session_wrap_key_async +gck_session_wrap_key_finish +gck_session_wrap_key_full +GckSessionInfo +gck_session_info_copy +gck_session_info_free +GckMechanism + +gck_session_get_type +GckSessionClass +GCK_IS_SESSION +GCK_IS_SESSION_CLASS +GCK_SESSION +GCK_SESSION_CLASS +GCK_SESSION_GET_CLASS +GCK_TYPE_SESSION +GckSessionPrivate +GCK_TYPE_SESSION_INFO +gck_session_info_get_type +
+ +
+gck-object +GckObject +GckObjectClass +gck_object_from_handle +gck_objects_from_handle_array +gck_object_equal +gck_object_hash +gck_object_get_module +gck_object_get_handle +gck_object_get_session +gck_object_destroy +gck_object_destroy_async +gck_object_destroy_finish +gck_object_set +gck_object_set_async +gck_object_set_finish +gck_object_get +gck_object_get_async +gck_object_get_finish +gck_object_get_data +gck_object_get_data_full +gck_object_get_data_async +gck_object_get_data_finish +gck_object_get_full +gck_object_get_template +gck_object_get_template_async +gck_object_get_template_finish +gck_object_set_template +gck_object_set_template_async +gck_object_set_template_finish + +gck_object_get_type +GCK_IS_OBJECT +GCK_IS_OBJECT_CLASS +GCK_OBJECT +GCK_OBJECT_CLASS +GCK_OBJECT_GET_CLASS +GCK_TYPE_OBJECT +GckObjectPrivate +
+ +
+gck-object-cache +GckObjectCache +GckObjectCacheIface +gck_object_cache_get_attributes +gck_object_cache_set_attributes +gck_object_cache_fill +gck_object_cache_lookup +gck_object_cache_lookup_async +gck_object_cache_lookup_finish +gck_object_cache_update +gck_object_cache_update_async +gck_object_cache_update_finish + +gck_object_cache_get_type +GCK_IS_OBJECT_CACHE +GCK_OBJECT_CACHE +GCK_OBJECT_CACHE_GET_INTERFACE +GCK_TYPE_OBJECT_CACHE +
+ +
+gck-error +GCK_VENDOR_CODE +GCK_ERROR +gck_message_from_rv +
+ +
+gck-uri +GckUriData +GckUriError +GckUriFlags +GCK_URI_FOR_MODULE_WITH_VERSION +GCK_URI_FOR_OBJECT_ON_TOKEN +GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE +gck_uri_data_new +gck_uri_parse +gck_uri_build +gck_uri_data_copy +gck_uri_data_free +GCK_URI_ERROR + +gck_uri_get_error_quark +GCK_URI_DATA_TYPE +gck_uri_data_get_type +gck_uri_error_get_quark +GCK_TYPE_URI_ERROR +GCK_TYPE_URI_FLAGS +gck_uri_error_get_type +gck_uri_flags_get_type +
+ +
+gck-enumerator +GckEnumerator +gck_enumerator_next +gck_enumerator_next_async +gck_enumerator_next_finish +gck_enumerator_next_n +gck_enumerator_get_interaction +gck_enumerator_set_interaction +gck_enumerator_get_object_type +gck_enumerator_set_object_type +gck_enumerator_set_object_type_full +gck_enumerator_get_chained +gck_enumerator_set_chained + +GckEnumeratorClass +gck_enumerator_get_type +GckEnumeratorPrivate +GCK_ENUMERATOR +GCK_ENUMERATOR_CLASS +GCK_ENUMERATOR_GET_CLASS +GCK_IS_ENUMERATOR +GCK_IS_ENUMERATOR_CLASS +GCK_TYPE_ENUMERATOR +
+ +
+gck-password +GckPassword +GckPasswordClass +gck_password_get_key +gck_password_get_module +gck_password_get_token + +gck_password_get_type +GckPasswordPrivate +GCK_IS_PASSWORD +GCK_IS_PASSWORD_CLASS +GCK_PASSWORD +GCK_PASSWORD_CLASS +GCK_PASSWORD_GET_CLASS +GCK_TYPE_PASSWORD +
+ +
+gck-misc +GckError +gck_list_ref_copy +gck_list_unref_free +gck_string_from_chars +gck_string_to_chars +gck_value_to_boolean +gck_value_to_ulong +GCK_INVALID + +gck_get_error_quark +gck_error_get_quark +GCK_TYPE_LIST +gck_list_get_boxed_type +GCK_TYPE_ERROR +gck_error_get_type +
+ +
+gck-private + +GCK_URI_BAD_PREFIX +CKR_GCK_MODULE_PROBLEM +
diff --git a/docs/reference/gck/gck.types b/docs/reference/gck/gck.types new file mode 100644 index 0000000..a1a8375 --- /dev/null +++ b/docs/reference/gck/gck.types @@ -0,0 +1,15 @@ +gck_attributes_get_type +gck_builder_get_type +gck_module_info_get_type +gck_module_get_type +gck_enumerator_get_type +gck_slot_info_get_type +gck_token_info_get_type +gck_mechanism_info_get_type +gck_slot_get_type +gck_session_info_get_type +gck_session_get_type +gck_object_get_type +gck_object_cache_get_type +gck_password_get_type +gck_uri_data_get_type diff --git a/docs/reference/gck/html/GckAttributes.html b/docs/reference/gck/html/GckAttributes.html new file mode 100644 index 0000000..4b4f062 --- /dev/null +++ b/docs/reference/gck/html/GckAttributes.html @@ -0,0 +1,3357 @@ + + + + +GckAttributes: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckAttributes

+

GckAttributes — A set of PKCS11 attributes.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckAttributes * + +gck_attributes_new_empty () +
const GckAttribute * + +gck_attributes_at () +
const GckAttribute * + +gck_attributes_find () +
+gboolean + +gck_attributes_find_boolean () +
+gboolean + +gck_attributes_find_ulong () +
+gboolean + +gck_attributes_find_string () +
+gboolean + +gck_attributes_find_date () +
+gulong + +gck_attributes_count () +
+GckAttributes * + +gck_attributes_ref () +
+GckAttributes * + +gck_attributes_ref_sink () +
+void + +gck_attributes_unref () +
+gboolean + +gck_attributes_contains () +
+gchar * + +gck_attributes_to_string () +
+void + +gck_attributes_dump () +
+void + +gck_builder_init () +
+void + +gck_builder_init_full () +
+GckBuilder * + +gck_builder_new () +
+void + +gck_builder_add_boolean () +
+void + +gck_builder_set_boolean () +
+void + +gck_builder_add_data () +
+void + +gck_builder_set_data () +
+void + +gck_builder_take_data () +
+void + +gck_builder_add_date () +
+void + +gck_builder_set_date () +
+void + +gck_builder_add_string () +
+void + +gck_builder_set_string () +
+void + +gck_builder_add_ulong () +
+void + +gck_builder_set_ulong () +
+void + +gck_builder_add_empty () +
+void + +gck_builder_set_empty () +
+void + +gck_builder_add_invalid () +
+void + +gck_builder_set_invalid () +
+void + +gck_builder_add_attribute () +
+void + +gck_builder_add_all () +
+void + +gck_builder_set_all () +
+void + +gck_builder_add_except () +
+void + +gck_builder_add_exceptv () +
+void + +gck_builder_add_only () +
+void + +gck_builder_add_onlyv () +
+GckAttributes * + +gck_builder_end () +
+void + +gck_builder_clear () +
+GckAttributes * + +gck_builder_steal () +
+GckBuilder * + +gck_builder_ref () +
+void + +gck_builder_unref () +
+GckBuilder * + +gck_builder_copy () +
const GckAttribute * + +gck_builder_find () +
+gboolean + +gck_builder_find_boolean () +
+gboolean + +gck_builder_find_date () +
+gboolean + +gck_builder_find_string () +
+gboolean + +gck_builder_find_ulong () +
+GckAttributes * + +gck_attributes_new () +
+GckAttribute * + +gck_attributes_add () +
+void + +gck_attributes_add_all () +
+GckAttribute * + +gck_attributes_add_boolean () +
+GckAttribute * + +gck_attributes_add_data () +
+GckAttribute * + +gck_attributes_add_date () +
+GckAttribute * + +gck_attributes_add_empty () +
+GckAttribute * + +gck_attributes_add_invalid () +
+GckAttribute * + +gck_attributes_add_string () +
+GckAttribute * + +gck_attributes_add_ulong () +
+GckAttributes * + +gck_attributes_dup () +
+GckAttributes * + +gck_attributes_new_full () +
+void + +gck_attributes_set () +
+void + +gck_attributes_set_all () +
+void + +gck_attributes_set_boolean () +
+void + +gck_attributes_set_date () +
+void + +gck_attributes_set_string () +
+void + +gck_attributes_set_ulong () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + +
 GckAttributes
structGckBuilder
enumGckBuilderFlags
#defineGCK_BUILDER_INIT
+
+
+

Object Hierarchy

+
    GBoxed
+    ├── GckAttributes
+    ╰── GckBuilder
+
+
+
+

Description

+

A set of GckAttribute structures. These attributes contain information +about a PKCS11 object. Use gck_object_get() or gck_object_set() to set and retrieve +attributes on an object.

+
+
+

Functions

+
+

gck_attributes_new_empty ()

+
GckAttributes *
+gck_attributes_new_empty (gulong first_type,
+                          ...);
+

Creates an GckAttributes array with empty attributes

+

Terminate the argument list with GCK_INVALID.

+

The returned set of attributes is floating, and should either be passed to +another gck library function which consumes this floating reference, or if +you wish to keep these attributes around you should ref them with +gck_attributes_ref_sink() and unref them later with gck_attributes_unref().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

first_type

the first empty attribute type

 

...

the other empty attribute types

 
+
+
+

Returns

+

a floating reference to an empty set of attributes.

+

[transfer none]

+
+
+
+
+

gck_attributes_at ()

+
const GckAttribute *
+gck_attributes_at (GckAttributes *attrs,
+                   guint index);
+

Get attribute at the specified index in the attribute array.

+

Use gck_attributes_count() to determine how many attributes are +in the array.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

The attributes array.

 

index

The attribute index to retrieve.

 
+
+
+

Returns

+

the specified attribute.

+

[transfer none]

+
+
+
+
+

gck_attributes_find ()

+
const GckAttribute *
+gck_attributes_find (GckAttributes *attrs,
+                     gulong attr_type);
+

Find an attribute with the specified type in the array.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

The attributes array to search.

 

attr_type

The type of attribute to find.

 
+
+
+

Returns

+

the first attribute found with the specified type, +or NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_find_boolean ()

+
gboolean
+gck_attributes_find_boolean (GckAttributes *attrs,
+                             gulong attr_type,
+                             gboolean *value);
+

Find an attribute with the specified type in the array.

+

The attribute (if found) must be of the right size to store +a boolean value (ie: CK_BBOOL). If the attribute is marked invalid +then it will be treated as not found.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

The attributes array to search.

 

attr_type

The type of attribute to find.

 

value

The resulting gboolean value.

[out]
+
+
+

Returns

+

Whether a value was found or not.

+
+
+
+
+

gck_attributes_find_ulong ()

+
gboolean
+gck_attributes_find_ulong (GckAttributes *attrs,
+                           gulong attr_type,
+                           gulong *value);
+

Find an attribute with the specified type in the array.

+

The attribute (if found) must be of the right size to store +a unsigned long value (ie: CK_ULONG). If the attribute is marked invalid +then it will be treated as not found.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

The attributes array to search.

 

attr_type

The type of attribute to find.

 

value

The resulting gulong value.

[out]
+
+
+

Returns

+

Whether a value was found or not.

+
+
+
+
+

gck_attributes_find_string ()

+
gboolean
+gck_attributes_find_string (GckAttributes *attrs,
+                            gulong attr_type,
+                            gchar **value);
+

Find an attribute with the specified type in the array.

+

If the attribute is marked invalid then it will be treated as not found. +The resulting string will be null-terminated, and must be freed by the caller +using g_free().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

The attributes array to search.

 

attr_type

The type of attribute to find.

 

value

The resulting string value.

[out]
+
+
+

Returns

+

Whether a value was found or not.

+
+
+
+
+

gck_attributes_find_date ()

+
gboolean
+gck_attributes_find_date (GckAttributes *attrs,
+                          gulong attr_type,
+                          GDate *value);
+

Find an attribute with the specified type in the array.

+

The attribute (if found) must be of the right size to store +a date value (ie: CK_DATE). If the attribute is marked invalid +then it will be treated as not found.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

The attributes array to search.

 

attr_type

The type of attribute to find.

 

value

The resulting GDate value.

[out]
+
+
+

Returns

+

Whether a value was found or not.

+
+
+
+
+

gck_attributes_count ()

+
gulong
+gck_attributes_count (GckAttributes *attrs);
+

Get the number of attributes in this attribute array.

+
+

Parameters

+
+++++ + + + + + +

attrs

The attributes array to count.

 
+
+
+

Returns

+

The number of contained attributes.

+
+
+
+
+

gck_attributes_ref ()

+
GckAttributes *
+gck_attributes_ref (GckAttributes *attrs);
+

Reference this attributes array.

+
+

Parameters

+
+++++ + + + + + +

attrs

An attribute array

 
+
+
+

Returns

+

the attributes

+
+
+
+
+

gck_attributes_ref_sink ()

+
GckAttributes *
+gck_attributes_ref_sink (GckAttributes *attrs);
+

GckAttributes uses a floating reference count system. gck_builder_end() +and gck_attributes_new_empty() both return floating references.

+

Calling gck_attributes_ref_sink() on a GckAttributes with a floating +reference will convert the floating reference into a full reference. +Calling gck_attributes_ref_sink() on a non-floating GckAttributes results +in an additional normal reference being added.

+

In other words, if the attrs + is floating, then this call "assumes +ownership" of the floating reference, converting it to a normal +reference. If the attrs + is not floating, then this call adds a +new normal reference increasing the reference count by one.

+

All Gck library functions that assume ownership of floating references +are documented as such. Essentially any Gck function that performs +an operation using a GckAttributes argument rather than operating on the +atributes themselves, will accept a floating reference.

+
+

Parameters

+
+++++ + + + + + +

attrs

an attribute array

 
+
+
+

Returns

+

the referenced attributes

+
+
+
+
+

gck_attributes_unref ()

+
void
+gck_attributes_unref (gpointer attrs);
+

Unreference this attribute array.

+

When all outstanding references are gone, the array will be freed.

+
+

Parameters

+
+++++ + + + + + +

attrs

(type Gck.Attributes): An attribute array.

[allow-none]
+
+
+
+
+

gck_attributes_contains ()

+
gboolean
+gck_attributes_contains (GckAttributes *attrs,
+                         const GckAttribute *match);
+

Check whether the attributes contain a certain attribute.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

The attributes to check

 

match

The attribute to find

 
+
+
+

Returns

+

TRUE if the attributes contain the attribute.

+
+
+
+
+

gck_attributes_to_string ()

+
gchar *
+gck_attributes_to_string (GckAttributes *attrs);
+

Print out attributes to a string in aform that's useful for debugging +or logging.

+

The format of the string returned may change in the future.

+
+

Parameters

+
+++++ + + + + + +

attrs

the attributes

 
+
+
+

Returns

+

a newly allocated string

+
+
+
+
+

gck_attributes_dump ()

+
void
+gck_attributes_dump (GckAttributes *attrs);
+

Dump the attributes using g_printerr().

+
+

Parameters

+
+++++ + + + + + +

attrs

The attributes

 
+
+
+
+
+

gck_builder_init ()

+
void
+gck_builder_init (GckBuilder *builder);
+

Initialize a stack allocated builder, with the default flags.

+

This is equivalent to initializing a builder variable with the +GCK_BUILDER_INIT constant, or setting it to zeroed memory.

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
/* Equivalent ways of initializing a GckBuilder */
+GckBuilder builder = GCK_BUILDER_INIT;
+GckBuilder builder2;
+GckBuilder builder3;
+
+gck_builder_init (&builder2);
+
+memset (&builder3, 0, sizeof (builder3));
+
+ +
+

Parameters

+
+++++ + + + + + +

builder

the builder

 
+
+
+
+
+

gck_builder_init_full ()

+
void
+gck_builder_init_full (GckBuilder *builder,
+                       GckBuilderFlags flags);
+

Initialize a stack allocated builder, with the appropriate flags.

+

If the GCK_BUILDER_SECURE_MEMORY flag is specified then non-pageable memory +will be used for the various values of the attributes in the builder

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

flags

the flags for the new builder

 
+
+
+
+
+

gck_builder_new ()

+
GckBuilder *
+gck_builder_new (GckBuilderFlags flags);
+

Create a new GckBuilder not allocated on the stack, so it can be shared +across a single scope, and referenced / unreferenced.

+

Normally a GckBuilder is created on the stack, and simply initialized.

+

If the GCK_BUILDER_SECURE_MEMORY flag is specified then non-pageable memory +will be used for the various values of the attributes in the builder

+
+

Parameters

+
+++++ + + + + + +

flags

flags for the new builder

 
+
+
+

Returns

+

a new builder, to be freed with gck_builder_unref().

+

[transfer full]

+
+
+
+
+

gck_builder_add_boolean ()

+
void
+gck_builder_add_boolean (GckBuilder *builder,
+                         gulong attr_type,
+                         gboolean value);
+

Add a new attribute to the builder for the boolean value +. +Unconditionally adds a new attribute, even if one with the same attr_type + +already exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value

 
+
+
+
+
+

gck_builder_set_boolean ()

+
void
+gck_builder_set_boolean (GckBuilder *builder,
+                         gulong attr_type,
+                         gboolean value);
+

Set an attribute on the builder for the boolean value +. +If an attribute with attr_type + already exists in the builder then it is +changed to the new value, otherwise an attribute is added.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value

 
+
+
+
+
+

gck_builder_add_data ()

+
void
+gck_builder_add_data (GckBuilder *builder,
+                      gulong attr_type,
+                      const guchar *value,
+                      gsize length);
+

Add a new attribute to the builder with an arbitrary value. Unconditionally +adds a new attribute, even if one with the same attr_type + already exists.

+

The memory in value + is copied by the builder.

+

NULL may be specified for the value + argument, in which case an empty +attribute is created. GCK_INVALID may be specified for the length, in +which case an invalid attribute is created in the PKCS#11 style.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

(allow-none): the new attribute memory.

[array length=length]

length

the length of the memory

 
+
+
+
+
+

gck_builder_set_data ()

+
void
+gck_builder_set_data (GckBuilder *builder,
+                      gulong attr_type,
+                      const guchar *value,
+                      gsize length);
+

Set a new attribute to the builder with an arbitrary value. If an attribute +with attr_type + already exists in the builder then it is changed to the new +value, otherwise an attribute is added.

+

The memory in value + is copied by the builder.

+

NULL may be specified for the value + argument, in which case an empty +attribute is created. GCK_INVALID may be specified for the length, in +which case an invalid attribute is created in the PKCS#11 style.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the attribute type

 

value

(allow-none): the new attribute memory.

[array length=length]

length

the length of the memory

 
+
+
+
+
+

gck_builder_take_data ()

+
void
+gck_builder_take_data (GckBuilder *builder,
+                       gulong attr_type,
+                       guchar *value,
+                       gsize length);
+

Add a new attribute to the builder with an arbitrary value. Unconditionally +adds a new attribute, even if one with the same attr_type + already exists.

+

Ownership of the value + memory is taken by the builder, may be reallocated, +and is eventually freed with g_free(). The memory must have been allocated +using the standard GLib memory allocation routines.

+

NULL may be specified for the value + argument, in which case an empty +attribute is created. GCK_INVALID may be specified for the length, in +which case an invalid attribute is created in the PKCS#11 style.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

(array length=length): (allow-none): the new +attribute memory.

[transfer full]

length

the length of the memory

 
+
+
+
+
+

gck_builder_add_date ()

+
void
+gck_builder_add_date (GckBuilder *builder,
+                      gulong attr_type,
+                      const GDate *value);
+

Add a new attribute to the builder for the date value +. +Unconditionally adds a new attribute, even if one with the same attr_type + +already exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value

 
+
+
+
+
+

gck_builder_set_date ()

+
void
+gck_builder_set_date (GckBuilder *builder,
+                      gulong attr_type,
+                      const GDate *value);
+

Set an attribute on the builder for the date value +. +If an attribute with attr_type + already exists in the builder then it is +changed to the new value, otherwise an attribute is added.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value

 
+
+
+
+
+

gck_builder_add_string ()

+
void
+gck_builder_add_string (GckBuilder *builder,
+                        gulong attr_type,
+                        const gchar *value);
+

Add a new attribute to the builder for the string value + or NULL. +Unconditionally adds a new attribute, even if one with the same attr_type + +already exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value.

[allow-none]
+
+
+
+
+

gck_builder_set_string ()

+
void
+gck_builder_set_string (GckBuilder *builder,
+                        gulong attr_type,
+                        const gchar *value);
+

Set an attribute on the builder for the string value + or NULL. +If an attribute with attr_type + already exists in the builder then it is +changed to the new value, otherwise an attribute is added.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value

 
+
+
+
+
+

gck_builder_add_ulong ()

+
void
+gck_builder_add_ulong (GckBuilder *builder,
+                       gulong attr_type,
+                       gulong value);
+

Add a new attribute to the builder for the unsigned long value +. +Unconditionally adds a new attribute, even if one with the same attr_type + +already exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value

 
+
+
+
+
+

gck_builder_set_ulong ()

+
void
+gck_builder_set_ulong (GckBuilder *builder,
+                       gulong attr_type,
+                       gulong value);
+

Set an attribute on the builder for the unsigned long value +. +If an attribute with attr_type + already exists in the builder then it is +changed to the new value, otherwise an attribute is added.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 

value

the attribute value

 
+
+
+
+
+

gck_builder_add_empty ()

+
void
+gck_builder_add_empty (GckBuilder *builder,
+                       gulong attr_type);
+

Add a new attribute to the builder that is empty. Unconditionally +adds a new attribute, even if one with the same attr_type + already exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 
+
+
+
+
+

gck_builder_set_empty ()

+
void
+gck_builder_set_empty (GckBuilder *builder,
+                       gulong attr_type);
+

Set an attribute on the builder that is empty. If an attribute +with attr_type + already exists in the builder then it is changed to the new +value, otherwise an attribute is added.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attr_type

the attribute type

 
+
+
+
+
+

gck_builder_add_invalid ()

+
void
+gck_builder_add_invalid (GckBuilder *builder,
+                         gulong attr_type);
+

Add a new attribute to the builder that is invalid in the PKCS#11 sense. +Unconditionally adds a new attribute, even if one with the same attr_type + +already exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attr_type

the new attribute type

 
+
+
+
+
+

gck_builder_set_invalid ()

+
void
+gck_builder_set_invalid (GckBuilder *builder,
+                         gulong attr_type);
+

Set an attribute on the builder that is invalid in the PKCS#11 sense. +If an attribute with attr_type + already exists in the builder then it is +changed to the new value, otherwise an attribute is added.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attr_type

the attribute type

 
+
+
+
+
+

gck_builder_add_attribute ()

+
void
+gck_builder_add_attribute (GckBuilder *builder,
+                           const GckAttribute *attr);
+

Add an attribute to the builder. The attribute is added unconditionally whether +or not an attribute with the same type already exists on the builder.

+

The attr + attribute must have been created or owned by the Gck library. +If you call this function on an arbitrary GckAttribute that is allocated on +the stack or elsewhere, then this will result in undefined behavior.

+

As an optimization, the attribute memory value is automatically shared +between the attribute and the builder.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attr

the attribute to add

 
+
+
+
+
+

gck_builder_add_all ()

+
void
+gck_builder_add_all (GckBuilder *builder,
+                     GckAttributes *attrs);
+

Add all the attrs + attributes to the builder. The attributes are added +uncondititionally whether or not attributes with the same types already +exist in the builder.

+

As an optimization, the attribute memory values are automatically shared +between the attributes and the builder.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attrs

the attributes to add

 
+
+
+
+
+

gck_builder_set_all ()

+
void
+gck_builder_set_all (GckBuilder *builder,
+                     GckAttributes *attrs);
+

Set all the attrs + attributes to the builder. If any attributes with the +same types are already present in the builder, then those attributes are +changed to the new values.

+

As an optimization, the attribute memory values are automatically shared +between the attributes and the builder.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attrs

the attributes to set

 
+
+
+
+
+

gck_builder_add_except ()

+
void
+gck_builder_add_except (GckBuilder *builder,
+                        GckAttributes *attrs,
+                        gulong except_type,
+                        ...);
+

Add the attributes in attrs + to the builder, with the exception of those +in the argument list. The attributes are added uncondititionally whether or +not attributes with the same types already exist in the builder.

+

The variable arguments must be unsigned longs.

+
+ + + + + + + +
1
+2
/* Add all attributes in attrs except CKA_CLASS to the builder */
+gck_builder_add_except (builder, attrs, CKA_CLASS, GCK_INVALID);
+
+ +

As an optimization, the attribute memory values are automatically shared +between the attributes and the builder.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

builder

the builder

 

attrs

the attributes to add

 

except_type

the first type of attribute to to exclude

 

...

the remaining attribute types to exclude, ending with GCK_INVALID

 
+
+
+
+
+

gck_builder_add_exceptv ()

+
void
+gck_builder_add_exceptv (GckBuilder *builder,
+                         GckAttributes *attrs,
+                         const gulong *except_types,
+                         guint n_except_types);
+

Add the attributes in attrs + to the builder, with the exception of those +whose types are specified in except_types +. The attributes are added +uncondititionally whether or not attributes with the same types already +exist in the builder.

+
+ + + + + + + +
1
+2
+3
/* Add all attributes in attrs except CKA_CLASS to the builder */
+gulong except_types[] = { CKA_CLASS };
+gck_builder_add_exceptv (builder, attrs, except_types, 1);
+
+ +

As an optimization, the attribute memory values are automatically shared +between the attributes and the builder.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

builder

the builder

 

attrs

the attributes to add

 

except_types

the except types.

[array length=n_except_types]

n_except_types

the number of except types

 
+
+
+
+
+

gck_builder_add_only ()

+
void
+gck_builder_add_only (GckBuilder *builder,
+                      GckAttributes *attrs,
+                      gulong only_type,
+                      ...);
+

Add the attributes specified in the argument list from attrs + to the +builder. The attributes are added uncondititionally whether or not +attributes with the same types already exist in the builder.

+

The variable arguments must be unsigned longs.

+
+ + + + + + + +
1
+2
/* Add the CKA_ID and CKA_CLASS attributes from attrs to builder */
+gck_builder_add_only (builder, attrs, CKA_ID, CKA_CLASS, GCK_INVALID);
+
+ +

As an optimization, the attribute memory values are automatically shared +between the attributes and the builder.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

builder

the builder

 

attrs

the attributes to add

 

only_type

the first type of attribute to add

 

...

the remaining attribute types to add, ending with GCK_INVALID

 
+
+
+
+
+

gck_builder_add_onlyv ()

+
void
+gck_builder_add_onlyv (GckBuilder *builder,
+                       GckAttributes *attrs,
+                       const gulong *only_types,
+                       guint n_only_types);
+

Add the attributes with the types in only_types + from attrs + to the +builder. The attributes are added uncondititionally whether or not +attributes with the same types already exist in the builder.

+
+ + + + + + + +
1
+2
+3
/* Add the CKA_ID and CKA_CLASS attributes from attrs to builder */
+gulong only[] = { CKA_ID, CKA_CLASS };
+gck_builder_add_onlyv (builder, attrs, only, 2);
+
+ +

As an optimization, the attribute memory values are automatically shared +between the attributes and the builder.

+

[rename-to gck_builder_add_only]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

builder

the builder

 

attrs

the attributes to add

 

only_types

the types of attributes to add.

[array length=n_only_types]

n_only_types

the number of attributes

 
+
+
+
+
+

gck_builder_end ()

+
GckAttributes *
+gck_builder_end (GckBuilder *builder);
+

Complete the GckBuilder, and return the attributes contained in the builder. +The GckBuilder will be cleared after this function call, and it is no +longer necessary to use gck_builder_clear() on it, although it is also +permitted. The builder may be used again to build another set of attributes +after this function call.

+

The returned set of attributes is floating, and should either be passed to +another gck library function which consumes this floating reference, or if +you wish to keep these attributes around you should ref them with +gck_attributes_ref_sink() and unref them later with gck_attributes_unref().

+
+

Parameters

+
+++++ + + + + + +

builder

the builder

 
+
+
+

Returns

+

a floating reference to the attributes created +in the builder.

+

[transfer none]

+
+
+
+
+

gck_builder_clear ()

+
void
+gck_builder_clear (GckBuilder *builder);
+

Clear the builder and release all allocated memory. The builder may be used +again to build another set of attributes after this function call.

+

If memory is shared between this builder and other attributes, then that +memory is only freed when both of them are cleared or unreferenced.

+
+

Parameters

+
+++++ + + + + + +

builder

the builder

 
+
+
+
+
+

gck_builder_steal ()

+
GckAttributes *
+gck_builder_steal (GckBuilder *builder);
+

Take the attributes that have been built in the GckBuilder. The builder +will no longer contain any attributes after this function call.

+

The returned set of attributes is a full reference, not floating.

+
+

Parameters

+
+++++ + + + + + +

builder

the builder

 
+
+
+

Returns

+

the stolen attributes, which should be freed with +gck_attributes_unref().

+

[transfer full]

+
+
+
+
+

gck_builder_ref ()

+
GckBuilder *
+gck_builder_ref (GckBuilder *builder);
+

Add a reference to a builder that was created with gck_builder_new(). The +builder must later be unreferenced again with gck_builder_unref().

+

It is an error to use this function on builders that were allocated on the +stack.

+
+

Parameters

+
+++++ + + + + + +

builder

the builder

 
+
+
+

Returns

+

the builder

+
+
+
+
+

gck_builder_unref ()

+
void
+gck_builder_unref (gpointer builder);
+

Unreferences a builder. If this was the last reference then the builder +is freed.

+

It is an error to use this function on builders that were allocated on the +stack.

+
+

Parameters

+
+++++ + + + + + +

builder

the builder

 
+
+
+
+
+

gck_builder_copy ()

+
GckBuilder *
+gck_builder_copy (GckBuilder *builder);
+

Make a copy of the builder and its state. The new builder is allocated +with gck_builder_new() and should be freed with gck_builder_unref().

+

Attribute value memory is automatically shared between the two builders, +and is only freed when both are gone.

+
+

Parameters

+
+++++ + + + + + +

builder

the builder to copy

 
+
+
+

Returns

+

the builder copy, which should be freed with +gck_builder_unref().

+

[transfer full]

+
+
+
+
+

gck_builder_find ()

+
const GckAttribute *
+gck_builder_find (GckBuilder *builder,
+                  gulong attr_type);
+

Find an attribute in the builder. Both valid and invalid attributes (in +the PKCS#11 sense) are returned. If multiple attributes exist for the given +attribute type, then the first one is returned.

+

The returned GckAttribute is owned by the builder and may not be modified +in any way. It is only valid until another attribute is added to or set on +the builder, or until the builder is cleared or unreferenced.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

builder

the builder

 

attr_type

the type of attribute to find

 
+
+
+

Returns

+

the attribute or NULL if not found

+
+
+
+
+

gck_builder_find_boolean ()

+
gboolean
+gck_builder_find_boolean (GckBuilder *builder,
+                          gulong attr_type,
+                          gboolean *value);
+

Find a boolean attribute in the builder that has the type attr_type +, is +of the correct boolean size, and is not invalid in the PKCS#11 sense. +If multiple attributes exist for the given attribute type, then the first\ +one is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the type of attribute to find

 

value

the location to place the found value.

[out]
+
+
+

Returns

+

whether a valid boolean attribute was found

+
+
+
+
+

gck_builder_find_date ()

+
gboolean
+gck_builder_find_date (GckBuilder *builder,
+                       gulong attr_type,
+                       GDate *value);
+

Find a date attribute in the builder that has the type attr_type +, is of +the correct date size, and is not invalid in the PKCS#11 sense. +If multiple attributes exist for the given attribute type, then the first +one is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the type of attribute to find

 

value

the location to place the found value.

[out]
+
+
+

Returns

+

whether a valid date attribute was found

+
+
+
+
+

gck_builder_find_string ()

+
gboolean
+gck_builder_find_string (GckBuilder *builder,
+                         gulong attr_type,
+                         gchar **value);
+

Find a string attribute in the builder that has the type attr_type +, has a +non NULL value pointer, and is not invalid in the PKCS#11 sense. +If multiple attributes exist for the given attribute type, then the first +one is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the type of attribute to find

 

value

the location to place the found value.

[out]
+
+
+

Returns

+

whether a valid string attribute was found

+
+
+
+
+

gck_builder_find_ulong ()

+
gboolean
+gck_builder_find_ulong (GckBuilder *builder,
+                        gulong attr_type,
+                        gulong *value);
+

Find a unsigned long attribute in the builder that has the type attr_type +, +is of the correct unsigned long size, and is not invalid in the PKCS#11 sense. +If multiple attributes exist for the given attribute type, then the first\ +one is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

builder

the builder

 

attr_type

the type of attribute to find

 

value

the location to place the found value.

[out]
+
+
+

Returns

+

whether a valid unsigned long attribute was found

+
+
+
+
+

gck_attributes_new ()

+
GckAttributes *
+gck_attributes_new (gulong reserved);
+

Create a new empty GckAttributes array.

+

The returned set of attributes is floating, and should either be passed to +another gck library function which consumes this floating reference, or if +you wish to keep these attributes around you should ref them with +gck_attributes_ref_sink() and unref them later with gck_attributes_unref().

+
+

Parameters

+
+++++ + + + + + +

reserved

Should be set to always be GCK_INVALID

 
+
+
+

Returns

+

a floating reference to the new attributes array; +when done with the array release it with gck_attributes_unref().

+

[transfer none]

+
+
+
+
+

gck_attributes_add ()

+
GckAttribute *
+gck_attributes_add (GckAttributes *attrs,
+                    GckAttribute *attr);
+
+

gck_attributes_add has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_all() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

the attributes array to add to

 

attr

the attribute to add

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_add_all ()

+
void
+gck_attributes_add_all (GckAttributes *attrs,
+                        GckAttributes *from);
+
+

gck_attributes_add_all has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_all() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

a set of attributes

 

from

attributes to add

 
+
+
+
+
+

gck_attributes_add_boolean ()

+
GckAttribute *
+gck_attributes_add_boolean (GckAttributes *attrs,
+                            gulong attr_type,
+                            gboolean value);
+
+

gck_attributes_add_boolean has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_boolean() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes array to add to

 

attr_type

the type of attribute to add

 

value

the boolean value to add

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_add_data ()

+
GckAttribute *
+gck_attributes_add_data (GckAttributes *attrs,
+                         gulong attr_type,
+                         const guchar *value,
+                         gsize length);
+
+

gck_attributes_add_data has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_data() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

attrs

The attributes array to add to.

 

attr_type

The type of attribute to add.

 

value

the raw memory of the attribute value.

[array length=length]

length

The length of the attribute value.

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_add_date ()

+
GckAttribute *
+gck_attributes_add_date (GckAttributes *attrs,
+                         gulong attr_type,
+                         const GDate *value);
+
+

gck_attributes_add_date has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_date() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes array to add to

 

attr_type

the type of attribute to add

 

value

the GDate value to add

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_add_empty ()

+
GckAttribute *
+gck_attributes_add_empty (GckAttributes *attrs,
+                          gulong attr_type);
+
+

gck_attributes_add_empty has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_empty() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

The attributes array to add.

 

attr_type

The type of attribute to add.

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_add_invalid ()

+
GckAttribute *
+gck_attributes_add_invalid (GckAttributes *attrs,
+                            gulong attr_type);
+
+

gck_attributes_add_invalid has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_invalid() instead

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

The attributes array to add to.

 

attr_type

The type of attribute to add.

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_add_string ()

+
GckAttribute *
+gck_attributes_add_string (GckAttributes *attrs,
+                           gulong attr_type,
+                           const gchar *value);
+
+

gck_attributes_add_string has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_string() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes array to add to

 

attr_type

the type of attribute to add

 

value

the null terminated string value to add

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_add_ulong ()

+
GckAttribute *
+gck_attributes_add_ulong (GckAttributes *attrs,
+                          gulong attr_type,
+                          gulong value);
+
+

gck_attributes_add_ulong has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_add_ulong() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes array to add to

 

attr_type

the type of attribute to add

 

value

the gulong value to add

 
+
+
+

Returns

+

returns NULL.

+

[transfer none]

+
+
+
+
+

gck_attributes_dup ()

+
GckAttributes *
+gck_attributes_dup (GckAttributes *attrs);
+
+

gck_attributes_dup has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_attributes_ref() or gck_builder_add_all() instead.

+
+

GckAttributes are now immutable, and can be used in mulitple places.

+
+

Parameters

+
+++++ + + + + + +

attrs

set of attributes to copy

 
+
+
+

Returns

+

a new floating GckAttributes.

+

[transfer none]

+
+
+
+
+

gck_attributes_new_full ()

+
GckAttributes *
+gck_attributes_new_full (GckAllocator allocator);
+
+

gck_attributes_new_full has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_all() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

allocator

memory allocator for attribute data, or NULL for default

 
+
+
+

Returns

+

returns NULL

+
+
+
+
+

gck_attributes_set ()

+
void
+gck_attributes_set (GckAttributes *attrs,
+                    GckAttribute *attr);
+
+

gck_attributes_set has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_data() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

attributes array to add to

 

attr

attribute to set

 
+
+
+
+
+

gck_attributes_set_all ()

+
void
+gck_attributes_set_all (GckAttributes *attrs,
+                        GckAttributes *from);
+
+

gck_attributes_set_all has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_all() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attrs

set of attributes

 

from

attributes to add

 
+
+
+
+
+

gck_attributes_set_boolean ()

+
void
+gck_attributes_set_boolean (GckAttributes *attrs,
+                            gulong attr_type,
+                            gboolean value);
+
+

gck_attributes_set_boolean has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_boolean() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes

 

attr_type

the type of attribute to set

 

value

boolean value to set

 
+
+
+
+
+

gck_attributes_set_date ()

+
void
+gck_attributes_set_date (GckAttributes *attrs,
+                         gulong attr_type,
+                         const GDate *value);
+
+

gck_attributes_set_date has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_date() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes

 

attr_type

the type of attribute to set

 

value

date value to set

 
+
+
+
+
+

gck_attributes_set_string ()

+
void
+gck_attributes_set_string (GckAttributes *attrs,
+                           gulong attr_type,
+                           const gchar *value);
+
+

gck_attributes_set_string has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_string() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes

 

attr_type

the type of attribute to set

 

value

null terminated string value to set

 
+
+
+
+
+

gck_attributes_set_ulong ()

+
void
+gck_attributes_set_ulong (GckAttributes *attrs,
+                          gulong attr_type,
+                          gulong value);
+
+

gck_attributes_set_ulong has been deprecated since version 3.4 and should not be used in newly-written code.

+

Use gck_builder_set_ulong() instead.

+
+

GckAttributes are now immutable. This method no longer does anything.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

the attributes

 

attr_type

the type of attribute to set

 

value

gulong value to set

 
+
+
+
+
+

Types and Values

+
+

GckAttributes

+
typedef struct _GckAttributes GckAttributes;
+

A set of GckAttribute structures.

+
+
+
+

struct GckBuilder

+
struct GckBuilder {
+};
+
+

A builder for a set of attributes. Add attributes to a builder, and then use +gck_builder_end() to get the completed GckAttributes.

+

The fields of GckBuilder are private and not to be accessed directly.

+
+
+
+

enum GckBuilderFlags

+

Flags to be used with a gck_builder_init_full() and gck_builder_new().

+
+

Members

+
+++++ + + + + + + + + + + + + +

GCK_BUILDER_NONE

+

no special flags

+
 

GCK_BUILDER_SECURE_MEMORY

+

use non-pageable memory for the values of the attributes

+
 
+
+
+
+
+

GCK_BUILDER_INIT

+
#define              GCK_BUILDER_INIT                       { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }
+
+

Values that can be assigned to a GckBuilder allocated on the stack.

+
+ + + + + + + +
1
GckBuilder builder = GCK_BUILDER_INIT;
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/GckEnumerator.html b/docs/reference/gck/html/GckEnumerator.html new file mode 100644 index 0000000..e6e826c --- /dev/null +++ b/docs/reference/gck/html/GckEnumerator.html @@ -0,0 +1,658 @@ + + + + +GckEnumerator: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckEnumerator

+

GckEnumerator — Enumerates through PKCS#11 objects.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckObject * + +gck_enumerator_next () +
+void + +gck_enumerator_next_async () +
+GList * + +gck_enumerator_next_finish () +
+GList * + +gck_enumerator_next_n () +
+GTlsInteraction * + +gck_enumerator_get_interaction () +
+void + +gck_enumerator_set_interaction () +
+GType + +gck_enumerator_get_object_type () +
+void + +gck_enumerator_set_object_type () +
+void + +gck_enumerator_set_object_type_full () +
+GckEnumerator * + +gck_enumerator_get_chained () +
+void + +gck_enumerator_set_chained () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + +
+GckEnumerator *chainedRead / Write
+GTlsInteraction *interactionRead / Write
+GType *object-typeRead / Write
+
+
+

Types and Values

+
++++ + + + + +
structGckEnumerator
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GckEnumerator
+
+
+
+

Description

+

A GckEnumerator can be used to enumerate through PKCS#11 objects. It will +automatically create sessions as necessary.

+

Use gck_modules_enumerate_objects() or gck_modules_enumerate_uri() to create +an enumerator. To get the objects use gck_enumerator_next() or +gck_enumerator_next_async() functions.

+
+
+

Functions

+
+

gck_enumerator_next ()

+
GckObject *
+gck_enumerator_next (GckEnumerator *self,
+                     GCancellable *cancellable,
+                     GError **error);
+

Get the next object in the enumerator, or NULL if there are no more objects.

+

NULL is also returned if the function fails. Use the error + to determine +whether a failure occurred or not.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The enumerator

 

cancellable

A GCancellable or NULL

 

error

A location to store an error on failure

 
+
+
+

Returns

+

The next object, which must be released +using g_object_unref, or NULL.

+

[transfer full][allow-none]

+
+
+
+
+

gck_enumerator_next_async ()

+
void
+gck_enumerator_next_async (GckEnumerator *self,
+                           gint max_objects,
+                           GCancellable *cancellable,
+                           GAsyncReadyCallback callback,
+                           gpointer user_data);
+

Get the next set of objects from the enumerator. This operation completes +asynchronously.The maximum number of objects can be specified with +max_objects +. If -1 is specified, then all the remaining objects will be +enumerated.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

An enumerator

 

max_objects

The maximum number of objects to get

 

cancellable

A GCancellable or NULL

 

callback

Called when the result is ready

 

user_data

Data to pass to the callback

 
+
+
+
+
+

gck_enumerator_next_finish ()

+
GList *
+gck_enumerator_next_finish (GckEnumerator *self,
+                            GAsyncResult *result,
+                            GError **error);
+

Complete an operation to enumerate next objects.

+

NULL is also returned if the function fails. Use the error + to determine +whether a failure occurred or not.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

An enumerator

 

result

The result passed to the callback

 

error

A location to raise an error on failure.

 
+
+
+

Returns

+

The list of objects, which +should be freed with gck_list_unref_free().

+

[element-type Gck.Object][transfer full]

+
+
+
+
+

gck_enumerator_next_n ()

+
GList *
+gck_enumerator_next_n (GckEnumerator *self,
+                       gint max_objects,
+                       GCancellable *cancellable,
+                       GError **error);
+

Get the next set of objects from the enumerator. The maximum number of +objects can be specified with max_objects +. If -1 is specified, then all +the remaining objects will be returned.

+

NULL is also returned if the function fails. Use the error + to determine +whether a failure occurred or not.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

An enumerator

 

max_objects

The maximum amount of objects to enumerate

 

cancellable

A GCancellable or NULL

 

error

A location to store an error on failure

 
+
+
+

Returns

+

A list of objects, which +should be freed using gck_list_unref_free().

+

[transfer full][element-type Gck.Object]

+
+
+
+
+

gck_enumerator_get_interaction ()

+
GTlsInteraction *
+gck_enumerator_get_interaction (GckEnumerator *self);
+

Get the interaction used when a pin is needed

+
+

Parameters

+
+++++ + + + + + +

self

the enumerator

 
+
+
+

Returns

+

the interaction or NULL.

+

[transfer full][allow-none]

+
+
+
+
+

gck_enumerator_set_interaction ()

+
void
+gck_enumerator_set_interaction (GckEnumerator *self,
+                                GTlsInteraction *interaction);
+

Set the interaction used when a pin is needed

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the enumerator

 

interaction

the interaction or NULL.

[allow-none]
+
+
+
+
+

gck_enumerator_get_object_type ()

+
GType
+gck_enumerator_get_object_type (GckEnumerator *self);
+

Get the type of objects created by this enumerator. The type will always +either be GckObject or derived from it.

+
+

Parameters

+
+++++ + + + + + +

self

an enumerator

 
+
+
+

Returns

+

the type of objects created

+
+
+
+
+

gck_enumerator_set_object_type ()

+
void
+gck_enumerator_set_object_type (GckEnumerator *self,
+                                GType object_type);
+

Set the type of objects to be created by this enumerator. The type must +always be either GckObject or derived from it.

+

If the GckObjectCache interface is implemented on the derived class +and the default_types class field is set, then the enumerator will retrieve +attributes for each object.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

an enumerator

 

object_type

the type of objects to create

 
+
+
+
+
+

gck_enumerator_set_object_type_full ()

+
void
+gck_enumerator_set_object_type_full (GckEnumerator *self,
+                                     GType object_type,
+                                     const gulong *attr_types,
+                                     gint attr_count);
+

Set the type of objects to be created by this enumerator. The type must +always be either GckObject or derived from it.

+

If attr_types + and attr_count + are non-NULL and non-zero respectively, +then the GckObjectCache interface is expected to be implemented on the +derived class, then the enumerator will retrieve attributes for each object.

+

[rename-to gck_enumerator_set_object_type]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

an enumerator

 

object_type

the type of objects to create

 

attr_types

types of attributes to retrieve for objects.

[array length=attr_count]

attr_count

the number of attributes to retrieve

 
+
+
+
+
+

gck_enumerator_get_chained ()

+
GckEnumerator *
+gck_enumerator_get_chained (GckEnumerator *self);
+

Get the enumerator that will be run after all objects from this one +are seen.

+
+

Parameters

+
+++++ + + + + + +

self

the enumerator

 
+
+
+

Returns

+

the chained enumerator or NULL.

+

[transfer full][allow-none]

+
+
+
+
+

gck_enumerator_set_chained ()

+
void
+gck_enumerator_set_chained (GckEnumerator *self,
+                            GckEnumerator *chained);
+

Set a chained enumerator that will be run after all objects from this one +are seen.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the enumerator

 

chained

the chained enumerator or NULL.

[allow-none]
+
+
+
+
+

Types and Values

+
+

struct GckEnumerator

+
struct GckEnumerator;
+

An object that allows enumerating of objects across modules, tokens.

+
+
+
+

Property Details

+
+

The “chained” property

+
  “chained”                  GckEnumerator *
+

Chained enumerator, which will be enumerated when this enumerator +has enumerated all its objects.

+

Flags: Read / Write

+
+
+
+

The “interaction” property

+
  “interaction”              GTlsInteraction *
+

Interaction object used to ask the user for pins when opening +sessions. Used if the session_options of the enumerator have +GCK_SESSION_LOGIN_USER

+

Flags: Read / Write

+
+
+
+

The “object-type” property

+
  “object-type”              GType *
+

The type of objects that are created by the enumerator. Must be +GckObject or derived from it.

+

[skip]

+

Flags: Read / Write

+

Allowed values: GckObject

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/GckModule.html b/docs/reference/gck/html/GckModule.html new file mode 100644 index 0000000..27dd310 --- /dev/null +++ b/docs/reference/gck/html/GckModule.html @@ -0,0 +1,850 @@ + + + + +GckModule: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckModule

+

GckModule — A loaded and initialized PKCS#11 module.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckModule * + +gck_module_initialize () +
+void + +gck_module_initialize_async () +
+GckModule * + +gck_module_initialize_finish () +
+GckModule * + +gck_module_new () +
+gboolean + +gck_module_equal () +
+guint + +gck_module_hash () +
+gboolean + +gck_module_match () +
const gchar * + +gck_module_get_path () +
+CK_FUNCTION_LIST_PTR + +gck_module_get_functions () +
+GckModuleInfo * + +gck_module_get_info () +
+GList * + +gck_module_get_slots () +
+GckModuleInfo * + +gck_module_info_copy () +
+void + +gck_module_info_free () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + +
gpointerfunctionsRead / Write / Construct Only
+gchar *pathRead / Write / Construct Only
+
+
+

Signals

+
+++++ + + + + + + + + + + + + +
gbooleanauthenticate-objectRun Last
gbooleanauthenticate-slotRun Last
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGckModule
structGckModuleInfo
+
+
+

Object Hierarchy

+
    GBoxed
+    ╰── GckModuleInfo
+    GObject
+    ╰── GckModule
+
+
+
+

Description

+

A GckModule object holds a loaded PKCS#11 module. A PKCS#11 module is a shared library.

+

You can load and initialize a PKCS#11 module with the gck_module_initialize() call. If you already +have a loaded and initialized module that you'd like to use with the various gck functions, then +you can use gck_module_new().

+
+
+

Functions

+
+

gck_module_initialize ()

+
GckModule *
+gck_module_initialize (const gchar *path,
+                       GCancellable *cancellable,
+                       GError **error);
+

Load and initialize a PKCS#11 module represented by a GckModule object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

path

The file system path to the PKCS#11 module to load.

 

cancellable

optional cancellation object.

[allow-none]

error

A location to store an error resulting from a failed load.

 
+
+
+

Returns

+

The loaded PKCS#11 module or NULL if failed.

+

[transfer full]

+
+
+
+
+

gck_module_initialize_async ()

+
void
+gck_module_initialize_async (const gchar *path,
+                             GCancellable *cancellable,
+                             GAsyncReadyCallback callback,
+                             gpointer user_data);
+

Asynchronously load and initialize a PKCS#11 module represented by a +GckModule object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

path

the file system path to the PKCS#11 module to load

 

cancellable

optional cancellation object.

[allow-none]

callback

a callback which will be called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gck_module_initialize_finish ()

+
GckModule *
+gck_module_initialize_finish (GAsyncResult *result,
+                              GError **error);
+

Finishes the asynchronous initialize operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the asynchronous result

 

error

location to place an error on failure

 
+
+
+

Returns

+

The initialized module, or NULL.

+

[transfer full][allow-none]

+
+
+
+
+

gck_module_new ()

+
GckModule *
+gck_module_new (CK_FUNCTION_LIST_PTR funcs);
+

Create a GckModule representing a PKCS#11 module. It is assumed that +this the module is already initialized. In addition it will not be +finalized when complete.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

funcs

Initialized PKCS#11 function list pointer

 
+
+
+

Returns

+

The new PKCS#11 module.

+
+
+
+
+

gck_module_equal ()

+
gboolean
+gck_module_equal (gconstpointer module1,
+                  gconstpointer module2);
+

Checks equality of two modules. Two GckModule objects can point to the same +underlying PKCS#11 module.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

module1

a pointer to the first GckModule.

[type Gck.Module]

module2

a pointer to the second GckModule.

[type Gck.Module]
+
+
+

Returns

+

TRUE if module1 and module2 are equal. FALSE if either is not a GckModule.

+
+
+
+
+

gck_module_hash ()

+
guint
+gck_module_hash (gconstpointer module);
+

Create a hash value for the GckModule.

+

This function is intended for easily hashing a GckModule to add to +a GHashTable or similar data structure.

+
+

Parameters

+
+++++ + + + + + +

module

a pointer to a GckModule.

[type Gck.Module]
+
+
+

Returns

+

An integer that can be used as a hash value, or 0 if invalid.

+
+
+
+
+

gck_module_match ()

+
gboolean
+gck_module_match (GckModule *self,
+                  GckUriData *uri);
+

Check whether the PKCS#11 URI matches the module

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the module to match

 

uri

the uri to match against the module

 
+
+
+

Returns

+

whether the URI matches or not

+
+
+
+
+

gck_module_get_path ()

+
const gchar *
+gck_module_get_path (GckModule *self);
+

Get the file path of this module. This may not be an absolute path, and +usually reflects the path passed to gck_module_initialize().

+
+

Parameters

+
+++++ + + + + + +

self

The module for which to get the path.

 
+
+
+

Returns

+

The path, do not modify or free this value.

+
+
+
+
+

gck_module_get_functions ()

+
CK_FUNCTION_LIST_PTR
+gck_module_get_functions (GckModule *self);
+

Get the PKCS#11 function list for the module.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

self

The module for which to get the function list.

 
+
+
+

Returns

+

The function list, do not modify this structure.

+
+
+
+
+

gck_module_get_info ()

+
GckModuleInfo *
+gck_module_get_info (GckModule *self);
+

Get the info about a PKCS#11 module.

+
+

Parameters

+
+++++ + + + + + +

self

The module to get info for.

 
+
+
+

Returns

+

the module info; release this with gck_module_info_free().

+

[transfer full]

+
+
+
+
+

gck_module_get_slots ()

+
GList *
+gck_module_get_slots (GckModule *self,
+                      gboolean token_present);
+

Get the GckSlot objects for a given module.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The module for which to get the slots.

 

token_present

Whether to limit only to slots with a token present.

 
+
+
+

Returns

+

The possibly empty +list of slots. Release this with gck_list_unref_free().

+

[element-type Gck.Slot][transfer full]

+
+
+
+
+

gck_module_info_copy ()

+
GckModuleInfo *
+gck_module_info_copy (GckModuleInfo *module_info);
+

Make a copy of the module info.

+
+

Parameters

+
+++++ + + + + + +

module_info

a module info

 
+
+
+

Returns

+

a newly allocated copy module info.

+

[transfer full]

+
+
+
+
+

gck_module_info_free ()

+
void
+gck_module_info_free (GckModuleInfo *module_info);
+

Free a GckModuleInfo structure.

+
+

Parameters

+
+++++ + + + + + +

module_info

The module info to free, or NULL.

 
+
+
+
+
+

Types and Values

+
+

struct GckModule

+
struct GckModule;
+

Holds a loaded and initialized PKCS#11 module.

+
+
+
+

struct GckModuleInfo

+
struct GckModuleInfo {
+	guint8 pkcs11_version_major;
+	guint8 pkcs11_version_minor;
+
+	gchar *manufacturer_id;
+	gulong flags;
+
+	gchar *library_description;
+	guint8 library_version_major;
+	guint8 library_version_minor;
+};
+
+

Holds information about the PKCS#11 module.

+

This structure corresponds to CK_MODULE_INFO in the PKCS#11 standard. The +strings are NULL terminated for easier use.

+

Use gck_module_info_free() to release this structure when done with it.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

guint8 pkcs11_version_major;

The major version of the module.

 

guint8 pkcs11_version_minor;

The minor version of the module.

 

gchar *manufacturer_id;

The module manufacturer.

 

gulong flags;

The module PKCS#11 flags.

 

gchar *library_description;

The module description.

 

guint8 library_version_major;

The major version of the library.

 

guint8 library_version_minor;

The minor version of the library.

 
+
+
+
+
+

Property Details

+
+

The “functions” property

+
  “functions”                gpointer
+

The raw PKCS#11 function list for the module.

+

This points to a CK_FUNCTION_LIST structure.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “path” property

+
  “path”                     gchar *
+

The PKCS#11 module file path.

+

This may be set to NULL if this object was created from an already +initialized module via the gck_module_new() function.

+

Flags: Read / Write / Construct Only

+

Default value: NULL

+
+
+
+

Signal Details

+
+

The “authenticate-object” signal

+
gboolean
+user_function (GckModule *module,
+               GckObject *object,
+               gchar     *label,
+               gpointer   password,
+               gpointer   user_data)
+

Use gck_session_set_interaction() instead of connecting to this signal.

+
+

GckModule::authenticate-object is deprecated and should not be used in newly-written code.

+

Since 3.4

+
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

module

The module.

 

object

The object to be authenticated.

 

label

A displayable label which describes the object.

 

password

A gchar** where a password should be returned.

 

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+

The “authenticate-slot” signal

+
gboolean
+user_function (GckModule *module,
+               GckSlot   *slot,
+               gchar     *string,
+               gpointer   password,
+               gpointer   user_data)
+

Use gck_session_set_interaction() instead of connecting to this signal.

+
+

GckModule::authenticate-slot is deprecated and should not be used in newly-written code.

+

Since 3.4

+
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

module

The module

 

slot

The slot to be authenticated.

 

string

A displayable label which describes the object.

 

password

A gchar** where a password should be returned.

 

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/GckObject.html b/docs/reference/gck/html/GckObject.html new file mode 100644 index 0000000..69e1c93 --- /dev/null +++ b/docs/reference/gck/html/GckObject.html @@ -0,0 +1,1622 @@ + + + + +GckObject: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckObject

+

GckObject — Represents a PKCS11 object such as a key or certificate.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckObject * + +gck_object_from_handle () +
+GList * + +gck_objects_from_handle_array () +
+gboolean + +gck_object_equal () +
+guint + +gck_object_hash () +
+GckModule * + +gck_object_get_module () +
+gulong + +gck_object_get_handle () +
+GckSession * + +gck_object_get_session () +
+gboolean + +gck_object_destroy () +
+void + +gck_object_destroy_async () +
+gboolean + +gck_object_destroy_finish () +
+gboolean + +gck_object_set () +
+void + +gck_object_set_async () +
+gboolean + +gck_object_set_finish () +
+GckAttributes * + +gck_object_get () +
+void + +gck_object_get_async () +
+GckAttributes * + +gck_object_get_finish () +
+guchar * + +gck_object_get_data () +
+guchar * + +gck_object_get_data_full () +
+void + +gck_object_get_data_async () +
+guchar * + +gck_object_get_data_finish () +
+GckAttributes * + +gck_object_get_full () +
+GckAttributes * + +gck_object_get_template () +
+void + +gck_object_get_template_async () +
+GckAttributes * + +gck_object_get_template_finish () +
+gboolean + +gck_object_set_template () +
+void + +gck_object_set_template_async () +
+gboolean + +gck_object_set_template_finish () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + +
gulonghandleRead / Write / Construct Only
+GckModule *moduleRead / Write / Construct Only
+GckSession *sessionRead / Write / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGckObject
structGckObjectClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GckObject
+
+
+
+

Known Derived Interfaces

+

+GckObject is required by + GckObjectCache.

+
+
+

Description

+

A GckObject holds a handle to a PKCS11 object such as a key or certificate. Token objects +are stored on the token persistently. Others are transient and are called session objects.

+
+
+

Functions

+
+

gck_object_from_handle ()

+
GckObject *
+gck_object_from_handle (GckSession *session,
+                        gulong object_handle);
+

Initialize a GckObject from a raw PKCS#11 handle. Normally you would use +gck_session_create_object() or gck_session_find_objects() to access objects.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

session

The session through which this object is accessed or created.

 

object_handle

The raw CK_OBJECT_HANDLE of the object.

 
+
+
+

Returns

+

The new GckObject. You should use +g_object_unref() when done with this object.

+

[transfer full]

+
+
+
+
+

gck_objects_from_handle_array ()

+
GList *
+gck_objects_from_handle_array (GckSession *session,
+                               gulong *object_handles,
+                               gulong n_object_handles);
+

Initialize a list of GckObject from raw PKCS#11 handles. The handles argument must contain +contiguous CK_OBJECT_HANDLE handles in an array.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

session

The session for these objects

 

object_handles

The raw object handles.

[array length=n_object_handles]

n_object_handles

The number of raw object handles.

 
+
+
+

Returns

+

The list of GckObject +objects. You should use gck_list_unref_free() when done with this +list.

+

[transfer full][element-type Gck.Object]

+
+
+
+
+

gck_object_equal ()

+
gboolean
+gck_object_equal (gconstpointer object1,
+                  gconstpointer object2);
+

Checks equality of two objects. Two GckObject objects can point to the same +underlying PKCS#11 object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object1

a pointer to the first GckObject.

[type Gck.Object]

object2

a pointer to the second GckObject.

[type Gck.Object]
+
+
+

Returns

+

TRUE if object1 and object2 are equal. FALSE if either is not a GckObject.

+
+
+
+
+

gck_object_hash ()

+
guint
+gck_object_hash (gconstpointer object);
+

Create a hash value for the GckObject.

+

This function is intended for easily hashing a GckObject to add to +a GHashTable or similar data structure.

+
+

Parameters

+
+++++ + + + + + +

object

a pointer to a GckObject.

[type Gck.Object]
+
+
+

Returns

+

An integer that can be used as a hash value, or 0 if invalid.

+
+
+
+
+

gck_object_get_module ()

+
GckModule *
+gck_object_get_module (GckObject *self);
+

Get the PKCS#11 module to which this object belongs.

+
+

Parameters

+
+++++ + + + + + +

self

The object.

 
+
+
+

Returns

+

the module, which should be unreffed after use.

+

[transfer full]

+
+
+
+
+

gck_object_get_handle ()

+
gulong
+gck_object_get_handle (GckObject *self);
+

Get the raw PKCS#11 handle of a GckObject.

+
+

Parameters

+
+++++ + + + + + +

self

The object.

 
+
+
+

Returns

+

the raw CK_OBJECT_HANDLE object handle

+
+
+
+
+

gck_object_get_session ()

+
GckSession *
+gck_object_get_session (GckObject *self);
+

Get the PKCS#11 session assigned to make calls on when operating +on this object.

+

This will only return a session if it was set explitly on this +object. By default an object will open and close sessions +appropriate for its calls.

+
+

Parameters

+
+++++ + + + + + +

self

The object

 
+
+
+

Returns

+

the assigned session, which must be unreffed after use.

+

[transfer full]

+
+
+
+
+

gck_object_destroy ()

+
gboolean
+gck_object_destroy (GckObject *self,
+                    GCancellable *cancellable,
+                    GError **error);
+

Destroy a PKCS#11 object, deleting it from storage or the session. +This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The object to destroy.

 

cancellable

Optional cancellable object, or NULL to ignore.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether the call was successful or not.

+
+
+
+
+

gck_object_destroy_async ()

+
void
+gck_object_destroy_async (GckObject *self,
+                          GCancellable *cancellable,
+                          GAsyncReadyCallback callback,
+                          gpointer user_data);
+

Destroy a PKCS#11 object, deleting it from storage or the session. +This call will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The object to destroy.

 

cancellable

Optional cancellable object, or NULL to ignore.

 

callback

Callback which is called when operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_object_destroy_finish ()

+
gboolean
+gck_object_destroy_finish (GckObject *self,
+                           GAsyncResult *result,
+                           GError **error);
+

Get the status of the operation to destroy a PKCS#11 object, begun with +gck_object_destroy_async().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The object being destroyed.

 

result

The result of the destory operation passed to the callback.

 

error

A location to store an error.

 
+
+
+

Returns

+

Whether the object was destroyed successfully or not.

+
+
+
+
+

gck_object_set ()

+
gboolean
+gck_object_set (GckObject *self,
+                GckAttributes *attrs,
+                GCancellable *cancellable,
+                GError **error);
+

Set PKCS#11 attributes on an object. This call may block for an indefinite period.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The object to set attributes on.

 

attrs

The attributes to set on the object.

 

cancellable

Optional cancellable object, or NULL to ignore.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether the call was successful or not.

+
+
+
+
+

gck_object_set_async ()

+
void
+gck_object_set_async (GckObject *self,
+                      GckAttributes *attrs,
+                      GCancellable *cancellable,
+                      GAsyncReadyCallback callback,
+                      gpointer user_data);
+

Set PKCS#11 attributes on an object. This call will return +immediately and completes asynchronously.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to set attributes on.

 

attrs

The attributes to set on the object.

 

cancellable

Optional cancellable object, or NULL to ignore.

 

callback

Callback which is called when operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_object_set_finish ()

+
gboolean
+gck_object_set_finish (GckObject *self,
+                       GAsyncResult *result,
+                       GError **error);
+

Get the status of the operation to set attributes on a PKCS#11 object, +begun with gck_object_set_async().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The object to set attributes on.

 

result

The result of the destory operation passed to the callback.

 

error

A location to store an error.

 
+
+
+

Returns

+

Whether the attributes were successfully set on the object or not.

+
+
+
+
+

gck_object_get ()

+
GckAttributes *
+gck_object_get (GckObject *self,
+                GCancellable *cancellable,
+                GError **error,
+                ...);
+

Get the specified attributes from the object. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get attributes from.

 

cancellable

A GCancellable or NULL

 

error

A location to store an error.

 

...

The attribute types to get.

 
+
+
+

Returns

+

the resulting PKCS#11 attributes, or NULL if an +error occurred; the result must be unreffed when you're finished +with it.

+

[transfer full]

+
+
+
+
+

gck_object_get_async ()

+
void
+gck_object_get_async (GckObject *self,
+                      const gulong *attr_types,
+                      guint n_attr_types,
+                      GCancellable *cancellable,
+                      GAsyncReadyCallback callback,
+                      gpointer user_data);
+

Get the specified attributes from the object. The attributes will be cleared +of their current values, and new attributes will be stored. The attributes +should not be accessed in any way except for referencing and unreferencing +them until gck_object_get_finish() is called.

+

This call returns immediately and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get attributes from.

 

attr_types

the types of the attributes to get.

[array length=n_attr_types]

n_attr_types

the number of attr_types

 

cancellable

optional cancellation object, or NULL

 

callback

A callback which is called when the operation completes.

 

user_data

Data to be passed to the callback.

 
+
+
+
+
+

gck_object_get_finish ()

+
GckAttributes *
+gck_object_get_finish (GckObject *self,
+                       GAsyncResult *result,
+                       GError **error);
+

Get the result of a get operation and return specified attributes from +the object.

+

No extra references are added to the returned attributes pointer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The object to get attributes from.

 

result

The result passed to the callback.

 

error

A location to store an error.

 
+
+
+

Returns

+

The filled in attributes structure if successful or +NULL if not successful.

+
+
+
+
+

gck_object_get_data ()

+
guchar *
+gck_object_get_data (GckObject *self,
+                     gulong attr_type,
+                     GCancellable *cancellable,
+                     gsize *n_data,
+                     GError **error);
+

Get the data for the specified attribute from the object. For convenience +the returned data has a null terminator.

+

This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get attribute data from.

 

attr_type

The attribute to get data for.

 

cancellable

A GCancellable or NULL

 

n_data

The length of the resulting data.

 

error

A location to store an error.

 
+
+
+

Returns

+

the resulting PKCS#11 +attribute data, or NULL if an error occurred.

+

[transfer full][array length=n_data]

+
+
+
+
+

gck_object_get_data_full ()

+
guchar *
+gck_object_get_data_full (GckObject *self,
+                          gulong attr_type,
+                          GckAllocator allocator,
+                          GCancellable *cancellable,
+                          gsize *n_data,
+                          GError **error);
+

Get the data for the specified attribute from the object. For convenience +the returned data has an extra null terminator, not included in the returned length.

+

This call may block for an indefinite period.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get attribute data from.

 

attr_type

The attribute to get data for.

 

allocator

An allocator with which to allocate memory for the data, or NULL for default.

 

cancellable

Optional cancellation object, or NULL.

 

n_data

The length of the resulting data.

 

error

A location to store an error.

 
+
+
+

Returns

+

The resulting PKCS#11 +attribute data, or NULL if an error occurred.

+

[transfer full][array length=n_data]

+
+
+
+
+

gck_object_get_data_async ()

+
void
+gck_object_get_data_async (GckObject *self,
+                           gulong attr_type,
+                           GckAllocator allocator,
+                           GCancellable *cancellable,
+                           GAsyncReadyCallback callback,
+                           gpointer user_data);
+

Get the data for the specified attribute from the object.

+

This call will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get attribute data from.

 

attr_type

The attribute to get data for.

 

allocator

An allocator with which to allocate memory for the data, or NULL for default.

[skip]

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to be passed to the callback.

 
+
+
+
+
+

gck_object_get_data_finish ()

+
guchar *
+gck_object_get_data_finish (GckObject *self,
+                            GAsyncResult *result,
+                            gsize *n_data,
+                            GError **error);
+

Get the result of an operation to get attribute data from +an object. For convenience the returned data has an extra null terminator, +not included in the returned length.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get an attribute from.

 

result

The result passed to the callback.

 

n_data

The length of the resulting data.

 

error

A location to store an error.

 
+
+
+

Returns

+

The PKCS#11 attribute data +or NULL if an error occurred.

+

[transfer full][array length=n_data]

+
+
+
+
+

gck_object_get_full ()

+
GckAttributes *
+gck_object_get_full (GckObject *self,
+                     const gulong *attr_types,
+                     guint n_attr_types,
+                     GCancellable *cancellable,
+                     GError **error);
+

Get the specified attributes from the object. This call may +block for an indefinite period.

+

No extra references are added to the returned attributes pointer. +During this call you may not access the attributes in any way.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get attributes from.

 

attr_types

the types of the attributes to get.

[array length=n_attr_types]

n_attr_types

the number of attr_types

 

cancellable

optional cancellation object, or NULL

 

error

A location to store an error.

 
+
+
+

Returns

+

a pointer to the filled in attributes if successful, +or NULL if not.

+

[transfer full]

+
+
+
+
+

gck_object_get_template ()

+
GckAttributes *
+gck_object_get_template (GckObject *self,
+                         gulong attr_type,
+                         GCancellable *cancellable,
+                         GError **error);
+

Get an attribute template from the object. The attr_type must be for +an attribute which returns a template.

+

This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get an attribute template from.

 

attr_type

The template attribute type.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to store an error.

 
+
+
+

Returns

+

the resulting PKCS#11 attribute template, or NULL +if an error occurred.

+

[transfer full]

+
+
+
+
+

gck_object_get_template_async ()

+
void
+gck_object_get_template_async (GckObject *self,
+                               gulong attr_type,
+                               GCancellable *cancellable,
+                               GAsyncReadyCallback callback,
+                               gpointer user_data);
+

Get an attribute template from the object. The attr_type must be for +an attribute which returns a template.

+

This call will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to get an attribute template from.

 

attr_type

The template attribute type.

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to be passed to the callback.

 
+
+
+
+
+

gck_object_get_template_finish ()

+
GckAttributes *
+gck_object_get_template_finish (GckObject *self,
+                                GAsyncResult *result,
+                                GError **error);
+

Get the result of an operation to get attribute template from +an object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The object to get an attribute from.

 

result

The result passed to the callback.

 

error

A location to store an error.

 
+
+
+

Returns

+

the resulting PKCS#11 attribute template, or NULL +if an error occurred.

+

[transfer full]

+
+
+
+
+

gck_object_set_template ()

+
gboolean
+gck_object_set_template (GckObject *self,
+                         gulong attr_type,
+                         GckAttributes *attrs,
+                         GCancellable *cancellable,
+                         GError **error);
+

Set an attribute template on the object. The attr_type must be for +an attribute which contains a template.

+

If the attrs + GckAttributes is floating, it is consumed.

+

This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to set an attribute template on.

 

attr_type

The attribute template type.

 

attrs

The attribute template.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to store an error.

 
+
+
+

Returns

+

TRUE if the operation succeeded.

+
+
+
+
+

gck_object_set_template_async ()

+
void
+gck_object_set_template_async (GckObject *self,
+                               gulong attr_type,
+                               GckAttributes *attrs,
+                               GCancellable *cancellable,
+                               GAsyncReadyCallback callback,
+                               gpointer user_data);
+

Set an attribute template on the object. The attr_type must be for +an attribute which contains a template.

+

If the attrs + GckAttributes is floating, it is consumed.

+

This call will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The object to set an attribute template on.

 

attr_type

The attribute template type.

 

attrs

The attribute template.

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to be passed to the callback.

 
+
+
+
+
+

gck_object_set_template_finish ()

+
gboolean
+gck_object_set_template_finish (GckObject *self,
+                                GAsyncResult *result,
+                                GError **error);
+

Get the result of an operation to set attribute template on +an object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The object to set an attribute template on.

 

result

The result passed to the callback.

 

error

A location to store an error.

 
+
+
+

Returns

+

TRUE if the operation succeeded.

+
+
+
+
+

Types and Values

+
+

struct GckObject

+
struct GckObject;
+

Represents a PKCS11 object handle such as a key or certifiacte.

+
+
+
+

struct GckObjectClass

+
struct GckObjectClass {
+	GObjectClass parent;
+};
+
+

The class for a GckObject.

+

If the attribute_types + field is set by a derived class, then the a +GckEnumerator which has been setup using gck_enumerator_set_object_type() +with this derived type will retrieve these attributes when enumerating. In +this case the class must implement an 'attributes' property of boxed type +GCK_TYPE_ATTRIBUTES.

+
+

Members

+
+++++ + + + + + +

GObjectClass parent;

derived from this

 
+
+
+
+
+

Property Details

+
+

The “handle” property

+
  “handle”                   gulong
+

The raw PKCS11 handle for this object.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “module” property

+
  “module”                   GckModule *
+

The GckModule that this object belongs to.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “session” property

+
  “session”                  GckSession *
+

The PKCS11 session to make calls on when this object needs to +perform operations on itself.

+

If this is NULL then a new session is opened for each operation, +such as gck_object_get(), gck_object_set() or gck_object_destroy().

+

Flags: Read / Write / Construct Only

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/GckObjectCache.html b/docs/reference/gck/html/GckObjectCache.html new file mode 100644 index 0000000..ebf591e --- /dev/null +++ b/docs/reference/gck/html/GckObjectCache.html @@ -0,0 +1,639 @@ + + + + +GckObjectCache: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckObjectCache

+

GckObjectCache — An interface which holds attributes for a PKCS#11 object

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckAttributes * + +gck_object_cache_get_attributes () +
+void + +gck_object_cache_set_attributes () +
+void + +gck_object_cache_fill () +
+GckAttributes * + +gck_object_cache_lookup () +
+void + +gck_object_cache_lookup_async () +
+GckAttributes * + +gck_object_cache_lookup_finish () +
+gboolean + +gck_object_cache_update () +
+void + +gck_object_cache_update_async () +
+gboolean + +gck_object_cache_update_finish () +
+
+
+

Properties

+
+++++ + + + + + +
+GckAttributes *attributesRead / Write
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GckObjectCache
structGckObjectCacheIface
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GckObjectCache
+
+
+
+

Prerequisites

+

+GckObjectCache requires + GckObject.

+
+
+

Description

+

GckObjectCache is an interface implemented by derived classes of +GckObject to indicate which attributes they'd like an enumerator to retrieve. +These attributes are then cached on the object and can be retrieved through +the “attributes” property.

+
+
+

Functions

+
+

gck_object_cache_get_attributes ()

+
GckAttributes *
+gck_object_cache_get_attributes (GckObjectCache *object);
+
+
+
+

gck_object_cache_set_attributes ()

+
void
+gck_object_cache_set_attributes (GckObjectCache *object,
+                                 GckAttributes *attrs);
+

Sets the attributes cached on this object.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

an object with an attribute cache

 

attrs

the attributes to set.

[allow-none]
+
+
+
+
+

gck_object_cache_fill ()

+
void
+gck_object_cache_fill (GckObjectCache *object,
+                       GckAttributes *attrs);
+

Adds the attributes to the set cached on this object. If an attribute is +already present in the cache it will be overridden by this value.

+

This will be done in a thread-safe manner.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

an object with the cache

 

attrs

the attributes to cache

 
+
+
+
+
+

gck_object_cache_lookup ()

+
GckAttributes *
+gck_object_cache_lookup (GckObject *object,
+                         const gulong *attr_types,
+                         gint n_attr_types,
+                         GCancellable *cancellable,
+                         GError **error);
+

Lookup attributes in the cache, or retrieve them from the object if necessary.

+

If object + is a GckObjectCache then this will lookup the attributes there +first if available, otherwise will read them from the object and update +the cache.

+

If object + is not a GckObjectCache, then the attributes will simply be +read from the object.

+

This may block, use the asynchronous version when this is not desirable

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

object

the object

 

attr_types

the types of attributes to update.

[array length=n_attr_types]

n_attr_types

the number of attribute types

 

cancellable

optional cancellation object

 

error

location to place an error

 
+
+
+

Returns

+

the attributes retrieved or NULL on failure.

+

[transfer full]

+
+
+
+
+

gck_object_cache_lookup_async ()

+
void
+gck_object_cache_lookup_async (GckObject *object,
+                               const gulong *attr_types,
+                               gint n_attr_types,
+                               GCancellable *cancellable,
+                               GAsyncReadyCallback callback,
+                               gpointer user_data);
+

Lookup attributes in the cache, or retrieve them from the object if necessary.

+

If object + is a GckObjectCache then this will lookup the attributes there +first if available, otherwise will read them from the object and update +the cache.

+

If object + is not a GckObjectCache, then the attributes will simply be +read from the object.

+

This will return immediately and complete asynchronously

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

object

the object

 

attr_types

the types of attributes to update.

[array length=n_attr_types]

n_attr_types

the number of attribute types

 

cancellable

optional cancellation object

 

callback

called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gck_object_cache_lookup_finish ()

+
GckAttributes *
+gck_object_cache_lookup_finish (GckObject *object,
+                                GAsyncResult *result,
+                                GError **error);
+

Complete an operation to lookup attributes in the cache or retrieve them +from the object if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

object

the object

 

result

the asynchrounous result passed to the callback

 

error

location to place an error

 
+
+
+

Returns

+

the attributes retrieved or NULL on failure.

+

[transfer full]

+
+
+
+
+

gck_object_cache_update ()

+
gboolean
+gck_object_cache_update (GckObjectCache *object,
+                         const gulong *attr_types,
+                         gint n_attr_types,
+                         GCancellable *cancellable,
+                         GError **error);
+

Update the object cache with given attributes. If an attribute already +exists in the cache, it will be updated, and if it doesn't it will be added.

+

This may block, use the asynchronous version when this is not desirable

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

object

the object with the cache

 

attr_types

the types of attributes to update.

[array length=n_attr_types]

n_attr_types

the number of attribute types

 

cancellable

optional cancellation object

 

error

location to place an error

 
+
+
+

Returns

+

whether the cache update was successful

+
+
+
+
+

gck_object_cache_update_async ()

+
void
+gck_object_cache_update_async (GckObjectCache *object,
+                               const gulong *attr_types,
+                               gint n_attr_types,
+                               GCancellable *cancellable,
+                               GAsyncReadyCallback callback,
+                               gpointer user_data);
+

Update the object cache with given attributes. If an attribute already +exists in the cache, it will be updated, and if it doesn't it will be added.

+

This call will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

object

the object with the cache

 

attr_types

the types of attributes to update.

[array length=n_attr_types]

n_attr_types

the number of attribute types

 

cancellable

optional cancellation object

 

callback

called when the operation completes

 

user_data

data to be passed to the callback

 
+
+
+
+
+

gck_object_cache_update_finish ()

+
gboolean
+gck_object_cache_update_finish (GckObjectCache *object,
+                                GAsyncResult *result,
+                                GError **error);
+

Complete an asynchronous operation to update the object cache with given +attributes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

object

the object with the cache

 

result

the asynchronous result passed to the callback

 

error

location to place an error

 
+
+
+

Returns

+

whether the cache update was successful

+
+
+
+
+

Types and Values

+
+

GckObjectCache

+
typedef struct _GckObjectCache GckObjectCache;
+

An interface implemented on an GckObject which contains a cache of attributes.

+
+
+
+

struct GckObjectCacheIface

+
struct GckObjectCacheIface {
+	GTypeInterface interface;
+
+	const gulong *  default_types;
+	gint            n_default_types;
+
+	void         (* fill)                              (GckObjectCache *object,
+	                                                    GckAttributes *attrs);
+};
+
+

Interface for GckObjectCache. If the default_types + field is set by +a implementing class, then the a GckEnumerator which has been setup using +gck_enumerator_set_object_type()

+

The implementation for populate + should add the attributes to the +cache. It must be thread safe.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

GTypeInterface interface;

parent interface

 

const gulong *default_types;

attribute types that an +enumerator should retrieve.

[array length=n_default_types]

gint n_default_types;

number of attribute types to be retrieved

 

fill ()

virtual method to add attributes to the cache

 
+
+
+
+
+

Property Details

+
+

The “attributes” property

+
  “attributes”               GckAttributes *
+

The attributes cached on this object.

+

Flags: Read / Write

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/GckSession.html b/docs/reference/gck/html/GckSession.html new file mode 100644 index 0000000..142bb75 --- /dev/null +++ b/docs/reference/gck/html/GckSession.html @@ -0,0 +1,4677 @@ + + + + +GckSession: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckSession

+

GckSession — Represents an open PKCS11 session.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckSession * + +gck_session_from_handle () +
+GckSession * + +gck_session_open () +
+void + +gck_session_open_async () +
+GckSession * + +gck_session_open_finish () +
+GckModule * + +gck_session_get_module () +
+GckSlot * + +gck_session_get_slot () +
+gulong + +gck_session_get_handle () +
+GckSessionInfo * + +gck_session_get_info () +
+GTlsInteraction * + +gck_session_get_interaction () +
+gboolean + +gck_session_login () +
+void + +gck_session_login_async () +
+gboolean + +gck_session_login_finish () +
+gboolean + +gck_session_logout () +
+void + +gck_session_logout_async () +
+gboolean + +gck_session_logout_finish () +
+GckObject * + +gck_session_create_object () +
+void + +gck_session_create_object_async () +
+GckObject * + +gck_session_create_object_finish () +
+GckEnumerator * + +gck_session_enumerate_objects () +
+gulong * + +gck_session_find_handles () +
+void + +gck_session_find_handles_async () +
+gulong * + +gck_session_find_handles_finish () +
+GList * + +gck_session_find_objects () +
+void + +gck_session_find_objects_async () +
+GList * + +gck_session_find_objects_finish () +
+guchar * + +gck_session_encrypt () +
+guchar * + +gck_session_encrypt_full () +
+void + +gck_session_encrypt_async () +
+guchar * + +gck_session_encrypt_finish () +
+guchar * + +gck_session_decrypt () +
+guchar * + +gck_session_decrypt_full () +
+void + +gck_session_decrypt_async () +
+guchar * + +gck_session_decrypt_finish () +
+gboolean + +gck_session_login_interactive () +
+void + +gck_session_login_interactive_async () +
+gboolean + +gck_session_login_interactive_finish () +
+void + +gck_session_set_interaction () +
+guchar * + +gck_session_sign () +
+guchar * + +gck_session_sign_full () +
+void + +gck_session_sign_async () +
+guchar * + +gck_session_sign_finish () +
+gboolean + +gck_session_verify () +
+gboolean + +gck_session_verify_full () +
+void + +gck_session_verify_async () +
+gboolean + +gck_session_verify_finish () +
+GckObject * + +gck_session_derive_key () +
+void + +gck_session_derive_key_async () +
+GckObject * + +gck_session_derive_key_finish () +
+GckObject * + +gck_session_derive_key_full () +
+gboolean + +gck_session_generate_key_pair () +
+void + +gck_session_generate_key_pair_async () +
+gboolean + +gck_session_generate_key_pair_finish () +
+gboolean + +gck_session_generate_key_pair_full () +
+GckSessionOptions + +gck_session_get_options () +
+gulong + +gck_session_get_state () +
+gboolean + +gck_session_init_pin () +
+void + +gck_session_init_pin_async () +
+gboolean + +gck_session_init_pin_finish () +
+gboolean + +gck_session_set_pin () +
+void + +gck_session_set_pin_async () +
+gboolean + +gck_session_set_pin_finish () +
+GckObject * + +gck_session_unwrap_key () +
+void + +gck_session_unwrap_key_async () +
+GckObject * + +gck_session_unwrap_key_finish () +
+GckObject * + +gck_session_unwrap_key_full () +
+guchar * + +gck_session_wrap_key () +
+void + +gck_session_wrap_key_async () +
+guchar * + +gck_session_wrap_key_finish () +
+guchar * + +gck_session_wrap_key_full () +
+GckSessionInfo * + +gck_session_info_copy () +
+void + +gck_session_info_free () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
gpointerapp-dataWrite / Construct Only
gulonghandleRead / Write / Construct Only
+GTlsInteraction *interactionRead / Write
+GckModule *moduleRead
gulongopening-flagsWrite / Construct Only
GckSessionOptionsoptionsRead / Write / Construct Only
+GckSlot *slotRead / Write / Construct Only
+
+
+

Signals

+
+++++ + + + + + +
gbooleandiscard-handleRun Last
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
structGckSession
structGckSessionInfo
structGckMechanism
+
+
+

Object Hierarchy

+
    GBoxed
+    ╰── GckSessionInfo
+    GObject
+    ╰── GckSession
+
+
+
+

Implemented Interfaces

+

+GckSession implements + GInitable and GAsyncInitable.

+
+
+

Description

+

Before performing any PKCS11 operations, a session must be opened. This is +analogous to an open database handle, or a file handle.

+
+
+

Functions

+
+

gck_session_from_handle ()

+
GckSession *
+gck_session_from_handle (GckSlot *slot,
+                         gulong session_handle,
+                         GckSessionOptions options);
+

Initialize a GckSession object from a raw PKCS#11 session handle. +Usually one would use the gck_slot_open_session() function to +create a session.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

slot

The slot which the session belongs to.

 

session_handle

the raw PKCS#11 handle of the session

 

options

Session options. Those which are used during opening a session have no effect.

 
+
+
+

Returns

+

the new GckSession object.

+

[transfer full]

+
+
+
+
+

gck_session_open ()

+
GckSession *
+gck_session_open (GckSlot *slot,
+                  GckSessionOptions options,
+                  GTlsInteraction *interaction,
+                  GCancellable *cancellable,
+                  GError **error);
+

Open a session on the slot. This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

slot

the slot to open session on

 

options

session options

 

interaction

optional interaction for logins or object authentication.

[allow-none]

cancellable

optional cancellation object

 

error

location to place error or NULL

 
+
+
+

Returns

+

the new session.

+

[transfer full]

+
+
+
+
+

gck_session_open_async ()

+
void
+gck_session_open_async (GckSlot *slot,
+                        GckSessionOptions options,
+                        GTlsInteraction *interaction,
+                        GCancellable *cancellable,
+                        GAsyncReadyCallback callback,
+                        gpointer user_data);
+

Open a session on the slot. This call will return immediately and complete +asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

slot

the slot to open session on

 

options

session options

 

interaction

optional interaction for logins or object authentication.

[allow-none]

cancellable

optional cancellation object

 

callback

called when the operation completes

 

user_data

data to pass to callback

 
+
+
+
+
+

gck_session_open_finish ()

+
GckSession *
+gck_session_open_finish (GAsyncResult *result,
+                         GError **error);
+

Get the result of an open session operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the result passed to the callback

 

error

location to return an error or NULL

 
+
+
+

Returns

+

the new session.

+

[transfer full]

+
+
+
+
+

gck_session_get_module ()

+
GckModule *
+gck_session_get_module (GckSession *self);
+

Get the PKCS#11 module to which this session belongs.

+
+

Parameters

+
+++++ + + + + + +

self

The session object.

 
+
+
+

Returns

+

the module, which should be unreffed after use.

+

[transfer full]

+
+
+
+
+

gck_session_get_slot ()

+
GckSlot *
+gck_session_get_slot (GckSession *self);
+

Get the PKCS#11 slot to which this session belongs.

+
+

Parameters

+
+++++ + + + + + +

self

The session object.

 
+
+
+

Returns

+

The slot, which should be unreffed after use.

+

[transfer full]

+
+
+
+
+

gck_session_get_handle ()

+
gulong
+gck_session_get_handle (GckSession *self);
+

Get the raw PKCS#11 session handle from a GckSession object.

+
+

Parameters

+
+++++ + + + + + +

self

The session object.

 
+
+
+

Returns

+

The raw session handle.

+
+
+
+
+

gck_session_get_info ()

+
GckSessionInfo *
+gck_session_get_info (GckSession *self);
+

Get information about the session.

+
+

Parameters

+
+++++ + + + + + +

self

The session object.

 
+
+
+

Returns

+

the session info. Use the gck_session_info_free() +to release when done.

+

[transfer full]

+
+
+
+
+

gck_session_get_interaction ()

+
GTlsInteraction *
+gck_session_get_interaction (GckSession *self);
+

Get the interaction object set on this session, which is used to prompt +for pins and the like.

+
+

Parameters

+
+++++ + + + + + +

self

the session

 
+
+
+

Returns

+

the interaction object, or NULL.

+

[transfer full][allow-none]

+
+
+
+
+

gck_session_login ()

+
gboolean
+gck_session_login (GckSession *self,
+                   gulong user_type,
+                   const guchar *pin,
+                   gsize n_pin,
+                   GCancellable *cancellable,
+                   GError **error);
+

Login the user on the session. This call may block for +an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

Log in to this session.

 

user_type

The type of login user.

 

pin

the user's PIN, or NULL for +protected authentication path.

[allow-none][array length=n_pin]

n_pin

The length of the PIN.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether successful or not.

+
+
+
+
+

gck_session_login_async ()

+
void
+gck_session_login_async (GckSession *self,
+                         gulong user_type,
+                         const guchar *pin,
+                         gsize n_pin,
+                         GCancellable *cancellable,
+                         GAsyncReadyCallback callback,
+                         gpointer user_data);
+

Login the user on the session. This call will return +immediately and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

Log in to this session.

 

user_type

The type of login user.

 

pin

the user's PIN, or NULL for +protected authentication path.

[allow-none][array length=n_pin]

n_pin

The length of the PIN.

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_login_finish ()

+
gboolean
+gck_session_login_finish (GckSession *self,
+                          GAsyncResult *result,
+                          GError **error);
+

Get the result of a login operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session logged into.

 

result

The result passed to the callback.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether the operation was successful or not.

+
+
+
+
+

gck_session_logout ()

+
gboolean
+gck_session_logout (GckSession *self,
+                    GCancellable *cancellable,
+                    GError **error);
+

Log out of the session. This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

Logout of this session.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether the logout was successful or not.

+
+
+
+
+

gck_session_logout_async ()

+
void
+gck_session_logout_async (GckSession *self,
+                          GCancellable *cancellable,
+                          GAsyncReadyCallback callback,
+                          gpointer user_data);
+

Log out of the session. This call returns immediately and completes +asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

Logout of this session.

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_logout_finish ()

+
gboolean
+gck_session_logout_finish (GckSession *self,
+                           GAsyncResult *result,
+                           GError **error);
+

Get the result of logging out of a session.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

Logout of this session.

 

result

The result passed to the callback.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether the logout was successful or not.

+
+
+
+
+

gck_session_create_object ()

+
GckObject *
+gck_session_create_object (GckSession *self,
+                           GckAttributes *attrs,
+                           GCancellable *cancellable,
+                           GError **error);
+

Create a new PKCS#11 object. This call may block for an +indefinite period.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The session to create the object on.

 

attrs

The attributes to create the object with.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the newly created object or NULL if an error occurred.

+

[transfer full]

+
+
+
+
+

gck_session_create_object_async ()

+
void
+gck_session_create_object_async (GckSession *self,
+                                 GckAttributes *attrs,
+                                 GCancellable *cancellable,
+                                 GAsyncReadyCallback callback,
+                                 gpointer user_data);
+

Create a new PKCS#11 object. This call will return immediately +and complete asynchronously.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to create the object on.

 

attrs

The attributes to create the object with.

 

cancellable

Optional cancellation object or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_create_object_finish ()

+
GckObject *
+gck_session_create_object_finish (GckSession *self,
+                                  GAsyncResult *result,
+                                  GError **error);
+

Get the result of creating a new PKCS#11 object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session to create the object on.

 

result

The result passed to the callback.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the newly created object or NULL if an error occurred.

+

[transfer full]

+
+
+
+
+

gck_session_enumerate_objects ()

+
GckEnumerator *
+gck_session_enumerate_objects (GckSession *self,
+                               GckAttributes *match);
+

Setup an enumerator for listing matching objects available via this session.

+

If the match + GckAttributes is floating, it is consumed.

+

This call will not block but will return an enumerator immediately.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

session to enumerate objects on

 

match

attributes that the objects must match, or empty for all objects

 
+
+
+

Returns

+

a new enumerator.

+

[transfer full]

+
+
+
+
+

gck_session_find_handles ()

+
gulong *
+gck_session_find_handles (GckSession *self,
+                          GckAttributes *match,
+                          GCancellable *cancellable,
+                          gulong *n_handles,
+                          GError **error);
+

Find the objects matching the passed attributes. This call may +block for an indefinite period.

+

If the match + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

the session to find objects on

 

match

the attributes to match against objects

 

cancellable

optional cancellation object or NULL

 

n_handles

location to return number of handles

 

error

a location to return an error or NULL

 
+
+
+

Returns

+

a list of +the matching objects, which may be empty.

+

[transfer full][array length=n_handles][allow-none]

+
+
+
+
+

gck_session_find_handles_async ()

+
void
+gck_session_find_handles_async (GckSession *self,
+                                GckAttributes *match,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Find the objects matching the passed attributes. This call will +return immediately and complete asynchronously.

+

If the match + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

the session to find objects on

 

match

the attributes to match against the objects

 

cancellable

optional cancellation object or NULL

 

callback

called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gck_session_find_handles_finish ()

+
gulong *
+gck_session_find_handles_finish (GckSession *self,
+                                 GAsyncResult *result,
+                                 gulong *n_handles,
+                                 GError **error);
+

Get the result of a find handles operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

the session

 

result

the asynchronous result

 

n_handles

location to store number of handles returned

 

error

a location to return an error on failure

 
+
+
+

Returns

+

an array of +handles that matched, which may be empty, or NULL on failure.

+

[transfer full][array length=n_handles][allow-none]

+
+
+
+
+

gck_session_find_objects ()

+
GList *
+gck_session_find_objects (GckSession *self,
+                          GckAttributes *match,
+                          GCancellable *cancellable,
+                          GError **error);
+

Find the objects matching the passed attributes. This call may +block for an indefinite period.

+

If the match + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The session to find objects on.

 

match

the attributes to match

 

cancellable

Optional cancellation object or NULL.

 

error

A location to return an error or NULL.

 
+
+
+

Returns

+

a list of the matching +objects, which may be empty.

+

[transfer full][element-type Gck.Object]

+
+
+
+
+

gck_session_find_objects_async ()

+
void
+gck_session_find_objects_async (GckSession *self,
+                                GckAttributes *match,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Find the objects matching the passed attributes. This call will +return immediately and complete asynchronously.

+

If the match + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to find objects on.

 

match

The attributes to match.

 

cancellable

Optional cancellation object or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_find_objects_finish ()

+
GList *
+gck_session_find_objects_finish (GckSession *self,
+                                 GAsyncResult *result,
+                                 GError **error);
+

Get the result of a find operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session to find objects on.

 

result

The attributes to match.

 

error

A location to return an error.

 
+
+
+

Returns

+

a list of the matching +objects, which may be empty.

+

[transfer full][element-type Gck.Object]

+
+
+
+
+

gck_session_encrypt ()

+
guchar *
+gck_session_encrypt (GckSession *self,
+                     GckObject *key,
+                     gulong mech_type,
+                     const guchar *input,
+                     gsize n_input,
+                     gsize *n_result,
+                     GCancellable *cancellable,
+                     GError **error);
+

Encrypt data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to encrypt with.

 

mech_type

The mechanism type to use for encryption.

 

input

the data to encrypt.

[array length=n_input]

n_input

the length of the data to encrypt

 

n_result

location to store the length of the result data

 

cancellable

Optional cancellation object, or NULL

 

error

A location to place error information.

 
+
+
+

Returns

+

the data that was encrypted, +or NULL if an error occured.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_encrypt_full ()

+
guchar *
+gck_session_encrypt_full (GckSession *self,
+                          GckObject *key,
+                          GckMechanism *mechanism,
+                          const guchar *input,
+                          gsize n_input,
+                          gsize *n_result,
+                          GCancellable *cancellable,
+                          GError **error);
+

Encrypt data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to encrypt with.

 

mechanism

The mechanism type and parameters to use for encryption.

 

input

the data to encrypt.

[array length=n_input]

n_input

the length of the data to encrypt

 

n_result

location to store the length of the result data

 

cancellable

A GCancellable which can be used to cancel the operation.

 

error

A location to place error information.

 
+
+
+

Returns

+

the data that was encrypted, +or NULL if an error occured.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_encrypt_async ()

+
void
+gck_session_encrypt_async (GckSession *self,
+                           GckObject *key,
+                           GckMechanism *mechanism,
+                           const guchar *input,
+                           gsize n_input,
+                           GCancellable *cancellable,
+                           GAsyncReadyCallback callback,
+                           gpointer user_data);
+

Encrypt data in a mechanism specific manner. This call will +return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to encrypt with.

 

mechanism

The mechanism type and parameters to use for encryption.

 

input

the data to encrypt.

[array length=n_input]

n_input

length of the data to encrypt

 

cancellable

A GCancellable which can be used to cancel the operation.

 

callback

Called when the operation completes.

 

user_data

A pointer to pass to the callback.

 
+
+
+
+
+

gck_session_encrypt_finish ()

+
guchar *
+gck_session_encrypt_finish (GckSession *self,
+                            GAsyncResult *result,
+                            gsize *n_result,
+                            GError **error);
+

Get the result of an encryption operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

result

The result object passed to the callback.

 

n_result

A location to store the length of the result data.

 

error

A location to place error information.

 
+
+
+

Returns

+

the data that was encrypted, +or NULL if an error occurred.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_decrypt ()

+
guchar *
+gck_session_decrypt (GckSession *self,
+                     GckObject *key,
+                     gulong mech_type,
+                     const guchar *input,
+                     gsize n_input,
+                     gsize *n_result,
+                     GCancellable *cancellable,
+                     GError **error);
+

Decrypt data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to decrypt with.

 

mech_type

The mechanism type to use for decryption.

 

input

data to decrypt.

[array length=n_input]

n_input

length of the data to decrypt

 

n_result

location to store the length of the result data

 

cancellable

Optional cancellation object, or NULL

 

error

A location to place an error.

 
+
+
+

Returns

+

the data that was decrypted, +or NULL if an error occured.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_decrypt_full ()

+
guchar *
+gck_session_decrypt_full (GckSession *self,
+                          GckObject *key,
+                          GckMechanism *mechanism,
+                          const guchar *input,
+                          gsize n_input,
+                          gsize *n_result,
+                          GCancellable *cancellable,
+                          GError **error);
+

Decrypt data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to decrypt with.

 

mechanism

The mechanism type and parameters to use for decryption.

 

input

data to decrypt.

[array length=n_input]

n_input

length of the data to decrypt

 

n_result

location to store the length of the result data

 

cancellable

A GCancellable which can be used to cancel the operation.

 

error

A location to place error information.

 
+
+
+

Returns

+

the data that was decrypted, +or NULL if an error occured.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_decrypt_async ()

+
void
+gck_session_decrypt_async (GckSession *self,
+                           GckObject *key,
+                           GckMechanism *mechanism,
+                           const guchar *input,
+                           gsize n_input,
+                           GCancellable *cancellable,
+                           GAsyncReadyCallback callback,
+                           gpointer user_data);
+

Decrypt data in a mechanism specific manner. This call will +return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to decrypt with.

 

mechanism

The mechanism type and parameters to use for decryption.

 

input

data to decrypt.

[array length=n_input]

n_input

length of the data to decrypt

 

cancellable

A GCancellable which can be used to cancel the operation.

 

callback

Called when the operation completes.

 

user_data

A pointer to pass to the callback.

 
+
+
+
+
+

gck_session_decrypt_finish ()

+
guchar *
+gck_session_decrypt_finish (GckSession *self,
+                            GAsyncResult *result,
+                            gsize *n_result,
+                            GError **error);
+

Get the result of an decryption operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

result

The result object passed to the callback.

 

n_result

A location to store the length of the result data.

 

error

A location to place error information.

 
+
+
+

Returns

+

the data that was decrypted, +or NULL if an error occurred.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_login_interactive ()

+
gboolean
+gck_session_login_interactive (GckSession *self,
+                               gulong user_type,
+                               GTlsInteraction *interaction,
+                               GCancellable *cancellable,
+                               GError **error);
+

Login the user on the session requesting the password interactively +when necessary. This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

session to use for login

 

user_type

the type of login user

 

interaction

interaction to request PIN when necessary.

[allow-none]

cancellable

optional cancellation object, or NULL

 

error

location to return an error

 
+
+
+

Returns

+

Whether successful or not.

+
+
+
+
+

gck_session_login_interactive_async ()

+
void
+gck_session_login_interactive_async (GckSession *self,
+                                     gulong user_type,
+                                     GTlsInteraction *interaction,
+                                     GCancellable *cancellable,
+                                     GAsyncReadyCallback callback,
+                                     gpointer user_data);
+

Login the user on the session prompting for passwords interactively when +necessary. This call will return immediately and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

session to use for login

 

user_type

the type of login user

 

interaction

interaction to request PIN when necessary.

[allow-none]

cancellable

optional cancellation object, or NULL

 

callback

called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gck_session_login_interactive_finish ()

+
gboolean
+gck_session_login_interactive_finish (GckSession *self,
+                                      GAsyncResult *result,
+                                      GError **error);
+

Get the result of a login operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the session logged into

 

result

the result passed to the callback

 

error

location to return an error

 
+
+
+

Returns

+

Whether the operation was successful or not.

+
+
+
+
+

gck_session_set_interaction ()

+
void
+gck_session_set_interaction (GckSession *self,
+                             GTlsInteraction *interaction);
+

Set the interaction object on this session, which is used to prompt for +pins and the like.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the session

 

interaction

the interaction or NULL.

[allow-none]
+
+
+
+
+

gck_session_sign ()

+
guchar *
+gck_session_sign (GckSession *self,
+                  GckObject *key,
+                  gulong mech_type,
+                  const guchar *input,
+                  gsize n_input,
+                  gsize *n_result,
+                  GCancellable *cancellable,
+                  GError **error);
+

Sign data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to sign with.

 

mech_type

The mechanism type to use for signing.

 

input

data to sign.

[array length=n_input]

n_input

length of the data to sign

 

n_result

location to store the length of the result data

 

cancellable

Optional cancellation object, or NULL

 

error

A location to place an error.

 
+
+
+

Returns

+

the data that was signed, +or NULL if an error occured.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_sign_full ()

+
guchar *
+gck_session_sign_full (GckSession *self,
+                       GckObject *key,
+                       GckMechanism *mechanism,
+                       const guchar *input,
+                       gsize n_input,
+                       gsize *n_result,
+                       GCancellable *cancellable,
+                       GError **error);
+

Sign data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to sign with.

 

mechanism

The mechanism type and parameters to use for signing.

 

input

data to sign.

[array length=n_input]

n_input

length of the data to sign

 

n_result

location to store the length of the result data

 

cancellable

A GCancellable which can be used to cancel the operation.

 

error

A location to place error information.

 
+
+
+

Returns

+

The data that was signed, or NULL if an error occured.

+
+
+
+
+

gck_session_sign_async ()

+
void
+gck_session_sign_async (GckSession *self,
+                        GckObject *key,
+                        GckMechanism *mechanism,
+                        const guchar *input,
+                        gsize n_input,
+                        GCancellable *cancellable,
+                        GAsyncReadyCallback callback,
+                        gpointer user_data);
+

Sign data in a mechanism specific manner. This call will +return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to sign with.

 

mechanism

The mechanism type and parameters to use for signing.

 

input

data to sign.

[array length=n_input]

n_input

length of the data to sign

 

cancellable

A GCancellable which can be used to cancel the operation.

 

callback

Called when the operation completes.

 

user_data

A pointer to pass to the callback.

 
+
+
+
+
+

gck_session_sign_finish ()

+
guchar *
+gck_session_sign_finish (GckSession *self,
+                         GAsyncResult *result,
+                         gsize *n_result,
+                         GError **error);
+

Get the result of an signing operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

result

The result object passed to the callback.

 

n_result

A location to store the length of the result data.

 

error

A location to place error information.

 
+
+
+

Returns

+

the data that was signed, +or NULL if an error occurred.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_verify ()

+
gboolean
+gck_session_verify (GckSession *self,
+                    GckObject *key,
+                    gulong mech_type,
+                    const guchar *input,
+                    gsize n_input,
+                    const guchar *signature,
+                    gsize n_signature,
+                    GCancellable *cancellable,
+                    GError **error);
+

Verify data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to verify with.

 

mech_type

The mechanism type to use for verifying.

 

input

data to verify.

[array length=n_input]

n_input

length of the data to verify

 

signature

the signature.

[array length=n_signature]

n_signature

length of the signature

 

cancellable

Optional cancellation object, or NULL

 

error

A location to place an error.

 
+
+
+

Returns

+

TRUE if the data verified correctly, otherwise a failure or error occurred.

+
+
+
+
+

gck_session_verify_full ()

+
gboolean
+gck_session_verify_full (GckSession *self,
+                         GckObject *key,
+                         GckMechanism *mechanism,
+                         const guchar *input,
+                         gsize n_input,
+                         const guchar *signature,
+                         gsize n_signature,
+                         GCancellable *cancellable,
+                         GError **error);
+

Verify data in a mechanism specific manner. This call may +block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to verify with.

 

mechanism

The mechanism type and parameters to use for signing.

 

input

data to verify.

[array length=n_input]

n_input

the length of the data to verify

 

signature

the signature.

[array length=n_signature]

n_signature

length of the signature

 

cancellable

A GCancellable which can be used to cancel the operation.

 

error

A location to place an error.

 
+
+
+

Returns

+

TRUE if the data verified correctly, otherwise a failure or error occurred.

+
+
+
+
+

gck_session_verify_async ()

+
void
+gck_session_verify_async (GckSession *self,
+                          GckObject *key,
+                          GckMechanism *mechanism,
+                          const guchar *input,
+                          gsize n_input,
+                          const guchar *signature,
+                          gsize n_signature,
+                          GCancellable *cancellable,
+                          GAsyncReadyCallback callback,
+                          gpointer user_data);
+

Verify data in a mechanism specific manner. This call returns +immediately and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session.

 

key

The key to verify with.

 

mechanism

The mechanism type and parameters to use for signing.

 

input

data to verify.

[array length=n_input]

n_input

the length of the data to verify

 

signature

the signature.

[array length=n_signature]

n_signature

the length of the signature

 

cancellable

A GCancellable which can be used to cancel the operation.

 

callback

Called when the operation completes.

 

user_data

A pointer to pass to the callback.

 
+
+
+
+
+

gck_session_verify_finish ()

+
gboolean
+gck_session_verify_finish (GckSession *self,
+                           GAsyncResult *result,
+                           GError **error);
+

Get the result of an verify operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session.

 

result

The result object passed to the callback.

 

error

A location to place error information.

 
+
+
+

Returns

+

TRUE if the data verified correctly, otherwise a failure or error occurred.

+
+
+
+
+

gck_session_derive_key ()

+
GckObject *
+gck_session_derive_key (GckSession *self,
+                        GckObject *base,
+                        gulong mech_type,
+                        GckAttributes *attrs,
+                        GCancellable *cancellable,
+                        GError **error);
+

Derive a key from another key. This call may block for an +indefinite period.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

base

The key to derive from.

 

mech_type

The mechanism to use for derivation.

 

attrs

Additional attributes for the derived key.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the new derived key or NULL if the operation +failed.

+

[transfer full]

+
+
+
+
+

gck_session_derive_key_async ()

+
void
+gck_session_derive_key_async (GckSession *self,
+                              GckObject *base,
+                              GckMechanism *mechanism,
+                              GckAttributes *attrs,
+                              GCancellable *cancellable,
+                              GAsyncReadyCallback callback,
+                              gpointer user_data);
+

Derive a key from another key. This call will +return immediately and complete asynchronously.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

base

The key to derive from.

 

mechanism

The mechanism to use for derivation.

 

attrs

Additional attributes for the derived key.

 

cancellable

Optional cancellation object or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_derive_key_finish ()

+
GckObject *
+gck_session_derive_key_finish (GckSession *self,
+                               GAsyncResult *result,
+                               GError **error);
+

Get the result of a derive key operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session to use.

 

result

The async result passed to the callback.

 

error

A location to return an error.

 
+
+
+

Returns

+

the new derived key or NULL if the operation +failed.

+

[transfer full]

+
+
+
+
+

gck_session_derive_key_full ()

+
GckObject *
+gck_session_derive_key_full (GckSession *self,
+                             GckObject *base,
+                             GckMechanism *mechanism,
+                             GckAttributes *attrs,
+                             GCancellable *cancellable,
+                             GError **error);
+

Derive a key from another key. This call may block for an +indefinite period.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

base

The key to derive from.

 

mechanism

The mechanism to use for derivation.

 

attrs

Additional attributes for the derived key.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the new derived key or NULL if the operation +failed.

+

[transfer full]

+
+
+
+
+

gck_session_generate_key_pair ()

+
gboolean
+gck_session_generate_key_pair (GckSession *self,
+                               gulong mech_type,
+                               GckAttributes *public_attrs,
+                               GckAttributes *private_attrs,
+                               GckObject **public_key,
+                               GckObject **private_key,
+                               GCancellable *cancellable,
+                               GError **error);
+

Generate a new key pair of public and private keys. This call may block for an +indefinite period.

+

If the public_attrs + and/or private_attrs + GckAttributes is floating, it is +consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

mech_type

The mechanism type to use for key generation.

 

public_attrs

Additional attributes for the generated public key.

 

private_attrs

Additional attributes for the generated private key.

 

public_key

location to return the resulting public key.

[allow-none][out]

private_key

location to return the resulting private key.

[allow-none][out]

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

TRUE if the operation succeeded.

+
+
+
+
+

gck_session_generate_key_pair_async ()

+
void
+gck_session_generate_key_pair_async (GckSession *self,
+                                     GckMechanism *mechanism,
+                                     GckAttributes *public_attrs,
+                                     GckAttributes *private_attrs,
+                                     GCancellable *cancellable,
+                                     GAsyncReadyCallback callback,
+                                     gpointer user_data);
+

Generate a new key pair of public and private keys. This call will +return immediately and complete asynchronously.

+

If the public_attrs + and/or private_attrs + GckAttributes is floating, it is +consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

mechanism

The mechanism to use for key generation.

 

public_attrs

Additional attributes for the generated public key.

 

private_attrs

Additional attributes for the generated private key.

 

cancellable

Optional cancellation object or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_generate_key_pair_finish ()

+
gboolean
+gck_session_generate_key_pair_finish (GckSession *self,
+                                      GAsyncResult *result,
+                                      GckObject **public_key,
+                                      GckObject **private_key,
+                                      GError **error);
+

Get the result of a generate key pair operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

result

The async result passed to the callback.

 

public_key

a location to return the resulting public key.

[allow-none][out]

private_key

a location to return the resulting private key.

[allow-none][out]

error

A location to return an error.

 
+
+
+

Returns

+

TRUE if the operation succeeded.

+
+
+
+
+

gck_session_generate_key_pair_full ()

+
gboolean
+gck_session_generate_key_pair_full (GckSession *self,
+                                    GckMechanism *mechanism,
+                                    GckAttributes *public_attrs,
+                                    GckAttributes *private_attrs,
+                                    GckObject **public_key,
+                                    GckObject **private_key,
+                                    GCancellable *cancellable,
+                                    GError **error);
+

Generate a new key pair of public and private keys. This call may block for an +indefinite period.

+

If the public_attrs + and/or private_attrs + GckAttributes is floating, it is +consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

mechanism

The mechanism to use for key generation.

 

public_attrs

Additional attributes for the generated public key.

 

private_attrs

Additional attributes for the generated private key.

 

public_key

a location to return the resulting public key.

[allow-none][out]

private_key

a location to return the resulting private key.

[allow-none][out]

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

TRUE if the operation succeeded.

+
+
+
+
+

gck_session_get_options ()

+
GckSessionOptions
+gck_session_get_options (GckSession *self);
+

Get the options this session was opened with.

+
+

Parameters

+
+++++ + + + + + +

self

The session to get options from.

 
+
+
+

Returns

+

The session options.

+
+
+
+
+

gck_session_get_state ()

+
gulong
+gck_session_get_state (GckSession *self);
+

Get the session state. The state is the various PKCS#11 CKS_XXX flags.

+
+

Parameters

+
+++++ + + + + + +

self

the session

 
+
+
+

Returns

+

the session state

+
+
+
+
+

gck_session_init_pin ()

+
gboolean
+gck_session_init_pin (GckSession *self,
+                      const guchar *pin,
+                      gsize n_pin,
+                      GCancellable *cancellable,
+                      GError **error);
+

Initialize the user's pin on this slot that this session is opened on. +According to the PKCS#11 standards, the session must be logged in with +the CKU_SO user type.

+

This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

Initialize PIN for this session's slot.

 

pin

the user's PIN, or NULL for +protected authentication path.

[allow-none][array length=n_pin]

n_pin

the length of the PIN

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether successful or not.

+
+
+
+
+

gck_session_init_pin_async ()

+
void
+gck_session_init_pin_async (GckSession *self,
+                            const guchar *pin,
+                            gsize n_pin,
+                            GCancellable *cancellable,
+                            GAsyncReadyCallback callback,
+                            gpointer user_data);
+

Initialize the user's pin on this slot that this session is opened on. +According to the PKCS#11 standards, the session must be logged in with +the CKU_SO user type.

+

This call will return immediately and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

Initialize PIN for this session's slot.

 

pin

the user's PIN, or NULL for protected authentication path.

[allow-none][array length=n_pin]

n_pin

the length of the PIN

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_init_pin_finish ()

+
gboolean
+gck_session_init_pin_finish (GckSession *self,
+                             GAsyncResult *result,
+                             GError **error);
+

Get the result of initializing a user's PIN.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session.

 

result

The result passed to the callback.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether the operation was successful or not.

+
+
+
+
+

gck_session_set_pin ()

+
gboolean
+gck_session_set_pin (GckSession *self,
+                     const guchar *old_pin,
+                     gsize n_old_pin,
+                     const guchar *new_pin,
+                     gsize n_new_pin,
+                     GCancellable *cancellable,
+                     GError **error);
+

Change the user's pin on this slot that this session is opened on.

+

This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

Change the PIN for this session's slot.

 

old_pin

the user's old PIN, or NULL +for protected authentication path.

[allow-none][array length=n_old_pin]

n_old_pin

The length of the PIN.

 

new_pin

the user's new PIN, or NULL +for protected authentication path.

[allow-none][array length=n_new_pin]

n_new_pin

The length of the PIN.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether successful or not.

+
+
+
+
+

gck_session_set_pin_async ()

+
void
+gck_session_set_pin_async (GckSession *self,
+                           const guchar *old_pin,
+                           gsize n_old_pin,
+                           const guchar *new_pin,
+                           gsize n_new_pin,
+                           GCancellable *cancellable,
+                           GAsyncReadyCallback callback,
+                           gpointer user_data);
+

Change the user's pin on this slot that this session is opened on.

+

This call will return immediately and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

Change the PIN for this session's slot.

 

old_pin

the user's old PIN, or NULL +for protected authentication path.

[allow-none][array length=n_new_pin]

n_old_pin

the length of the old PIN

 

new_pin

the user's new PIN, or NULL +for protected authentication path.

[allow-none][array length=n_new_pin]

n_new_pin

the length of the new PIN

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_set_pin_finish ()

+
gboolean
+gck_session_set_pin_finish (GckSession *self,
+                            GAsyncResult *result,
+                            GError **error);
+

Get the result of changing a user's PIN.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session.

 

result

The result passed to the callback.

 

error

A location to return an error.

 
+
+
+

Returns

+

Whether the operation was successful or not.

+
+
+
+
+

gck_session_unwrap_key ()

+
GckObject *
+gck_session_unwrap_key (GckSession *self,
+                        GckObject *wrapper,
+                        gulong mech_type,
+                        const guchar *input,
+                        gsize n_input,
+                        GckAttributes *attrs,
+                        GCancellable *cancellable,
+                        GError **error);
+

Unwrap a key from a byte stream. This call may block for an +indefinite period.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

wrapper

The key to use for unwrapping.

 

mech_type

The mechanism to use for unwrapping.

 

input

the wrapped data as a byte stream.

[array length=n_input]

n_input

The length of the wrapped data.

 

attrs

Additional attributes for the unwrapped key.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the new unwrapped key or NULL if the +operation failed.

+

[transfer full]

+
+
+
+
+

gck_session_unwrap_key_async ()

+
void
+gck_session_unwrap_key_async (GckSession *self,
+                              GckObject *wrapper,
+                              GckMechanism *mechanism,
+                              const guchar *input,
+                              gsize n_input,
+                              GckAttributes *attrs,
+                              GCancellable *cancellable,
+                              GAsyncReadyCallback callback,
+                              gpointer user_data);
+

Unwrap a key from a byte stream. This call will +return immediately and complete asynchronously.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

wrapper

The key to use for unwrapping.

 

mechanism

The mechanism to use for unwrapping.

 

input

the wrapped data as a byte stream.

[array length=n_input]

n_input

The length of the wrapped data.

 

attrs

Additional attributes for the unwrapped key.

 

cancellable

Optional cancellation object or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_unwrap_key_finish ()

+
GckObject *
+gck_session_unwrap_key_finish (GckSession *self,
+                               GAsyncResult *result,
+                               GError **error);
+

Get the result of a unwrap key operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The session to use.

 

result

The async result passed to the callback.

 

error

A location to return an error.

 
+
+
+

Returns

+

the new unwrapped key or NULL if the operation +failed.

+

[transfer full]

+
+
+
+
+

gck_session_unwrap_key_full ()

+
GckObject *
+gck_session_unwrap_key_full (GckSession *self,
+                             GckObject *wrapper,
+                             GckMechanism *mechanism,
+                             const guchar *input,
+                             gsize n_input,
+                             GckAttributes *attrs,
+                             GCancellable *cancellable,
+                             GError **error);
+

Unwrap a key from a byte stream. This call may block for an +indefinite period.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

wrapper

The key to use for unwrapping.

 

mechanism

The mechanism to use for unwrapping.

 

input

the wrapped data as a byte stream.

[array length=n_input]

n_input

The length of the wrapped data.

 

attrs

Additional attributes for the unwrapped key.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the new unwrapped key or NULL if the operation +failed.

+

[transfer full]

+
+
+
+
+

gck_session_wrap_key ()

+
guchar *
+gck_session_wrap_key (GckSession *self,
+                      GckObject *wrapper,
+                      gulong mech_type,
+                      GckObject *wrapped,
+                      gsize *n_result,
+                      GCancellable *cancellable,
+                      GError **error);
+

Wrap a key into a byte stream. This call may block for an +indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

wrapper

The key to use for wrapping.

 

mech_type

The mechanism type to use for wrapping.

 

wrapped

The key to wrap.

 

n_result

A location in which to return the length of the wrapped data.

 

cancellable

A GCancellable or NULL

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the wrapped data or NULL +if the operation failed.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_wrap_key_async ()

+
void
+gck_session_wrap_key_async (GckSession *self,
+                            GckObject *wrapper,
+                            GckMechanism *mechanism,
+                            GckObject *wrapped,
+                            GCancellable *cancellable,
+                            GAsyncReadyCallback callback,
+                            gpointer user_data);
+

Wrap a key into a byte stream. This call will +return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

wrapper

The key to use for wrapping.

 

mechanism

The mechanism to use for wrapping.

 

wrapped

The key to wrap.

 

cancellable

Optional cancellation object or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_session_wrap_key_finish ()

+
guchar *
+gck_session_wrap_key_finish (GckSession *self,
+                             GAsyncResult *result,
+                             gsize *n_result,
+                             GError **error);
+

Get the result of a wrap key operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

result

The async result passed to the callback.

 

n_result

A location in which to return the length of the wrapped data.

 

error

A location to return an error.

 
+
+
+

Returns

+

the wrapped data or NULL +if the operation failed.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_wrap_key_full ()

+
guchar *
+gck_session_wrap_key_full (GckSession *self,
+                           GckObject *wrapper,
+                           GckMechanism *mechanism,
+                           GckObject *wrapped,
+                           gsize *n_result,
+                           GCancellable *cancellable,
+                           GError **error);
+

Wrap a key into a byte stream. This call may block for an +indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The session to use.

 

wrapper

The key to use for wrapping.

 

mechanism

The mechanism to use for wrapping.

 

wrapped

The key to wrap.

 

n_result

A location in which to return the length of the wrapped data.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

the wrapped data or NULL +if the operation failed.

+

[transfer full][array length=n_result]

+
+
+
+
+

gck_session_info_copy ()

+
GckSessionInfo *
+gck_session_info_copy (GckSessionInfo *session_info);
+

Make a new copy of a session info structure.

+
+

Parameters

+
+++++ + + + + + +

session_info

a session info structure

 
+
+
+

Returns

+

a new copy of the session info.

+

[transfer full]

+
+
+
+
+

gck_session_info_free ()

+
void
+gck_session_info_free (GckSessionInfo *session_info);
+

Free the GckSessionInfo structure and all associated memory.

+
+

Parameters

+
+++++ + + + + + +

session_info

Session info to free.

 
+
+
+
+
+

Types and Values

+
+

struct GckSession

+
struct GckSession;
+

Represents an open PKCS11 session.

+
+
+
+

struct GckSessionInfo

+
struct GckSessionInfo {
+	gulong slot_id;
+	gulong state;
+	gulong flags;
+	gulong device_error;
+};
+
+

Information about the session. This is analogous to a CK_SESSION_INFO structure.

+

When done with this structure, release it using gck_session_info_free().

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

gulong slot_id;

The handle of the PKCS11 slot that this session is opened on.

 

gulong state;

The user login state of the session.

 

gulong flags;

Various PKCS11 flags.

 

gulong device_error;

The last device error that occurred from an operation on this session.

 
+
+
+
+
+

struct GckMechanism

+
struct GckMechanism {
+	gulong type;
+	gconstpointer parameter;
+	gulong n_parameter;
+};
+
+

Represents a mechanism used with crypto operations.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

gulong type;

The mechanism type

 

gconstpointer parameter;

Mechanism specific data.

 

gulong n_parameter;

Length of mechanism specific data.

 
+
+
+
+
+

Property Details

+
+

The “app-data” property

+
  “app-data”                 gpointer
+

Raw PKCS#11 application data used to open the PKCS#11 session.

+

Flags: Write / Construct Only

+
+
+
+

The “handle” property

+
  “handle”                   gulong
+

The raw CK_SESSION_HANDLE handle of this session.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “interaction” property

+
  “interaction”              GTlsInteraction *
+

Interaction object used to ask the user for pins when opening +sessions. Used if the session_options of the enumerator have +GCK_SESSION_LOGIN_USER

+

Flags: Read / Write

+
+
+
+

The “module” property

+
  “module”                   GckModule *
+

The GckModule that this session is opened on.

+

Flags: Read

+
+
+
+

The “opening-flags” property

+
  “opening-flags”            gulong
+

Raw PKCS#11 flags used to open the PKCS#11 session.

+

Flags: Write / Construct Only

+
+
+
+

The “options” property

+
  “options”                  GckSessionOptions
+

The options this session was opened with.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “slot” property

+
  “slot”                     GckSlot *
+

The GckSlot this session is opened on.

+

Flags: Read / Write / Construct Only

+
+
+
+

Signal Details

+
+

The “discard-handle” signal

+
gboolean
+user_function (GckSession *session,
+               gulong      handle,
+               gpointer    user_data)
+

When a GckSession is being disposed of it emits this signal to allow +a session pool to pick up the handle and keep it around.

+

If no signal handler claims the handle, then it is closed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

session

The session.

 

handle

The handle being discarded.

 

user_data

user data set when the signal handler was connected.

 
+
+
+

Returns

+

Whether or not this handle was claimed.

+
+

Flags: Run Last

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/GckSlot.html b/docs/reference/gck/html/GckSlot.html new file mode 100644 index 0000000..89de5dc --- /dev/null +++ b/docs/reference/gck/html/GckSlot.html @@ -0,0 +1,1603 @@ + + + + +GckSlot: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckSlot

+

GckSlot — Represents a PKCS#11 slot that can contain a token.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckMechanismInfo * + +gck_mechanism_info_copy () +
+void + +gck_mechanism_info_free () +
#define +gck_mechanisms_length() +
#define +gck_mechanisms_at() +
+gboolean + +gck_mechanisms_check () +
+gboolean + +gck_slot_equal () +
+guint + +gck_slot_hash () +
+GckModule * + +gck_slot_get_module () +
+gulong + +gck_slot_get_handle () +
+GckSlotInfo * + +gck_slot_get_info () +
+gboolean + +gck_slot_match () +
+GckTokenInfo * + +gck_slot_get_token_info () +
+GArray * + +gck_slot_get_mechanisms () +
+GckMechanismInfo * + +gck_slot_get_mechanism_info () +
+gboolean + +gck_slot_has_flags () +
+GckEnumerator * + +gck_slot_enumerate_objects () +
+GckEnumerator * + +gck_slots_enumerate_objects () +
+GckSession * + +gck_slot_open_session () +
+GckSession * + +gck_slot_open_session_full () +
+void + +gck_slot_open_session_full_async () +
+void + +gck_slot_open_session_async () +
+GckSession * + +gck_slot_open_session_finish () +
+GckSlot * + +gck_slot_from_handle () +
+GckSlotInfo * + +gck_slot_info_copy () +
+void + +gck_slot_info_free () +
+GckTokenInfo * + +gck_token_info_copy () +
+void + +gck_token_info_free () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + +
gulonghandleRead / Write / Construct Only
+GckModule *moduleRead / Write / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
structGckMechanismInfo
enumGckSessionOptions
structGckSlot
structGckSlotInfo
structGckTokenInfo
+
+
+

Object Hierarchy

+
    GBoxed
+    ├── GckMechanismInfo
+    ├── GckSlotInfo
+    ╰── GckTokenInfo
+    GObject
+    ╰── GckSlot
+
+
+
+

Description

+

A PKCS11 slot can contain a token. As an example, a slot might be a card reader, and the token +the card. If the PKCS#11 module is not a hardware driver, often the slot and token are equivalent.

+
+
+

Functions

+
+

gck_mechanism_info_copy ()

+
GckMechanismInfo *
+gck_mechanism_info_copy (GckMechanismInfo *mech_info);
+

Make a copy of the mechanism info.

+
+

Parameters

+
+++++ + + + + + +

mech_info

a mechanism info

 
+
+
+

Returns

+

a newly allocated copy mechanism info.

+

[transfer full]

+
+
+
+
+

gck_mechanism_info_free ()

+
void
+gck_mechanism_info_free (GckMechanismInfo *mech_info);
+

Free the GckMechanismInfo and associated resources.

+
+

Parameters

+
+++++ + + + + + +

mech_info

The mechanism info to free, or NULL.

 
+
+
+
+
+

gck_mechanisms_length()

+
#define             gck_mechanisms_length(a)                ((a)->len)
+
+

Get the number of GckMechanismInfo in the set.

+
+

Parameters

+
+++++ + + + + + +

a

A GckMechanisms set.

 
+
+
+

Returns

+

The number in the set.

+
+
+
+
+

gck_mechanisms_at()

+
#define             gck_mechanisms_at(a, i)                 (g_array_index (a, CK_MECHANISM_TYPE, i))
+
+

Get a specific mechanism in a the set.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

a

A GckMechanisms set.

 

i

The index of a mechanism

 
+
+
+

Returns

+

the mechanism

+
+
+
+
+

gck_mechanisms_check ()

+
gboolean
+gck_mechanisms_check (GArray *mechanisms,
+                      ...);
+

Check whether all the mechanism types are in the list.

+

The arguments should be a list of CKM_XXX mechanism types. The last argument +should be GCK_INVALID.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mechanisms

A list of mechanisms, perhaps +retrieved from gck_slot_get_mechanisms().

[element-type ulong]

...

A list of mechanism types followed by GCK_INVALID.

 
+
+
+

Returns

+

Whether the mechanism is in the list or not.

+
+
+
+
+

gck_slot_equal ()

+
gboolean
+gck_slot_equal (gconstpointer slot1,
+                gconstpointer slot2);
+

Checks equality of two slots. Two GckSlot objects can point to the same +underlying PKCS#11 slot.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

slot1

a pointer to the first GckSlot.

[type Gck.Slot]

slot2

a pointer to the second GckSlot.

[type Gck.Slot]
+
+
+

Returns

+

TRUE if slot1 and slot2 are equal. FALSE if either is not a GckSlot.

+
+
+
+
+

gck_slot_hash ()

+
guint
+gck_slot_hash (gconstpointer slot);
+

Create a hash value for the GckSlot.

+

This function is intended for easily hashing a GckSlot to add to +a GHashTable or similar data structure.

+
+

Parameters

+
+++++ + + + + + +

slot

a pointer to a GckSlot.

[type Gck.Slot]
+
+
+

Returns

+

An integer that can be used as a hash value, or 0 if invalid.

+
+
+
+
+

gck_slot_get_module ()

+
GckModule *
+gck_slot_get_module (GckSlot *self);
+

Get the module that this slot is on.

+
+

Parameters

+
+++++ + + + + + +

self

The slot to get the module for.

 
+
+
+

Returns

+

The module, you must unreference this after +you're done with it.

+

[transfer full]

+
+
+
+
+

gck_slot_get_handle ()

+
gulong
+gck_slot_get_handle (GckSlot *self);
+

Get the raw PKCS#11 handle of a slot.

+
+

Parameters

+
+++++ + + + + + +

self

The slot to get the handle of.

 
+
+
+

Returns

+

the raw CK_SLOT_ID handle

+
+
+
+
+

gck_slot_get_info ()

+
GckSlotInfo *
+gck_slot_get_info (GckSlot *self);
+

Get the information for this slot.

+
+

Parameters

+
+++++ + + + + + +

self

The slot to get info for.

 
+
+
+

Returns

+

the slot information, when done, use gck_slot_info_free() +to release it.

+

[transfer full]

+
+
+
+
+

gck_slot_match ()

+
gboolean
+gck_slot_match (GckSlot *self,
+                GckUriData *uri);
+

Check whether the PKCS#11 URI matches the slot

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the slot to match

 

uri

the uri to match against the slot

 
+
+
+

Returns

+

whether the URI matches or not

+
+
+
+
+

gck_slot_get_token_info ()

+
GckTokenInfo *
+gck_slot_get_token_info (GckSlot *self);
+

Get the token information for this slot.

+
+

Parameters

+
+++++ + + + + + +

self

The slot to get info for.

 
+
+
+

Returns

+

the token information; when done, use gck_token_info_free() +to release it.

+

[transfer full]

+
+
+
+
+

gck_slot_get_mechanisms ()

+
GArray *
+gck_slot_get_mechanisms (GckSlot *self);
+

Get the available mechanisms for this slot.

+
+

Parameters

+
+++++ + + + + + +

self

The slot to get mechanisms for.

 
+
+
+

Returns

+

a list of the mechanisms +for this slot, which should be freed with g_array_free().

+

[transfer full][element-type ulong]

+
+
+
+
+

gck_slot_get_mechanism_info ()

+
GckMechanismInfo *
+gck_slot_get_mechanism_info (GckSlot *self,
+                             gulong mech_type);
+

Get information for the specified mechanism.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The slot to get mechanism info from.

 

mech_type

The mechanisms type to get info for.

 
+
+
+

Returns

+

the mechanism information, or NULL if failed; use +gck_mechanism_info_free() when done with it.

+

[transfer full]

+
+
+
+
+

gck_slot_has_flags ()

+
gboolean
+gck_slot_has_flags (GckSlot *self,
+                    gulong flags);
+

Check if the PKCS11 slot has the given flags.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The GckSlot object.

 

flags

The flags to check.

 
+
+
+

Returns

+

Whether one or more flags exist.

+
+
+
+
+

gck_slot_enumerate_objects ()

+
GckEnumerator *
+gck_slot_enumerate_objects (GckSlot *self,
+                            GckAttributes *match,
+                            GckSessionOptions options);
+

Setup an enumerator for listing matching objects on the slot.

+

If the match + GckAttributes is floating, it is consumed.

+

This call will not block but will return an enumerator immediately.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a GckSlot to enumerate objects on

 

match

attributes that the objects must match, or empty for all objects

 

options

options for opening a session

 
+
+
+

Returns

+

a new enumerator.

+

[transfer full]

+
+
+
+
+

gck_slots_enumerate_objects ()

+
GckEnumerator *
+gck_slots_enumerate_objects (GList *slots,
+                             GckAttributes *match,
+                             GckSessionOptions options);
+

Setup an enumerator for listing matching objects on the slots.

+

If the match + GckAttributes is floating, it is consumed.

+

This call will not block but will return an enumerator immediately.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

slots

a list of GckSlot to enumerate objects on.

[element-type Gck.Slot]

match

attributes that the objects must match, or empty for all objects

 

options

options for opening a session

 
+
+
+

Returns

+

a new enumerator.

+

[transfer full]

+
+
+
+
+

gck_slot_open_session ()

+
GckSession *
+gck_slot_open_session (GckSlot *self,
+                       GckSessionOptions options,
+                       GCancellable *cancellable,
+                       GError **error);
+

Open a session on the slot. If the 'auto reuse' setting is set, +then this may be a recycled session with the same flags.

+

This call may block for an indefinite period.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The slot ot open a session on.

 

options

The GckSessionOptions to open a session with.

 

cancellable

An optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

a new session or NULL if an error occurs.

+

[transfer full]

+
+
+
+
+

gck_slot_open_session_full ()

+
GckSession *
+gck_slot_open_session_full (GckSlot *self,
+                            GckSessionOptions options,
+                            gulong pkcs11_flags,
+                            gpointer app_data,
+                            CK_NOTIFY notify,
+                            GCancellable *cancellable,
+                            GError **error);
+

Open a session on the slot. If the 'auto reuse' setting is set, +then this may be a recycled session with the same flags.

+

This call may block for an indefinite period.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The slot to open a session on.

 

options

The options to open the new session with.

 

pkcs11_flags

Additional raw PKCS#11 flags.

 

app_data

Application data for notification callback.

 

notify

PKCS#11 notification callback.

 

cancellable

Optional cancellation object, or NULL.

 

error

A location to return an error, or NULL.

 
+
+
+

Returns

+

a new session or NULL if an error occurs.

+

[transfer full]

+
+
+
+
+

gck_slot_open_session_full_async ()

+
void
+gck_slot_open_session_full_async (GckSlot *self,
+                                  GckSessionOptions options,
+                                  gulong pkcs11_flags,
+                                  gpointer app_data,
+                                  CK_NOTIFY notify,
+                                  GCancellable *cancellable,
+                                  GAsyncReadyCallback callback,
+                                  gpointer user_data);
+

Open a session on the slot. If the 'auto reuse' setting is set, +then this may be a recycled session with the same flags.

+

This call will return immediately and complete asynchronously.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The slot to open a session on.

 

options

Options to open the new session with.

 

pkcs11_flags

Additional raw PKCS#11 flags.

 

app_data

Application data for notification callback.

 

notify

PKCS#11 notification callback.

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_slot_open_session_async ()

+
void
+gck_slot_open_session_async (GckSlot *self,
+                             GckSessionOptions options,
+                             GCancellable *cancellable,
+                             GAsyncReadyCallback callback,
+                             gpointer user_data);
+

Open a session on the slot. If the 'auto reuse' setting is set, +then this may be a recycled session with the same flags.

+

This call will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The slot to open a session on.

 

options

The options to open the new session with.

 

cancellable

Optional cancellation object, or NULL.

 

callback

Called when the operation completes.

 

user_data

Data to pass to the callback.

 
+
+
+
+
+

gck_slot_open_session_finish ()

+
GckSession *
+gck_slot_open_session_finish (GckSlot *self,
+                              GAsyncResult *result,
+                              GError **error);
+

Get the result of an open session operation. If the 'auto reuse' setting is set, +then this may be a recycled session with the same flags.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The slot to open a session on.

 

result

The result passed to the callback.

 

error

A location to return an error or NULL.

 
+
+
+

Returns

+

the new session or NULL if an error occurs.

+

[transfer full]

+
+
+
+
+

gck_slot_from_handle ()

+
GckSlot *
+gck_slot_from_handle (GckModule *module,
+                      gulong slot_id);
+

Create a new GckSlot object for a raw PKCS#11 handle.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

module

The module that this slot is on.

 

slot_id

The raw PKCS#11 handle or slot id of this slot.

 
+
+
+

Returns

+

The new GckSlot object.

+

[transfer full]

+
+
+
+
+

gck_slot_info_copy ()

+
GckSlotInfo *
+gck_slot_info_copy (GckSlotInfo *slot_info);
+

Make a copy of the slot info.

+
+

Parameters

+
+++++ + + + + + +

slot_info

a slot info

 
+
+
+

Returns

+

a newly allocated copy slot info.

+

[transfer full]

+
+
+
+
+

gck_slot_info_free ()

+
void
+gck_slot_info_free (GckSlotInfo *slot_info);
+

Free the GckSlotInfo and associated resources.

+
+

Parameters

+
+++++ + + + + + +

slot_info

The slot info to free, or NULL.

 
+
+
+
+
+

gck_token_info_copy ()

+
GckTokenInfo *
+gck_token_info_copy (GckTokenInfo *token_info);
+

Make a copy of the token info.

+
+

Parameters

+
+++++ + + + + + +

token_info

a token info

 
+
+
+

Returns

+

a newly allocated copy token info.

+

[transfer full]

+
+
+
+
+

gck_token_info_free ()

+
void
+gck_token_info_free (GckTokenInfo *token_info);
+

Free the GckTokenInfo and associated resources.

+
+

Parameters

+
+++++ + + + + + +

token_info

The token info to free, or NULL.

 
+
+
+
+
+

Types and Values

+
+

struct GckMechanismInfo

+
struct GckMechanismInfo {
+	gulong min_key_size;
+	gulong max_key_size;
+	gulong flags;
+};
+
+

Represents information about a PKCS11 mechanism.

+

This is analogous to a CK_MECHANISM_INFO structure.

+

When you're done with this structure it should be released with +gck_mechanism_info_free().

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

gulong min_key_size;

The minimum key size that can be used with this mechanism.

 

gulong max_key_size;

The maximum key size that can be used with this mechanism.

 

gulong flags;

Various PKCS11 flags that apply to this mechanism.

 
+
+
+
+
+

enum GckSessionOptions

+

Options for creating sessions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

GCK_SESSION_READ_ONLY

+

Open session as read only

+
 

GCK_SESSION_READ_WRITE

+

Open sessions as read/write

+
 

GCK_SESSION_LOGIN_USER

+

Login as user on new sessions

+
 

GCK_SESSION_AUTHENTICATE

+

Authenticate as necessary

+
 
+
+
+
+
+

struct GckSlot

+
struct GckSlot;
+

Represents a PKCS11 slot.

+
+
+
+

struct GckSlotInfo

+
struct GckSlotInfo {
+	gchar *slot_description;
+	gchar *manufacturer_id;
+	gulong flags;
+	guint8 hardware_version_major;
+	guint8 hardware_version_minor;
+	guint8 firmware_version_major;
+	guint8 firmware_version_minor;
+};
+
+

Represents information about a PKCS11 slot.

+

This is analogous to a CK_SLOT_INFO structure, but the +strings are far more usable.

+

When you're done with this structure it should be released with +gck_slot_info_free().

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

gchar *slot_description;

Description of the slot.

 

gchar *manufacturer_id;

The manufacturer of this slot.

 

gulong flags;

Various PKCS11 flags that apply to this slot.

 

guint8 hardware_version_major;

The major version of the hardware.

 

guint8 hardware_version_minor;

The minor version of the hardware.

 

guint8 firmware_version_major;

The major version of the firmware.

 

guint8 firmware_version_minor;

The minor version of the firmware.

 
+
+
+
+
+

struct GckTokenInfo

+
struct GckTokenInfo {
+	gchar *label;
+	gchar *manufacturer_id;
+	gchar *model;
+	gchar *serial_number;
+	gulong flags;
+	glong max_session_count;
+	glong session_count;
+	glong max_rw_session_count;
+	glong rw_session_count;
+	glong max_pin_len;
+	glong min_pin_len;
+	glong total_public_memory;
+	glong free_public_memory;
+	glong total_private_memory;
+	glong free_private_memory;
+	guint8 hardware_version_major;
+	guint8 hardware_version_minor;
+	guint8 firmware_version_major;
+	guint8 firmware_version_minor;
+	gint64 utc_time;
+};
+
+

Represents information about a PKCS11 token.

+

This is analogous to a CK_TOKEN_INFO structure, but the +strings are far more usable.

+

When you're done with this structure it should be released with +gck_token_info_free().

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

gchar *label;

The displayable token label.

 

gchar *manufacturer_id;

The manufacturer of this slot.

 

gchar *model;

The token model number as a string.

 

gchar *serial_number;

The token serial number as a string.

 

gulong flags;

Various PKCS11 flags that apply to this token.

 

glong max_session_count;

The maximum number of sessions allowed on this token.

 

glong session_count;

The number of sessions open on this token.

 

glong max_rw_session_count;

The maximum number of read/write sessions allowed on this token.

 

glong rw_session_count;

The number of sessions open on this token.

 

glong max_pin_len;

The maximum length of a PIN for locking this token.

 

glong min_pin_len;

The minimum length of a PIN for locking this token.

 

glong total_public_memory;

The total amount of memory on this token for storing public objects.

 

glong free_public_memory;

The available amount of memory on this token for storing public objects.

 

glong total_private_memory;

The total amount of memory on this token for storing private objects.

 

glong free_private_memory;

The available amount of memory on this token for storing private objects.

 

guint8 hardware_version_major;

The major version of the hardware.

 

guint8 hardware_version_minor;

The minor version of the hardware.

 

guint8 firmware_version_major;

The major version of the firmware.

 

guint8 firmware_version_minor;

The minor version of the firmware.

 

gint64 utc_time;

If the token has a hardware clock, this is set to the number of seconds since the epoch.

 
+
+
+
+
+

Property Details

+
+

The “handle” property

+
  “handle”                   gulong
+

The raw CK_SLOT_ID handle of this slot.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “module” property

+
  “module”                   GckModule *
+

The PKCS11 object that this slot is a part of.

+

Flags: Read / Write / Construct Only

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/annotation-glossary.html b/docs/reference/gck/html/annotation-glossary.html new file mode 100644 index 0000000..c3128d7 --- /dev/null +++ b/docs/reference/gck/html/annotation-glossary.html @@ -0,0 +1,62 @@ + + + + +Annotation Glossary: Gck Library Reference Manual + + + + + + + + + + + + + + + +
+

+Annotation Glossary

+

A

+
allow-none
+

NULL is OK, both for passing and for returning.

+
array
+

Parameter points to an array of items.

+

E

+
element-type
+

Generics and defining elements of containers and arrays.

+

O

+
out
+

Parameter for returning results. Default is transfer full.

+

R

+
rename-to
+

Rename the original symbol's name to SYMBOL.

+

S

+
skip
+

Exposed in C code, not necessarily available in other languages.

+

T

+
transfer full
+

Free data after the code is done.

+
transfer none
+

Don't free data after the code is done.

+
type
+

Override the parsed C type with given type.

+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/gck-Errors.html b/docs/reference/gck/html/gck-Errors.html new file mode 100644 index 0000000..0c2efb0 --- /dev/null +++ b/docs/reference/gck/html/gck-Errors.html @@ -0,0 +1,124 @@ + + + + +Errors: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Errors

+

Errors — Gck Errors and error codes.

+
+
+

Functions

+
++++ + + + + +
const gchar * + +gck_message_from_rv () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineGCK_VENDOR_CODE
#defineGCK_ERROR
+
+
+

Description

+

Errors are returned as GError structures. The code member of GError +contains the raw PKCS11 CK_RV result value.

+
+
+

Functions

+
+

gck_message_from_rv ()

+
const gchar *
+gck_message_from_rv (gulong rv);
+

Get a message for a PKCS#11 return value or error code. Do not +pass CKR_OK or other such non errors to this function.

+
+

Parameters

+
+++++ + + + + + +

rv

The PKCS#11 return value to get a message for.

 
+
+
+

Returns

+

The user readable message.

+
+
+
+
+

Types and Values

+
+

GCK_VENDOR_CODE

+
#define             GCK_VENDOR_CODE                         0x47434B00 /* GCK */
+
+

Custom PKCS11 errors that originate from the gck library, are +based at this error code.

+
+
+
+

GCK_ERROR

+
#define             GCK_ERROR                               (gck_error_get_quark ())
+
+

The error domain for gck library errors.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/gck-GckAttribute.html b/docs/reference/gck/html/gck-GckAttribute.html new file mode 100644 index 0000000..1582a36 --- /dev/null +++ b/docs/reference/gck/html/gck-GckAttribute.html @@ -0,0 +1,1242 @@ + + + + +GckAttribute: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckAttribute

+

GckAttribute — A PKCS11 attribute.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+gboolean + +gck_attribute_is_invalid () +
+gboolean + +gck_attribute_get_boolean () +
+gulong + +gck_attribute_get_ulong () +
+gchar * + +gck_attribute_get_string () +
+void + +gck_attribute_get_date () +
const guchar * + +gck_attribute_get_data () +
+void + +gck_attribute_dump () +
+gboolean + +gck_attribute_equal () +
+guint + +gck_attribute_hash () +
+void + +gck_attribute_init () +
+void + +gck_attribute_init_boolean () +
+void + +gck_attribute_init_date () +
+void + +gck_attribute_init_string () +
+void + +gck_attribute_init_ulong () +
+void + +gck_attribute_init_empty () +
+void + +gck_attribute_init_invalid () +
+void + +gck_attribute_init_copy () +
+GckAttribute * + +gck_attribute_new () +
+GckAttribute * + +gck_attribute_new_boolean () +
+GckAttribute * + +gck_attribute_new_date () +
+GckAttribute * + +gck_attribute_new_string () +
+GckAttribute * + +gck_attribute_new_ulong () +
+GckAttribute * + +gck_attribute_new_empty () +
+GckAttribute * + +gck_attribute_new_invalid () +
+GckAttribute * + +gck_attribute_dup () +
+void + +gck_attribute_clear () +
+void + +gck_attribute_free () +
+
+
+

Types and Values

+
++++ + + + + +
structGckAttribute
+
+
+

Description

+

This structure represents a PKCS11 CK_ATTRIBUTE. These attributes contain i +about a PKCS11 object. Use gck_object_get() or gck_object_set() to set and +attributes on an object.

+

Although you are free to allocate a GckAttribute in your own code, no functions in +this library will operate on such an attribute.

+
+
+

Functions

+
+

gck_attribute_is_invalid ()

+
gboolean
+gck_attribute_is_invalid (const GckAttribute *attr);
+

Check if the PKCS#11 attribute represents 'invalid' or 'not found' +according to the PKCS#11 spec. That is, having length +of (CK_ULONG)-1.

+
+

Parameters

+
+++++ + + + + + +

attr

The attribute to check.

 
+
+
+

Returns

+

Whether the attribute represents invalid or not.

+
+
+
+
+

gck_attribute_get_boolean ()

+
gboolean
+gck_attribute_get_boolean (const GckAttribute *attr);
+

Get the CK_BBOOL of a PKCS#11 attribute. No conversion +is performed. It is an error to pass an attribute to this +function unless you're know it's supposed to contain a +boolean value.

+
+

Parameters

+
+++++ + + + + + +

attr

The attribute to retrieve value from.

 
+
+
+

Returns

+

The boolean value of the attribute.

+
+
+
+
+

gck_attribute_get_ulong ()

+
gulong
+gck_attribute_get_ulong (const GckAttribute *attr);
+

Get the CK_ULONG value of a PKCS#11 attribute. No +conversion is performed. It is an error to pass an attribute +to this function unless you're know it's supposed to contain +a value of the right type.

+
+

Parameters

+
+++++ + + + + + +

attr

The attribute to retrieve value from.

 
+
+
+

Returns

+

The ulong value of the attribute.

+
+
+
+
+

gck_attribute_get_string ()

+
gchar *
+gck_attribute_get_string (const GckAttribute *attr);
+

Get the string value of a PKCS#11 attribute. No +conversion is performed. It is an error to pass an attribute +to this function unless you're know it's supposed to contain +a value of the right type.

+
+

Parameters

+
+++++ + + + + + +

attr

The attribute to retrieve value from.

 
+
+
+

Returns

+

a null terminated string, to be freed with +g_free(), or NULL if the value was invalid.

+

[allow-none]

+
+
+
+
+

gck_attribute_get_date ()

+
void
+gck_attribute_get_date (const GckAttribute *attr,
+                        GDate *value);
+

Get the CK_DATE of a PKCS#11 attribute. No +conversion is performed. It is an error to pass an attribute +to this function unless you're know it's supposed to contain +a value of the right type.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr

The attribute to retrieve value from.

 

value

The date value to fill in with the parsed date.

 
+
+
+
+
+

gck_attribute_get_data ()

+
const guchar *
+gck_attribute_get_data (const GckAttribute *attr,
+                        gsize *length);
+

Get the raw value in the attribute.

+

This is useful from scripting languages. C callers will generally +access the GckAttribute struct directly.

+

This function will NULL if the attribute contains empty or invalid +data. The returned data must not be modified and is only valid +as long as this attribute +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr

an attribute

 

length

the length of the returned data

 
+
+
+

Returns

+

the value data or NULL.

+

[transfer none][array length=length]

+
+
+
+
+

gck_attribute_dump ()

+
void
+gck_attribute_dump (const GckAttribute *attr);
+

Dump the specified attribute using g_printerr().

+
+

Parameters

+
+++++ + + + + + +

attr

The attribute

 
+
+
+
+
+

gck_attribute_equal ()

+
gboolean
+gck_attribute_equal (gconstpointer attr1,
+                     gconstpointer attr2);
+

Compare two attributes. Useful with GHashTable.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr1

first attribute to compare.

[type Gck.Attribute]

attr2

second attribute to compare.

[type Gck.Attribute]
+
+
+

Returns

+

TRUE if the attributes are equal.

+
+
+
+
+

gck_attribute_hash ()

+
guint
+gck_attribute_hash (gconstpointer attr);
+

Hash an attribute for use in GHashTable keys.

+
+

Parameters

+
+++++ + + + + + +

attr

attribute to hash.

[type Gck.Attribute]
+
+
+

Returns

+

the hash code

+
+
+
+
+

gck_attribute_init ()

+
void
+gck_attribute_init (GckAttribute *attr,
+                    gulong attr_type,
+                    const guchar *value,
+                    gsize length);
+

Initialize a PKCS#11 attribute. This copies the value memory +into an internal buffer.

+

When done with the attribute you should use gck_attribute_clear() +to free the internal memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

attr

an uninitialized attribute

 

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

The raw value of the attribute.

[array length=length]

length

The length of the raw value.

 
+
+
+
+
+

gck_attribute_init_boolean ()

+
void
+gck_attribute_init_boolean (GckAttribute *attr,
+                            gulong attr_type,
+                            gboolean value);
+

Initialize a PKCS#11 attribute to boolean. This will result +in a CK_BBOOL attribute from the PKCS#11 specs.

+

When done with the attribute you should use gck_attribute_clear() +to free the internal memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attr

an uninitialized attribute

 

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the boolean value of the attribute

 
+
+
+
+
+

gck_attribute_init_date ()

+
void
+gck_attribute_init_date (GckAttribute *attr,
+                         gulong attr_type,
+                         const GDate *value);
+

Initialize a PKCS#11 attribute to a date. This will result +in a CK_DATE attribute from the PKCS#11 specs.

+

When done with the attribute you should use gck_attribute_clear() +to free the internal memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attr

an uninitialized attribute

 

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the date value of the attribute

 
+
+
+
+
+

gck_attribute_init_string ()

+
void
+gck_attribute_init_string (GckAttribute *attr,
+                           gulong attr_type,
+                           const gchar *value);
+

Initialize a PKCS#11 attribute to a string. This will result +in an attribute containing the text, but not the null terminator. +The text in the attribute will be of the same encoding as you pass +to this function.

+

When done with the attribute you should use gck_attribute_clear() +to free the internal memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attr

an uninitialized attribute

 

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the null terminated string value of the attribute

 
+
+
+
+
+

gck_attribute_init_ulong ()

+
void
+gck_attribute_init_ulong (GckAttribute *attr,
+                          gulong attr_type,
+                          gulong value);
+

Initialize a PKCS#11 attribute to a unsigned long. This will result +in a CK_ULONG attribute from the PKCS#11 specs.

+

When done with the attribute you should use gck_attribute_clear() +to free the internal memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attr

an uninitialized attribute

 

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the ulong value of the attribute

 
+
+
+
+
+

gck_attribute_init_empty ()

+
void
+gck_attribute_init_empty (GckAttribute *attr,
+                          gulong attr_type);
+

Initialize a PKCS#11 attribute to an empty state. The attribute +type will be set, but no data will be set.

+

When done with the attribute you should use gck_attribute_clear() +to free the internal memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr

an uninitialized attribute

 

attr_type

the PKCS#11 attribute type to set on the attribute

 
+
+
+
+
+

gck_attribute_init_invalid ()

+
void
+gck_attribute_init_invalid (GckAttribute *attr,
+                            gulong attr_type);
+

Initialize a PKCS#11 attribute to an 'invalid' or 'not found' +state. Specifically this sets the value length to (CK_ULONG)-1 +as specified in the PKCS#11 specification.

+

When done with the attribute you should use gck_attribute_clear() +to free the internal memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr

an uninitialized attribute

 

attr_type

the PKCS#11 attribute type to set on the attribute

 
+
+
+
+
+

gck_attribute_init_copy ()

+
void
+gck_attribute_init_copy (GckAttribute *dest,
+                         const GckAttribute *src);
+

Initialize a PKCS#11 attribute as a copy of another attribute. +This copies the value memory as well.

+

When done with the copied attribute you should use +gck_attribute_clear() to free the internal memory.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dest

An uninitialized attribute.

 

src

An attribute to copy.

 
+
+
+
+
+

gck_attribute_new ()

+
GckAttribute *
+gck_attribute_new (gulong attr_type,
+                   const guchar *value,
+                   gsize length);
+

Create a new PKCS#11 attribute. The value will be copied +into the new attribute.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the raw value of the attribute

 

length

the length of the attribute

 
+
+
+

Returns

+

the new attribute; when done with the attribute +use gck_attribute_free() to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_new_boolean ()

+
GckAttribute *
+gck_attribute_new_boolean (gulong attr_type,
+                           gboolean value);
+

Initialize a PKCS#11 attribute to boolean. This will result +in a CK_BBOOL attribute from the PKCS#11 specs.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the boolean value of the attribute

 
+
+
+

Returns

+

the new attribute; when done with the attribute u +gck_attribute_free() to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_new_date ()

+
GckAttribute *
+gck_attribute_new_date (gulong attr_type,
+                        const GDate *value);
+

Initialize a PKCS#11 attribute to a date. This will result +in a CK_DATE attribute from the PKCS#11 specs.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the date value of the attribute

 
+
+
+

Returns

+

the new attribute; when done with the attribute u +gck_attribute_free() to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_new_string ()

+
GckAttribute *
+gck_attribute_new_string (gulong attr_type,
+                          const gchar *value);
+

Initialize a PKCS#11 attribute to a string. This will result +in an attribute containing the text, but not the null terminator. +The text in the attribute will be of the same encoding as you pass +to this function.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the null-terminated string value of the attribute

 
+
+
+

Returns

+

the new attribute; when done with the attribute u +gck_attribute_free() to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_new_ulong ()

+
GckAttribute *
+gck_attribute_new_ulong (gulong attr_type,
+                         gulong value);
+

Initialize a PKCS#11 attribute to a unsigned long. This will result +in a CK_ULONG attribute from the PKCS#11 specs.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

attr_type

the PKCS#11 attribute type to set on the attribute

 

value

the ulong value of the attribute

 
+
+
+

Returns

+

the new attribute; when done with the attribute u +gck_attribute_free() to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_new_empty ()

+
GckAttribute *
+gck_attribute_new_empty (gulong attr_type);
+

Create a new PKCS#11 attribute with empty data.

+
+

Parameters

+
+++++ + + + + + +

attr_type

the PKCS#11 attribute type to set on the attribute

 
+
+
+

Returns

+

the new attribute; when done with the attribute +use gck_attribute_free() to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_new_invalid ()

+
GckAttribute *
+gck_attribute_new_invalid (gulong attr_type);
+

Create a new PKCS#11 attribute as 'invalid' or 'not found' +state. Specifically this sets the value length to (CK_ULONG)-1 +as specified in the PKCS#11 specification.

+
+

Parameters

+
+++++ + + + + + +

attr_type

the PKCS#11 attribute type to set on the attribute

 
+
+
+

Returns

+

the new attribute; when done with the attribute +use gck_attribute_free() to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_dup ()

+
GckAttribute *
+gck_attribute_dup (const GckAttribute *attr);
+

Duplicate the PKCS#11 attribute. All value memory is +also copied.

+

The attr + must have been allocated or initialized by a Gck function or +the results of this function are undefined.

+
+

Parameters

+
+++++ + + + + + +

attr

the attribute to duplicate

 
+
+
+

Returns

+

the duplicated attribute; use gck_attribute_free() +to free it.

+

[transfer full]

+
+
+
+
+

gck_attribute_clear ()

+
void
+gck_attribute_clear (GckAttribute *attr);
+

Clear allocated memory held by a GckAttribute.

+

This attribute must have been allocated by a Gck library function, or +the results of this method are undefined.

+

The type of the attribute will remain set.

+
+

Parameters

+
+++++ + + + + + +

attr

Attribute to clear.

 
+
+
+
+
+

gck_attribute_free ()

+
void
+gck_attribute_free (gpointer attr);
+

Free an attribute and its allocated memory. These is usually +used with attributes that are allocated by gck_attribute_new() +or a similar function.

+
+

Parameters

+
+++++ + + + + + +

attr

attribute to free.

[type Gck.Attribute]
+
+
+
+
+

Types and Values

+
+

struct GckAttribute

+
struct GckAttribute {
+	gulong type;
+	guchar *value;
+	gulong length;
+};
+
+

This structure represents a PKCS11 CK_ATTRIBUTE.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

gulong type;

The attribute type, such as CKA_LABEL.

 

guchar *value;

The value of the attribute. May be NULL.

[array length=length]

gulong length;

The length of the attribute. May be GCK_INVALID if the attribute is invalid.

 
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/gck-GckModule-lists.html b/docs/reference/gck/html/gck-GckModule-lists.html new file mode 100644 index 0000000..168e2a9 --- /dev/null +++ b/docs/reference/gck/html/gck-GckModule-lists.html @@ -0,0 +1,566 @@ + + + + +GckModule lists: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GckModule lists

+

GckModule lists — Dealing with lists of PKCS#11 modules.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GList * + +gck_modules_initialize_registered () +
+void + +gck_modules_initialize_registered_async () +
+GList * + +gck_modules_initialize_registered_finish () +
+GckEnumerator * + +gck_modules_enumerate_objects () +
+GckEnumerator * + +gck_modules_enumerate_uri () +
+GList * + +gck_modules_get_slots () +
+GckObject * + +gck_modules_object_for_uri () +
+GList * + +gck_modules_objects_for_uri () +
+GckSlot * + +gck_modules_token_for_uri () +
+GList * + +gck_modules_tokens_for_uri () +
+
+
+

Description

+

These functions are useful for dealing with lists of modules, and performing +operations on all of them.

+
+
+

Functions

+
+

gck_modules_initialize_registered ()

+
GList *
+gck_modules_initialize_registered (GCancellable *cancellable,
+                                   GError **error);
+

Load and initialize all the registered modules.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cancellable

optional cancellation object.

[allow-none]

error

location to place an error on failure.

[allow-none]
+
+
+

Returns

+

A newly allocated list +of GckModule objects, which should be released with gck_list_unref_free().

+

[transfer full][element-type Gck.Module]

+
+
+
+
+

gck_modules_initialize_registered_async ()

+
void
+gck_modules_initialize_registered_async
+                               (GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Load and initialize all the registered modules asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cancellable

optional cancellation object

 

callback

a callback which will be called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gck_modules_initialize_registered_finish ()

+
GList *
+gck_modules_initialize_registered_finish
+                               (GAsyncResult *result,
+                                GError **error);
+

Finishes the asynchronous operation to initialize the registered +PKCS#11 modules.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the asynchronous result

 

error

location to place an error on failure

 
+
+
+

Returns

+

a list of newly +initialized GckModule objects.

+

[transfer full][element-type Gck.Module]

+
+
+
+
+

gck_modules_enumerate_objects ()

+
GckEnumerator *
+gck_modules_enumerate_objects (GList *modules,
+                               GckAttributes *attrs,
+                               GckSessionOptions session_options);
+

Setup an enumerator for listing matching objects on the modules.

+

This call will not block but will return an enumerator immediately.

+

If the attrs + GckAttributes is floating, it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

modules

The modules.

[element-type Gck.Module]

attrs

attributes that the objects must have, or empty for all objects

 

session_options

Options from GckSessionOptions

 
+
+
+

Returns

+

A new enumerator, which should be released +with g_object_unref().

+

[transfer full]

+
+
+
+
+

gck_modules_enumerate_uri ()

+
GckEnumerator *
+gck_modules_enumerate_uri (GList *modules,
+                           const gchar *uri,
+                           GckSessionOptions session_options,
+                           GError **error);
+

Enumerate objects that match a URI.

+

This call will not block. Use the GckEnumerator functions in order to +get at the actual objects that match.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

modules

The modules.

[element-type Gck.Module]

uri

The URI that the enumerator will match

 

session_options

Options from GckSessionOptions

 

error

A location to raise an error on failure.

 
+
+
+

Returns

+

A new GckEnumerator, or NULL if an error occurs.

+

[transfer full]

+
+
+
+
+

gck_modules_get_slots ()

+
GList *
+gck_modules_get_slots (GList *modules,
+                       gboolean token_present);
+

Get a list of slots for across all of the modules.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

modules

The modules.

[element-type Gck.Module]

token_present

Whether to only list slots with token present

 
+
+
+

Returns

+

A list of GckSlot +objects, which should be freed with gck_list_unref_free().

+

[transfer full][element-type Gck.Slot]

+
+
+
+
+

gck_modules_object_for_uri ()

+
GckObject *
+gck_modules_object_for_uri (GList *modules,
+                            const gchar *uri,
+                            GckSessionOptions session_options,
+                            GError **error);
+

Find an object that matches a URI.

+

This call can block. Use gck_modules_enumerate_uri() for a non-blocking +version.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

modules

The modules.

[element-type Gck.Module]

uri

The URI the objects must match

 

session_options

Options from GckSessionOptions

 

error

A location to raise an error on failure.

 
+
+
+

Returns

+

A new GckObject which should be released with +g_object_unref(), or NULL if no matching object was found.

+

[transfer full][allow-none]

+
+
+
+
+

gck_modules_objects_for_uri ()

+
GList *
+gck_modules_objects_for_uri (GList *modules,
+                             const gchar *uri,
+                             GckSessionOptions session_options,
+                             GError **error);
+

Find objects that match a URI.

+

This call can block. Use gck_modules_enumerate_uri() for a non-blocking +version.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

modules

The modules.

[element-type Gck.Module]

uri

The URI the objects must match

 

session_options

Options from GckSessionOptions

 

error

A location to raise an error on failure.

 
+
+
+

Returns

+

A list of GckObject which +should be released with gck_list_unref_free(), or NULL if no matching object +was found.

+

[transfer full][element-type Gck.Object]

+
+
+
+
+

gck_modules_token_for_uri ()

+
GckSlot *
+gck_modules_token_for_uri (GList *modules,
+                           const gchar *uri,
+                           GError **error);
+

Lookup a token that matches the URI.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

modules

The modules.

[element-type Gck.Module]

uri

The URI that the token must match

 

error

A location to raise an error on failure

 
+
+
+

Returns

+

A newly allocated GckSlot or NULL if no such +token was found.

+

[transfer full]

+
+
+
+
+

gck_modules_tokens_for_uri ()

+
GList *
+gck_modules_tokens_for_uri (GList *modules,
+                            const gchar *uri,
+                            GError **error);
+

Lookup a token that matches the URI.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

modules

The modules.

[element-type Gck.Module]

uri

The URI that the token must match

 

error

A location to raise an error on failure

 
+
+
+

Returns

+

A list of newly allocated +GckSlot objects. Use gck_list_unref_free() to release the list once you're +done with it.

+

[transfer full][element-type Gck.Slot]

+
+
+
+
+

Types and Values

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/gck-Library-Utilities.html b/docs/reference/gck/html/gck-Library-Utilities.html new file mode 100644 index 0000000..8723f30 --- /dev/null +++ b/docs/reference/gck/html/gck-Library-Utilities.html @@ -0,0 +1,162 @@ + + + + +Library Utilities: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Library Utilities

+

Library Utilities — Library utilities such as version checks

+
+
+

Functions

+
++++ + + + + +
#define +GCK_CHECK_VERSION() +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
#defineGCK_MAJOR_VERSION
#defineGCK_MICRO_VERSION
#defineGCK_MINOR_VERSION
+
+
+

Description

+

Basic library utilities such as version checks.

+
+
+

Functions

+
+

GCK_CHECK_VERSION()

+
#define             GCK_CHECK_VERSION(major,minor,micro)
+

Checks the version of the Gck libarry that is being compiled +against.

+
+

Example 1. Checking the version of the Gck library

+
+ + + + + + + +
1
+2
+3
#if !GCK_CHECK_VERSION (3, 0, 0)
+#warning Old Gck version, disabling functionality
+#endif
+
+ +
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

major

the major version to check for

 

minor

the minor version to check for

 

micro

the micro version to check for

 
+
+
+

Returns

+

TRUE if the version of the GLib header files +is the same as or newer than the passed-in version.

+
+
+
+
+

Types and Values

+
+

GCK_MAJOR_VERSION

+
#define GCK_MAJOR_VERSION (3)
+
+

The major version number of the Gck library.

+
+
+
+

GCK_MICRO_VERSION

+
#define GCK_MICRO_VERSION (0)
+
+

The micro version number of the Gck library.

+
+
+
+

GCK_MINOR_VERSION

+
#define GCK_MINOR_VERSION (28)
+
+

The minor version number of the Gck library.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/gck-Miscellaneous-Functions.html b/docs/reference/gck/html/gck-Miscellaneous-Functions.html new file mode 100644 index 0000000..e18780d --- /dev/null +++ b/docs/reference/gck/html/gck-Miscellaneous-Functions.html @@ -0,0 +1,376 @@ + + + + +Miscellaneous Functions: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Miscellaneous Functions

+

Miscellaneous Functions — Other miscellaneous functions.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GList * + +gck_list_ref_copy () +
+void + +gck_list_unref_free () +
+gchar * + +gck_string_from_chars () +
+gboolean + +gck_string_to_chars () +
+gboolean + +gck_value_to_boolean () +
+gboolean + +gck_value_to_ulong () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
enumGckError
#defineGCK_INVALID
+
+
+

Description

+

A few supporting functions that come in handy when dealing with the gck +library or PKCS11 in general.

+
+
+

Functions

+
+

gck_list_ref_copy ()

+
GList *
+gck_list_ref_copy (GList *reflist);
+

Copy a list of GObject based pointers. All objects +in the list will be reffed and the list will be copied.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

reflist

list of GObject reference counted +objects.

[element-type GObject.Object]
+
+
+

Returns

+

the copied and +reffed list, when done, free it with gck_list_unref_free().

+

[transfer full][element-type GObject.Object]

+
+
+
+
+

gck_list_unref_free ()

+
void
+gck_list_unref_free (GList *reflist);
+

Free a list of GObject based pointers. All objects in the list +will be unreffed and then the list itself will be freed.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

reflist

list of Gobject reference counted pointers.

[element-type GObject.Object]
+
+
+
+
+

gck_string_from_chars ()

+
gchar *
+gck_string_from_chars (const guchar *data,
+                       gsize max);
+

Create a string from a set of PKCS#11 characters. This is +similar to g_strndup, except for that it also strips trailing +spaces. These space padded strings are often used in PKCS#11 +structures.

+

If the space padded string is filled with null characters then +this function will return NULL.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

data

The character data to turn into a null terminated string.

 

max

The maximum length of the charater data.

 
+
+
+

Returns

+

The null terminated string.

+
+
+
+
+

gck_string_to_chars ()

+
gboolean
+gck_string_to_chars (guchar *data,
+                     gsize max,
+                     const gchar *string);
+

Create a space padded PKCS#11 string from a null terminated string. +The string must be shorter than the buffer or FALSE will be +returned.

+

If a NULL string is passed, then the space padded string will be +set to zero characters.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

data

The character buffer to place string into.

 

max

The maximum length of the charater buffer.

 

string

The string to place in the buffer.

 
+
+
+

Returns

+

The null terminated string.

+
+
+
+
+

gck_value_to_boolean ()

+
gboolean
+gck_value_to_boolean (const guchar *value,
+                      gsize length,
+                      gboolean *result);
+

Convert CK_BBOOL type memory to a boolean.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

value

memory to convert.

[array length=length]

length

length of memory

 

result

A location to store the result

 
+
+
+

Returns

+

Whether the conversion was successful.

+
+
+
+
+

gck_value_to_ulong ()

+
gboolean
+gck_value_to_ulong (const guchar *value,
+                    gsize length,
+                    gulong *result);
+

Convert CK_ULONG type memory to a boolean.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

value

memory to convert.

[array length=length]

length

length of memory

 

result

A location to store the result

 
+
+
+

Returns

+

Whether the conversion was successful.

+
+
+
+
+

Types and Values

+
+

enum GckError

+

Various error codes. All the CKR_XXX error codes from PKCS#11 are also +relevant error codes.

+
+

Members

+
+++++ + + + + + +

GCK_ERROR_MODULE_PROBLEM

+

a result code that signifies there was a problem + loading a PKCS#11 module, usually a shared library

+
 
+
+
+
+
+

GCK_INVALID

+
#define GCK_INVALID ((gulong)-1)
+
+

Used as a terminator at the end of variable argument lists.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/gck-PKCS11-URIs.html b/docs/reference/gck/html/gck-PKCS11-URIs.html new file mode 100644 index 0000000..74278a1 --- /dev/null +++ b/docs/reference/gck/html/gck-PKCS11-URIs.html @@ -0,0 +1,478 @@ + + + + +PKCS11 URIs: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PKCS11 URIs

+

PKCS11 URIs — Parsing and building PKCS#11 URIs.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+GckUriData * + +gck_uri_data_new () +
+GckUriData * + +gck_uri_parse () +
+gchar * + +gck_uri_build () +
+GckUriData * + +gck_uri_data_copy () +
+void + +gck_uri_data_free () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
structGckUriData
enumGckUriError
enumGckUriFlags
#defineGCK_URI_FOR_MODULE_WITH_VERSION
#defineGCK_URI_FOR_OBJECT_ON_TOKEN
#defineGCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE
#defineGCK_URI_ERROR
+
+
+

Object Hierarchy

+
    GBoxed
+    ╰── GckUriData
+
+
+
+

Description

+PKCS\#11 URIs

are a standard for referring to PKCS#11 modules, tokens, or objects. What the +PKCS#11 URI refers to depends on the context in which it is used.

+

A PKCS#11 URI can always resolve to more than one object, token or module. A +PKCS#11 URI that refers to a token, would (when used in a context that expects +objects) refer to all the token on that module.

+

In most cases the parsing or building of URIs is handled elsewhere in the GCK +library. For example to enumerate objects that match a PKCS#11 URI use the +gck_modules_enumerate_uri() function.

+

To parse a PKCS#11 URI use the gck_uri_parse() function passing in the type of +context in which you're using the URI. To build a URI use the gck_uri_build() +function.

+
+
+

Functions

+
+

gck_uri_data_new ()

+
GckUriData *
+gck_uri_data_new (void);
+

Allocate a new GckUriData structure. None of the fields +will be set.

+
+

Returns

+

a newly allocated GckUriData, free with +gck_uri_data_free().

+

[transfer full]

+
+
+
+
+

gck_uri_parse ()

+
GckUriData *
+gck_uri_parse (const gchar *string,
+               GckUriFlags flags,
+               GError **error);
+

Parse a PKCS#11 URI for use in a given context.

+

The result will contain the fields that are relevant for +the given context. See GckUriData for more info. +Other fields will be set to NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

string

the URI to parse.

 

flags

the context in which the URI will be used.

 

error

a GError, or NULL.

 
+
+
+

Returns

+

a newly allocated GckUriData; which should be +freed with gck_uri_data_free().

+

[transfer full]

+
+
+
+
+

gck_uri_build ()

+
gchar *
+gck_uri_build (GckUriData *uri_data,
+               GckUriFlags flags);
+

Build a PKCS#11 URI. The various parts relevant to the flags +specified will be used to build the URI.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

uri_data

the info to build the URI from.

 

flags

The context that the URI is for

 
+
+
+

Returns

+

a newly allocated string containing a PKCS#11 URI.

+
+
+
+
+

gck_uri_data_copy ()

+
GckUriData *
+gck_uri_data_copy (GckUriData *uri_data);
+

Copy a GckUriData

+
+

Parameters

+
+++++ + + + + + +

uri_data

URI data to copy

 
+
+
+

Returns

+

newly allocated copy of the uri data.

+

[transfer full]

+
+
+
+
+

gck_uri_data_free ()

+
void
+gck_uri_data_free (GckUriData *uri_data);
+

Free a GckUriData.

+
+

Parameters

+
+++++ + + + + + +

uri_data

URI data to free.

 
+
+
+
+
+

Types and Values

+
+

struct GckUriData

+
struct GckUriData {
+	gboolean any_unrecognized;
+	GckModuleInfo *module_info;
+	GckTokenInfo *token_info;
+	GckAttributes *attributes;
+};
+
+

Information about the contents of a PKCS#11 URI. Various fields may be NULL +depending on the context that the URI was parsed for.

+

Since PKCS#11 URIs represent a set which results from the intersections of +all of the URI parts, if any_recognized + is set to TRUE then usually the URI +should be treated as not matching anything.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

gboolean any_unrecognized;

whether any parts of the PKCS#11 URI were unsupported or unrecognized.

 

GckModuleInfo *module_info;

information about the PKCS#11 modules matching the URI.

 

GckTokenInfo *token_info;

information about the PKCS#11 tokens matching the URI.

 

GckAttributes *attributes;

information about the PKCS#11 objects matching the URI.

 
+
+
+
+
+

enum GckUriError

+

Various error codes used with PKCS#11 URIs

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GCK_URI_BAD_SCHEME

+

invalid URI scheme

+
 

GCK_URI_BAD_ENCODING

+

bad URI encoding

+
 

GCK_URI_BAD_SYNTAX

+

bad URI syntax

+
 

GCK_URI_BAD_VERSION

+

bad URI version component

+
 

GCK_URI_NOT_FOUND

+

piece of the URI was not found

+
 
+
+
+
+
+

enum GckUriFlags

+

Which parts of the PKCS#11 URI will be parsed or formatted. These can be +combined.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GCK_URI_FOR_OBJECT

+

the URI will be used to match objects.

+
 

GCK_URI_FOR_TOKEN

+

the URI will be used to match tokens.

+
 

GCK_URI_FOR_MODULE

+

the URI will be used to match modules.

+
 

GCK_URI_WITH_VERSION

+

the URI has specific version numbers for module and/or token

+
 

GCK_URI_FOR_ANY

+

parse all recognized components of the URI.

+
 
+
+
+
+
+

GCK_URI_FOR_MODULE_WITH_VERSION

+
#define             GCK_URI_FOR_MODULE_WITH_VERSION         (GCK_URI_WITH_VERSION | GCK_URI_FOR_MODULE)
+
+

The URI will match specific version of modules. To be used as a GckUriFlags argument.

+
+
+
+

GCK_URI_FOR_OBJECT_ON_TOKEN

+
#define             GCK_URI_FOR_OBJECT_ON_TOKEN             (GCK_URI_FOR_OBJECT | GCK_URI_FOR_TOKEN)
+
+

The URI will match objects on a specific token. To be used as a GckUriFlags argument.

+
+
+
+

GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE

+
#define             GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE  (GCK_URI_FOR_OBJECT_ON_TOKEN | GCK_URI_FOR_MODULE)
+
+

The token inserted into a device with a specific module.

+
+
+
+

GCK_URI_ERROR

+
#define             GCK_URI_ERROR                           (gck_uri_error_get_quark ())
+
+

Error domain for URI errors.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/gck.devhelp2 b/docs/reference/gck/html/gck.devhelp2 new file mode 100644 index 0000000..4545c24 --- /dev/null +++ b/docs/reference/gck/html/gck.devhelp2 @@ -0,0 +1,428 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gck/html/home.png b/docs/reference/gck/html/home.png new file mode 100644 index 0000000..9346b33 Binary files /dev/null and b/docs/reference/gck/html/home.png differ diff --git a/docs/reference/gck/html/index.html b/docs/reference/gck/html/index.html new file mode 100644 index 0000000..171287b --- /dev/null +++ b/docs/reference/gck/html/index.html @@ -0,0 +1,76 @@ + + + + +Gck Library Reference Manual: Gck Library Reference Manual + + + + + + + +
+
+
+
+

+ For Gck 3.28.0 +. + An online version of this documentation can be found at + http://developer.gnome.org/gck/stable/. +

+
+
+
+
+
PKCS#11 GObject Bindings
+
+
+GckModule — A loaded and initialized PKCS#11 module. +
+
+GckSlot — Represents a PKCS#11 slot that can contain a token. +
+
+GckSession — Represents an open PKCS11 session. +
+
+GckObject — Represents a PKCS11 object such as a key or certificate. +
+
+GckAttribute — A PKCS11 attribute. +
+
+GckAttributes — A set of PKCS11 attributes. +
+
+GckObjectCache — An interface which holds attributes for a PKCS#11 object +
+
+GckEnumerator — Enumerates through PKCS#11 objects. +
+
+GckModule lists — Dealing with lists of PKCS#11 modules. +
+
+Errors — Gck Errors and error codes. +
+
+PKCS11 URIs — Parsing and building PKCS#11 URIs. +
+
+Library Utilities — Library utilities such as version checks +
+
+Miscellaneous Functions — Other miscellaneous functions. +
+
+
About PKCS#11
+
Annotation Glossary
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/left-insensitive.png b/docs/reference/gck/html/left-insensitive.png new file mode 100644 index 0000000..3269393 Binary files /dev/null and b/docs/reference/gck/html/left-insensitive.png differ diff --git a/docs/reference/gck/html/left.png b/docs/reference/gck/html/left.png new file mode 100644 index 0000000..2abde03 Binary files /dev/null and b/docs/reference/gck/html/left.png differ diff --git a/docs/reference/gck/html/pkcs11-links.html b/docs/reference/gck/html/pkcs11-links.html new file mode 100644 index 0000000..20b516a --- /dev/null +++ b/docs/reference/gck/html/pkcs11-links.html @@ -0,0 +1,35 @@ + + + + +About PKCS#11: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+

+About PKCS#11

+

PKCS#11 is an API for storing and using crypto objects, and performing + crypto operations on them.

+

It is specified at the + RSA website + and a handy reference is also + available.

+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/reference.html b/docs/reference/gck/html/reference.html new file mode 100644 index 0000000..8e97733 --- /dev/null +++ b/docs/reference/gck/html/reference.html @@ -0,0 +1,70 @@ + + + + +PKCS#11 GObject Bindings: Gck Library Reference Manual + + + + + + + + + + + + + + + + +
+

+PKCS#11 GObject Bindings

+
+
+GckModule — A loaded and initialized PKCS#11 module. +
+
+GckSlot — Represents a PKCS#11 slot that can contain a token. +
+
+GckSession — Represents an open PKCS11 session. +
+
+GckObject — Represents a PKCS11 object such as a key or certificate. +
+
+GckAttribute — A PKCS11 attribute. +
+
+GckAttributes — A set of PKCS11 attributes. +
+
+GckObjectCache — An interface which holds attributes for a PKCS#11 object +
+
+GckEnumerator — Enumerates through PKCS#11 objects. +
+
+GckModule lists — Dealing with lists of PKCS#11 modules. +
+
+Errors — Gck Errors and error codes. +
+
+PKCS11 URIs — Parsing and building PKCS#11 URIs. +
+
+Library Utilities — Library utilities such as version checks +
+
+Miscellaneous Functions — Other miscellaneous functions. +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gck/html/right-insensitive.png b/docs/reference/gck/html/right-insensitive.png new file mode 100644 index 0000000..4c95785 Binary files /dev/null and b/docs/reference/gck/html/right-insensitive.png differ diff --git a/docs/reference/gck/html/right.png b/docs/reference/gck/html/right.png new file mode 100644 index 0000000..76260ec Binary files /dev/null and b/docs/reference/gck/html/right.png differ diff --git a/docs/reference/gck/html/style.css b/docs/reference/gck/html/style.css new file mode 100644 index 0000000..4be4ede --- /dev/null +++ b/docs/reference/gck/html/style.css @@ -0,0 +1,483 @@ +body +{ + font-family: cantarell, sans-serif; +} +.synopsis, .classsynopsis +{ + /* tango:aluminium 1/2 */ + background: #eeeeec; + background: rgba(238, 238, 236, 0.5); + border: solid 1px rgb(238, 238, 236); + padding: 0.5em; +} +.programlisting +{ + /* tango:sky blue 0/1 */ + /* fallback for no rgba support */ + background: #e6f3ff; + border: solid 1px #729fcf; + background: rgba(114, 159, 207, 0.1); + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0.5em; +} +.variablelist +{ + padding: 4px; + margin-left: 3em; +} +.variablelist td:first-child +{ + vertical-align: top; +} + +span.nowrap { + white-space: nowrap; +} + +div.gallery-float +{ + float: left; + padding: 10px; +} +div.gallery-float img +{ + border-style: none; +} +div.gallery-spacer +{ + clear: both; +} + +a, a:visited +{ + text-decoration: none; + /* tango:sky blue 2 */ + color: #3465a4; +} +a:hover +{ + text-decoration: underline; + /* tango:sky blue 1 */ + color: #729fcf; +} + +div.informaltable table +{ + border-collapse: separate; + border-spacing: 1em 0.3em; + border: none; +} + +div.informaltable table td, div.informaltable table th +{ + vertical-align: top; +} + +.function_type, +.variable_type, +.property_type, +.signal_type, +.parameter_name, +.struct_member_name, +.union_member_name, +.define_keyword, +.datatype_keyword, +.typedef_keyword +{ + text-align: right; +} + +/* dim non-primary columns */ +.c_punctuation, +.function_type, +.variable_type, +.property_type, +.signal_type, +.define_keyword, +.datatype_keyword, +.typedef_keyword, +.property_flags, +.signal_flags, +.parameter_annotations, +.enum_member_annotations, +.struct_member_annotations, +.union_member_annotations +{ + color: #888a85; +} + +.function_type a, +.function_type a:visited, +.function_type a:hover, +.property_type a, +.property_type a:visited, +.property_type a:hover, +.signal_type a, +.signal_type a:visited, +.signal_type a:hover, +.signal_flags a, +.signal_flags a:visited, +.signal_flags a:hover +{ + color: #729fcf; +} + +td p +{ + margin: 0.25em; +} + +div.table table +{ + border-collapse: collapse; + border-spacing: 0px; + /* tango:aluminium 3 */ + border: solid 1px #babdb6; +} + +div.table table td, div.table table th +{ + /* tango:aluminium 3 */ + border: solid 1px #babdb6; + padding: 3px; + vertical-align: top; +} + +div.table table th +{ + /* tango:aluminium 2 */ + background-color: #d3d7cf; +} + +h4 +{ + color: #555753; + margin-top: 1em; + margin-bottom: 1em; +} + +hr +{ + /* tango:aluminium 1 */ + color: #d3d7cf; + background: #d3d7cf; + border: none 0px; + height: 1px; + clear: both; + margin: 2.0em 0em 2.0em 0em; +} + +dl.toc dt +{ + padding-bottom: 0.25em; +} + +dl.toc > dt +{ + padding-top: 0.25em; + padding-bottom: 0.25em; + font-weight: bold; +} + +dl.toc > dl +{ + padding-bottom: 0.5em; +} + +.parameter +{ + font-style: normal; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.informalfigure, +.figure +{ + margin: 1em; +} + +.informalexample, +.example +{ + margin-top: 1em; + margin-bottom: 1em; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + background: rgba(252, 175, 62, 0.1); + border-color: #ffb04f; + border-color: rgba(252, 175, 62, 0.2); +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + background: rgba(138, 226, 52, 0.1); + border-color: #abf562; + border-color: rgba(138, 226, 52, 0.2); +} +div.blockquote +{ + border-color: #eeeeec; +} +.note, .warning, div.blockquote +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; + margin: 2em; +} +.note p, .warning p +{ + margin: 0; +} + +div.warning h3.title, +div.note h3.title +{ + display: none; +} + +p + div.section +{ + margin-top: 1em; +} + +div.refnamediv, +div.refsynopsisdiv, +div.refsect1, +div.refsect2, +div.toc, +div.section +{ + margin-bottom: 1em; +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.lineart +{ + color: #d3d7cf; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-weight: normal; +} + +.structfield +{ + font-style: normal; + font-weight: normal; +} + +acronym,abbr +{ + border-bottom: 1px dotted gray; +} + +/* code listings */ + +.listing_code .programlisting .normal, +.listing_code .programlisting .normal a, +.listing_code .programlisting .number, +.listing_code .programlisting .cbracket, +.listing_code .programlisting .symbol { color: #555753; } +.listing_code .programlisting .comment, +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .function, +.listing_code .programlisting .function a, +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #ad7fa8; } /* tango: plum */ +.listing_code .programlisting .keyword, +.listing_code .programlisting .usertype, +.listing_code .programlisting .type, +.listing_code .programlisting .type a { color: #4e9a06; } /* tango: chameleon 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + background: rgba(114, 159, 207, 0.2); + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; + background: rgba(114, 159, 207, 0.1); +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; + background: none; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} + +@media screen { + /* these have a as a first child, but since there are no parent selectors + * we can't use that. */ + a.footnote + { + position: relative; + top: 0em ! important; + } + /* this is needed so that the local anchors are displayed below the naviagtion */ + div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] + { + display: inline-block; + position: relative; + top:-5em; + } + /* this seems to be a bug in the xsl style sheets when generating indexes */ + div.index div.index + { + top: 0em; + } + /* make space for the fixed navigation bar and add space at the bottom so that + * link targets appear somewhat close to top + */ + body + { + padding-top: 2.5em; + padding-bottom: 500px; + max-width: 60em; + } + p + { + max-width: 60em; + } + /* style and size the navigation bar */ + table.navigation#top + { + position: fixed; + background: #e2e2e2; + border-bottom: solid 1px #babdb6; + border-spacing: 5px; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + z-index: 10; + } + table.navigation#top td + { + padding-left: 6px; + padding-right: 6px; + } + .navigation a, .navigation a:visited + { + /* tango:sky blue 3 */ + color: #204a87; + } + .navigation a:hover + { + /* tango:sky blue 2 */ + color: #3465a4; + } + td.shortcuts + { + /* tango:sky blue 2 */ + color: #3465a4; + font-size: 80%; + white-space: nowrap; + } + td.shortcuts .dim + { + color: #babdb6; + } + .navigation .title + { + font-size: 80%; + max-width: none; + margin: 0px; + font-weight: normal; + } +} +@media screen and (min-width: 60em) { + /* screen larger than 60em */ + body { margin: auto; } +} +@media screen and (max-width: 60em) { + /* screen less than 60em */ + #nav_hierarchy { display: none; } + #nav_interfaces { display: none; } + #nav_prerequisites { display: none; } + #nav_derived_interfaces { display: none; } + #nav_implementations { display: none; } + #nav_child_properties { display: none; } + #nav_style_properties { display: none; } + #nav_index { display: none; } + #nav_glossary { display: none; } + .gallery_image { display: none; } + .property_flags { display: none; } + .signal_flags { display: none; } + .parameter_annotations { display: none; } + .enum_member_annotations { display: none; } + .struct_member_annotations { display: none; } + .union_member_annotations { display: none; } + /* now that a column is hidden, optimize space */ + col.parameters_name { width: auto; } + col.parameters_description { width: auto; } + col.struct_members_name { width: auto; } + col.struct_members_description { width: auto; } + col.enum_members_name { width: auto; } + col.enum_members_description { width: auto; } + col.union_members_name { width: auto; } + col.union_members_description { width: auto; } + .listing_lines { display: none; } +} +@media print { + table.navigation { + visibility: collapse; + display: none; + } + div.titlepage table.navigation { + visibility: visible; + display: table; + background: #e2e2e2; + border: solid 1px #babdb6; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + } +} + diff --git a/docs/reference/gck/html/up-insensitive.png b/docs/reference/gck/html/up-insensitive.png new file mode 100644 index 0000000..f404986 Binary files /dev/null and b/docs/reference/gck/html/up-insensitive.png differ diff --git a/docs/reference/gck/html/up.png b/docs/reference/gck/html/up.png new file mode 100644 index 0000000..80b4b37 Binary files /dev/null and b/docs/reference/gck/html/up.png differ diff --git a/docs/reference/gck/version.xml.in b/docs/reference/gck/version.xml.in new file mode 100644 index 0000000..27323da --- /dev/null +++ b/docs/reference/gck/version.xml.in @@ -0,0 +1 @@ +@VERSION@ \ No newline at end of file diff --git a/docs/reference/gcr/Makefile.am b/docs/reference/gcr/Makefile.am new file mode 100644 index 0000000..1c6a9ee --- /dev/null +++ b/docs/reference/gcr/Makefile.am @@ -0,0 +1,177 @@ +## Process this file with automake to produce Makefile.in + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name the module, e.g. 'glib'. +DOC_MODULE=gcr + +# Uncomment for versioned docs and specify the version of the module, e.g. '2'. +DOC_MODULE_VERSION=@GCR_MAJOR@ + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR=$(top_srcdir)/$(DOC_MODULE) $(top_srcdir)/ui $(top_builddir)/$(DOC_MODULE) $(top_builddir)/ui + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS=--deprecated-guards="GCR_DISABLE_DEPRECATED" + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS=--sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS= + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB=$(top_srcdir)/gcr/*.h $(top_srcdir)/ui/*.h +CFILE_GLOB=$(top_srcdir)/gcr/*.c $(top_srcdir)/ui/*.c + +# Extra header to include when scanning, which are not under DOC_SOURCE_DIR +# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h +EXTRA_HFILES=$(top_srcdir)/ui/*.h + +# Header files to ignore when scanning. Use base file name, no paths +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES= \ + console-interaction.h \ + eggimagemenuitem.h \ + gcr-callback-output-stream.h \ + gcr-certificate-exporter.h \ + gcr-certificate-basics-widget.h \ + gcr-certificate-details-widget.h \ + gcr-certificate-request-renderer.h \ + gcr-dbus-constants.h \ + gcr-dbus-generated.h \ + gcr-deprecated.h \ + gcr-deprecated-base.h \ + gcr-display-scrolled.h \ + gcr-display-view.h \ + gcr-failure-renderer.h \ + gcr-gnupg-importer.h \ + gcr-gnupg-renderer.h \ + gcr-icons.h \ + gcr-import-dialog.h \ + gcr-internal.h \ + gcr-live-search.h \ + gcr-marshal.h \ + gcr-menu-button.h \ + gcr-oids.h \ + gcr-openpgp.h \ + gcr-pkcs11-importer.h \ + gcr-pkcs11-import-interaction.h \ + gcr-pkcs11-import-dialog.h \ + gcr-pkcs11-renderer.h \ + gcr-record.h \ + gcr-single-collection.h \ + gcr-unlock-renderer.h \ + gcr-viewer-window.h \ + gcr-xxx.h \ + gcr-zzz.h + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= \ + $(srcdir)/images/certificate-widget.png \ + $(srcdir)/images/combo-selector.png \ + $(srcdir)/images/import-button.png \ + $(srcdir)/images/list-selector.png \ + $(srcdir)/images/key-widget.png \ + $(srcdir)/images/tree-selector.png \ + $(srcdir)/images/viewer-widget.png + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files=gcr-visual-index.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS= -I$(top_srcdir) -I$(top_builddir) $(GLIB_CFLAGS) -Wno-error \ + -Wno-deprecated-declarations +GTKDOC_LIBS= $(GLIB_LIBS) \ + $(top_builddir)/libgcr-ui-@GCR_MAJOR@.la \ + $(top_builddir)/libgcr-base-@GCR_MAJOR@.la \ + $(top_builddir)/libgck-@GCK_MAJOR@.la + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +# EXTRA_DIST += + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +DISTCLEANFILES = tmpl/gcr-unused.sgml + +# Comment this out if you want your docs-status tested during 'make check' +#TESTS_ENVIRONMENT = cd $(srcsrc) +#TESTS = $(GTKDOC_CHECK) + +# ------------------------------------------------------------------------------ +# SHOOTER + +WIDGETS = \ + certificate-widget \ + combo-selector \ + import-button \ + key-widget \ + list-selector \ + tree-selector \ + viewer-widget + +shots: gcr-shooter + mkdir -p $(builddir)/images + for widget in $(WIDGETS); do ./gcr-shooter $$widget $(builddir)/images; done + +SHOOTER_SRCS = \ + gcr-shooter.c \ + gcr-widgets.c + +SHOOTER_HEADS = \ + gcr-shooter.h + +gcr-shooter: $(SHOOTER_SRCS) $(SHOOTER_HEADERS) Makefile + $(AM_V_CC) libtool --mode=link gcc -o gcr-shooter -Wall -Werror $(GTK_CFLAGS) \ + -I$(top_srcdir)/gcr -DGCR_API_SUBJECT_TO_CHANGE \ + -DSRCDIR=\"$(srcdir)\" -DTOPDIR=\"$(top_srcdir)\" \ + `pkg-config x11 xext --cflags --libs` \ + $(GTK_LDFLAGS) -lm $(top_builddir)/ui/libgcr-ui-@GCR_MAJOR@.la \ + $(SHOOTER_SRCS) + +EXTRA_DIST += $(SHOOTER_SRCS) \ + $(SHOOTER_HEADERS) \ + images diff --git a/docs/reference/gcr/Makefile.in b/docs/reference/gcr/Makefile.in new file mode 100644 index 0000000..7d36ad0 --- /dev/null +++ b/docs/reference/gcr/Makefile.in @@ -0,0 +1,1010 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +# -*- mode: makefile -*- +# +# gtk-doc.make - make rules for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2004-2007 Damon Chaplin +# 2007-2017 Stefan Sauer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = docs/reference/gcr +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = version.xml +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/version.xml.in \ + $(top_srcdir)/gtk-doc.make +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name the module, e.g. 'glib'. +DOC_MODULE = gcr + +# Uncomment for versioned docs and specify the version of the module, e.g. '2'. +DOC_MODULE_VERSION = @GCR_MAJOR@ + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR = $(top_srcdir)/$(DOC_MODULE) $(top_srcdir)/ui $(top_builddir)/$(DOC_MODULE) $(top_builddir)/ui + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS = + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS = --deprecated-guards="GCR_DISABLE_DEPRECATED" + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS = --sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS = + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS = + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS = + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB = $(top_srcdir)/gcr/*.h $(top_srcdir)/ui/*.h +CFILE_GLOB = $(top_srcdir)/gcr/*.c $(top_srcdir)/ui/*.c + +# Extra header to include when scanning, which are not under DOC_SOURCE_DIR +# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h +EXTRA_HFILES = $(top_srcdir)/ui/*.h + +# Header files to ignore when scanning. Use base file name, no paths +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES = \ + console-interaction.h \ + eggimagemenuitem.h \ + gcr-callback-output-stream.h \ + gcr-certificate-exporter.h \ + gcr-certificate-basics-widget.h \ + gcr-certificate-details-widget.h \ + gcr-certificate-request-renderer.h \ + gcr-dbus-constants.h \ + gcr-dbus-generated.h \ + gcr-deprecated.h \ + gcr-deprecated-base.h \ + gcr-display-scrolled.h \ + gcr-display-view.h \ + gcr-failure-renderer.h \ + gcr-gnupg-importer.h \ + gcr-gnupg-renderer.h \ + gcr-icons.h \ + gcr-import-dialog.h \ + gcr-internal.h \ + gcr-live-search.h \ + gcr-marshal.h \ + gcr-menu-button.h \ + gcr-oids.h \ + gcr-openpgp.h \ + gcr-pkcs11-importer.h \ + gcr-pkcs11-import-interaction.h \ + gcr-pkcs11-import-dialog.h \ + gcr-pkcs11-renderer.h \ + gcr-record.h \ + gcr-single-collection.h \ + gcr-unlock-renderer.h \ + gcr-viewer-window.h \ + gcr-xxx.h \ + gcr-zzz.h + + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES = \ + $(srcdir)/images/certificate-widget.png \ + $(srcdir)/images/combo-selector.png \ + $(srcdir)/images/import-button.png \ + $(srcdir)/images/list-selector.png \ + $(srcdir)/images/key-widget.png \ + $(srcdir)/images/tree-selector.png \ + $(srcdir)/images/viewer-widget.png + + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files = gcr-visual-index.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files = + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS = -I$(top_srcdir) -I$(top_builddir) $(GLIB_CFLAGS) -Wno-error \ + -Wno-deprecated-declarations + +GTKDOC_LIBS = $(GLIB_LIBS) \ + $(top_builddir)/libgcr-ui-@GCR_MAJOR@.la \ + $(top_builddir)/libgcr-base-@GCR_MAJOR@.la \ + $(top_builddir)/libgck-@GCK_MAJOR@.la + +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +SETUP_FILES = \ + $(content_files) \ + $(expand_content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) $(SHOOTER_SRCS) \ + $(SHOOTER_HEADERS) images +DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test +@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = +@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp +@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = +@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp + +#### setup #### +GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_@AM_V@) +GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_@AM_DEFAULT_V@) +GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; + +#### scan #### +GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_@AM_V@) +GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_@AM_DEFAULT_V@) +GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; +GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_@AM_V@) +GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_@AM_DEFAULT_V@) +GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; + +#### xml #### +GTK_DOC_V_XML = $(GTK_DOC_V_XML_@AM_V@) +GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_@AM_DEFAULT_V@) +GTK_DOC_V_XML_0 = @echo " DOC Building XML"; + +#### html #### +GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_@AM_V@) +GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_@AM_DEFAULT_V@) +GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; +GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_@AM_V@) +GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_@AM_DEFAULT_V@) +GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; + +#### pdf #### +GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_@AM_V@) +GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_@AM_DEFAULT_V@) +GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; + +# This includes the standard gtk-doc make rules, copied by gtkdocize. + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +# EXTRA_DIST += + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +DISTCLEANFILES = tmpl/gcr-unused.sgml + +# Comment this out if you want your docs-status tested during 'make check' +#TESTS_ENVIRONMENT = cd $(srcsrc) +#TESTS = $(GTKDOC_CHECK) + +# ------------------------------------------------------------------------------ +# SHOOTER +WIDGETS = \ + certificate-widget \ + combo-selector \ + import-button \ + key-widget \ + list-selector \ + tree-selector \ + viewer-widget + +SHOOTER_SRCS = \ + gcr-shooter.c \ + gcr-widgets.c + +SHOOTER_HEADS = \ + gcr-shooter.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/reference/gcr/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/reference/gcr/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/gtk-doc.make $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +@ENABLE_GTK_DOC_FALSE@all-local: +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool clean-local cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distclean-local \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-local + +.PRECIOUS: Makefile + + +gtkdoc-check.test: Makefile + $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ + echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ + chmod +x $@ + +all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +.PHONY: all-gtk-doc + +@ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + destdir=`dirname $(abs_builddir)/$$file`; \ + test -d "$$destdir" || mkdir -p "$$destdir"; \ + test -f $(abs_srcdir)/$$file && \ + cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + fi + $(AM_V_at)touch setup-build.stamp + +scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent + $(GTK_DOC_V_XML)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +$(DOC_MAIN_SGML_FILE): sgml-build.stamp + @true + +xml/gtkdocentities.ent: Makefile + $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + ) > $@ + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ + mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$$?" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + test -f $(abs_srcdir)/$$file && cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + test -f $(abs_builddir)/$$file && cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + done; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ + mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ + rm -f $(DOC_MODULE).types; \ + fi + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ + rm -f $(DOC_MODULE)-sections.txt; \ + fi + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ + fi + +maintainer-clean-local: + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +@HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs +@HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: +@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" +@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" +@HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" +@HAVE_GTK_DOC_FALSE@ @false + +dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local + @mkdir $(distdir)/html + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +shots: gcr-shooter + mkdir -p $(builddir)/images + for widget in $(WIDGETS); do ./gcr-shooter $$widget $(builddir)/images; done + +gcr-shooter: $(SHOOTER_SRCS) $(SHOOTER_HEADERS) Makefile + $(AM_V_CC) libtool --mode=link gcc -o gcr-shooter -Wall -Werror $(GTK_CFLAGS) \ + -I$(top_srcdir)/gcr -DGCR_API_SUBJECT_TO_CHANGE \ + -DSRCDIR=\"$(srcdir)\" -DTOPDIR=\"$(top_srcdir)\" \ + `pkg-config x11 xext --cflags --libs` \ + $(GTK_LDFLAGS) -lm $(top_builddir)/ui/libgcr-ui-@GCR_MAJOR@.la \ + $(SHOOTER_SRCS) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/docs/reference/gcr/gcr-docs.sgml b/docs/reference/gcr/gcr-docs.sgml new file mode 100644 index 0000000..749bebe --- /dev/null +++ b/docs/reference/gcr/gcr-docs.sgml @@ -0,0 +1,81 @@ + + +]> + + + Gcr Library Reference Manual + + for Gcr &version;. + An online version of this documentation can be found at + http://developer.gnome.org/gcr/stable/. + + + + + Certificates + + + + + + + + + Collections + + + + + + + + Widgets + + + + + + + + + + + + Widget Gallery + + + + + + Prompting + + + + + + + + + Storage + + + + + + + + Miscellaneous + + + + + + + + + + + + diff --git a/docs/reference/gcr/gcr-overrides.txt b/docs/reference/gcr/gcr-overrides.txt new file mode 100644 index 0000000..13f485f --- /dev/null +++ b/docs/reference/gcr/gcr-overrides.txt @@ -0,0 +1,2 @@ +# These are manually-edited to override or add declarations to those scanned +# from the header files. diff --git a/docs/reference/gcr/gcr-sections.txt b/docs/reference/gcr/gcr-sections.txt new file mode 100644 index 0000000..de171dd --- /dev/null +++ b/docs/reference/gcr/gcr-sections.txt @@ -0,0 +1,899 @@ +
+Library Utilities +gcr-library +GCR_CHECK_VERSION +GCR_MAJOR_VERSION +GCR_MICRO_VERSION +GCR_MINOR_VERSION +
+ +
+gcr-parser +GcrParser +GCR_DATA_ERROR +GcrDataError +GcrDataFormat +GcrParser +GcrParserClass +gcr_parser_new +gcr_parser_parse_bytes +gcr_parser_parse_data +gcr_parser_parse_stream +gcr_parser_parse_stream_async +gcr_parser_parse_stream_finish +gcr_parser_format_enable +gcr_parser_format_disable +gcr_parser_format_supported +gcr_parser_add_password +gcr_parser_get_parsed_label +gcr_parser_get_parsed_description +gcr_parser_get_parsed_attributes +gcr_parser_get_parsed_block +gcr_parser_get_parsed_bytes +gcr_parser_get_parsed_format +gcr_parser_get_filename +gcr_parser_set_filename +GcrParsed +gcr_parsed_ref +gcr_parsed_unref +gcr_parsed_get_attributes +gcr_parsed_get_data +gcr_parsed_get_bytes +gcr_parsed_get_description +gcr_parsed_get_format +gcr_parsed_get_label +gcr_parser_get_parsed +gcr_parsed_get_filename + +GCR_TYPE_PARSED +GcrParserPrivate +gcr_parsed_get_type +GCR_PARSER +GCR_IS_PARSER +GCR_TYPE_PARSER +gcr_parser_get_type +GCR_PARSER_CLASS +GCR_IS_PARSER_CLASS +GCR_PARSER_GET_CLASS +GCK_API_SUBJECT_TO_CHANGE +gcr_data_error_get_domain +GCR_TYPE_DATA_ERROR +GCR_TYPE_DATA_FORMAT +gcr_data_error_get_type +gcr_data_format_get_type +
+ +
+gcr-certificate +GcrCertificate +GcrCertificateIface +gcr_certificate_get_der_data +gcr_certificate_get_issuer_cn +gcr_certificate_get_issuer_dn +gcr_certificate_get_issuer_name +gcr_certificate_get_issuer_part +gcr_certificate_get_issuer_raw +gcr_certificate_is_issuer +gcr_certificate_get_subject_cn +gcr_certificate_get_subject_dn +gcr_certificate_get_subject_name +gcr_certificate_get_subject_part +gcr_certificate_get_subject_raw +gcr_certificate_get_issued_date +gcr_certificate_get_expiry_date +gcr_certificate_get_serial_number +gcr_certificate_get_serial_number_hex +gcr_certificate_get_key_size +gcr_certificate_get_fingerprint +gcr_certificate_get_fingerprint_hex +gcr_certificate_get_basic_constraints +gcr_certificate_mixin_class_init +gcr_certificate_mixin_emit_notify +gcr_certificate_mixin_get_property +GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE +gcr_certificate_mixin_comparable_init +gcr_certificate_compare +gcr_certificate_get_icon +gcr_certificate_get_markup_text + +gcr_certificate_get_columns +GCR_CERTIFICATE +GCR_IS_CERTIFICATE +GCR_TYPE_CERTIFICATE +GCR_CERTIFICATE_GET_INTERFACE +gcr_certificate_get_type + +GcrCertificateExtensionKeyUsage +GcrGeneralName +GcrGeneralNameType +
+ +
+gcr-certificate-request +GcrCertificateRequest +GcrCertificateRequestFormat +gcr_certificate_request_capable +gcr_certificate_request_capable_async +gcr_certificate_request_capable_finish +gcr_certificate_request_prepare +gcr_certificate_request_get_format +gcr_certificate_request_get_private_key +gcr_certificate_request_set_cn +gcr_certificate_request_complete +gcr_certificate_request_complete_async +gcr_certificate_request_complete_finish +gcr_certificate_request_encode + +GCR_CERTIFICATE_REQUEST +GCR_IS_CERTIFICATE_REQUEST +GCR_TYPE_CERTIFICATE_REQUEST +GCR_TYPE_CERTIFICATE_REQUEST_FORMAT +gcr_certificate_request_get_type +gcr_certificate_request_format_get_type +
+ +
+gcr-importer +GcrImporter +GcrImporterIface +gcr_importer_get_interaction +gcr_importer_set_interaction +gcr_importer_import +gcr_importer_import_async +gcr_importer_import_finish +gcr_importer_register +gcr_importer_register_well_known +gcr_importer_create_for_parsed +gcr_importer_queue_for_parsed +gcr_importer_queue_and_filter_for_parsed + +GCR_IMPORTER +GCR_IS_IMPORTER +GCR_TYPE_IMPORTER +gcr_importer_get_type +GCR_IMPORTER_GET_INTERFACE +GCR_IMPORT_INTERACTION +GCR_IMPORT_INTERACTION_GET_INTERFACE +GCR_IS_IMPORT_INTERACTION +GCR_TYPE_IMPORT_INTERACTION +GcrImportInteraction +GcrImportInteractionIface +gcr_import_interaction_get_type +
+ +
+gcr-import-interaction +GcrImportInteraction +GcrImportInteractionIface +gcr_import_interaction_supplement_prep +gcr_import_interaction_supplement +gcr_import_interaction_supplement_async +gcr_import_interaction_supplement_finish +
+ +
+gcr-import-button +GcrImportButton +GcrImportButtonClass +gcr_import_button_new +gcr_import_button_add_parsed + +GCR_IMPORT_BUTTON +GCR_IMPORT_BUTTON_CLASS +GCR_IMPORT_BUTTON_GET_CLASS +GCR_IS_IMPORT_BUTTON +GCR_IS_IMPORT_BUTTON_CLASS +gcr_import_button_get_type +GCR_TYPE_IMPORT_BUTTON + +GcrImportButtonPrivate +
+ +
+gcr-simple-certificate +GcrSimpleCertificate +GcrSimpleCertificate +GcrSimpleCertificateClass +gcr_simple_certificate_new +gcr_simple_certificate_new_static + +GcrSimpleCertificatePrivate +GCR_SIMPLE_CERTIFICATE +GCR_IS_SIMPLE_CERTIFICATE +GCR_TYPE_SIMPLE_CERTIFICATE +gcr_simple_certificate_get_type +GCR_SIMPLE_CERTIFICATE_CLASS +GCR_IS_SIMPLE_CERTIFICATE_CLASS +GCR_SIMPLE_CERTIFICATE_GET_CLASS +
+ +
+gcr-pkcs11-certificate +GcrPkcs11Certificate +GcrPkcs11Certificate +GcrPkcs11CertificateClass +gcr_pkcs11_certificate_lookup_issuer +gcr_pkcs11_certificate_lookup_issuer_async +gcr_pkcs11_certificate_lookup_issuer_finish +gcr_pkcs11_certificate_get_attributes + +gcr_pkcs11_certificate_get_type +GCR_IS_PKCS11_CERTIFICATE +GCR_IS_PKCS11_CERTIFICATE_CLASS +GcrPkcs11CertificatePrivate +GCR_PKCS11_CERTIFICATE +GCR_PKCS11_CERTIFICATE_CLASS +GCR_PKCS11_CERTIFICATE_GET_CLASS +GCR_TYPE_PKCS11_CERTIFICATE +
+ +
+gcr-trust +GCR_PURPOSE_SERVER_AUTH +GCR_PURPOSE_CLIENT_AUTH +GCR_PURPOSE_EMAIL +GCR_PURPOSE_CODE_SIGNING +gcr_trust_is_certificate_anchored +gcr_trust_is_certificate_anchored_async +gcr_trust_is_certificate_anchored_finish +gcr_trust_is_certificate_pinned +gcr_trust_is_certificate_pinned_async +gcr_trust_is_certificate_pinned_finish +gcr_trust_add_pinned_certificate +gcr_trust_add_pinned_certificate_async +gcr_trust_add_pinned_certificate_finish +gcr_trust_remove_pinned_certificate +gcr_trust_remove_pinned_certificate_async +gcr_trust_remove_pinned_certificate_finish +
+ +
+gcr-pkcs11 +gcr_pkcs11_initialize +gcr_pkcs11_initialize_async +gcr_pkcs11_initialize_finish +gcr_pkcs11_get_modules +gcr_pkcs11_set_modules +gcr_pkcs11_add_module +gcr_pkcs11_add_module_from_file +gcr_pkcs11_get_trust_lookup_slots +gcr_pkcs11_get_trust_store_slot +gcr_pkcs11_get_trust_lookup_uris +gcr_pkcs11_set_trust_lookup_uris +gcr_pkcs11_get_trust_store_uri +gcr_pkcs11_set_trust_store_uri +
+ +
+gcr-certificate-chain +GcrCertificateChain +GcrCertificateChainClass +GcrCertificateChainStatus +gcr_certificate_chain_new +gcr_certificate_chain_add +gcr_certificate_chain_get_certificate +gcr_certificate_chain_get_status +gcr_certificate_chain_get_anchor +gcr_certificate_chain_get_endpoint +gcr_certificate_chain_get_length +GcrCertificateChainFlags +gcr_certificate_chain_build +gcr_certificate_chain_build_async +gcr_certificate_chain_build_finish +GCR_TYPE_CERTIFICATE_CHAIN_FLAGS +GCR_TYPE_CERTIFICATE_CHAIN_STATUS + +gcr_certificate_chain_flags_get_type +gcr_certificate_chain_status_get_type +gcr_certificate_chain_get_type +GCR_CERTIFICATE_CHAIN +GCR_TYPE_CERTIFICATE_CHAIN +GCR_CERTIFICATE_CHAIN_CLASS +GCR_CERTIFICATE_CHAIN_GET_CLASS +GCR_IS_CERTIFICATE_CHAIN +GCR_IS_CERTIFICATE_CHAIN_CLASS +GcrCertificateChainPrivate +
+ +
+gcr-comparable +GcrComparable +GcrComparableIface +gcr_comparable_compare +gcr_comparable_memcmp + +gcr_comparable_get_type +GCR_COMPARABLE +GCR_COMPARABLE_GET_INTERFACE +GCR_IS_COMPARABLE +GCR_TYPE_COMPARABLE +
+ +
+gcr-collection +GcrCollection +gcr_collection_get_length +gcr_collection_get_objects +gcr_collection_contains +gcr_collection_emit_added +gcr_collection_emit_removed + +gcr_collection_get_type +GCR_COLLECTION +GCR_COLLECTION_GET_INTERFACE +GCR_IS_COLLECTION +GCR_TYPE_COLLECTION +GcrCollectionIface +
+ +
+gcr-simple-collection +GcrSimpleCollection +GcrSimpleCollectionClass +gcr_simple_collection_new +gcr_simple_collection_add +gcr_simple_collection_remove + +gcr_simple_collection_get_type +GCR_IS_SIMPLE_COLLECTION +GCR_IS_SIMPLE_COLLECTION_CLASS +GCR_SIMPLE_COLLECTION +GCR_SIMPLE_COLLECTION_CLASS +GCR_SIMPLE_COLLECTION_GET_CLASS +GCR_TYPE_SIMPLE_COLLECTION +GcrSimpleCollectionPrivate +
+ +
+gcr-filter-collection +GcrFilterCollection +GcrFilterCollectionClass +GcrFilterCollectionFunc +gcr_filter_collection_new_with_callback +gcr_filter_collection_set_callback +gcr_filter_collection_get_underlying +gcr_filter_collection_refilter + +gcr_filter_collection_get_type +GCR_FILTER_COLLECTION +GCR_FILTER_COLLECTION_CLASS +GCR_FILTER_COLLECTION_GET_CLASS +GCR_IS_FILTER_COLLECTION +GCR_IS_FILTER_COLLECTION_CLASS +GCR_TYPE_FILTER_COLLECTION + +GcrFilterCollectionPrivate +
+ +
+gcr-union-collection +GcrUnionCollection +GcrUnionCollectionClass +gcr_union_collection_new +gcr_union_collection_add +gcr_union_collection_take +gcr_union_collection_remove +gcr_union_collection_have +gcr_union_collection_size +gcr_union_collection_elements + +GCR_IS_UNION_COLLECTION +GCR_IS_UNION_COLLECTION_CLASS +GCR_TYPE_UNION_COLLECTION +GCR_UNION_COLLECTION +GCR_UNION_COLLECTION_CLASS +GCR_UNION_COLLECTION_GET_CLASS +GcrUnionCollectionPrivate +gcr_union_collection_get_type +
+ +
+gcr-collection-model +GcrCollectionModel +GcrCollectionModelClass +GcrCollectionModelMode +gcr_collection_model_new +gcr_collection_model_new_full +gcr_collection_model_set_columns +gcr_collection_model_get_collection +gcr_collection_model_set_collection +gcr_collection_model_iter_for_object +gcr_collection_model_object_for_iter +gcr_collection_model_is_selected +gcr_collection_model_change_selected +gcr_collection_model_toggle_selected +gcr_collection_model_get_selected_objects +gcr_collection_model_set_selected_objects +gcr_collection_model_column_for_selected + +gcr_collection_model_get_type +GCR_COLLECTION_MODEL +GCR_COLLECTION_MODEL_CLASS +GCR_COLLECTION_MODEL_GET_CLASS +GCR_IS_COLLECTION_MODEL +GCR_IS_COLLECTION_MODEL_CLASS +GCR_TYPE_COLLECTION_MODEL +GCR_TYPE_COLLECTION_MODEL_MODE +gcr_collection_model_mode_get_type + +GcrCollectionModelPrivate +
+ +
+gcr-column +GcrColumn +GcrColumnFlags + +GCR_TYPE_COLUMN_FLAGS +gcr_column_flags_get_type +
+ +
+gcr-tree-selector +GcrTreeSelector +GcrTreeSelectorClass +gcr_tree_selector_get_collection +gcr_tree_selector_get_columns +gcr_tree_selector_new +gcr_tree_selector_get_selected +gcr_tree_selector_set_selected + +gcr_tree_selector_get_type +GCR_IS_TREE_SELECTOR +GCR_IS_TREE_SELECTOR_CLASS +GCR_TREE_SELECTOR +GCR_TREE_SELECTOR_CLASS +GCR_TREE_SELECTOR_GET_CLASS +GCR_TYPE_TREE_SELECTOR +GcrTreeSelectorPrivate +
+ +
+gcr-list-selector +GcrListSelector +GcrListSelectorClass +gcr_list_selector_new +gcr_list_selector_get_collection +gcr_list_selector_get_selected +gcr_list_selector_set_selected + +gcr_list_selector_get_type +GcrListSelectorPrivate +GCR_IS_LIST_SELECTOR +GCR_IS_LIST_SELECTOR_CLASS +GCR_LIST_SELECTOR +GCR_LIST_SELECTOR_CLASS +GCR_LIST_SELECTOR_GET_CLASS +GCR_TYPE_LIST_SELECTOR +
+ +
+gcr-combo-selector +GcrComboSelector +GcrComboSelectorClass +gcr_combo_selector_get_collection +gcr_combo_selector_new +gcr_combo_selector_get_selected +gcr_combo_selector_set_selected + +gcr_combo_selector_get_type +GCR_IS_COMBO_SELECTOR +GCR_IS_COMBO_SELECTOR_CLASS +GCR_COMBO_SELECTOR +GCR_COMBO_SELECTOR_CLASS +GCR_COMBO_SELECTOR_GET_CLASS +GCR_TYPE_COMBO_SELECTOR +GcrComboSelectorPrivate +
+ +
+gcr-renderer +GcrRenderer +GcrRendererIface +gcr_renderer_create +gcr_renderer_register +gcr_renderer_get_attributes +gcr_renderer_set_attributes +gcr_renderer_popuplate_popup +gcr_renderer_render_view +gcr_renderer_emit_data_changed +gcr_renderer_register_well_known + +gcr_renderer_get_type +GCR_IS_RENDERER +GCR_RENDERER +GCR_RENDERER_GET_INTERFACE +GCR_TYPE_RENDERER +
+ +
+gcr-viewer +GcrViewer +GcrViewerIface +gcr_viewer_new +gcr_viewer_new_scrolled +gcr_viewer_add_renderer +gcr_viewer_insert_renderer +gcr_viewer_remove_renderer +gcr_viewer_count_renderers +gcr_viewer_get_renderer + +gcr_viewer_get_type +GCR_IS_VIEWER +GCR_TYPE_VIEWER +GCR_VIEWER +GCR_VIEWER_GET_INTERFACE +
+ +
+gcr-certificate-widget +GCR_CERTIFICATE_COLUMNS +GcrCertificateWidget +GcrCertificateWidgetClass +GcrCertificateRenderer +GcrCertificateRendererClass +gcr_certificate_widget_new +gcr_certificate_widget_get_certificate +gcr_certificate_widget_set_certificate +gcr_certificate_renderer_new +gcr_certificate_renderer_new_for_attributes +gcr_certificate_renderer_get_certificate +gcr_certificate_renderer_set_certificate + +gcr_certificate_widget_get_type +GCR_CERTIFICATE_RENDERER +GCR_CERTIFICATE_RENDERER_CLASS +GCR_CERTIFICATE_RENDERER_GET_CLASS +GCR_IS_CERTIFICATE_RENDERER +GCR_IS_CERTIFICATE_RENDERER_CLASS +GCR_CERTIFICATE_WIDGET +GCR_CERTIFICATE_WIDGET_CLASS +GCR_CERTIFICATE_WIDGET_GET_CLASS +GCR_IS_CERTIFICATE_WIDGET +GCR_IS_CERTIFICATE_WIDGET_CLASS +GCR_TYPE_CERTIFICATE_RENDERER +GCR_TYPE_CERTIFICATE_WIDGET +GcrCertificateRendererPrivate +GcrCertificateWidgetPrivate +gcr_certificate_renderer_get_type +
+ +
+gcr-key-widget +GcrKeyWidget +GcrKeyWidgetClass +GcrKeyRenderer +GcrKeyRendererClass +gcr_key_widget_new +gcr_key_widget_get_attributes +gcr_key_widget_set_attributes +gcr_key_renderer_new +gcr_key_renderer_get_attributes +gcr_key_renderer_set_attributes + +gcr_key_renderer_get_type +gcr_key_widget_get_type +GCR_IS_KEY_RENDERER +GCR_IS_KEY_RENDERER_CLASS +GCR_IS_KEY_WIDGET +GCR_IS_KEY_WIDGET_CLASS +GCR_KEY_RENDERER +GCR_KEY_RENDERER_CLASS +GCR_KEY_RENDERER_GET_CLASS +GCR_KEY_WIDGET +GCR_KEY_WIDGET_CLASS +GCR_KEY_WIDGET_GET_CLASS +GCR_TYPE_KEY_RENDERER +GCR_TYPE_KEY_WIDGET +GcrKeyRendererPrivate +GcrKeyWidgetPrivate +
+ +
+gcr-unlock-options-widget +GcrUnlockOptionsWidget +GcrUnlockOptionsWidgetClass +GCR_UNLOCK_OPTION_ALWAYS +GCR_UNLOCK_OPTION_IDLE +GCR_UNLOCK_OPTION_SESSION +GCR_UNLOCK_OPTION_TIMEOUT +gcr_unlock_options_widget_new +gcr_unlock_options_widget_get_choice +gcr_unlock_options_widget_set_choice +gcr_unlock_options_widget_get_label +gcr_unlock_options_widget_set_label +gcr_unlock_options_widget_get_ttl +gcr_unlock_options_widget_set_ttl +gcr_unlock_options_widget_get_sensitive +gcr_unlock_options_widget_set_sensitive + +gcr_unlock_options_widget_get_type +GCR_IS_UNLOCK_OPTIONS_WIDGET +GCR_IS_UNLOCK_OPTIONS_WIDGET_CLASS +GCR_TYPE_UNLOCK_OPTIONS_WIDGET +GCR_UNLOCK_OPTIONS_WIDGET +GCR_UNLOCK_OPTIONS_WIDGET_CLASS +GCR_UNLOCK_OPTIONS_WIDGET_GET_CLASS +GcrUnlockOptionsWidgetPrivate +
+ +
+gcr-viewer-widget +GcrViewerWidget +gcr_viewer_widget_new +gcr_viewer_widget_load_bytes +gcr_viewer_widget_load_data +gcr_viewer_widget_load_file +gcr_viewer_widget_get_parser +gcr_viewer_widget_get_viewer +gcr_viewer_widget_show_error +gcr_viewer_widget_clear_error +gcr_viewer_widget_get_display_name +gcr_viewer_widget_set_display_name + +gcr_viewer_widget_get_type +GCR_TYPE_VIEWER_WIDGET +GCR_IS_VIEWER_WIDGET +GCR_VIEWER_WIDGET +
+ +
+gcr-secret-exchange +GcrSecretExchange +GcrSecretExchangeClass +GCR_SECRET_EXCHANGE_PROTOCOL_1 +gcr_secret_exchange_new +gcr_secret_exchange_begin +gcr_secret_exchange_receive +gcr_secret_exchange_get_protocol +gcr_secret_exchange_get_secret +gcr_secret_exchange_send + +gcr_secret_exchange_get_type +GCR_IS_SECRET_EXCHANGE +GCR_IS_SECRET_EXCHANGE_CLASS +GCR_SECRET_EXCHANGE +GCR_SECRET_EXCHANGE_CLASS +GCR_SECRET_EXCHANGE_GET_CLASS +GCR_TYPE_SECRET_EXCHANGE +GcrSecretExchangePrivate +
+ +
+gcr-fingerprint +gcr_fingerprint_from_attributes +gcr_fingerprint_from_subject_public_key_info +
+ +
+gcr-secure-entry-buffer +GcrSecureEntryBuffer +GcrSecureEntryBufferClass +gcr_secure_entry_buffer_new + +gcr_secure_entry_buffer_get_type +GCR_IS_SECURE_ENTRY_BUFFER +GCR_IS_SECURE_ENTRY_BUFFER_CLASS +GCR_SECURE_ENTRY_BUFFER +GCR_SECURE_ENTRY_BUFFER_CLASS +GCR_SECURE_ENTRY_BUFFER_GET_CLASS +GCR_TYPE_SECURE_ENTRY_BUFFER + +GcrSecureEntryBufferPrivate +
+ +
+gcr-secure-memory +gcr_secure_memory_new +gcr_secure_memory_alloc +gcr_secure_memory_try_alloc +gcr_secure_memory_realloc +gcr_secure_memory_try_realloc +gcr_secure_memory_strdup +gcr_secure_memory_strfree +gcr_secure_memory_free +gcr_secure_memory_is_secure +
+ +
+gcr-ssh-askpass +GcrSshAskpass +gcr_ssh_askpass_new +gcr_ssh_askpass_get_interaction +gcr_ssh_askpass_child_setup + +GCR_IS_SSH_ASKPASS +GCR_IS_SSH_ASKPASS_CLASS +GCR_SSH_ASKPASS +GCR_SSH_ASKPASS_CLASS +GCR_SSH_ASKPASS_GET_CLASS +GCR_TYPE_SSH_ASKPASS +GcrSshAskpassClass +gcr_ssh_askpass_get_type +
+ +
+gcr-private + +GCR_GNUPG_COLLECTION +GCR_GNUPG_COLLECTION_CLASS +GCR_GNUPG_COLLECTION_GET_CLASS +GCR_GNUPG_KEY +GCR_GNUPG_KEY_CLASS +GCR_GNUPG_KEY_COLUMNS +GCR_GNUPG_KEY_GET_CLASS +GCR_IS_GNUPG_COLLECTION +GCR_IS_GNUPG_COLLECTION_CLASS +GCR_IS_GNUPG_KEY +GCR_IS_GNUPG_KEY_CLASS +GCR_TYPE_GNUPG_COLLECTION +GCR_TYPE_GNUPG_KEY +GCR_GNUPG_PROCESS +GCR_GNUPG_PROCESS_CLASS +GCR_GNUPG_PROCESS_GET_CLASS +GCR_IS_GNUPG_PROCESS +GCR_IS_GNUPG_PROCESS_CLASS +GCR_TYPE_GNUPG_PROCESS +GcrGnupgProcess +GcrGnupgProcessClass +GcrGnupgProcessPrivate +GcrGnupgProcessFlags +GcrGnupgCollection +GcrGnupgCollectionClass +GcrGnupgCollectionPrivate +GcrGnupgKey +GcrGnupgKeyClass +GcrGnupgKeyPrivate +GcrLineCallback +GCR_IS_MEMORY_ICON +GCR_IS_MEMORY_ICON_CLASS +GCR_MEMORY_ICON +GCR_MEMORY_ICON_CLASS +GCR_MEMORY_ICON_COLUMNS +GCR_MEMORY_ICON_GET_CLASS +GCR_TYPE_MEMORY_ICON +GcrMemoryIcon +GcrMemoryIconClass +GcrMemoryIconPrivate +GcrOpensshPubCallback +GCR_TYPE_IMPORTER_PROMPT_BEHAVIOR +gcr_importer_prompt_behavior_get_type +
+ +
+gcr-prompt +GcrPrompt +GcrPromptIface +GcrPromptReply +gcr_prompt_password +gcr_prompt_password_async +gcr_prompt_password_finish +gcr_prompt_password_run +gcr_prompt_confirm +gcr_prompt_confirm_async +gcr_prompt_confirm_finish +gcr_prompt_confirm_run +gcr_prompt_reset +gcr_prompt_close +gcr_prompt_get_title +gcr_prompt_set_title +gcr_prompt_get_message +gcr_prompt_set_message +gcr_prompt_get_description +gcr_prompt_set_description +gcr_prompt_get_warning +gcr_prompt_set_warning +gcr_prompt_get_continue_label +gcr_prompt_set_continue_label +gcr_prompt_get_cancel_label +gcr_prompt_set_cancel_label +gcr_prompt_get_choice_label +gcr_prompt_set_choice_label +gcr_prompt_get_choice_chosen +gcr_prompt_set_choice_chosen +gcr_prompt_get_password_new +gcr_prompt_set_password_new +gcr_prompt_get_password_strength +gcr_prompt_get_caller_window +gcr_prompt_set_caller_window + +gcr_prompt_get_type +gcr_prompt_reply_get_type +GCR_IS_PROMPT +GCR_PROMPT +GCR_PROMPT_GET_INTERFACE +GCR_TYPE_PROMPT +GCR_TYPE_PROMPT_REPLY +
+ +
+gcr-prompt-dialog +GcrPromptDialog +GcrPromptDialogClass + +GcrPromptDialogPrivate +gcr_prompt_dialog_get_type +GCR_IS_PROMPT_DIALOG +GCR_IS_PROMPT_DIALOG_CLASS +GCR_PROMPT_DIALOG +GCR_PROMPT_DIALOG_CLASS +GCR_PROMPT_DIALOG_GET_CLASS +GCR_TYPE_PROMPT_DIALOG +
+ +
+gcr-system-prompt +GcrSystemPrompt +GcrSystemPromptClass +GCR_SYSTEM_PROMPT_ERROR +GcrSystemPromptError +gcr_system_prompt_open +gcr_system_prompt_open_async +gcr_system_prompt_open_finish +gcr_system_prompt_open_for_prompter +gcr_system_prompt_open_for_prompter_async +gcr_system_prompt_get_secret_exchange +gcr_system_prompt_close +gcr_system_prompt_close_async +gcr_system_prompt_close_finish + +GcrSystemPromptPrivate +gcr_system_prompt_error_get_domain +gcr_system_prompt_error_get_type +gcr_system_prompt_get_type +GCR_IS_SYSTEM_PROMPT +GCR_IS_SYSTEM_PROMPT_CLASS +GCR_SYSTEM_PROMPT +GCR_SYSTEM_PROMPT_CLASS +GCR_SYSTEM_PROMPT_GET_CLASS +GCR_TYPE_SYSTEM_PROMPT +GCR_TYPE_SYSTEM_PROMPT_ERROR +
+ +
+gcr-system-prompter +GcrSystemPrompter +GcrSystemPrompterClass +GcrSystemPrompterMode +gcr_system_prompter_new +gcr_system_prompter_register +gcr_system_prompter_unregister +gcr_system_prompter_get_mode +gcr_system_prompter_get_prompt_type +gcr_system_prompter_get_prompting + +GcrSystemPrompterPrivate +gcr_system_prompter_get_type +gcr_system_prompter_mode_get_type +GCR_IS_SYSTEM_PROMPTER +GCR_IS_SYSTEM_PROMPTER_CLASS +GCR_SYSTEM_PROMPTER +GCR_SYSTEM_PROMPTER_CLASS +GCR_SYSTEM_PROMPTER_GET_CLASS +GCR_TYPE_SYSTEM_PROMPTER +GCR_TYPE_SYSTEM_PROMPTER_MODE +
+ +
+gcr-mock-prompter +gcr_mock_prompter_start +gcr_mock_prompter_stop +gcr_mock_prompter_disconnect +gcr_mock_prompter_expect_confirm_cancel +gcr_mock_prompter_expect_confirm_ok +gcr_mock_prompter_expect_password_cancel +gcr_mock_prompter_expect_password_ok +gcr_mock_prompter_expect_close +gcr_mock_prompter_get_delay_msec +gcr_mock_prompter_set_delay_msec +gcr_mock_prompter_is_expecting +gcr_mock_prompter_is_prompting +
+ +
+GcrDBusPrompter +
+ +
+GcrDBusPrompterCallback +
diff --git a/docs/reference/gcr/gcr-shooter.c b/docs/reference/gcr/gcr-shooter.c new file mode 100644 index 0000000..0ae3827 --- /dev/null +++ b/docs/reference/gcr/gcr-shooter.c @@ -0,0 +1,466 @@ + +#include "gcr-shooter.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAXIMUM_WM_REPARENTING_DEPTH 4 + +#define SMALL_WIDTH 240 +#define SMALL_HEIGHT 75 +#define MEDIUM_WIDTH 240 +#define MEDIUM_HEIGHT 165 +#define LARGE_WIDTH 240 +#define LARGE_HEIGHT 240 + +static Window +find_toplevel_window (Window xid) +{ + Window root, parent, *children; + guint nchildren; + + do { + if (XQueryTree (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xid, &root, + &parent, &children, &nchildren) == 0) { + g_warning ("Couldn't find window manager window"); + return None; + } + + if (root == parent) + return xid; + + xid = parent; + } while (TRUE); +} + + +static gboolean +adjust_size_callback (GcrShooterInfo *info) +{ + Window toplevel; + Window root; + GdkWindow *window; + gint tx; + gint ty; + guint twidth; + guint theight; + guint tborder_width; + guint tdepth; + gint target_width = 0; + gint target_height = 0; + + window = gtk_widget_get_window (info->window); + toplevel = find_toplevel_window (GDK_WINDOW_XID (window)); + XGetGeometry (GDK_WINDOW_XDISPLAY (window), toplevel, + &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth); + + switch (info->size) { + case GCR_SHOOTER_SMALL: + target_width = SMALL_WIDTH; + target_height = SMALL_HEIGHT; + break; + case GCR_SHOOTER_MEDIUM: + target_width = MEDIUM_WIDTH; + target_height = MEDIUM_HEIGHT; + break; + case GCR_SHOOTER_LARGE: + target_width = LARGE_WIDTH; + target_height = LARGE_HEIGHT; + break; + case GCR_SHOOTER_ASIS: + target_width = twidth; + target_height = theight; + break; + } + + if (twidth > target_width || theight > target_height) { + gtk_widget_set_size_request (info->window, + 2 + target_width - (twidth - target_width), /* Dunno why I need the +2 fudge factor; */ + 2 + target_height - (theight - target_height)); + } + return FALSE; +} + +static void +realize_callback (GtkWidget *widget, GcrShooterInfo *info) +{ + gdk_threads_add_timeout (500, (GSourceFunc)adjust_size_callback, info); +} + +GcrShooterInfo* +gcr_shooter_info_new (const gchar *name, GtkWidget *widget, GcrShooterSize size) +{ + GcrShooterInfo *info; + + info = g_new0 (GcrShooterInfo, 1); + info->name = g_strdup (name); + info->size = size; + if (GTK_IS_WINDOW (widget)) { + info->window = widget; + gtk_window_set_resizable (GTK_WINDOW (info->window), FALSE); + info->include_decorations = TRUE; + g_signal_connect (info->window, "realize", G_CALLBACK (realize_callback), info); + } else { + info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_has_resize_grip (GTK_WINDOW (info->window), FALSE); + info->include_decorations = FALSE; + gtk_widget_show_all (widget); + gtk_container_add (GTK_CONTAINER (info->window), widget); + } + info->no_focus = TRUE; + + gtk_widget_set_app_paintable (info->window, TRUE); + g_signal_connect (info->window, "focus", G_CALLBACK (gtk_true), NULL); + gtk_container_set_border_width (GTK_CONTAINER (info->window), 12); + + switch (size) { + case GCR_SHOOTER_SMALL: + gtk_widget_set_size_request (info->window, 240, 75); + break; + case GCR_SHOOTER_MEDIUM: + gtk_widget_set_size_request (info->window, 240, 165); + break; + case GCR_SHOOTER_LARGE: + gtk_widget_set_size_request (info->window, 240, 240); + break; + default: + break; + } + + return info; +} + +#define BLUR_RADIUS 5 +#define SHADOW_OFFSET (BLUR_RADIUS * 4 / 5) +#define SHADOW_OPACITY 0.75 + +typedef struct { + int size; + double *data; +} ConvFilter; + +static double +gaussian (double x, double y, double r) +{ + return ((1 / (2 * M_PI * r)) * + exp ((- (x * x + y * y)) / (2 * r * r))); +} + +static ConvFilter * +create_blur_filter (int radius) +{ + ConvFilter *filter; + int x, y; + double sum; + + filter = g_new0 (ConvFilter, 1); + filter->size = radius * 2 + 1; + filter->data = g_new (double, filter->size * filter->size); + + sum = 0.0; + + for (y = 0 ; y < filter->size; y++) { + for (x = 0 ; x < filter->size; x++) { + sum += filter->data[y * filter->size + x] = gaussian (x - (filter->size >> 1), + y - (filter->size >> 1), + radius); + } + } + + for (y = 0; y < filter->size; y++) { + for (x = 0; x < filter->size; x++) { + filter->data[y * filter->size + x] /= sum; + } + } + + return filter; + +} + +static GdkPixbuf * +create_shadow (GdkPixbuf *src) +{ + int x, y, i, j; + int width, height; + GdkPixbuf *dest; + static ConvFilter *filter = NULL; + int src_rowstride, dest_rowstride; + int src_bpp, dest_bpp; + guchar *src_pixels, *dest_pixels; + + if (!filter) + filter = create_blur_filter (BLUR_RADIUS); + + width = gdk_pixbuf_get_width (src) + BLUR_RADIUS * 2 + SHADOW_OFFSET; + height = gdk_pixbuf_get_height (src) + BLUR_RADIUS * 2 + SHADOW_OFFSET; + + dest = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src), + gdk_pixbuf_get_has_alpha (src), + gdk_pixbuf_get_bits_per_sample (src), + width, height); + gdk_pixbuf_fill (dest, 0); + src_pixels = gdk_pixbuf_get_pixels (src); + src_rowstride = gdk_pixbuf_get_rowstride (src); + src_bpp = gdk_pixbuf_get_has_alpha (src) ? 4 : 3; + + dest_pixels = gdk_pixbuf_get_pixels (dest); + dest_rowstride = gdk_pixbuf_get_rowstride (dest); + dest_bpp = gdk_pixbuf_get_has_alpha (dest) ? 4 : 3; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + int sumr = 0, sumg = 0, sumb = 0, suma = 0; + + for (i = 0; i < filter->size; i++) { + for (j = 0; j < filter->size; j++) { + int src_x, src_y; + + src_y = -(BLUR_RADIUS + SHADOW_OFFSET) + y - (filter->size >> 1) + i; + src_x = -(BLUR_RADIUS + SHADOW_OFFSET) + x - (filter->size >> 1) + j; + + if (src_y < 0 || src_y > gdk_pixbuf_get_height (src) || + src_x < 0 || src_x > gdk_pixbuf_get_width (src)) + continue; + + sumr += src_pixels [src_y * src_rowstride + + src_x * src_bpp + 0] * + filter->data [i * filter->size + j]; + sumg += src_pixels [src_y * src_rowstride + + src_x * src_bpp + 1] * + filter->data [i * filter->size + j]; + + sumb += src_pixels [src_y * src_rowstride + + src_x * src_bpp + 2] * + filter->data [i * filter->size + j]; + + if (src_bpp == 4) + suma += src_pixels [src_y * src_rowstride + + src_x * src_bpp + 3] * + filter->data [i * filter->size + j]; + } + } + + if (dest_bpp == 4) + dest_pixels [y * dest_rowstride + + x * dest_bpp + 3] = suma * SHADOW_OPACITY; + } + } + + return dest; +} + +GdkPixbuf * +create_shadowed_pixbuf (GdkPixbuf *src) +{ + GdkPixbuf *dest; + + dest = create_shadow (src); + + gdk_pixbuf_composite (src, dest, + BLUR_RADIUS, BLUR_RADIUS, + gdk_pixbuf_get_width (src), + gdk_pixbuf_get_height (src), + BLUR_RADIUS, BLUR_RADIUS, 1.0, 1.0, + GDK_INTERP_NEAREST, 255); + return dest; +} +static GdkPixbuf * +add_border_to_shot (GdkPixbuf *pixbuf) +{ + GdkPixbuf *retval; + + retval = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, + gdk_pixbuf_get_width (pixbuf) + 2, + gdk_pixbuf_get_height (pixbuf) + 2); + + /* Fill with solid black */ + gdk_pixbuf_fill (retval, 0xFF); + gdk_pixbuf_copy_area (pixbuf, + 0, 0, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + retval, 1, 1); + + return retval; +} + +static GdkPixbuf * +remove_shaped_area (GdkPixbuf *pixbuf, Window window) +{ + GdkPixbuf *retval; + XRectangle *rectangles; + int rectangle_count, rectangle_order; + int i; + + retval = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf)); + + gdk_pixbuf_fill (retval, 0); + rectangles = XShapeGetRectangles (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), window, + ShapeBounding, &rectangle_count, &rectangle_order); + + for (i = 0; i < rectangle_count; i++) { + int y, x; + + for (y = rectangles[i].y; y < rectangles[i].y + rectangles[i].height; y++) { + guchar *src_pixels, *dest_pixels; + + src_pixels = gdk_pixbuf_get_pixels (pixbuf) + + y * gdk_pixbuf_get_rowstride (pixbuf) + + rectangles[i].x * (gdk_pixbuf_get_has_alpha (pixbuf) ? 4 : 3); + dest_pixels = gdk_pixbuf_get_pixels (retval) + + y * gdk_pixbuf_get_rowstride (retval) + + rectangles[i].x * 4; + + for (x = rectangles[i].x; x < rectangles[i].x + rectangles[i].width; x++) { + *dest_pixels++ = *src_pixels ++; + *dest_pixels++ = *src_pixels ++; + *dest_pixels++ = *src_pixels ++; + *dest_pixels++ = 255; + + if (gdk_pixbuf_get_has_alpha (pixbuf)) + src_pixels++; + } + } + } + + return retval; +} + +static GdkPixbuf * +take_window_shot (Window child, gboolean include_decoration) +{ + GdkWindow *window; + Window xid; + gint x_orig, y_orig; + gint x = 0, y = 0; + gint width, height; + + GdkPixbuf *tmp, *tmp2; + GdkPixbuf *retval; + + if (include_decoration) + xid = find_toplevel_window (child); + else + xid = child; + + window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), xid); + + width = gdk_window_get_width (window); + height = gdk_window_get_height (window); + gdk_window_get_origin (window, &x_orig, &y_orig); + + if (x_orig < 0) { + x = - x_orig; + width = width + x_orig; + x_orig = 0; + } + + if (y_orig < 0) { + y = - y_orig; + height = height + y_orig; + y_orig = 0; + } + + if (x_orig + width > gdk_screen_width ()) + width = gdk_screen_width () - x_orig; + + if (y_orig + height > gdk_screen_height ()) + height = gdk_screen_height () - y_orig; + + tmp = gdk_pixbuf_get_from_window (window, x, y, width, height); + + if (include_decoration) + tmp2 = remove_shaped_area (tmp, xid); + else + tmp2 = add_border_to_shot (tmp); + + retval = create_shadowed_pixbuf (tmp2); + g_object_unref (tmp); + g_object_unref (tmp2); + + return retval; +} + +int +main (int argc, char **argv) +{ + GdkPixbuf *screenshot = NULL; + GError *error = NULL; + GtkAllocation allocation; + GcrShooterInfo *info; + GdkWindow *window; + const gchar *outdir; + XID id; + char *filename; + + /* + * If there's no DISPLAY, we silently error out. We don't want to break + * headless builds. + */ + + if (!gtk_init_check (&argc, &argv)) + return 0; + + if (argc < 2 || !argv[1]) { + g_printerr ("specify name of widget\n"); + return 2; + } + + info = gcr_widgets_create (argv[1]); + if (info == NULL) { + g_printerr ("no such widget: %s\n", argv[1]); + return 1; + } + + gtk_widget_show (info->window); + window = gtk_widget_get_window (info->window); + gtk_widget_get_allocation (info->window, &allocation); + + gtk_widget_show_now (info->window); + gtk_widget_queue_draw_area (info->window, + allocation.x, allocation.y, + allocation.width, allocation.height); + gdk_window_process_updates (window, TRUE); + + while (gtk_events_pending ()) + gtk_main_iteration (); + sleep (1); + + while (gtk_events_pending ()) + gtk_main_iteration (); + + id = gdk_x11_window_get_xid (window); + screenshot = take_window_shot (id, info->include_decorations); + + outdir = (argc >= 3) ? argv[2] : "."; + filename = g_strdup_printf ("%s/%s.png", outdir, info->name); + if (!gdk_pixbuf_save (screenshot, filename, "png", &error, NULL)) { + g_printerr ("couldn't write screenshot: %s: %s\n", filename, error->message); + g_clear_error (&error); + return 1; + } + g_free(filename); + gtk_widget_hide (info->window); + + return 0; +} diff --git a/docs/reference/gcr/gcr-visual-index.xml b/docs/reference/gcr/gcr-visual-index.xml new file mode 100644 index 0000000..ced540a --- /dev/null +++ b/docs/reference/gcr/gcr-visual-index.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gcr/gcr-widgets.c b/docs/reference/gcr/gcr-widgets.c new file mode 100644 index 0000000..d8458ed --- /dev/null +++ b/docs/reference/gcr/gcr-widgets.c @@ -0,0 +1,236 @@ + +#include "gcr-shooter.h" +#include "gcr.h" + +static gpointer +load_gcr_test_file (const gchar *name, gsize *length) +{ + GError *error = NULL; + gchar *contents; + gchar *filename; + + filename = g_build_filename (TOPDIR, "gcr", "tests", "files", name, NULL); + if (!g_file_get_contents (filename, &contents, length, &error)) + g_error ("couldn't read file: %s: %s", filename, error->message); + g_free (filename); + return contents; +} + +static GcrShooterInfo * +create_certificate_widget (const gchar *name) +{ + GcrCertificate *certificate; + GtkWidget *widget; + GtkWidget *align; + gchar *contents; + gsize length; + + contents = load_gcr_test_file ("cacert.org.cer", &length); + certificate = gcr_simple_certificate_new (contents, length); + g_free (contents); + + widget = GTK_WIDGET (gcr_certificate_widget_new (certificate)); + g_object_unref (certificate); + + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), widget); + + return gcr_shooter_info_new (name, align, GCR_SHOOTER_LARGE); +} + +static void +on_parser_key_parsed (GcrParser *parser, gpointer unused) +{ + GckAttributes **attrs = unused; + *attrs = gck_attributes_ref (gcr_parser_get_parsed_attributes (parser)); +} + +static GcrShooterInfo * +create_key_widget (const gchar *name) +{ + GError *error = NULL; + GckAttributes *attrs = NULL; + GtkWidget *widget; + GtkWidget *align; + GcrParser *parser; + gchar *contents; + gsize length; + + contents = load_gcr_test_file ("der-dsa-1024.key", &length); + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_key_parsed), &attrs); + if (!gcr_parser_parse_data (parser, contents, length, &error)) + g_error ("couldn't parse data: %s", error->message); + g_object_unref (parser); + g_free (contents); + + g_assert (attrs); + widget = GTK_WIDGET (gcr_key_widget_new (attrs)); + gck_attributes_unref (attrs); + + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), widget); + + return gcr_shooter_info_new (name, align, GCR_SHOOTER_LARGE); +} + +static GcrShooterInfo * +create_combo_selector (const gchar *name) +{ + GcrComboSelector *selector; + GcrCertificate *certificate; + GcrCollection *collection; + GtkWidget *align; + gchar *contents; + gsize length; + + contents = load_gcr_test_file ("cacert.org.cer", &length); + certificate = gcr_simple_certificate_new (contents, length); + g_free (contents); + + collection = gcr_simple_collection_new (); + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), G_OBJECT (certificate)); + + selector = gcr_combo_selector_new (collection); + g_object_unref (collection); + + gcr_combo_selector_set_selected (selector, G_OBJECT (certificate)); + g_object_unref (certificate); + + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (selector)); + + return gcr_shooter_info_new (name, align, GCR_SHOOTER_MEDIUM); +} + +static GcrShooterInfo * +create_tree_selector (const gchar *name) +{ + GcrTreeSelector *selector; + GcrCertificate *certificate; + GcrCollection *collection; + GtkWidget *align; + gchar *contents; + gsize length; + GList *selected = NULL; + + collection = gcr_simple_collection_new (); + selector = gcr_tree_selector_new (collection, GCR_CERTIFICATE_COLUMNS); + + contents = load_gcr_test_file ("cacert.org.cer", &length); + certificate = gcr_simple_certificate_new (contents, length); + g_free (contents); + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), G_OBJECT (certificate)); + selected = g_list_append (selected, certificate); + gcr_tree_selector_set_selected (selector, selected); + g_list_free (selected); + g_object_unref (certificate); + + contents = load_gcr_test_file ("der-certificate-dsa.cer", &length); + certificate = gcr_simple_certificate_new (contents, length); + g_free (contents); + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), G_OBJECT (certificate)); + g_object_unref (certificate); + + g_object_unref (collection); + + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (selector)); + + return gcr_shooter_info_new (name, align, GCR_SHOOTER_MEDIUM); +} + +static GcrShooterInfo * +create_list_selector (const gchar *name) +{ + GcrListSelector *selector; + GcrCertificate *certificate; + GcrCollection *collection; + GtkWidget *align; + gchar *contents; + gsize length; + GList *selected = NULL; + + collection = gcr_simple_collection_new (); + selector = gcr_list_selector_new (collection); + + contents = load_gcr_test_file ("cacert.org.cer", &length); + certificate = gcr_simple_certificate_new (contents, length); + g_free (contents); + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), G_OBJECT (certificate)); + selected = g_list_append (selected, certificate); + gcr_list_selector_set_selected (selector, selected); + g_list_free (selected); + g_object_unref (certificate); + + contents = load_gcr_test_file ("der-certificate-dsa.cer", &length); + certificate = gcr_simple_certificate_new (contents, length); + g_free (contents); + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), G_OBJECT (certificate)); + g_object_unref (certificate); + + g_object_unref (collection); + + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (selector)); + + return gcr_shooter_info_new (name, align, GCR_SHOOTER_MEDIUM); +} + +static GcrShooterInfo * +create_import_button (const gchar *name) +{ + GcrImportButton *import; + GtkWidget *align; + + import = gcr_import_button_new ("Import"); + + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (import)); + + return gcr_shooter_info_new (name, align, GCR_SHOOTER_MEDIUM); +} + +static GcrShooterInfo * +create_viewer_widget (const gchar *name) +{ + GcrViewerWidget *viewer; + GtkWidget *align; + gchar *contents; + gsize length; + + contents = load_gcr_test_file ("email.p12", &length); + viewer = gcr_viewer_widget_new (); + gcr_viewer_widget_load_data (viewer, "Email certificate", (gpointer)contents, length); + g_free (contents); + + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (viewer)); + + return gcr_shooter_info_new (name, align, GCR_SHOOTER_LARGE); +} + +GcrShooterInfo* +gcr_widgets_create (const gchar *name) +{ + g_assert (name); + + if (g_str_equal (name, "certificate-widget")) + return create_certificate_widget (name); + else if (g_str_equal (name, "combo-selector")) + return create_combo_selector (name); + else if (g_str_equal (name, "import-button")) + return create_import_button (name); + else if (g_str_equal (name, "key-widget")) + return create_key_widget (name); + else if (g_str_equal (name, "list-selector")) + return create_list_selector (name); + else if (g_str_equal (name, "tree-selector")) + return create_tree_selector (name); + else if (g_str_equal (name, "viewer-widget")) + return create_viewer_widget (name); + else + g_assert_not_reached (); + + return NULL; +} diff --git a/docs/reference/gcr/gcr.types b/docs/reference/gcr/gcr.types new file mode 100644 index 0000000..c222b4a --- /dev/null +++ b/docs/reference/gcr/gcr.types @@ -0,0 +1,29 @@ +gcr_certificate_chain_get_type +gcr_certificate_get_type +gcr_certificate_renderer_get_type +gcr_certificate_widget_get_type +gcr_collection_get_type +gcr_collection_model_get_type +gcr_combo_selector_get_type +gcr_comparable_get_type +gcr_filter_collection_get_type +gcr_import_button_get_type +gcr_importer_get_type +gcr_key_renderer_get_type +gcr_key_widget_get_type +gcr_list_selector_get_type +gcr_parser_get_type +gcr_pkcs11_certificate_get_type +gcr_prompt_get_type +gcr_prompt_dialog_get_type +gcr_renderer_get_type +gcr_secure_entry_buffer_get_type +gcr_simple_certificate_get_type +gcr_simple_collection_get_type +gcr_system_prompt_get_type +gcr_system_prompter_get_type +gcr_tree_selector_get_type +gcr_union_collection_get_type +gcr_unlock_options_widget_get_type +gcr_viewer_get_type +gcr_viewer_widget_get_type diff --git a/docs/reference/gcr/html/GcrCertificate.html b/docs/reference/gcr/html/GcrCertificate.html new file mode 100644 index 0000000..4c77e73 --- /dev/null +++ b/docs/reference/gcr/html/GcrCertificate.html @@ -0,0 +1,1472 @@ + + + + +GcrCertificate: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrCertificate

+

GcrCertificate — Represents an X.509 certificate

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
const guint8 * + +gcr_certificate_get_der_data () +
+gchar * + +gcr_certificate_get_issuer_cn () +
+gchar * + +gcr_certificate_get_issuer_dn () +
+gchar * + +gcr_certificate_get_issuer_name () +
+gchar * + +gcr_certificate_get_issuer_part () +
+guchar * + +gcr_certificate_get_issuer_raw () +
+gboolean + +gcr_certificate_is_issuer () +
+gchar * + +gcr_certificate_get_subject_cn () +
+gchar * + +gcr_certificate_get_subject_dn () +
+gchar * + +gcr_certificate_get_subject_name () +
+gchar * + +gcr_certificate_get_subject_part () +
+guchar * + +gcr_certificate_get_subject_raw () +
+GDate * + +gcr_certificate_get_issued_date () +
+GDate * + +gcr_certificate_get_expiry_date () +
+guchar * + +gcr_certificate_get_serial_number () +
+gchar * + +gcr_certificate_get_serial_number_hex () +
+guint + +gcr_certificate_get_key_size () +
+guchar * + +gcr_certificate_get_fingerprint () +
+gchar * + +gcr_certificate_get_fingerprint_hex () +
+gboolean + +gcr_certificate_get_basic_constraints () +
+void + +gcr_certificate_mixin_class_init () +
+void + +gcr_certificate_mixin_emit_notify () +
+void + +gcr_certificate_mixin_get_property () +
#defineGCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE
+void + +gcr_certificate_mixin_comparable_init () +
+gint + +gcr_certificate_compare () +
+GIcon * + +gcr_certificate_get_icon () +
+gchar * + +gcr_certificate_get_markup_text () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+gchar *descriptionRead
+GDate *expiryRead
+GIcon *iconRead
+gchar *issuerRead
+gchar *labelRead
+gchar *markupRead
+gchar *subjectRead
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrCertificate
structGcrCertificateIface
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GcrCertificate
+
+
+
+

Prerequisites

+

+GcrCertificate requires + GcrComparable and GObject.

+
+
+

Known Implementations

+

+GcrCertificate is implemented by + GcrCertificateRenderer, GcrPkcs11Certificate and GcrSimpleCertificate.

+
+
+

Description

+

This is an interface that represents an X.509 certificate. Objects can +implement this interface to make a certificate usable with the GCR +library.

+

Various methods are available to parse out relevant bits of the certificate. +However no verification of the validity of a certificate is done here. Use +your favorite crypto library to do this.

+

You can use GcrSimpleCertificate to simply load a certificate for which +you already have the raw certificate data.

+

The GcrCertificate interface has several properties that must be implemented. +You can use a mixin to implement these properties if desired. See the +gcr_certificate_mixin_class_init() and gcr_certificate_mixin_get_property() +functions.

+

All certificates are comparable. If implementing a GcrCertificate, you can +use GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE() to implement the GcrComparable +interface.

+
+
+

Functions

+
+

gcr_certificate_get_der_data ()

+
const guint8 *
+gcr_certificate_get_der_data (GcrCertificate *self,
+                              gsize *n_data);
+

Gets the raw DER data for an X.509 certificate.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

n_data

a pointer to a location to store the size of the resulting DER data.

 
+
+
+

Returns

+

raw DER data of the X.509 certificate.

+

[transfer none][array length=n_data]

+
+
+
+
+

gcr_certificate_get_issuer_cn ()

+
gchar *
+gcr_certificate_get_issuer_cn (GcrCertificate *self);
+

Get the common name of the issuer of this certificate.

+

The string returned should be freed by the caller when no longer +required.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

The allocated issuer CN, or NULL if no issuer CN present.

+
+
+
+
+

gcr_certificate_get_issuer_dn ()

+
gchar *
+gcr_certificate_get_issuer_dn (GcrCertificate *self);
+

Get the full issuer DN of the certificate as a (mostly) +readable string.

+

The string returned should be freed by the caller when no longer +required.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

The allocated issuer DN of the certificate.

+
+
+
+
+

gcr_certificate_get_issuer_name ()

+
gchar *
+gcr_certificate_get_issuer_name (GcrCertificate *self);
+

Get a name to represent the issuer of this certificate.

+

This will try to lookup the common name, orianizational unit, +organization in that order.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

the allocated issuer name, or NULL if no issuer name

+
+
+
+
+

gcr_certificate_get_issuer_part ()

+
gchar *
+gcr_certificate_get_issuer_part (GcrCertificate *self,
+                                 const gchar *part);
+

Get a part of the DN of the issuer of this certificate.

+

Examples of a part + might be the 'OU' (organizational unit) +or the 'CN' (common name). Only the value of that part +of the DN is returned.

+

The string returned should be freed by the caller when no longer +required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

part

a DN type string or OID.

 
+
+
+

Returns

+

the allocated part of the issuer DN, or NULL if no +such part is present.

+

[allow-none]

+
+
+
+
+

gcr_certificate_get_issuer_raw ()

+
guchar *
+gcr_certificate_get_issuer_raw (GcrCertificate *self,
+                                gsize *n_data);
+

Get the raw DER data for the issuer DN of the certificate.

+

The data should be freed by using g_free() when no longer required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

n_data

The length of the returned data.

 
+
+
+

Returns

+

allocated memory containing +the raw issuer.

+

[transfer full][array length=n_data]

+
+
+
+
+

gcr_certificate_is_issuer ()

+
gboolean
+gcr_certificate_is_issuer (GcrCertificate *self,
+                           GcrCertificate *issuer);
+

Check if issuer + could be the issuer of this certificate. This is done by +comparing the relevant subject and issuer fields. No signature check is +done. Proper verification of certificates must be done via a crypto +library.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

issuer

a possible issuer GcrCertificate

 
+
+
+

Returns

+

whether issuer +could be the issuer of the certificate.

+
+
+
+
+

gcr_certificate_get_subject_cn ()

+
gchar *
+gcr_certificate_get_subject_cn (GcrCertificate *self);
+

Get the common name of the subject of this certificate.

+

The string returned should be freed by the caller when no longer +required.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

The allocated subject CN, or NULL if no subject CN present.

+
+
+
+
+

gcr_certificate_get_subject_dn ()

+
gchar *
+gcr_certificate_get_subject_dn (GcrCertificate *self);
+

Get the full subject DN of the certificate as a (mostly) +readable string.

+

The string returned should be freed by the caller when no longer +required.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

The allocated subject DN of the certificate.

+
+
+
+
+

gcr_certificate_get_subject_name ()

+
gchar *
+gcr_certificate_get_subject_name (GcrCertificate *self);
+

Get a name to represent the subject of this certificate.

+

This will try to lookup the common name, orianizational unit, +organization in that order.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

the allocated subject name, or NULL if no subject name

+
+
+
+
+

gcr_certificate_get_subject_part ()

+
gchar *
+gcr_certificate_get_subject_part (GcrCertificate *self,
+                                  const gchar *part);
+

Get a part of the DN of the subject of this certificate.

+

Examples of a part + might be the 'OU' (organizational unit) +or the 'CN' (common name). Only the value of that part +of the DN is returned.

+

The string returned should be freed by the caller when no longer +required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

part

a DN type string or OID.

 
+
+
+

Returns

+

the allocated part of the subject DN, or NULL if no +such part is present.

+

[allow-none]

+
+
+
+
+

gcr_certificate_get_subject_raw ()

+
guchar *
+gcr_certificate_get_subject_raw (GcrCertificate *self,
+                                 gsize *n_data);
+

Get the raw DER data for the subject DN of the certificate.

+

The data should be freed by using g_free() when no longer required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

n_data

The length of the returned data.

 
+
+
+

Returns

+

allocated memory containing +the raw subject.

+

[transfer full][array length=n_data]

+
+
+
+
+

gcr_certificate_get_issued_date ()

+
GDate *
+gcr_certificate_get_issued_date (GcrCertificate *self);
+

Get the issued date of this certificate.

+

The GDate returned should be freed by the caller using +g_date_free() when no longer required.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

An allocated issued date of this certificate.

+
+
+
+
+

gcr_certificate_get_expiry_date ()

+
GDate *
+gcr_certificate_get_expiry_date (GcrCertificate *self);
+

Get the expiry date of this certificate.

+

The GDate returned should be freed by the caller using +g_date_free() when no longer required.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

An allocated expiry date of this certificate.

+
+
+
+
+

gcr_certificate_get_serial_number ()

+
guchar *
+gcr_certificate_get_serial_number (GcrCertificate *self,
+                                   gsize *n_length);
+

Get the raw binary serial number of the certificate.

+

The caller should free the returned data using g_free() when +it is no longer required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

n_length

the length of the returned data.

 
+
+
+

Returns

+

the raw binary serial number.

+

[array length=n_length]

+
+
+
+
+

gcr_certificate_get_serial_number_hex ()

+
gchar *
+gcr_certificate_get_serial_number_hex (GcrCertificate *self);
+

Get the serial number of the certificate as a hex string.

+

The caller should free the returned data using g_free() when +it is no longer required.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

an allocated string containing the serial number as hex.

+
+
+
+
+

gcr_certificate_get_key_size ()

+
guint
+gcr_certificate_get_key_size (GcrCertificate *self);
+

Get the key size in bits of the public key represented +by this certificate.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrCertificate

 
+
+
+

Returns

+

The key size of the certificate.

+
+
+
+
+

gcr_certificate_get_fingerprint ()

+
guchar *
+gcr_certificate_get_fingerprint (GcrCertificate *self,
+                                 GChecksumType type,
+                                 gsize *n_length);
+

Calculate the fingerprint for this certificate.

+

You can pass G_CHECKSUM_SHA1 or G_CHECKSUM_MD5 as the type + +parameter.

+

The caller should free the returned data using g_free() when +it is no longer required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a GcrCertificate

 

type

the type of algorithm for the fingerprint.

 

n_length

The length of the resulting fingerprint.

 
+
+
+

Returns

+

the raw binary fingerprint.

+

[array length=n_length]

+
+
+
+
+

gcr_certificate_get_fingerprint_hex ()

+
gchar *
+gcr_certificate_get_fingerprint_hex (GcrCertificate *self,
+                                     GChecksumType type);
+

Calculate the fingerprint for this certificate, and return it +as a hex string.

+

You can pass G_CHECKSUM_SHA1 or G_CHECKSUM_MD5 as the type + +parameter.

+

The caller should free the returned data using g_free() when +it is no longer required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrCertificate

 

type

the type of algorithm for the fingerprint.

 
+
+
+

Returns

+

an allocated hex string which contains the fingerprint.

+
+
+
+
+

gcr_certificate_get_basic_constraints ()

+
gboolean
+gcr_certificate_get_basic_constraints (GcrCertificate *self,
+                                       gboolean *is_ca,
+                                       gint *path_len);
+

Get the basic constraints for the certificate if present. If FALSE is +returned then no basic constraints are present and the is_ca + and +path_len + arguments are not changed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the certificate

 

is_ca

location to place a TRUE if is an authority.

[out][allow-none]

path_len

location to place the max path length.

[out][allow-none]
+
+
+

Returns

+

whether basic constraints are present or not

+
+
+
+
+

gcr_certificate_mixin_class_init ()

+
void
+gcr_certificate_mixin_class_init (GObjectClass *object_class);
+

Initialize the certificate mixin for the class. This mixin implements the +various required properties for the certificate.

+

Call this function near the end of your derived class_init function. The +derived class must implement the GcrCertificate interface.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

object_class

The GObjectClass for this class

 
+
+
+
+
+

gcr_certificate_mixin_emit_notify ()

+
void
+gcr_certificate_mixin_emit_notify (GcrCertificate *self);
+

Implementers of the GcrCertificate mixin should call this function to notify +when the certificate has changed to emit notifications on the various +properties.

+
+

Parameters

+
+++++ + + + + + +

self

the GcrCertificate

 
+
+
+
+
+

gcr_certificate_mixin_get_property ()

+
void
+gcr_certificate_mixin_get_property (GObject *obj,
+                                    guint prop_id,
+                                    GValue *value,
+                                    GParamSpec *pspec);
+

Implementation to get various required certificate properties. This should +be called from your derived class get_property function, or used as a +get_property virtual function.

+

Example of use as called from derived class get_property function:

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
static void
+my_get_property (GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    ...
+
+    default:
+        gcr_certificate_mixin_get_property (obj, prop_id, value, pspec);
+        break;
+    }
+}
+
+ +

Example of use as get_property function:

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
static void
+my_class_init (MyClass *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+    gobject_class->get_property = gcr_certificate_mixin_get_property;
+
+    ...
+}
+
+ +

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

obj

The object

 

prop_id

The property id

 

value

The value to fill in.

 

pspec

The param specification.

 
+
+
+
+
+

GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE

+
#define             GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE()
+

Implement the GcrComparable interface. Use this macro like this:

+
+ + + + + + + +
1
+2
+3
+4
G_DEFINE_TYPE_WITH_CODE (MyCertificate, my_certificate, G_TYPE_OBJECT,
+GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE ();
+G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, my_certificate_iface_init);
+);
+
+ +
+
+
+

gcr_certificate_mixin_comparable_init ()

+
void
+gcr_certificate_mixin_comparable_init (GcrComparableIface *iface);
+

Initialize a GcrComparableIface to compare the current certificate. +In general it's easier to use the GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE() +macro instead of this function.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

iface

The interface

 
+
+
+
+
+

gcr_certificate_compare ()

+
gint
+gcr_certificate_compare (GcrComparable *first,
+                         GcrComparable *other);
+

Compare one certificate against another. If the certificates are equal +then zero is returned. If one certificate is NULL or not a certificate, +then a non-zero value is returned.

+

The return value is useful in a stable sort, but has no user logical +meaning.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

first

the certificate to compare.

[allow-none]

other

the certificate to compare against.

[allow-none]
+
+
+

Returns

+

zero if the certificates match, non-zero otherwise.

+
+
+
+
+

gcr_certificate_get_icon ()

+
GIcon *
+gcr_certificate_get_icon (GcrCertificate *self);
+

Get the icon for a certificate.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

self

The certificate

 
+
+
+

Returns

+

the icon for this certificate, which should be +released with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_certificate_get_markup_text ()

+
gchar *
+gcr_certificate_get_markup_text (GcrCertificate *self);
+

Calculate a GMarkup string for displaying this certificate.

+
+

Parameters

+
+++++ + + + + + +

self

a certificate

 
+
+
+

Returns

+

the markup string.

+

[transfer full]

+
+
+
+
+

Types and Values

+
+

GcrCertificate

+
typedef struct _GcrCertificate GcrCertificate;
+

An object which holds a certificate.

+
+
+
+

struct GcrCertificateIface

+
struct GcrCertificateIface {
+	GTypeInterface parent;
+
+
+	/*
+	 * g-ir-scanner cannot comprehend this yet ...
+	 * See: https://bugzilla.gnome.org/show_bug.cgi?id=725501
+	 *
+	 * GcrCertificate.get_der_data:
+	 * @self: a #GcrCertificate
+	 * @n_data: a pointer to a location to store the size of the resulting DER data.
+	 *
+	 * Implemented to return the raw DER data for an X.509 certificate. The data
+	 * should be owned by the #GcrCertificate object.
+	 *
+	 * Returns: (array length=n_data): raw DER data of the X.509 certificate
+	 */
+	const guint8 * (* get_der_data) (GcrCertificate *self,
+	                                 gsize *n_data);
+};
+
+

The interface that implementors of GcrCertificate must implement.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GTypeInterface parent;

the parent interface type

 

get_der_data ()

a method which returns the RAW der data of the certificate

 
+
+
+
+
+

Property Details

+
+

The “description” property

+
  “description”              gchar *
+

A readable description for this certificate

+

Flags: Read

+

Default value: ""

+
+
+
+

The “expiry” property

+
  “expiry”                   GDate *
+

The expiry date of the certificate

+

Flags: Read

+
+
+
+

The “icon” property

+
  “icon”                     GIcon *
+

An icon representing the certificate

+

Flags: Read

+
+
+
+

The “issuer” property

+
  “issuer”                   gchar *
+

Common name part of the certificate issuer

+

Flags: Read

+

Default value: ""

+
+
+
+

The “label” property

+
  “label”                    gchar *
+

A readable label for this certificate.

+

Flags: Read

+

Default value: ""

+
+
+
+

The “markup” property

+
  “markup”                   gchar *
+

GLib markup to describe the certificate

+

Flags: Read

+

Default value: ""

+
+
+
+

The “subject” property

+
  “subject”                  gchar *
+

Common name part of the certificate subject

+

Flags: Read

+

Default value: ""

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrCertificateChain.html b/docs/reference/gcr/html/GcrCertificateChain.html new file mode 100644 index 0000000..5799e97 --- /dev/null +++ b/docs/reference/gcr/html/GcrCertificateChain.html @@ -0,0 +1,798 @@ + + + + +GcrCertificateChain: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrCertificateChain

+

GcrCertificateChain — A certificate chain

+
+
+

Functions

+ +
+
+

Properties

+
+++++ + + + + + + + + + + + + +
guintlengthRead
GcrCertificateChainStatusstatusRead
+
+
+

Types and Values

+ +
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrCertificateChain
+
+
+
+

Description

+

GcrCertificateChain represents a chain of certificates, normally used to +validate the trust in a certificate. An X.509 certificate chain has one +endpoint certificate (the one for which trust is being verified) and then +in turn the certificate that issued each previous certificate in the chain.

+

This functionality is for building of certificate chains not for validating +them. Use your favorite crypto library to validate trust in a certificate +chain once its built.

+

The order of certificates in the chain should be first the endpoint +certificates and then the signing certificates.

+

Create a new certificate chain with gcr_certificate_chain_new() and then +add the certificates with gcr_certificate_chain_add().

+

You can then use gcr_certificate_chain_build() to build the remainder of +the chain. This will lookup missing certificates in PKCS#11 modules and +also check that each certificate in the chain is the signer of the previous +one. If a trust anchor, pinned certificate, or self-signed certificate is +found, then the chain is considered built. Any extra certificates are +removed from the chain.

+

Once the certificate chain has been built, you can access its status +through gcr_certificate_chain_get_status(). The status signifies whether +the chain is anchored on a trust root, self-signed, incomplete etc. See +GcrCertificateChainStatus for information on the various statuses.

+

It's important to understand that the building of a certificate chain is +merely the first step towards verifying trust in a certificate.

+
+
+

Functions

+
+

gcr_certificate_chain_new ()

+
GcrCertificateChain *
+gcr_certificate_chain_new (void);
+

Create a new GcrCertificateChain.

+
+

Returns

+

a newly allocated certificate chain.

+

[transfer full]

+
+
+
+
+

gcr_certificate_chain_add ()

+
void
+gcr_certificate_chain_add (GcrCertificateChain *self,
+                           GcrCertificate *certificate);
+

Add certificate + to the chain. The order of certificates in the chain are +important. The first certificate should be the endpoint certificate, and +then come the signers (certificate authorities) each in turn. If a root +certificate authority is present, it should come last.

+

Adding a certificate an already built chain (see +gcr_certificate_chain_build()) resets the type of the certificate chain +to GCR_CERTIFICATE_CHAIN_UNKNOWN

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the GcrCertificateChain

 

certificate

a GcrCertificate to add to the chain

 
+
+
+
+
+

gcr_certificate_chain_get_certificate ()

+
GcrCertificate *
+gcr_certificate_chain_get_certificate (GcrCertificateChain *self,
+                                       guint index);
+

Get a certificate in the chain. It is an error to call this function +with an invalid index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the GcrCertificateChain

 

index

index of the certificate to get

 
+
+
+

Returns

+

the certificate.

+

[transfer none]

+
+
+
+
+

gcr_certificate_chain_get_status ()

+
GcrCertificateChainStatus
+gcr_certificate_chain_get_status (GcrCertificateChain *self);
+

Get the status of a certificate chain. If the certificate chain has not +been built, then the status will be GCR_CERTIFICATE_CHAIN_UNKNOWN.

+

A status of GCR_CERTIFICATE_CHAIN_ANCHORED does not mean that the +certificate chain has been verified, but merely that an anchor has been +found.

+
+

Parameters

+
+++++ + + + + + +

self

the GcrCertificateChain

 
+
+
+

Returns

+

the status of the certificate chain.

+
+
+
+
+

gcr_certificate_chain_get_anchor ()

+
GcrCertificate *
+gcr_certificate_chain_get_anchor (GcrCertificateChain *self);
+

If the certificate chain has been built and is of status +GCR_CERTIFICATE_CHAIN_ANCHORED, then this will return the anchor +certificate that was found. This is not necessarily a root certificate +authority. If an intermediate certificate authority in the chain was +found to be anchored, then that certificate will be returned.

+

If an anchor is returned it does not mean that the certificate chain has +been verified, but merely that an anchor has been found.

+
+

Parameters

+
+++++ + + + + + +

self

the GcrCertificateChain

 
+
+
+

Returns

+

the anchor certificate, or NULL if not anchored.

+

[transfer none]

+
+
+
+
+

gcr_certificate_chain_get_endpoint ()

+
GcrCertificate *
+gcr_certificate_chain_get_endpoint (GcrCertificateChain *self);
+

Get the endpoint certificate in the chain. This is always the first +certificate in the chain. The endpoint certificate cannot be anchored.

+
+

Parameters

+
+++++ + + + + + +

self

the GcrCertificateChain

 
+
+
+

Returns

+

the endpoint certificate, or NULL if the chain +is empty.

+

[transfer none]

+
+
+
+
+

gcr_certificate_chain_get_length ()

+
guint
+gcr_certificate_chain_get_length (GcrCertificateChain *self);
+

Get the length of the certificate chain.

+
+

Parameters

+
+++++ + + + + + +

self

the GcrCertificateChain

 
+
+
+

Returns

+

the length of the certificate chain

+
+
+
+
+

gcr_certificate_chain_build ()

+
gboolean
+gcr_certificate_chain_build (GcrCertificateChain *self,
+                             const gchar *purpose,
+                             const gchar *peer,
+                             GcrCertificateChainFlags flags,
+                             GCancellable *cancellable,
+                             GError **error);
+

Complete a certificate chain. Once a certificate chain has been built +its status can be examined.

+

This operation will lookup missing certificates in PKCS#11 +modules and also that each certificate in the chain is the signer of the +previous one. If a trust anchor, pinned certificate, or self-signed certificate +is found, then the chain is considered built. Any extra certificates are +removed from the chain.

+

It's important to understand that building of a certificate chain does not +constitute verifying that chain. This is merely the first step towards +trust verification.

+

The purpose + is a string like GCR_PURPOSE_CLIENT_AUTH and is the purpose +for which the certificate chain will be used. Trust anchors are looked up +for this purpose. This argument is required.

+

The peer + is usually the host name of the peer whith which this certificate +chain is being used. It is used to look up pinned certificates that have +been stored for this peer. If NULL then no pinned certificates will +be considered.

+

If the GCR_CERTIFICATE_CHAIN_NO_LOOKUPS flag is specified then no +lookups for anchors or pinned certificates are done, and the resulting chain +will be neither anchored or pinned. Additionally no missing certificate +authorities are looked up in PKCS#11

+

This call will block, see gcr_certificate_chain_build_async() for the +asynchronous version.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

the GcrCertificateChain

 

purpose

the purpose the certificate chain will be used for

 

peer

the peer the certificate chain will be used with, or NULL.

[allow-none]

flags

chain completion flags

 

cancellable

a GCancellable or NULL

 

error

a GError or NULL

 
+
+
+

Returns

+

whether the operation completed successfully

+
+
+
+
+

gcr_certificate_chain_build_async ()

+
void
+gcr_certificate_chain_build_async (GcrCertificateChain *self,
+                                   const gchar *purpose,
+                                   const gchar *peer,
+                                   GcrCertificateChainFlags flags,
+                                   GCancellable *cancellable,
+                                   GAsyncReadyCallback callback,
+                                   gpointer user_data);
+

Complete a certificate chain. Once a certificate chain has been built +its status can be examined.

+

This will lookup missing certificates in PKCS#11 +modules and also that each certificate in the chain is the signer of the +previous one. If a trust anchor, pinned certificate, or self-signed certificate +is found, then the chain is considered built. Any extra certificates are +removed from the chain.

+

It's important to understand that building of a certificate chain does not +constitute verifying that chain. This is merely the first step towards +trust verification.

+

The purpose + is a string like GCR_PURPOSE_CLIENT_AUTH and is the purpose +for which the certificate chain will be used. Trust anchors are looked up +for this purpose. This argument is required.

+

The peer + is usually the host name of the peer whith which this certificate +chain is being used. It is used to look up pinned certificates that have +been stored for this peer. If NULL then no pinned certificates will +be considered.

+

If the GCR_CERTIFICATE_CHAIN_NO_LOOKUPS flag is specified then no +lookups for anchors or pinned certificates are done, and the resulting chain +will be neither anchored or pinned. Additionally no missing certificate +authorities are looked up in PKCS#11

+

When the operation is finished, callback + will be called. You can then call +gcr_certificate_chain_build_finish() to get the result of the operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

the GcrCertificateChain

 

purpose

the purpose the certificate chain will be used for

 

peer

the peer the certificate chain will be used with, or NULL.

[allow-none]

flags

chain completion flags

 

cancellable

a GCancellable or NULL

 

callback

this will be called when the operation completes.

 

user_data

data to pass to the callback

 
+
+
+
+
+

gcr_certificate_chain_build_finish ()

+
gboolean
+gcr_certificate_chain_build_finish (GcrCertificateChain *self,
+                                    GAsyncResult *result,
+                                    GError **error);
+

Finishes an asynchronous operation started by +gcr_certificate_chain_build_async().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the GcrCertificateChain

 

result

the GAsyncResult passed to the callback

 

error

a GError, or NULL

 
+
+
+

Returns

+

whether the operation succeeded

+
+
+
+
+

Types and Values

+
+

struct GcrCertificateChain

+
struct GcrCertificateChain;
+

A chain of certificates.

+
+
+
+

struct GcrCertificateChainClass

+
struct GcrCertificateChainClass {
+	GObjectClass parent_class;
+};
+
+

The class for GcrCertificateChain.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GcrCertificateChainStatus

+

The status of a built certificate chain. Will be set to +GCR_CERTIFICATE_CHAIN_UNKNOWN for certificate chains that have not been +built.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GCR_CERTIFICATE_CHAIN_UNKNOWN

+

The certificate chain's status is unknown. +When a chain is not yet built it has this status. If a chain is modified after +being built, it has this status.

+
 

GCR_CERTIFICATE_CHAIN_INCOMPLETE

+

A full chain could not be loaded. The +chain does not end with a self-signed certificate, a trusted anchor, or a +pinned certificate.

+
 

GCR_CERTIFICATE_CHAIN_DISTRUSTED

+

The certificate chain contains a revoked +or otherwise explicitly distrusted certificate. The entire chain should +be distrusted.

+
 

GCR_CERTIFICATE_CHAIN_SELFSIGNED

+

The chain ends with a self-signed +certificate. No trust anchor was found.

+
 

GCR_CERTIFICATE_CHAIN_PINNED

+

The chain represents a pinned certificate. A +pinned certificate is an exception which trusts a given certificate +explicitly for a purpose and communication with a certain peer.

+
 

GCR_CERTIFICATE_CHAIN_ANCHORED

+

The chain ends with an anchored +certificate. The anchored certificate is not necessarily self-signed.

+
 
+
+
+
+
+

enum GcrCertificateChainFlags

+

Flags to be used with the gcr_certificate_chain_build() operation.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GCR_CERTIFICATE_CHAIN_NONE

+

no flags

+
 

GCR_CERTIFICATE_CHAIN_NO_LOOKUPS

+

If this flag is specified then no +lookups for anchors or pinned certificates are done, and the resulting chain +will be neither anchored or pinned. Additionally no missing certificate +authorities are looked up in PKCS#11.

+
 
+
+
+
+
+

GCR_TYPE_CERTIFICATE_CHAIN_FLAGS

+
#define GCR_TYPE_CERTIFICATE_CHAIN_FLAGS (gcr_certificate_chain_flags_get_type ())
+
+

The flags GType for GcrCertificateChainFlags.

+
+
+
+

GCR_TYPE_CERTIFICATE_CHAIN_STATUS

+
#define GCR_TYPE_CERTIFICATE_CHAIN_STATUS (gcr_certificate_chain_status_get_type ())
+
+

The enum GType for GcrCertificateChainStatus.

+
+
+
+

Property Details

+
+

The “length” property

+
  “length”                   guint
+

The length of the certificate chain.

+

Flags: Read

+

Default value: 0

+
+
+
+

The “status” property

+
  “status”                   GcrCertificateChainStatus
+

The certificate chain status. See GcrCertificateChainStatus

+

Flags: Read

+

Default value: GCR_CERTIFICATE_CHAIN_UNKNOWN

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrCertificateWidget.html b/docs/reference/gcr/html/GcrCertificateWidget.html new file mode 100644 index 0000000..503ae61 --- /dev/null +++ b/docs/reference/gcr/html/GcrCertificateWidget.html @@ -0,0 +1,519 @@ + + + + +GcrCertificateWidget: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrCertificateWidget

+

GcrCertificateWidget — Certificate widget and renderer

+
+ +
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GckAttributes *attributesRead / Write
+GcrCertificate *certificateRead / Write
+GckAttributes *attributesRead / Write
+GcrCertificate *certificateRead / Write
+gchar *labelRead / Write
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
#defineGCR_CERTIFICATE_COLUMNS
structGcrCertificateWidget
structGcrCertificateWidgetClass
structGcrCertificateRenderer
structGcrCertificateRendererClass
+
+
+

Object Hierarchy

+
    GObject
+    ├── GInitiallyUnowned
+       ╰── GtkWidget
+           ╰── GtkContainer
+               ╰── GtkBin
+                   ╰── GcrCertificateWidget
+    ╰── GcrCertificateRenderer
+
+
+
+

Implemented Interfaces

+

+GcrCertificateWidget implements + AtkImplementorIface and GtkBuildable.

+

+GcrCertificateRenderer implements + GcrRenderer, GcrComparable and GcrCertificate.

+
+
+

Description

+

A GcrCertificateWidget can be used to display a certificate. The widget +is normally in a collapsed state showing only details, but can be expanded +by the user.

+

Use gcr_certificate_widget_new() to create a new certificate widget. Only +one certificate can be displayed. A GcrCertificateWidget contains a +GcrViewer internally and GcrCertificateRenderer is used to render the +certificate to the viewer. To show more than one certificate in a view, +create the viewer and add renderers to it.

+
+
+

Functions

+
+

gcr_certificate_widget_new ()

+
GcrCertificateWidget *
+gcr_certificate_widget_new (GcrCertificate *certificate);
+

Create a new certificate widget which displays a given certificate.

+
+

Parameters

+
+++++ + + + + + +

certificate

certificate to display, or NULL.

[allow-none]
+
+
+

Returns

+

a newly allocated GcrCertificateWidget, which +should be freed with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_certificate_widget_get_certificate ()

+
GcrCertificate *
+gcr_certificate_widget_get_certificate
+                               (GcrCertificateWidget *self);
+

Get the certificate displayed in the widget.

+
+

Parameters

+
+++++ + + + + + +

self

The certificate widget

 
+
+
+

Returns

+

the certificate.

+

[allow-none][transfer none]

+
+
+
+
+

gcr_certificate_widget_set_certificate ()

+
void
+gcr_certificate_widget_set_certificate
+                               (GcrCertificateWidget *self,
+                                GcrCertificate *certificate);
+

Set the certificate displayed in the widget

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The certificate widget

 

certificate

the certificate to display.

[allow-none]
+
+
+
+
+

gcr_certificate_renderer_new ()

+
GcrCertificateRenderer *
+gcr_certificate_renderer_new (GcrCertificate *certificate);
+

Create a new certificate renderer to display the certificate.

+
+

Parameters

+
+++++ + + + + + +

certificate

The certificate to display

 
+
+
+

Returns

+

a newly allocated GcrCertificateRenderer, which +should be released with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_certificate_renderer_new_for_attributes ()

+
GcrCertificateRenderer *
+gcr_certificate_renderer_new_for_attributes
+                               (const gchar *label,
+                                struct _GckAttributes *attrs);
+

Create a new certificate renderer to display the label and attributes. One +of the attributes should be a CKA_VALUE type attribute containing a DER +encoded certificate.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

label

the label to display.

[allow-none]

attrs

The attributes to display

 
+
+
+

Returns

+

a newly allocated GcrCertificateRenderer, which +should be released with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_certificate_renderer_get_certificate ()

+
GcrCertificate *
+gcr_certificate_renderer_get_certificate
+                               (GcrCertificateRenderer *self);
+

Get the certificate displayed in the renderer. If no certificate was +explicitly set, then the renderer will return itself since it acts as +a valid certificate.

+
+

Parameters

+
+++++ + + + + + +

self

The renderer

 
+
+
+

Returns

+

The certificate, owned by the renderer.

+

[transfer none]

+
+
+
+
+

gcr_certificate_renderer_set_certificate ()

+
void
+gcr_certificate_renderer_set_certificate
+                               (GcrCertificateRenderer *self,
+                                GcrCertificate *certificate);
+

Set a certificate to display in the renderer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The renderer

 

certificate

the certificate to display.

[allow-none]
+
+
+
+
+

Types and Values

+
+

GCR_CERTIFICATE_COLUMNS

+
#define GCR_CERTIFICATE_COLUMNS                 (gcr_certificate_get_columns ())
+
+

The columns that are valid for a certificate. This is to be used with +the GcrTreeSelector or GcrCollectionModel.

+

This is an array of GcrColumn, owned by the gcr library.

+
+
+
+

struct GcrCertificateWidget

+
struct GcrCertificateWidget;
+

A widget that displays a certificate.

+
+
+
+

struct GcrCertificateWidgetClass

+
struct GcrCertificateWidgetClass {
+};
+
+

The class for GcrCertificateWidget

+
+
+
+

struct GcrCertificateRenderer

+
struct GcrCertificateRenderer;
+

An implementation of GcrRenderer which renders certificates.

+
+
+
+

struct GcrCertificateRendererClass

+
struct GcrCertificateRendererClass {
+	GObjectClass parent_class;
+};
+
+

The class for GcrCertificateRenderer.

+
+

Members

+
+++++ + +
+
+
+
+
+

Property Details

+
+

The “attributes” property

+
  “attributes”               GckAttributes *
+

Attributes which contain the certificate.

+

Flags: Read / Write

+
+
+
+

The “certificate” property

+
  “certificate”              GcrCertificate *
+

Certificate to display.

+

Flags: Read / Write

+
+
+
+

The “attributes” property

+
  “attributes”               GckAttributes *
+

The certificate attributes to display. One of the attributes must be +a CKA_VALUE type attribute which contains a DER encoded certificate.

+

Flags: Read / Write

+
+
+
+

The “certificate” property

+
  “certificate”              GcrCertificate *
+

The certificate to display. May be NULL.

+

Flags: Read / Write

+
+
+
+

The “label” property

+
  “label”                    gchar *
+

The label to display.

+

Flags: Read / Write

+

Default value: ""

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrCollection.html b/docs/reference/gcr/html/GcrCollection.html new file mode 100644 index 0000000..d43c624 --- /dev/null +++ b/docs/reference/gcr/html/GcrCollection.html @@ -0,0 +1,390 @@ + + + + +GcrCollection: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrCollection

+

GcrCollection — A collection of objects.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+guint + +gcr_collection_get_length () +
+GList * + +gcr_collection_get_objects () +
+gboolean + +gcr_collection_contains () +
+void + +gcr_collection_emit_added () +
+void + +gcr_collection_emit_removed () +
+
+
+

Signals

+
+++++ + + + + + + + + + + + + +
voidaddedRun Last
voidremovedRun Last
+
+
+

Types and Values

+
++++ + + + + +
 GcrCollection
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GcrCollection
+
+
+
+

Prerequisites

+

+GcrCollection requires + GObject.

+
+
+

Known Implementations

+

+GcrCollection is implemented by + GcrFilterCollection, GcrSimpleCollection and GcrUnionCollection.

+
+
+

Description

+

A GcrCollection is used to group a set of objects. This is an abstract +interface which can be used to determine which objects show up in a selector +or other user interface element.

+

Use gcr_simple_collection_new() to create a concrete implementation of this +interface which you can add objects to.

+
+
+

Functions

+
+

gcr_collection_get_length ()

+
guint
+gcr_collection_get_length (GcrCollection *self);
+

Get the number of objects in this collection.

+
+

Parameters

+
+++++ + + + + + +

self

The collection

 
+
+
+

Returns

+

The number of objects.

+
+
+
+
+

gcr_collection_get_objects ()

+
GList *
+gcr_collection_get_objects (GcrCollection *self);
+

Get a list of the objects in this collection.

+
+

Parameters

+
+++++ + + + + + +

self

The collection

 
+
+
+

Returns

+

a list of the objects +in this collection, which should be freed with g_list_free().

+

[transfer container][element-type GObject.Object]

+
+
+
+
+

gcr_collection_contains ()

+
gboolean
+gcr_collection_contains (GcrCollection *self,
+                         GObject *object);
+

Check whether the collection contains an object or not.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the collection

 

object

object to check

 
+
+
+

Returns

+

whether the collection contains this object

+
+
+
+
+

gcr_collection_emit_added ()

+
void
+gcr_collection_emit_added (GcrCollection *self,
+                           GObject *object);
+

Emit the “added” signal for the given object. This function +is used by implementors of this interface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The collection

 

object

The object that was added

 
+
+
+
+
+

gcr_collection_emit_removed ()

+
void
+gcr_collection_emit_removed (GcrCollection *self,
+                             GObject *object);
+

Emit the “removed” signal for the given object. This function +is used by implementors of this interface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The collection

 

object

The object that was removed

 
+
+
+
+
+

Types and Values

+
+

GcrCollection

+
typedef struct _GcrCollection GcrCollection;
+

A GcrCollection is used to group a set of objects.

+
+
+
+

Signal Details

+
+

The “added” signal

+
void
+user_function (GcrCollection *self,
+               GObject       *object,
+               gpointer       user_data)
+

This signal is emitted when an object is added to the collection.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the collection

 

object

object that was added.

[type GObject.Object]

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+

The “removed” signal

+
void
+user_function (GcrCollection *self,
+               GObject       *object,
+               gpointer       user_data)
+

This signal is emitted when an object is removed from the collection.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the collection

 

object

object that was removed.

[type GObject.Object]

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrCollectionModel.html b/docs/reference/gcr/html/GcrCollectionModel.html new file mode 100644 index 0000000..575280d --- /dev/null +++ b/docs/reference/gcr/html/GcrCollectionModel.html @@ -0,0 +1,776 @@ + + + + +GcrCollectionModel: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrCollectionModel

+

GcrCollectionModel — A GtkTreeModel that represents a collection

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrCollectionModel * + +gcr_collection_model_new () +
+GcrCollectionModel * + +gcr_collection_model_new_full () +
+guint + +gcr_collection_model_set_columns () +
+GcrCollection * + +gcr_collection_model_get_collection () +
+void + +gcr_collection_model_set_collection () +
+gboolean + +gcr_collection_model_iter_for_object () +
+GObject * + +gcr_collection_model_object_for_iter () +
+gboolean + +gcr_collection_model_is_selected () +
+void + +gcr_collection_model_change_selected () +
+void + +gcr_collection_model_toggle_selected () +
+GList * + +gcr_collection_model_get_selected_objects () +
+void + +gcr_collection_model_set_selected_objects () +
+gint + +gcr_collection_model_column_for_selected () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + +
+GcrCollection *collectionRead / Write
gpointercolumnsRead / Write / Construct Only
GcrCollectionModelModemodeRead / Write / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
structGcrCollectionModel
structGcrCollectionModelClass
enumGcrCollectionModelMode
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrCollectionModel
+
+
+
+

Implemented Interfaces

+

+GcrCollectionModel implements + GtkTreeModel and GtkTreeSortable.

+
+
+

Description

+

This is an implementation of GtkTreeModel which represents the objects in +the a GcrCollection. As objects are added or removed from the collection, +rows are added and removed from this model.

+

The row values come from the properties of the objects in the collection. Use +gcr_collection_model_new() to create a new collection model. To have more +control over the values use a set of GcrColumn structures to define the +columns. This can be done with gcr_collection_model_new_full() or +gcr_collection_model_set_columns().

+

Each row can have a selected state, which is represented by a boolean column. +The selected state can be toggled with gcr_collection_model_toggle_selected() +or set with gcr_collection_model_set_selected_objects() and retrieved with +gcr_collection_model_get_selected_objects().

+

To determine which object a row represents and vice versa, use the +gcr_collection_model_iter_for_object() or gcr_collection_model_object_for_iter() +functions.

+
+
+

Functions

+
+

gcr_collection_model_new ()

+
GcrCollectionModel *
+gcr_collection_model_new (GcrCollection *collection,
+                          GcrCollectionModelMode mode,
+                          ...);
+

Create a new GcrCollectionModel. The variable argument list should contain +pairs of property names, and GType values. The variable argument list should +be terminated with NULL.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

collection

the collection to represent

 

mode

whether list or tree mode

 

...

the column names and types

 
+
+
+

Returns

+

a newly allocated model, which should be released +with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_collection_model_new_full ()

+
GcrCollectionModel *
+gcr_collection_model_new_full (GcrCollection *collection,
+                               GcrCollectionModelMode mode,
+                               const GcrColumn *columns);
+

Create a new GcrCollectionModel.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

collection

the collection to represent

 

mode

whether list or tree mode

 

columns

the columns the model should contain

 
+
+
+

Returns

+

a newly allocated model, which should be released +with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_collection_model_set_columns ()

+
guint
+gcr_collection_model_set_columns (GcrCollectionModel *self,
+                                  const GcrColumn *columns);
+

Set the columns that the model should contain. columns + is an array of +GcrColumn structures, with the last one containing NULL for all values.

+

This function can only be called once, and only if the model was not created +without a set of columns. This function cannot be called after the model +has been added to a view.

+

The columns are accessed as static data. They should continue to remain +in memory for longer than the GcrCollectionModel object.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The model

 

columns

The columns the model should contain

 
+
+
+

Returns

+

The number of columns

+
+
+
+
+

gcr_collection_model_get_collection ()

+
GcrCollection *
+gcr_collection_model_get_collection (GcrCollectionModel *self);
+

Get the collection which this model represents

+
+

Parameters

+
+++++ + + + + + +

self

a collection model

 
+
+
+

Returns

+

the collection, owned by the model.

+

[transfer none]

+
+
+
+
+

gcr_collection_model_set_collection ()

+
void
+gcr_collection_model_set_collection (GcrCollectionModel *self,
+                                     GcrCollection *collection);
+

Set the collection which this model represents

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a collection model

 

collection

the collection or NULL.

[allow-none]
+
+
+
+
+

gcr_collection_model_iter_for_object ()

+
gboolean
+gcr_collection_model_iter_for_object (GcrCollectionModel *self,
+                                      GObject *object,
+                                      GtkTreeIter *iter);
+

Set iter + to the row for the given object. If the object is not in this +model, then FALSE will be returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The model

 

object

The object

 

iter

The row for the object

 
+
+
+

Returns

+

TRUE if the object was present.

+
+
+
+
+

gcr_collection_model_object_for_iter ()

+
GObject *
+gcr_collection_model_object_for_iter (GcrCollectionModel *self,
+                                      const GtkTreeIter *iter);
+

Get the object that is represented by the given row in the model.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The model

 

iter

The row

 
+
+
+

Returns

+

The object, owned by the model.

+

[transfer none]

+
+
+
+
+

gcr_collection_model_is_selected ()

+
gboolean
+gcr_collection_model_is_selected (GcrCollectionModel *self,
+                                  GtkTreeIter *iter);
+

Check whether a given row has been toggled as selected.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The model

 

iter

The row

 
+
+
+

Returns

+

Whether the row has been selected.

+
+
+
+
+

gcr_collection_model_change_selected ()

+
void
+gcr_collection_model_change_selected (GcrCollectionModel *self,
+                                      GtkTreeIter *iter,
+                                      gboolean selected);
+

Set whether a given row is toggled selected or not.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The model

 

iter

The row

 

selected

Whether the row should be selected or not.

 
+
+
+
+
+

gcr_collection_model_toggle_selected ()

+
void
+gcr_collection_model_toggle_selected (GcrCollectionModel *self,
+                                      GtkTreeIter *iter);
+

Toggle the selected state of a given row.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The model

 

iter

The row

 
+
+
+
+
+

gcr_collection_model_get_selected_objects ()

+
GList *
+gcr_collection_model_get_selected_objects
+                               (GcrCollectionModel *self);
+

Get a list of checked/selected objects.

+
+

Parameters

+
+++++ + + + + + +

self

the collection model

 
+
+
+

Returns

+

a list of selected +objects, which should be freed with g_list_free().

+

[transfer container][element-type GObject.Object]

+
+
+
+
+

gcr_collection_model_set_selected_objects ()

+
void
+gcr_collection_model_set_selected_objects
+                               (GcrCollectionModel *self,
+                                GList *selected);
+

Set the checked/selected objects.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the collection model

 

selected

a list of objects to select.

[element-type GObject.Object]
+
+
+
+
+

gcr_collection_model_column_for_selected ()

+
gint
+gcr_collection_model_column_for_selected
+                               (GcrCollectionModel *self);
+

Get the column identifier for the column that contains the values +of the selected state.

+
+

Parameters

+
+++++ + + + + + +

self

The model

 
+
+
+

Returns

+

The column identifier.

+
+
+
+
+

Types and Values

+
+

struct GcrCollectionModel

+
struct GcrCollectionModel;
+

A GtkTreeModel which contains a row for each object in a GcrCollection.

+
+
+
+

struct GcrCollectionModelClass

+
struct GcrCollectionModelClass {
+	GObjectClass parent_class;
+};
+
+

The class for GcrCollectionModel.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GcrCollectionModelMode

+

If set GcrCollectionModel is created with a mode of GCR_COLLECTION_MODEL_TREE, +then any included objects that are themselves a GcrCollection, will have all child +objects include as child rows in a tree form.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GCR_COLLECTION_MODEL_LIST

+

only objects in the top collection, no child objects

+
 

GCR_COLLECTION_MODEL_TREE

+

show objects in the collection, and child objects in a tree form

+
 
+
+
+
+
+

Property Details

+
+

The “collection” property

+
  “collection”               GcrCollection *
+

Collection to get objects from.

+

Flags: Read / Write

+
+
+
+

The “columns” property

+
  “columns”                  gpointer
+

Columns for the model.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “mode” property

+
  “mode”                     GcrCollectionModelMode
+

Tree or list mode.

+

Flags: Read / Write / Construct Only

+

Default value: GCR_COLLECTION_MODEL_TREE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrComboSelector.html b/docs/reference/gcr/html/GcrComboSelector.html new file mode 100644 index 0000000..a6e9c57 --- /dev/null +++ b/docs/reference/gcr/html/GcrComboSelector.html @@ -0,0 +1,280 @@ + + + + +GcrComboSelector: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrComboSelector

+

GcrComboSelector — A selector widget to select a single certificate or key.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
+GcrCollection * + +gcr_combo_selector_get_collection () +
+GcrComboSelector * + +gcr_combo_selector_new () +
+GObject * + +gcr_combo_selector_get_selected () +
+void + +gcr_combo_selector_set_selected () +
+
+
+

Properties

+
+++++ + + + + + +
+GcrCollection *collectionRead / Write / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrComboSelector
structGcrComboSelectorClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GInitiallyUnowned
+        ╰── GtkWidget
+            ╰── GtkContainer
+                ╰── GtkBin
+                    ╰── GtkComboBox
+                        ╰── GcrComboSelector
+
+
+
+

Implemented Interfaces

+

+GcrComboSelector implements + AtkImplementorIface, GtkBuildable, GtkCellLayout and GtkCellEditable.

+
+
+

Description

+

The GcrComboSelector can be used to select a certificate or key. It allows +the user to select one object from the selector at a time.

+
+
+

Functions

+
+

gcr_combo_selector_get_collection ()

+
GcrCollection *
+gcr_combo_selector_get_collection (GcrComboSelector *self);
+

Get the collection that this selector is displaying objects from.

+
+

Parameters

+
+++++ + + + + + +

self

The selector

 
+
+
+

Returns

+

The collection, owned by the selector.

+

[transfer none]

+
+
+
+
+

gcr_combo_selector_new ()

+
GcrComboSelector *
+gcr_combo_selector_new (GcrCollection *collection);
+

Create a new GcrTreeSelector.

+
+

Parameters

+
+++++ + + + + + +

collection

The collection that contains the objects to display

 
+
+
+

Returns

+

A newly allocated selector, which should be released with +g_object_unref().

+
+
+
+
+

gcr_combo_selector_get_selected ()

+
GObject *
+gcr_combo_selector_get_selected (GcrComboSelector *self);
+

Get the selected object in the selector, or NULL if nothing selected.

+
+

Parameters

+
+++++ + + + + + +

self

The selector

 
+
+
+

Returns

+

the selected object, owned by the selector, or NULL.

+

[transfer none]

+
+
+
+
+

gcr_combo_selector_set_selected ()

+
void
+gcr_combo_selector_set_selected (GcrComboSelector *self,
+                                 GObject *selected);
+

Set the currently selected object in the selector, or clear the selection +if selected is set to NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The selector

 

selected

the object to select or NULL.

[allow-none]
+
+
+
+
+

Types and Values

+
+

struct GcrComboSelector

+
struct GcrComboSelector;
+

A combo selector widget.

+
+
+
+

struct GcrComboSelectorClass

+
struct GcrComboSelectorClass {
+};
+
+

The class for GcrComboSelector.

+
+
+
+

Property Details

+
+

The “collection” property

+
  “collection”               GcrCollection *
+

The collection which contains the objects to display in the selector.

+

Flags: Read / Write / Construct Only

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrComparable.html b/docs/reference/gcr/html/GcrComparable.html new file mode 100644 index 0000000..8eeaa47 --- /dev/null +++ b/docs/reference/gcr/html/GcrComparable.html @@ -0,0 +1,243 @@ + + + + +GcrComparable: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrComparable

+

GcrComparable — Interface for comparing objects

+
+
+

Functions

+
++++ + + + + + + + + + + +
+gint + +gcr_comparable_compare () +
+gint + +gcr_comparable_memcmp () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrComparable
structGcrComparableIface
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GcrComparable
+
+
+
+

Prerequisites

+

+GcrComparable requires + GObject.

+
+
+

Known Derived Interfaces

+

+GcrComparable is required by + GcrCertificate.

+
+
+

Known Implementations

+

+GcrComparable is implemented by + GcrCertificateRenderer, GcrPkcs11Certificate and GcrSimpleCertificate.

+
+
+

Description

+

The GcrComparable interface is implemented by objects when they should be +comparable against one another.

+
+
+

Functions

+
+

gcr_comparable_compare ()

+
gint
+gcr_comparable_compare (GcrComparable *self,
+                        GcrComparable *other);
+

Compare whether two objects represent the same thing. The return value can +also be used to sort the objects.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The comparable object

 

other

Another comparable object.

[allow-none]
+
+
+

Returns

+

Zero if the two objects represent the same thing, non-zero if not.

+
+
+
+
+

gcr_comparable_memcmp ()

+
gint
+gcr_comparable_memcmp (gconstpointer mem1,
+                       gsize size1,
+                       gconstpointer mem2,
+                       gsize size2);
+

Compare two blocks of memory. The return value can be used to sort +the blocks of memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

mem1

First block of memory.

[array length=size1][element-type guint8]

size1

Length of first block

 

mem2

Second block of memory.

[array length=size2][element-type guint8]

size2

Length of second block

 
+
+
+

Returns

+

Zero if the blocks are identical, negative if first +less than secend, possitive otherwise.

+
+
+
+
+

Types and Values

+
+

GcrComparable

+
typedef struct _GcrComparable GcrComparable;
+

The GcrComparable interface is implemented by comparable objects.

+
+
+
+

struct GcrComparableIface

+
struct GcrComparableIface {
+	GTypeInterface parent;
+	gint (*compare) (GcrComparable *self, GcrComparable *other);
+};
+
+

The interface to implement for GcrComparable

+
+

Members

+
+++++ + + + + + + + + + + + + +

GTypeInterface parent;

type interface

 

compare ()

Compare whether tow objects represent the same thing.

 
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrImportButton.html b/docs/reference/gcr/html/GcrImportButton.html new file mode 100644 index 0000000..d202acb --- /dev/null +++ b/docs/reference/gcr/html/GcrImportButton.html @@ -0,0 +1,319 @@ + + + + +GcrImportButton: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrImportButton

+

GcrImportButton — Button which imports parsed certificates and keys

+
+
+

Functions

+
++++ + + + + + + + + + + +
+GcrImportButton * + +gcr_import_button_new () +
+void + +gcr_import_button_add_parsed () +
+
+
+

Signals

+
+++++ + + + + + + + + + + + + +
voidimportedRun Last
voidimportingRun Last
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrImportButton
structGcrImportButtonClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GInitiallyUnowned
+        ╰── GtkWidget
+            ╰── GtkContainer
+                ╰── GtkBin
+                    ╰── GtkButton
+                        ╰── GcrImportButton
+
+
+
+

Implemented Interfaces

+

+GcrImportButton implements + AtkImplementorIface, GtkBuildable, GtkActionable and GtkActivatable.

+
+
+

Description

+

A button which imports keys and certificates. Shows a spinner when the +button is activated. When more than one importer is available shows +a drop down to select which to import to.

+
+
+

Functions

+
+

gcr_import_button_new ()

+
GcrImportButton *
+gcr_import_button_new (const gchar *label);
+

Create a new GcrImportButton.

+
+

Parameters

+
+++++ + + + + + +

label

label to display on the button.

[allow-none]
+
+
+

Returns

+

a newly created GcrImportButton.

+

[transfer full]

+
+
+
+
+

gcr_import_button_add_parsed ()

+
void
+gcr_import_button_add_parsed (GcrImportButton *self,
+                              GcrParsed *parsed);
+

Queue an item to import via the button

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

an import button

 

parsed

a parsed item

 
+
+
+
+
+

Types and Values

+
+

struct GcrImportButton

+
struct GcrImportButton;
+

Button which imports parsed certificates and keys.

+
+
+
+

struct GcrImportButtonClass

+
struct GcrImportButtonClass {
+	GtkButtonClass parent_class;
+
+	void    (*importing)   (GcrImportButton *self,
+	                        GcrImporter *importer);
+
+	void    (*imported)    (GcrImportButton *self,
+	                        GcrImporter *importer,
+	                        GError *error);
+};
+
+

Class for GcrImportButton.

+
+

Members

+
+++++ + + + + + + + + + + + + +

importing ()

Emitted when the import begins.

 

imported ()

Emitted when the import completes, or fails.

 
+
+
+
+
+

Signal Details

+
+

The “imported” signal

+
void
+user_function (GcrImportButton *self,
+               GObject         *importer,
+               GError          *error,
+               gpointer         user_data)
+

Signal emitted when an import completes or fails.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

the import button

 

importer

the importer that was imported to

 

error

if import was successful NULL, or an error

 

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+

The “importing” signal

+
void
+user_function (GcrImportButton *self,
+               GObject         *importer,
+               gpointer         user_data)
+

Signal emitted when an import begins.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the import button

 

importer

the importer that will be imported to

 

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrImporter.html b/docs/reference/gcr/html/GcrImporter.html new file mode 100644 index 0000000..da42113 --- /dev/null +++ b/docs/reference/gcr/html/GcrImporter.html @@ -0,0 +1,655 @@ + + + + +GcrImporter: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrImporter

+

GcrImporter — Import certificates and keys

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GTlsInteraction * + +gcr_importer_get_interaction () +
+void + +gcr_importer_set_interaction () +
+gboolean + +gcr_importer_import () +
+void + +gcr_importer_import_async () +
+gboolean + +gcr_importer_import_finish () +
+void + +gcr_importer_register () +
+void + +gcr_importer_register_well_known () +
+GList * + +gcr_importer_create_for_parsed () +
+gboolean + +gcr_importer_queue_for_parsed () +
+GList * + +gcr_importer_queue_and_filter_for_parsed () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +
+GIcon *iconRead
+GTlsInteraction *interactionRead / Write
+gchar *labelRead
+gchar *uriRead
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrImporter
structGcrImporterIface
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GcrImporter
+
+
+
+

Prerequisites

+

+GcrImporter requires + GObject.

+
+
+

Description

+

An interface which allows importing of certificates and keys. Each +GcrImporter is registered with a set of PKCS#11 attributes to match +stuff that it can import.

+

An importer gets passed a GcrParser and accesses the currently parsed +item. To create a set of importers that can import the currently parsed +item in a GcrParser, use gcr_importer_create_for_parsed(). The list of +importers returned has the parsed item queued for import.

+

To queue additional items with a importer use gcr_importer_queue_for_parsed(). +In addition you can try and queue an additional item with a set of importers +using the gcr_importer_queue_and_filter_for_parsed().

+

To start the import use gcr_importer_import() or the async variants.

+
+
+

Functions

+
+

gcr_importer_get_interaction ()

+
GTlsInteraction *
+gcr_importer_get_interaction (GcrImporter *importer);
+

Get the interaction used to prompt the user when needed by this +importer.

+
+

Parameters

+
+++++ + + + + + +

importer

the importer

 
+
+
+

Returns

+

the interaction or NULL.

+

[transfer none][allow-none]

+
+
+
+
+

gcr_importer_set_interaction ()

+
void
+gcr_importer_set_interaction (GcrImporter *importer,
+                              GTlsInteraction *interaction);
+

Set the interaction used to prompt the user when needed by this +importer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

importer

the importer

 

interaction

the interaction used by the importer

 
+
+
+
+
+

gcr_importer_import ()

+
gboolean
+gcr_importer_import (GcrImporter *importer,
+                     GCancellable *cancellable,
+                     GError **error);
+

Import the queued items in the importer. This call will block +until the operation completes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

importer

the importer

 

cancellable

a GCancellable, or NULL

 

error

the location to place an error on failure, or NULL

 
+
+
+

Returns

+

whether the items were imported successfully or not

+
+
+
+
+

gcr_importer_import_async ()

+
void
+gcr_importer_import_async (GcrImporter *importer,
+                           GCancellable *cancellable,
+                           GAsyncReadyCallback callback,
+                           gpointer user_data);
+

Import the queued items in the importer. This function returns immediately +and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

importer

the importer

 

cancellable

a GCancellable, or NULL

 

callback

called when the operation completes

 

user_data

data to be passed to the callback

 
+
+
+
+
+

gcr_importer_import_finish ()

+
gboolean
+gcr_importer_import_finish (GcrImporter *importer,
+                            GAsyncResult *result,
+                            GError **error);
+

Complete an asynchronous operation to import queued items.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

importer

the importer

 

result

an asynchronous result

 

error

the location to place an error on failure, or NULL

 
+
+
+

Returns

+

whether the import succeeded or failed

+
+
+
+
+

gcr_importer_register ()

+
void
+gcr_importer_register (GType importer_type,
+                       GckAttributes *attrs);
+

Register an importer to handle parsed items that match the given attributes.

+

If attrs + are a floating reference, then it is consumed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

importer_type

the GType of the importer being registered

 

attrs

the attributes that this importer is compatible with

 
+
+
+
+
+

gcr_importer_register_well_known ()

+
void
+gcr_importer_register_well_known (void);
+

Register built-in PKCS#11 and GnuPG importers.

+
+
+
+

gcr_importer_create_for_parsed ()

+
GList *
+gcr_importer_create_for_parsed (GcrParsed *parsed);
+

Create a set of importers which can import this parsed item. +The parsed item is represented by the state of the GcrParser at the +time of calling this method.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parser with a parsed item to import

 
+
+
+

Returns

+

a list of importers +which can import the parsed item, which should be freed with +g_object_unref(), or NULL if no types of importers can be created.

+

[element-type Gcr.Importer][transfer full]

+
+
+
+
+

gcr_importer_queue_for_parsed ()

+
gboolean
+gcr_importer_queue_for_parsed (GcrImporter *importer,
+                               GcrParsed *parsed);
+

Queues an additional item to be imported. The parsed item is represented +by the state of the GcrParser at the time of calling this method.

+

If the parsed item is incompatible with the importer, then this will +fail and the item will not be queued.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

importer

an importer to add additional items to

 

parsed

a parsed item to import

 
+
+
+

Returns

+

whether the item was queued or not

+
+
+
+
+

gcr_importer_queue_and_filter_for_parsed ()

+
GList *
+gcr_importer_queue_and_filter_for_parsed
+                               (GList *importers,
+                                GcrParsed *parsed);
+

Queues an additional item to be imported in all compattible importers +in the set. The parsed item is represented by the state of the GcrParser +at the time of calling this method.

+

If the parsed item is incompatible with an importer, then that the item +will not be queued on that importer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

importers

a set of importers.

[element-type Gcr.Importer]

parsed

a parsed item

 
+
+
+

Returns

+

a new set of importers +that queued the item, which should be freed with gck_list_unref_free().

+

[transfer full][element-type Gcr.Importer]

+
+
+
+
+

Types and Values

+
+

GcrImporter

+
typedef struct _GcrImporter GcrImporter;
+

Imports certificates and keys

+
+
+
+

struct GcrImporterIface

+
struct GcrImporterIface {
+	GTypeInterface parent;
+
+	GList *     (*create_for_parsed)      (GcrParsed *parsed);
+
+	gboolean    (*queue_for_parsed)       (GcrImporter *importer,
+	                                       GcrParsed *parsed);
+
+	gboolean    (*import_sync)            (GcrImporter *importer,
+	                                       GCancellable *cancellable,
+	                                       GError **error);
+
+	void        (*import_async)           (GcrImporter *importer,
+	                                       GCancellable *cancellable,
+	                                       GAsyncReadyCallback callback,
+	                                       gpointer user_data);
+
+	gboolean    (*import_finish)          (GcrImporter *importer,
+	                                       GAsyncResult *result,
+	                                       GError **error);
+};
+
+

Interface implemented for a GcrImporter.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GTypeInterface parent;

parent interface

 

create_for_parsed ()

implementation of gcr_importer_create_for_parsed(), required

 

queue_for_parsed ()

implementation of gcr_importer_queue_for_parsed(), required

 

import_sync ()

optional implemantionon of gcr_importer_import()

 

import_async ()

implementation of gcr_importer_import_async(), required

 

import_finish ()

implementation of gcr_importer_import_finish()

 
+
+
+
+
+

Property Details

+
+

The “icon” property

+
  “icon”                     GIcon *
+

The icon for the importer.

+

Flags: Read

+
+
+
+

The “interaction” property

+
  “interaction”              GTlsInteraction *
+

The interaction for the importer.

+

Flags: Read / Write

+
+
+
+

The “label” property

+
  “label”                    gchar *
+

The label for the importer.

+

Flags: Read

+

Default value: ""

+
+
+
+

The “uri” property

+
  “uri”                      gchar *
+

The URI of the location imported to.

+

Flags: Read

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrKeyWidget.html b/docs/reference/gcr/html/GcrKeyWidget.html new file mode 100644 index 0000000..5081e6a --- /dev/null +++ b/docs/reference/gcr/html/GcrKeyWidget.html @@ -0,0 +1,419 @@ + + + + +GcrKeyWidget: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrKeyWidget

+

GcrKeyWidget — Key widget and renderer

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrKeyWidget * + +gcr_key_widget_new () +
+GckAttributes * + +gcr_key_widget_get_attributes () +
+void + +gcr_key_widget_set_attributes () +
+GcrKeyRenderer * + +gcr_key_renderer_new () +
+GckAttributes * + +gcr_key_renderer_get_attributes () +
+void + +gcr_key_renderer_set_attributes () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + +
+GckAttributes *attributesRead / Write
+GckObject *objectRead / Write
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + +
 GcrKeyWidget
 GcrKeyWidgetClass
structGcrKeyRenderer
structGcrKeyRendererClass
+
+
+

Object Hierarchy

+
    GObject
+    ├── GInitiallyUnowned
+       ╰── GtkWidget
+           ╰── GtkContainer
+               ╰── GtkBin
+                   ╰── GcrKeyWidget
+    ╰── GcrKeyRenderer
+
+
+
+

Implemented Interfaces

+

+GcrKeyWidget implements + AtkImplementorIface and GtkBuildable.

+

+GcrKeyRenderer implements + GcrRenderer.

+
+
+

Description

+

A GcrKeyWidget can be used to display a RSA, DSA or EC key. The widget +is normally in a collapsed state showing only details, but can be expanded +by the user.

+

Use gcr_key_widget_new() to create a new key widget. Only +one key can be displayed. A GcrKeyWidget contains a +GcrViewer internally and GcrKeyRenderer is used to render the +key to the viewer. To show more than one key in a view, +create the viewer and add renderers to it.

+
+
+

Functions

+
+

gcr_key_widget_new ()

+
GcrKeyWidget *
+gcr_key_widget_new (GckAttributes *attrs);
+

Create a new key widget which displays a given key in the attributes.

+
+

Parameters

+
+++++ + + + + + +

attrs

key to display, or NULL.

[allow-none]
+
+
+

Returns

+

A newly allocated GcrKeyWidget, which should be freed +with g_object_unref().

+
+
+
+
+

gcr_key_widget_get_attributes ()

+
GckAttributes *
+gcr_key_widget_get_attributes (GcrKeyWidget *self);
+

Get the attributes displayed in the widget.

+
+

Parameters

+
+++++ + + + + + +

self

The key widget

 
+
+
+

Returns

+

The attributes, owned by the widget.

+

[allow-none][transfer none]

+
+
+
+
+

gcr_key_widget_set_attributes ()

+
void
+gcr_key_widget_set_attributes (GcrKeyWidget *self,
+                               GckAttributes *attrs);
+

Get the attributes displayed in the widget. The attributes should represent +either an RSA, DSA or EC key in PKCS#11 style.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The key widget

 

attrs

the attributes to display.

[allow-none]
+
+
+
+
+

gcr_key_renderer_new ()

+
GcrKeyRenderer *
+gcr_key_renderer_new (const gchar *label,
+                      GckAttributes *attrs);
+

Create a new key renderer which renders a given key in the attributes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

label

label describing the key.

[allow-none]

attrs

key to display, or NULL.

[allow-none]
+
+
+

Returns

+

a newly allocated GcrKeyRenderer, which should be +freed with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_key_renderer_get_attributes ()

+
GckAttributes *
+gcr_key_renderer_get_attributes (GcrKeyRenderer *self);
+

Get the attributes displayed in the renderer.

+
+

Parameters

+
+++++ + + + + + +

self

The key renderer

 
+
+
+

Returns

+

the attributes, owned by the renderer.

+

[transfer none][allow-none]

+
+
+
+
+

gcr_key_renderer_set_attributes ()

+
void
+gcr_key_renderer_set_attributes (GcrKeyRenderer *self,
+                                 GckAttributes *attrs);
+

Get the attributes displayed in the renderer. The attributes should represent +either an RSA, DSA, or EC key in PKCS#11 style.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The key renderer

 

attrs

the attributes to display.

[allow-none]
+
+
+
+
+

Types and Values

+
+

GcrKeyWidget

+
typedef struct _GcrKeyWidget GcrKeyWidget;
+

A widget that displays a key.

+
+
+
+

GcrKeyWidgetClass

+
typedef struct _GcrKeyWidgetClass GcrKeyWidgetClass;
+

The class for GcrKeyWidget

+
+
+
+

struct GcrKeyRenderer

+
struct GcrKeyRenderer;
+

An implementation of GcrRenderer which renders keys.

+
+
+
+

struct GcrKeyRendererClass

+
struct GcrKeyRendererClass {
+	GObjectClass parent_class;
+};
+
+

The class for GcrKeyRenderer.

+
+

Members

+
+++++ + +
+
+
+
+
+

Property Details

+
+

The “attributes” property

+
  “attributes”               GckAttributes *
+

The data displayed in the widget.

+

Flags: Read / Write

+
+
+
+

The “object” property

+
  “object”                   GckObject *
+

Key Object.

+

Flags: Read / Write

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrListSelector.html b/docs/reference/gcr/html/GcrListSelector.html new file mode 100644 index 0000000..81600ff --- /dev/null +++ b/docs/reference/gcr/html/GcrListSelector.html @@ -0,0 +1,280 @@ + + + + +GcrListSelector: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrListSelector

+

GcrListSelector — A selector widget to one or more certificates from a list.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
+GcrListSelector * + +gcr_list_selector_new () +
+GcrCollection * + +gcr_list_selector_get_collection () +
+GList * + +gcr_list_selector_get_selected () +
+void + +gcr_list_selector_set_selected () +
+
+
+

Properties

+
+++++ + + + + + +
+GcrCollection *collectionRead / Write / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrListSelector
structGcrListSelectorClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GInitiallyUnowned
+        ╰── GtkWidget
+            ╰── GtkContainer
+                ╰── GtkTreeView
+                    ╰── GcrListSelector
+
+
+
+

Implemented Interfaces

+

+GcrListSelector implements + AtkImplementorIface, GtkBuildable and GtkScrollable.

+
+
+

Description

+

The GcrListSelector can be used to select one or more certificates or keys. +Live search is available for quick filtering.

+
+
+

Functions

+
+

gcr_list_selector_new ()

+
GcrListSelector *
+gcr_list_selector_new (GcrCollection *collection);
+

Create a new GcrListSelector.

+
+

Parameters

+
+++++ + + + + + +

collection

The collection that contains the objects to display

 
+
+
+

Returns

+

a newly allocated selector, which should be +released with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_list_selector_get_collection ()

+
GcrCollection *
+gcr_list_selector_get_collection (GcrListSelector *self);
+

Get the collection that this selector is displaying objects from.

+
+

Parameters

+
+++++ + + + + + +

self

The selector

 
+
+
+

Returns

+

The collection, owned by the selector.

+

[transfer none]

+
+
+
+
+

gcr_list_selector_get_selected ()

+
GList *
+gcr_list_selector_get_selected (GcrListSelector *self);
+

Get a list of selected objects.

+
+

Parameters

+
+++++ + + + + + +

self

The selector

 
+
+
+

Returns

+

the list of +selected objects, to be released with g_list_free().

+

[transfer container][element-type GObject.Object]

+
+
+
+
+

gcr_list_selector_set_selected ()

+
void
+gcr_list_selector_set_selected (GcrListSelector *self,
+                                GList *selected);
+

Select certain objects in the selector.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The selector

 

selected

the list of objects to select.

[element-type GObject.Object]
+
+
+
+
+

Types and Values

+
+

struct GcrListSelector

+
struct GcrListSelector;
+

A list selector widget.

+
+
+
+

struct GcrListSelectorClass

+
struct GcrListSelectorClass {
+};
+
+

The class for GcrListSelector.

+
+
+
+

Property Details

+
+

The “collection” property

+
  “collection”               GcrCollection *
+

The collection which contains the objects to display in the selector.

+

Flags: Read / Write / Construct Only

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrParser.html b/docs/reference/gcr/html/GcrParser.html new file mode 100644 index 0000000..056e48d --- /dev/null +++ b/docs/reference/gcr/html/GcrParser.html @@ -0,0 +1,1708 @@ + + + + +GcrParser: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrParser

+

GcrParser — Parser for certificate and key files

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrParser * + +gcr_parser_new () +
+gboolean + +gcr_parser_parse_bytes () +
+gboolean + +gcr_parser_parse_data () +
+gboolean + +gcr_parser_parse_stream () +
+void + +gcr_parser_parse_stream_async () +
+gboolean + +gcr_parser_parse_stream_finish () +
+void + +gcr_parser_format_enable () +
+void + +gcr_parser_format_disable () +
+gboolean + +gcr_parser_format_supported () +
+void + +gcr_parser_add_password () +
const gchar * + +gcr_parser_get_parsed_label () +
const gchar * + +gcr_parser_get_parsed_description () +
+GckAttributes * + +gcr_parser_get_parsed_attributes () +
const guchar * + +gcr_parser_get_parsed_block () +
+GBytes * + +gcr_parser_get_parsed_bytes () +
+GcrDataFormat + +gcr_parser_get_parsed_format () +
const gchar * + +gcr_parser_get_filename () +
+void + +gcr_parser_set_filename () +
+GcrParsed * + +gcr_parsed_ref () +
+void + +gcr_parsed_unref () +
+GckAttributes * + +gcr_parsed_get_attributes () +
const guchar * + +gcr_parsed_get_data () +
+GBytes * + +gcr_parsed_get_bytes () +
const gchar * + +gcr_parsed_get_description () +
+GcrDataFormat + +gcr_parsed_get_format () +
const gchar * + +gcr_parsed_get_label () +
+GcrParsed * + +gcr_parser_get_parsed () +
const gchar * + +gcr_parsed_get_filename () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + +
+GckAttributes *parsed-attributesRead
+gchar *parsed-descriptionRead
+gchar *parsed-labelRead
+
+
+

Signals

+
+++++ + + + + + + + + + + + + +
gbooleanauthenticateRun Last
voidparsedRun First
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
#defineGCR_DATA_ERROR
enumGcrDataError
enumGcrDataFormat
structGcrParser
structGcrParserClass
 GcrParsed
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrParser
+
+
+
+

Description

+

A GcrParser can parse various certificate and key files such as OpenSSL +PEM files, DER encoded certifictes, PKCS#8 keys and so on. Each various +format is identified by a value in the GcrDataFormat enumeration.

+

In order to parse data, a new parser is created with gcr_parser_new() and +then the “authenticate” and “parsed” signals should be +connected to. Data is then fed to the parser via gcr_parser_parse_data() +or gcr_parser_parse_stream().

+

During the “parsed” signal the attributes that make up the currently +parsed item can be retrieved using the gcr_parser_get_parsed_attributes() +function.

+
+
+

Functions

+
+

gcr_parser_new ()

+
GcrParser *
+gcr_parser_new (void);
+

Create a new GcrParser

+
+

Returns

+

a newly allocated GcrParser.

+

[transfer full]

+
+
+
+
+

gcr_parser_parse_bytes ()

+
gboolean
+gcr_parser_parse_bytes (GcrParser *self,
+                        GBytes *data,
+                        GError **error);
+

Parse the data. The “parsed” and “authenticate” signals +may fire during the parsing.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The parser

 

data

the data to parse

 

error

A location to raise an error on failure.

 
+
+
+

Returns

+

Whether the data was parsed successfully or not.

+
+
+
+
+

gcr_parser_parse_data ()

+
gboolean
+gcr_parser_parse_data (GcrParser *self,
+                       const guchar *data,
+                       gsize n_data,
+                       GError **error);
+

Parse the data. The “parsed” and “authenticate” signals +may fire during the parsing.

+

A copy of the data will be made. Use gcr_parser_parse_bytes() to avoid this.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The parser

 

data

the data to parse.

[array length=n_data]

n_data

The length of the data

 

error

A location to raise an error on failure.

 
+
+
+

Returns

+

Whether the data was parsed successfully or not.

+
+
+
+
+

gcr_parser_parse_stream ()

+
gboolean
+gcr_parser_parse_stream (GcrParser *self,
+                         GInputStream *input,
+                         GCancellable *cancellable,
+                         GError **error);
+

Parse items from the data in a GInputStream. This function may block while +reading from the input stream. Use gcr_parser_parse_stream_async() for +a non-blocking variant.

+

The “parsed” and “authenticate” signals +may fire during the parsing.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

The parser

 

input

The input stream

 

cancellable

An optional cancellation object

 

error

A location to raise an error on failure

 
+
+
+

Returns

+

Whether the parsing completed successfully or not.

+
+
+
+
+

gcr_parser_parse_stream_async ()

+
void
+gcr_parser_parse_stream_async (GcrParser *self,
+                               GInputStream *input,
+                               GCancellable *cancellable,
+                               GAsyncReadyCallback callback,
+                               gpointer user_data);
+

Parse items from the data in a GInputStream. This function completes +asyncronously and doesn't block.

+

The “parsed” and “authenticate” signals +may fire during the parsing.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

self

The parser

 

input

The input stream

 

cancellable

An optional cancellation object

 

callback

Called when the operation result is ready.

 

user_data

Data to pass to callback

 
+
+
+
+
+

gcr_parser_parse_stream_finish ()

+
gboolean
+gcr_parser_parse_stream_finish (GcrParser *self,
+                                GAsyncResult *result,
+                                GError **error);
+

Complete an operation to parse a stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The parser

 

result

The operation result

 

error

A location to raise an error on failure

 
+
+
+

Returns

+

Whether the parsing completed successfully or not.

+
+
+
+
+

gcr_parser_format_enable ()

+
void
+gcr_parser_format_enable (GcrParser *self,
+                          GcrDataFormat format);
+

Enable parsing of the given format. Use GCR_FORMAT_ALL to enable all the formats.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The parser

 

format

The format identifier

 
+
+
+
+
+

gcr_parser_format_disable ()

+
void
+gcr_parser_format_disable (GcrParser *self,
+                           GcrDataFormat format);
+

Disable parsing of the given format. Use GCR_FORMAT_ALL to disable all the formats.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The parser

 

format

The format identifier

 
+
+
+
+
+

gcr_parser_format_supported ()

+
gboolean
+gcr_parser_format_supported (GcrParser *self,
+                             GcrDataFormat format);
+

Check whether the given format is supported by the parser.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The parser

 

format

The format identifier

 
+
+
+

Returns

+

Whether the format is supported.

+
+
+
+
+

gcr_parser_add_password ()

+
void
+gcr_parser_add_password (GcrParser *self,
+                         const gchar *password);
+

Add a password to the set of passwords to try when parsing locked or encrypted +items. This is usually called from the “authenticate” signal.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The parser

 

password

a password to try.

[allow-none]
+
+
+
+
+

gcr_parser_get_parsed_label ()

+
const gchar *
+gcr_parser_get_parsed_label (GcrParser *self);
+

Get the label of the currently parsed item. This is generally only valid +during the “parsed” signal.

+
+

Parameters

+
+++++ + + + + + +

self

The parser

 
+
+
+

Returns

+

the label of the currently parsed item. The value is +owned by the parser and should not be freed.

+

[allow-none]

+
+
+
+
+

gcr_parser_get_parsed_description ()

+
const gchar *
+gcr_parser_get_parsed_description (GcrParser *self);
+

Get a description for the type of the currently parsed item. This is generally +only valid during the “parsed” signal.

+
+

Parameters

+
+++++ + + + + + +

self

The parser

 
+
+
+

Returns

+

the description for the current item; this is owned by +the parser and should not be freed.

+

[allow-none]

+
+
+
+
+

gcr_parser_get_parsed_attributes ()

+
GckAttributes *
+gcr_parser_get_parsed_attributes (GcrParser *self);
+

Get the attributes which make up the currently parsed item. This is generally +only valid during the “parsed” signal.

+
+

Parameters

+
+++++ + + + + + +

self

The parser

 
+
+
+

Returns

+

the attributes for the current item, +which are owned by the parser and should not be freed.

+

[transfer none][allow-none]

+
+
+
+
+

gcr_parser_get_parsed_block ()

+
const guchar *
+gcr_parser_get_parsed_block (GcrParser *self,
+                             gsize *n_block);
+

Get the raw data block that represents this parsed object. This is only +valid during the “parsed” signal.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a parser

 

n_block

a location to place the size of the block

 
+
+
+

Returns

+

the raw data +block of the currently parsed item; the value is owned by the parser +and should not be freed.

+

[transfer none][array length=n_block][allow-none]

+
+
+
+
+

gcr_parser_get_parsed_bytes ()

+
GBytes *
+gcr_parser_get_parsed_bytes (GcrParser *self);
+

Get the raw data block that represents this parsed object. This is only +valid during the “parsed” signal.

+
+

Parameters

+
+++++ + + + + + +

self

a parser

 
+
+
+

Returns

+

the raw data block of the currently parsed item.

+

[transfer none]

+
+
+
+
+

gcr_parser_get_parsed_format ()

+
GcrDataFormat
+gcr_parser_get_parsed_format (GcrParser *self);
+

Get the format of the raw data block that represents this parsed object. +This corresponds with the data returned from gcr_parser_get_parsed_block().

+

This is only valid during the “parsed” signal.

+
+

Parameters

+
+++++ + + + + + +

self

a parser

 
+
+
+

Returns

+

the data format of the currently parsed item

+
+
+
+
+

gcr_parser_get_filename ()

+
const gchar *
+gcr_parser_get_filename (GcrParser *self);
+

Get the filename of the parser item.

+
+

Parameters

+
+++++ + + + + + +

self

a parser item

 
+
+
+

Returns

+

the filename set on the parser, or NULL

+
+
+
+
+

gcr_parser_set_filename ()

+
void
+gcr_parser_set_filename (GcrParser *self,
+                         const gchar *filename);
+

Sets the filename of the parser item.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a parser item

 

filename

a string of the filename of the parser item.

[allow-none]
+
+
+
+
+

gcr_parsed_ref ()

+
GcrParsed *
+gcr_parsed_ref (GcrParsed *parsed);
+

Add a reference to a parsed item. An item may not be shared across threads +until it has been referenced at least once.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+

Returns

+

the parsed item.

+

[transfer full]

+
+
+
+
+

gcr_parsed_unref ()

+
void
+gcr_parsed_unref (gpointer parsed);
+

Unreferences a parsed item which was referenced with gcr_parsed_ref()

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+
+
+

gcr_parsed_get_attributes ()

+
GckAttributes *
+gcr_parsed_get_attributes (GcrParsed *parsed);
+

Get the attributes which make up the parsed item.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+

Returns

+

the attributes for the item; these +are owned by the parsed item and should not be freed.

+

[transfer none][allow-none]

+
+
+
+
+

gcr_parsed_get_data ()

+
const guchar *
+gcr_parsed_get_data (GcrParsed *parsed,
+                     gsize *n_data);
+

Get the raw data block for the parsed item.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

parsed

a parsed item

 

n_data

location to store size of returned data

 
+
+
+

Returns

+

the raw data of +the parsed item, or NULL.

+

[transfer none][array length=n_data][allow-none]

+
+
+
+
+

gcr_parsed_get_bytes ()

+
GBytes *
+gcr_parsed_get_bytes (GcrParsed *parsed);
+

Get the raw data block for the parsed item.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+

Returns

+

the raw data of the parsed item, or NULL.

+

[transfer none]

+
+
+
+
+

gcr_parsed_get_description ()

+
const gchar *
+gcr_parsed_get_description (GcrParsed *parsed);
+

Get the descirption for a parsed item.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+

Returns

+

the description.

+

[allow-none]

+
+
+
+
+

gcr_parsed_get_format ()

+
GcrDataFormat
+gcr_parsed_get_format (GcrParsed *parsed);
+

Get the format of the parsed item.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+

Returns

+

the data format of the item

+
+
+
+
+

gcr_parsed_get_label ()

+
const gchar *
+gcr_parsed_get_label (GcrParsed *parsed);
+

Get the label for the parsed item.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+

Returns

+

the label for the item.

+

[allow-none]

+
+
+
+
+

gcr_parser_get_parsed ()

+
GcrParsed *
+gcr_parser_get_parsed (GcrParser *self);
+

Get the currently parsed item

+
+

Parameters

+
+++++ + + + + + +

self

a parser

 
+
+
+

Returns

+

the currently parsed item.

+

[transfer none]

+
+
+
+
+

gcr_parsed_get_filename ()

+
const gchar *
+gcr_parsed_get_filename (GcrParsed *parsed);
+

Get the filename of the parsed item.

+
+

Parameters

+
+++++ + + + + + +

parsed

a parsed item

 
+
+
+

Returns

+

the filename of +the parsed item, or NULL.

+

[transfer none]

+
+
+
+
+

Types and Values

+
+

GCR_DATA_ERROR

+
#define             GCR_DATA_ERROR                    (gcr_data_error_get_domain ())
+
+

A domain for data errors with codes from GcrDataError

+
+
+
+

enum GcrDataError

+

Values responding to error codes for parsing and serializing data.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

GCR_ERROR_FAILURE

+

Failed to parse or serialize the data

+
 

GCR_ERROR_UNRECOGNIZED

+

The data was unrecognized or unsupported

+
 

GCR_ERROR_CANCELLED

+

The operation was cancelled

+
 

GCR_ERROR_LOCKED

+

The data was encrypted or locked and could not be unlocked.

+
 
+
+
+
+
+

enum GcrDataFormat

+

The various format identifiers.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GCR_FORMAT_ALL

+

Represents all the formats, when enabling or disabling

+
 

GCR_FORMAT_INVALID

+

Not a valid format

+
 

GCR_FORMAT_DER_PRIVATE_KEY

+

DER encoded private key

+
 

GCR_FORMAT_DER_PRIVATE_KEY_RSA

+

DER encoded RSA private key

+
 

GCR_FORMAT_DER_PRIVATE_KEY_DSA

+

DER encoded DSA private key

+
 

GCR_FORMAT_DER_PRIVATE_KEY_EC

+

DER encoded EC private key

+
 

GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY

+

DER encoded SubjectPublicKeyInfo

+
 

GCR_FORMAT_DER_CERTIFICATE_X509

+

DER encoded X.509 certificate

+
 

GCR_FORMAT_DER_PKCS7

+

DER encoded PKCS#7 container file which can contain certificates

+
 

GCR_FORMAT_DER_PKCS8

+

DER encoded PKCS#8 file which can contain a key

+
 

GCR_FORMAT_DER_PKCS8_PLAIN

+

Unencrypted DER encoded PKCS#8 file which can contain a key

+
 

GCR_FORMAT_DER_PKCS8_ENCRYPTED

+

Encrypted DER encoded PKCS#8 file which can contain a key

+
 

GCR_FORMAT_DER_PKCS10

+

DER encoded PKCS#10 certificate request file

+
 

GCR_FORMAT_DER_SPKAC

+

DER encoded SPKAC as generated by HTML5 keygen element

+
 

GCR_FORMAT_BASE64_SPKAC

+

OpenSSL style SPKAC data

+
 

GCR_FORMAT_DER_PKCS12

+

DER encoded PKCS#12 file which can contain certificates and/or keys

+
 

GCR_FORMAT_OPENSSH_PUBLIC

+

OpenSSH v1 or v2 public key

+
 

GCR_FORMAT_OPENPGP_PACKET

+

OpenPGP key packet(s)

+
 

GCR_FORMAT_OPENPGP_ARMOR

+

OpenPGP public or private key armor encoded data

+
 

GCR_FORMAT_PEM

+

An OpenSSL style PEM file with unspecified contents

+
 

GCR_FORMAT_PEM_PRIVATE_KEY_RSA

+

An OpenSSL style PEM file with a private RSA key

+
 

GCR_FORMAT_PEM_PRIVATE_KEY_DSA

+

An OpenSSL style PEM file with a private DSA key

+
 

GCR_FORMAT_PEM_CERTIFICATE_X509

+

An OpenSSL style PEM file with an X.509 certificate

+
 

GCR_FORMAT_PEM_PKCS7

+

An OpenSSL style PEM file containing PKCS#7

+
 

GCR_FORMAT_PEM_PKCS8_PLAIN

+

Unencrypted OpenSSL style PEM file containing PKCS#8

+
 

GCR_FORMAT_PEM_PKCS8_ENCRYPTED

+

Encrypted OpenSSL style PEM file containing PKCS#8

+
 

GCR_FORMAT_PEM_PKCS12

+

An OpenSSL style PEM file containing PKCS#12

+
 

GCR_FORMAT_PEM_PRIVATE_KEY

+

An OpenSSL style PEM file with a private key

+
 

GCR_FORMAT_PEM_PKCS10

+

An OpenSSL style PEM file containing PKCS#10

+
 

GCR_FORMAT_PEM_PRIVATE_KEY_EC

+

An OpenSSL style PEM file with a private EC key

+
 

GCR_FORMAT_PEM_PUBLIC_KEY

+

An OpenSSL style PEM file containing a SubjectPublicKeyInfo

+
 
+
+
+
+
+

struct GcrParser

+
struct GcrParser;
+

A parser for parsing various types of files or data.

+
+
+
+

struct GcrParserClass

+
struct GcrParserClass {
+	GObjectClass parent_class;
+
+	/* signals --------------------------------------------------------- */
+
+	/* A callback for each password needed */
+	gboolean (*authenticate) (GcrParser *self, gint count);
+
+	void     (*parsed) (GcrParser *self);
+};
+
+

The class for GcrParser

+
+

Members

+
+++++ + + + + + + + + + + + + +

authenticate ()

The default handler for the authenticate signal.

 

parsed ()

The default handler for the parsed signal.

 
+
+
+
+
+

GcrParsed

+
typedef struct _GcrParsed GcrParsed;
+

A parsed item parsed by a GcrParser.

+
+
+
+

Property Details

+
+

The “parsed-attributes” property

+
  “parsed-attributes”        GckAttributes *
+

Get the attributes that make up the currently parsed item. This is +generally only valid during a “parsed” signal.

+

Flags: Read

+
+
+
+

The “parsed-description” property

+
  “parsed-description”       gchar *
+

The description of the type of the currently parsed item. This is generally +only valid during a “parsed” signal.

+

Flags: Read

+

Default value: ""

+
+
+
+

The “parsed-label” property

+
  “parsed-label”             gchar *
+

The label of the currently parsed item. This is generally +only valid during a “parsed” signal.

+

Flags: Read

+

Default value: ""

+
+
+
+

Signal Details

+
+

The “authenticate” signal

+
gboolean
+user_function (GcrParser *self,
+               gint       count,
+               gpointer   user_data)
+

This signal is emitted when an item needs to be unlocked or decrypted before +it can be parsed. The count + argument specifies the number of times +the signal has been emitted for a given item. This can be used to +display a message saying the previous password was incorrect.

+

Typically the gcr_parser_add_password() function is called in +response to this signal.

+

If FALSE is returned, then the authentication was not handled. If +no handlers return TRUE then the item is not parsed and an error +with the code GCR_ERROR_CANCELLED will be raised.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the parser

 

count

the number of times this item has been authenticated

 

user_data

user data set when the signal handler was connected.

 
+
+
+

Returns

+

Whether the authentication was handled.

+
+

Flags: Run Last

+
+
+
+

The “parsed” signal

+
void
+user_function (GcrParser *self,
+               gpointer   user_data)
+

This signal is emitted when an item is sucessfully parsed. To access +the information about the item use the gcr_parser_get_parsed_label(), +gcr_parser_get_parsed_attributes() and gcr_parser_get_parsed_description() +functions.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the parser

 

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run First

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrPkcs11Certificate.html b/docs/reference/gcr/html/GcrPkcs11Certificate.html new file mode 100644 index 0000000..1ebe83e --- /dev/null +++ b/docs/reference/gcr/html/GcrPkcs11Certificate.html @@ -0,0 +1,333 @@ + + + + +GcrPkcs11Certificate: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrPkcs11Certificate

+

GcrPkcs11Certificate — A certificate loaded from PKCS#11 storage

+
+
+

Functions

+ +
+
+

Properties

+
+++++ + + + + + +
+GckAttributes *attributesRead / Write / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrPkcs11Certificate
structGcrPkcs11CertificateClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GckObject
+        ╰── GcrPkcs11Certificate
+
+
+
+

Implemented Interfaces

+

+GcrPkcs11Certificate implements + GcrComparable and GcrCertificate.

+
+
+

Description

+

A GcrPkcs11Certificate is a certificate loaded from a PKCS#11 storage. +It is also a valid GckObject and can be used as such.

+

Use gcr_pkcs11_certificate_lookup_issuer() to lookup the issuer of a given +certificate in the PKCS#11 store.

+

Various common PKCS#11 certificate attributes are automatically loaded and +are available via gcr_pkcs11_certificate_get_attributes().

+
+
+

Functions

+
+

gcr_pkcs11_certificate_lookup_issuer ()

+
GcrCertificate *
+gcr_pkcs11_certificate_lookup_issuer (GcrCertificate *certificate,
+                                      GCancellable *cancellable,
+                                      GError **error);
+

Lookup a the issuer of a certificate + in the PKCS#11 storage. The +lookup is done using the issuer DN of the certificate. No certificate chain +verification is done. Use a crypto library to make trust decisions.

+

This call may block, see gcr_pkcs11_certificate_lookup_issuer() for the +non-blocking version.

+

Will return NULL if no issuer certificate is found. Use error + to determine +if an error occurred.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate

 

cancellable

a GCancellable

 

error

a GError, or NULL

 
+
+
+

Returns

+

a new GcrPkcs11Certificate, or NULL.

+

[transfer full]

+
+
+
+
+

gcr_pkcs11_certificate_lookup_issuer_async ()

+
void
+gcr_pkcs11_certificate_lookup_issuer_async
+                               (GcrCertificate *certificate,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Lookup a the issuer of a certificate + in the PKCS#11 storage. The +lookup is done using the issuer DN of the certificate. No certificate chain +verification is done. Use a crypto library to make trust decisions.

+

When the operation is finished, callback will be called. You can then call +gcr_pkcs11_certificate_lookup_issuer_finish() to get the result of the +operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate

 

cancellable

a GCancellable

 

callback

a GAsyncReadyCallback to call when the operation completes

 

user_data

the data to pass to callback function

 
+
+
+
+
+

gcr_pkcs11_certificate_lookup_issuer_finish ()

+
GcrCertificate *
+gcr_pkcs11_certificate_lookup_issuer_finish
+                               (GAsyncResult *result,
+                                GError **error);
+

Finishes an asynchronous operation started by +gcr_pkcs11_certificate_lookup_issuer_async().

+

Will return NULL if no issuer certificate is found. Use error + to determine +if an error occurred.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the GAsyncResult passed to the callback

 

error

a GError, or NULL

 
+
+
+

Returns

+

a new GcrPkcs11Certificate, or NULL.

+

[transfer full]

+
+
+
+
+

gcr_pkcs11_certificate_get_attributes ()

+
GckAttributes *
+gcr_pkcs11_certificate_get_attributes (GcrPkcs11Certificate *self);
+

Access the automatically loaded attributes for this certificate.

+
+

Parameters

+
+++++ + + + + + +

self

A GcrPkcs11Certificate

 
+
+
+

Returns

+

the certificate attributes.

+

[transfer none]

+
+
+
+
+

Types and Values

+
+

struct GcrPkcs11Certificate

+
struct GcrPkcs11Certificate;
+

A certificate loaded from PKCS#11 storage.

+
+
+
+

struct GcrPkcs11CertificateClass

+
struct GcrPkcs11CertificateClass {
+};
+
+

The class for GcrPkcs11Certificate.

+
+
+
+

Property Details

+
+

The “attributes” property

+
  “attributes”               GckAttributes *
+

Automatically loaded attributes for this certificate.

+

Flags: Read / Write / Construct Only

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrPrompt.html b/docs/reference/gcr/html/GcrPrompt.html new file mode 100644 index 0000000..e061022 --- /dev/null +++ b/docs/reference/gcr/html/GcrPrompt.html @@ -0,0 +1,1768 @@ + + + + +GcrPrompt: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrPrompt

+

GcrPrompt — a user prompt

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
const gchar * + +gcr_prompt_password () +
+void + +gcr_prompt_password_async () +
const gchar * + +gcr_prompt_password_finish () +
const gchar * + +gcr_prompt_password_run () +
+GcrPromptReply + +gcr_prompt_confirm () +
+void + +gcr_prompt_confirm_async () +
+GcrPromptReply + +gcr_prompt_confirm_finish () +
+GcrPromptReply + +gcr_prompt_confirm_run () +
+void + +gcr_prompt_reset () +
+void + +gcr_prompt_close () +
+gchar * + +gcr_prompt_get_title () +
+void + +gcr_prompt_set_title () +
+gchar * + +gcr_prompt_get_message () +
+void + +gcr_prompt_set_message () +
+gchar * + +gcr_prompt_get_description () +
+void + +gcr_prompt_set_description () +
+gchar * + +gcr_prompt_get_warning () +
+void + +gcr_prompt_set_warning () +
+gchar * + +gcr_prompt_get_continue_label () +
+void + +gcr_prompt_set_continue_label () +
+gchar * + +gcr_prompt_get_cancel_label () +
+void + +gcr_prompt_set_cancel_label () +
+gchar * + +gcr_prompt_get_choice_label () +
+void + +gcr_prompt_set_choice_label () +
+gboolean + +gcr_prompt_get_choice_chosen () +
+void + +gcr_prompt_set_choice_chosen () +
+gboolean + +gcr_prompt_get_password_new () +
+void + +gcr_prompt_set_password_new () +
+gint + +gcr_prompt_get_password_strength () +
+gchar * + +gcr_prompt_get_caller_window () +
+void + +gcr_prompt_set_caller_window () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+gchar *caller-windowRead / Write / Construct
+gchar *cancel-labelRead / Write / Construct
gbooleanchoice-chosenRead / Write
+gchar *choice-labelRead / Write / Construct
+gchar *continue-labelRead / Write / Construct
+gchar *descriptionRead / Write / Construct
+gchar *messageRead / Write / Construct
gbooleanpassword-newRead / Write
gintpassword-strengthRead
+gchar *titleRead / Write / Construct
+gchar *warningRead / Write / Construct
+
+
+

Signals

+
+++++ + + + + + +
voidprompt-closeRun First
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
 GcrPrompt
structGcrPromptIface
enumGcrPromptReply
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GcrPrompt
+
+
+
+

Prerequisites

+

+GcrPrompt requires + GObject.

+
+
+

Known Implementations

+

+GcrPrompt is implemented by + GcrPromptDialog and GcrSystemPrompt.

+
+
+

Description

+

A GcrPrompt represents a prompt displayed to the user. It is an interface +with various implementations.

+

Various properties are set on the prompt, and then the prompt is displayed +the various prompt methods like gcr_prompt_password_run().

+

A GcrPrompt may be used to display multiple related prompts. Most +implemantions do not hide the window between display of multiple related +prompts, and the GcrPrompt must be closed or destroyed in order to make +it go away. This allows the user to see that the prompts are related.

+

Use GcrPromptDialog to create an in-process GTK+ dialog prompt. Use +GcrSystemPrompt to create a system prompt in a prompter process.

+

The prompt implementation will always display the GcrPrompt:message property, +but may choose not to display the GcrPrompt:description or GcrPrompt:title +properties.

+
+
+

Functions

+
+

gcr_prompt_password ()

+
const gchar *
+gcr_prompt_password (GcrPrompt *prompt,
+                     GCancellable *cancellable,
+                     GError **error);
+

Prompts for password. Set the various properties on the prompt before calling +this method to explain which password should be entered.

+

This method will block until the a response is returned from the prompter.

+

A password will be returned if the user enters a password successfully. +The returned password is valid until the next time a method is called +to display another prompt.

+

NULL will be returned if the user cancels or if an error occurs. Check the +error + argument to tell the difference.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

cancellable

optional cancellation object

 

error

location to place error on failure

 
+
+
+

Returns

+

the password owned by the prompt, or NULL

+
+
+
+
+

gcr_prompt_password_async ()

+
void
+gcr_prompt_password_async (GcrPrompt *prompt,
+                           GCancellable *cancellable,
+                           GAsyncReadyCallback callback,
+                           gpointer user_data);
+

Prompts for password. Set the various properties on the prompt before calling +this method to explain which password should be entered.

+

This method will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

cancellable

optional cancellation object

 

callback

called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gcr_prompt_password_finish ()

+
const gchar *
+gcr_prompt_password_finish (GcrPrompt *prompt,
+                            GAsyncResult *result,
+                            GError **error);
+

Complete an operation to prompt for a password.

+

A password will be returned if the user enters a password successfully. +The returned password is valid until the next time a method is called +to display another prompt.

+

NULL will be returned if the user cancels or if an error occurs. Check the +error + argument to tell the difference.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

result

asynchronous result passed to callback

 

error

location to place error on failure

 
+
+
+

Returns

+

the password owned by the prompt, or NULL

+
+
+
+
+

gcr_prompt_password_run ()

+
const gchar *
+gcr_prompt_password_run (GcrPrompt *prompt,
+                         GCancellable *cancellable,
+                         GError **error);
+

Prompts for password. Set the various properties on the prompt before calling +this method to explain which password should be entered.

+

This method will block until the a response is returned from the prompter +and will run a main loop similar to a gtk_dialog_run(). The application +will remain responsive but care must be taken to handle reentrancy issues.

+

A password will be returned if the user enters a password successfully. +The returned password is valid until the next time a method is called +to display another prompt.

+

NULL will be returned if the user cancels or if an error occurs. Check the +error + argument to tell the difference.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

cancellable

optional cancellation object

 

error

location to place error on failure

 
+
+
+

Returns

+

the password owned by the prompt, or NULL

+
+
+
+
+

gcr_prompt_confirm ()

+
GcrPromptReply
+gcr_prompt_confirm (GcrPrompt *prompt,
+                    GCancellable *cancellable,
+                    GError **error);
+

Prompts for confirmation asking a cancel/continue style question. +Set the various properties on the prompt before calling this function to +represent the question correctly.

+

This method will block until the a response is returned from the prompter.

+

GCR_PROMPT_REPLY_CONTINUE will be returned if the user confirms the prompt. The +return value will also be GCR_PROMPT_REPLY_CANCEL if the user cancels or if +an error occurs. Check the error + argument to tell the difference.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

cancellable

optional cancellation object

 

error

location to place error on failure

 
+
+
+

Returns

+

the reply from the prompt

+
+
+
+
+

gcr_prompt_confirm_async ()

+
void
+gcr_prompt_confirm_async (GcrPrompt *prompt,
+                          GCancellable *cancellable,
+                          GAsyncReadyCallback callback,
+                          gpointer user_data);
+

Prompts for confirmation asking a cancel/continue style question. +Set the various properties on the prompt before calling this method to +represent the question correctly.

+

This method will return immediately and complete asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

cancellable

optional cancellation object

 

callback

called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gcr_prompt_confirm_finish ()

+
GcrPromptReply
+gcr_prompt_confirm_finish (GcrPrompt *prompt,
+                           GAsyncResult *result,
+                           GError **error);
+

Complete an operation to prompt for confirmation.

+

GCR_PROMPT_REPLY_CONTINUE will be returned if the user confirms the prompt. The +return value will also be GCR_PROMPT_REPLY_CANCEL if the user cancels or if +an error occurs. Check the error + argument to tell the difference.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

result

asynchronous result passed to callback

 

error

location to place error on failure

 
+
+
+

Returns

+

the reply from the prompt

+
+
+
+
+

gcr_prompt_confirm_run ()

+
GcrPromptReply
+gcr_prompt_confirm_run (GcrPrompt *prompt,
+                        GCancellable *cancellable,
+                        GError **error);
+

Prompts for confirmation asking a cancel/continue style question. +Set the various properties on the prompt before calling this function to +represent the question correctly.

+

This method will block until the a response is returned from the prompter +and will run a main loop similar to a gtk_dialog_run(). The application +will remain responsive but care must be taken to handle reentrancy issues.

+

GCR_PROMPT_REPLY_CONTINUE will be returned if the user confirms the prompt. The +return value will also be GCR_PROMPT_REPLY_CANCEL if the user cancels or if +an error occurs. Check the error + argument to tell the difference.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

prompt

a prompt

 

cancellable

optional cancellation object

 

error

location to place error on failure

 
+
+
+

Returns

+

the reply from the prompt

+
+
+
+
+

gcr_prompt_reset ()

+
void
+gcr_prompt_reset (GcrPrompt *prompt);
+

Reset the contents and properties of the prompt.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+
+
+

gcr_prompt_close ()

+
void
+gcr_prompt_close (GcrPrompt *prompt);
+

Closes the prompt so that in can no longer be used to prompt. The various +prompt methods will return results as if the user dismissed the prompt.

+

The prompt may also be closed by the implementor of the GcrPrompt object.

+

This emits the GcrPrompt::prompt-close signal on the prompt object.

+
+

Parameters

+
+++++ + + + + + +

prompt

a prompt

 
+
+
+
+
+

gcr_prompt_get_title ()

+
gchar *
+gcr_prompt_get_title (GcrPrompt *prompt);
+

Gets the title of the prompt.

+

A prompt implementation may choose not to display the prompt title. The +prompt message should contain relevant information.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the prompt +title.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_title ()

+
void
+gcr_prompt_set_title (GcrPrompt *prompt,
+                      const gchar *title);
+

Sets the title of the prompt.

+

A prompt implementation may choose not to display the prompt title. The +prompt message should contain relevant information.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

title

the prompt title

 
+
+
+
+
+

gcr_prompt_get_message ()

+
gchar *
+gcr_prompt_get_message (GcrPrompt *prompt);
+

Gets the prompt message for the user.

+

A prompt implementation should always display this message.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the detailed +description of the prompt.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_message ()

+
void
+gcr_prompt_set_message (GcrPrompt *prompt,
+                        const gchar *message);
+

Sets the prompt message for the user.

+

A prompt implementation should always display this message.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

message

the prompt message

 
+
+
+
+
+

gcr_prompt_get_description ()

+
gchar *
+gcr_prompt_get_description (GcrPrompt *prompt);
+

Get the detailed description of the prompt.

+

A prompt implementation may choose not to display this detailed description. +The prompt message should contain relevant information.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the detailed +description of the prompt.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_description ()

+
void
+gcr_prompt_set_description (GcrPrompt *prompt,
+                            const gchar *description);
+

Set the detailed description of the prompt.

+

A prompt implementation may choose not to display this detailed description. +Use gcr_prompt_set_message() to set a general message containing relevant +information.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

description

the detailed description

 
+
+
+
+
+

gcr_prompt_get_warning ()

+
gchar *
+gcr_prompt_get_warning (GcrPrompt *prompt);
+

Get a prompt warning displayed on the prompt.

+

This is a warning like "The password is incorrect." usually displayed to the +user about a previous 'unsuccessful' prompt.

+

If this string is NULL then no warning is displayed.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the prompt +warning, or NULL if no warning.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_warning ()

+
void
+gcr_prompt_set_warning (GcrPrompt *prompt,
+                        const gchar *warning);
+

Set a prompt warning displayed on the prompt.

+

This is a warning like "The password is incorrect." usually displayed to the +user about a previous 'unsuccessful' prompt.

+

If this string is NULL then no warning is displayed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

warning

the warning or NULL.

[allow-none]
+
+
+
+
+

gcr_prompt_get_continue_label ()

+
gchar *
+gcr_prompt_get_continue_label (GcrPrompt *prompt);
+

Get the label for the continue button.

+

This is the button that results in a GCR_PROMPT_REPLY_CONTINUE reply +from the prompt.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the label.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_continue_label ()

+
void
+gcr_prompt_set_continue_label (GcrPrompt *prompt,
+                               const gchar *continue_label);
+

Set the label for the continue button.

+

This is the button that results in a GCR_PROMPT_REPLY_CONTINUE reply +from the prompt.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

continue_label

the label

 
+
+
+
+
+

gcr_prompt_get_cancel_label ()

+
gchar *
+gcr_prompt_get_cancel_label (GcrPrompt *prompt);
+

Get the label for the cancel button.

+

This is the button that results in a GCR_PROMPT_REPLY_CANCEL reply +from the prompt.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the label.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_cancel_label ()

+
void
+gcr_prompt_set_cancel_label (GcrPrompt *prompt,
+                             const gchar *cancel_label);
+

Set the label for the continue button.

+

This is the button that results in a GCR_PROMPT_REPLY_CANCEL reply +from the prompt.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

cancel_label

the label

 
+
+
+
+
+

gcr_prompt_get_choice_label ()

+
gchar *
+gcr_prompt_get_choice_label (GcrPrompt *prompt);
+

Get the label for the additional choice.

+

This will be NULL if no additional choice is being displayed.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the additional +choice or NULL.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_choice_label ()

+
void
+gcr_prompt_set_choice_label (GcrPrompt *prompt,
+                             const gchar *choice_label);
+

Set the label for the additional choice.

+

If this is a non-NULL value then an additional boolean choice will be +displayed by the prompt allowing the user to select or deselect it.

+

The initial value of the choice can be set with the +gcr_prompt_set_choice_label() method.

+

If this is NULL, then no additional choice is being displayed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

choice_label

the additional choice or NULL.

[allow-none]
+
+
+
+
+

gcr_prompt_get_choice_chosen ()

+
gboolean
+gcr_prompt_get_choice_chosen (GcrPrompt *prompt);
+

Get whether the additional choice was chosen or not.

+

The additional choice would have been setup using +gcr_prompt_set_choice_label().

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

whether chosen

+
+
+
+
+

gcr_prompt_set_choice_chosen ()

+
void
+gcr_prompt_set_choice_chosen (GcrPrompt *prompt,
+                              gboolean chosen);
+

Set whether the additional choice is chosen or not.

+

The additional choice should be set up using gcr_prompt_set_choice_label().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

chosen

whether chosen

 
+
+
+
+
+

gcr_prompt_get_password_new ()

+
gboolean
+gcr_prompt_get_password_new (GcrPrompt *prompt);
+

Get whether the prompt will prompt for a new password.

+

This will cause the prompt implementation to ask the user to confirm the +password and/or display other relevant user interface for creating a new +password.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

whether in new password mode or not

+
+
+
+
+

gcr_prompt_set_password_new ()

+
void
+gcr_prompt_set_password_new (GcrPrompt *prompt,
+                             gboolean new_password);
+

Set whether the prompt will prompt for a new password.

+

This will cause the prompt implementation to ask the user to confirm the +password and/or display other relevant user interface for creating a new +password.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

new_password

whether in new password mode or not

 
+
+
+
+
+

gcr_prompt_get_password_strength ()

+
gint
+gcr_prompt_get_password_strength (GcrPrompt *prompt);
+

Get indication of the password strength.

+

Prompts will return a zero value if the password is empty, and a value +greater than zero if the password has any characters.

+

This is only valid after a successful prompt for a password.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

zero if the password is empty, greater than zero if not

+
+
+
+
+

gcr_prompt_get_caller_window ()

+
gchar *
+gcr_prompt_get_caller_window (GcrPrompt *prompt);
+

Get the string handle of the caller's window.

+

The caller window indicates to the prompt which window is prompting the +user. The prompt may choose to ignore this information or use it in whatever +way it sees fit.

+
+

Parameters

+
+++++ + + + + + +

prompt

the prompt

 
+
+
+

Returns

+

a newly allocated string containing the string +handle of the window.

+

[transfer full]

+
+
+
+
+

gcr_prompt_set_caller_window ()

+
void
+gcr_prompt_set_caller_window (GcrPrompt *prompt,
+                              const gchar *window_id);
+

Set the string handle of the caller's window.

+

The caller window indicates to the prompt which window is prompting the +user. The prompt may choose to ignore this information or use it in whatever +way it sees fit.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

prompt

the prompt

 

window_id

the window id

 
+
+
+
+
+

Types and Values

+
+

GcrPrompt

+
typedef struct _GcrPrompt GcrPrompt;
+

Represents a GcrPrompt displayed to the user.

+
+
+
+

struct GcrPromptIface

+
struct GcrPromptIface {
+	GTypeInterface parent_iface;
+
+	void               (* prompt_password_async)    (GcrPrompt *prompt,
+	                                                 GCancellable *cancellable,
+	                                                 GAsyncReadyCallback callback,
+	                                                 gpointer user_data);
+
+	const gchar *      (* prompt_password_finish)   (GcrPrompt *prompt,
+	                                                 GAsyncResult *result,
+	                                                 GError **error);
+
+	void               (* prompt_confirm_async)     (GcrPrompt *prompt,
+	                                                 GCancellable *cancellable,
+	                                                 GAsyncReadyCallback callback,
+	                                                 gpointer user_data);
+
+	GcrPromptReply     (* prompt_confirm_finish)    (GcrPrompt *prompt,
+	                                                 GAsyncResult *result,
+	                                                 GError **error);
+
+	void               (* prompt_close)             (GcrPrompt *prompt);
+};
+
+

The interface for implementing GcrPrompt.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GTypeInterface parent_iface;

parent interface

 

prompt_password_async ()

begin a password prompt

 

prompt_password_finish ()

complete a password prompt

 

prompt_confirm_async ()

begin a confirm prompt

 

prompt_confirm_finish ()

complete a confirm prompt

 

prompt_close ()

close a prompt

 
+
+
+
+
+

enum GcrPromptReply

+

Various replies returned by gcr_prompt_confirm() and friends.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GCR_PROMPT_REPLY_CANCEL

+

the prompt was cancelled

+
 

GCR_PROMPT_REPLY_CONTINUE

+

the user replied with 'ok'

+
 
+
+
+
+
+

Property Details

+
+

The “caller-window” property

+
  “caller-window”            gchar *
+

The string handle of the caller's window.

+

The caller window indicates to the prompt which window is prompting the +user. The prompt may choose to ignore this information or use it in whatever +way it sees fit.

+

Flags: Read / Write / Construct

+

Default value: NULL

+
+
+
+

The “cancel-label” property

+
  “cancel-label”             gchar *
+

The label for the cancel button in the prompt.

+

Flags: Read / Write / Construct

+

Default value: "Cancel"

+
+
+
+

The “choice-chosen” property

+
  “choice-chosen”            gboolean
+

Whether the additional choice is chosen or not.

+

The additional choice would have been setup using “choice-label”.

+

Flags: Read / Write

+

Default value: FALSE

+
+
+
+

The “choice-label” property

+
  “choice-label”             gchar *
+

The label for the additional choice.

+

If this is a non-NULL value then an additional boolean choice will be +displayed by the prompt allowing the user to select or deselect it.

+

If NULL, then no additional choice is displayed.

+

The initial value of the choice can be set with “choice-chosen”.

+

Flags: Read / Write / Construct

+

Default value: NULL

+
+
+
+

The “continue-label” property

+
  “continue-label”           gchar *
+

The label for the continue button in the prompt.

+

Flags: Read / Write / Construct

+

Default value: "Continue"

+
+
+
+

The “description” property

+
  “description”              gchar *
+

The detailed description of the prompt.

+

A prompt implementation may choose not to display this detailed description. +The prompt message should contain relevant information.

+

Flags: Read / Write / Construct

+

Default value: NULL

+
+
+
+

The “message” property

+
  “message”                  gchar *
+

The prompt message for the user.

+

A prompt implementation should always display this message.

+

Flags: Read / Write / Construct

+

Default value: NULL

+
+
+
+

The “password-new” property

+
  “password-new”             gboolean
+

Whether the prompt will prompt for a new password.

+

This will cause the prompt implementation to ask the user to confirm the +password and/or display other relevant user interface for creating a new +password.

+

Flags: Read / Write

+

Default value: FALSE

+
+
+
+

The “password-strength” property

+
  “password-strength”        gint
+

Indication of the password strength.

+

Prompts will return a zero value if the password is empty, and a value +greater than zero if the password has any characters.

+

This is only valid after a successful prompt for a password.

+

Flags: Read

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The “title” property

+
  “title”                    gchar *
+

The title of the prompt.

+

A prompt implementation may choose not to display the prompt title. The +“message” should contain relevant information.

+

Flags: Read / Write / Construct

+

Default value: NULL

+
+
+
+

The “warning” property

+
  “warning”                  gchar *
+

A prompt warning displayed on the prompt, or NULL for no warning.

+

This is a warning like "The password is incorrect." usually displayed to the +user about a previous 'unsuccessful' prompt.

+

Flags: Read / Write / Construct

+

Default value: NULL

+
+
+
+

Signal Details

+
+

The “prompt-close” signal

+
void
+user_function (GcrPrompt *gcrprompt,
+               gpointer   user_data)
+

Action signal fired when the prompt is to be closed. After the default +handler has run, the prompt is closed. The various prompting methods +will return results as if the user dismissed the prompt.

+

You can use the gcr_prompt_close() method to emit this signal.

+
+

Parameters

+
+++++ + + + + + +

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run First

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrPromptDialog.html b/docs/reference/gcr/html/GcrPromptDialog.html new file mode 100644 index 0000000..067c33c --- /dev/null +++ b/docs/reference/gcr/html/GcrPromptDialog.html @@ -0,0 +1,182 @@ + + + + +GcrPromptDialog: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrPromptDialog

+

GcrPromptDialog — a GTK+ dialog prompt

+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +
gbooleanchoice-visibleRead
gbooleanconfirm-visibleRead
gbooleanpassword-visibleRead
gbooleanwarning-visibleRead
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrPromptDialog
structGcrPromptDialogClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GInitiallyUnowned
+        ╰── GtkWidget
+            ╰── GtkContainer
+                ╰── GtkBin
+                    ╰── GtkWindow
+                        ╰── GtkDialog
+                            ╰── GcrPromptDialog
+
+
+
+

Implemented Interfaces

+

+GcrPromptDialog implements + AtkImplementorIface, GtkBuildable and GcrPrompt.

+
+
+

Description

+

A GcrPrompt implementation which shows a GTK+ dialog. The dialog will +remain visible (but insensitive) between prompts. If the user cancels the +dialog between prompts, then the dialog will be hidden.

+
+
+

Functions

+

+
+
+

Types and Values

+
+

struct GcrPromptDialog

+
struct GcrPromptDialog;
+

A GcrPrompt implementation which shows a GTK+ dialog.

+
+
+
+

struct GcrPromptDialogClass

+
struct GcrPromptDialogClass {
+	GtkDialogClass parent_class;
+};
+
+

The class for GcrPromptDialog.

+
+

Members

+
+++++ + +
+
+
+
+
+

Property Details

+
+

The “choice-visible” property

+
  “choice-visible”           gboolean
+

Whether the choice check box is visible or not.

+

Flags: Read

+

Default value: FALSE

+
+
+
+

The “confirm-visible” property

+
  “confirm-visible”          gboolean
+

Whether the password confirm entry is visible or not.

+

Flags: Read

+

Default value: FALSE

+
+
+
+

The “password-visible” property

+
  “password-visible”         gboolean
+

Whether the password entry is visible or not.

+

Flags: Read

+

Default value: FALSE

+
+
+
+

The “warning-visible” property

+
  “warning-visible”          gboolean
+

Whether the warning label is visible or not.

+

Flags: Read

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrRenderer.html b/docs/reference/gcr/html/GcrRenderer.html new file mode 100644 index 0000000..7a853c7 --- /dev/null +++ b/docs/reference/gcr/html/GcrRenderer.html @@ -0,0 +1,531 @@ + + + + +GcrRenderer: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrRenderer

+

GcrRenderer — An interface implemented by renderers.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrRenderer * + +gcr_renderer_create () +
+void + +gcr_renderer_register () +
+GckAttributes * + +gcr_renderer_get_attributes () +
+void + +gcr_renderer_set_attributes () +
+void + +gcr_renderer_popuplate_popup () +
+void + +gcr_renderer_render_view () +
+void + +gcr_renderer_emit_data_changed () +
+void + +gcr_renderer_register_well_known () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + +
+GckAttributes *attributesRead / Write
+gchar *labelRead / Write
+
+
+

Signals

+
+++++ + + + + + +
voiddata-changedRun Last
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrRenderer
structGcrRendererIface
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GcrRenderer
+
+
+
+

Prerequisites

+

+GcrRenderer requires + GObject.

+
+
+

Known Implementations

+

+GcrRenderer is implemented by + GcrCertificateRenderer and GcrKeyRenderer.

+
+
+

Description

+

A GcrRenderer is an interface that's implemented by renderers which wish +to render data to a GcrViewer.

+

The interaction between GcrRenderer and GcrViewer is not stable yet, and +so new renderers cannot be implemented outside the Gcr library at this time.

+

To lookup a renderer for a given set of attributes, use the gcr_renderer_create() +function. This will create and initialize a renderer that's capable of viewing +the data in those attributes.

+
+
+

Functions

+
+

gcr_renderer_create ()

+
GcrRenderer *
+gcr_renderer_create (const gchar *label,
+                     GckAttributes *attrs);
+

Create and initialize a renderer for the given attributes and label. These +renderers should have been preregistered via gcr_renderer_register().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

label

The label for the renderer.

[allow-none]

attrs

The attributes to render

 
+
+
+

Returns

+

a new renderer, or NULL if no renderer +matched the attributes; the render should be released with g_object_unref().

+

[transfer full][allow-none]

+
+
+
+
+

gcr_renderer_register ()

+
void
+gcr_renderer_register (GType renderer_type,
+                       GckAttributes *attrs);
+

Register a renderer to be created when matching attributes are passed to +gcr_renderer_create().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

renderer_type

The renderer class type

 

attrs

The attributes to match

 
+
+
+
+
+

gcr_renderer_get_attributes ()

+
GckAttributes *
+gcr_renderer_get_attributes (GcrRenderer *self);
+

Get the PKCS#11 attributes, if any, set for this renderer to display.

+
+

Parameters

+
+++++ + + + + + +

self

The renderer

 
+
+
+

Returns

+

the attributes, owned by the renderer.

+

[allow-none][transfer none]

+
+
+
+
+

gcr_renderer_set_attributes ()

+
void
+gcr_renderer_set_attributes (GcrRenderer *self,
+                             GckAttributes *attrs);
+

Set the PKCS#11 attributes for this renderer to display.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The renderer

 

attrs

attributes to set.

[allow-none]
+
+
+
+
+

gcr_renderer_popuplate_popup ()

+
void
+gcr_renderer_popuplate_popup (GcrRenderer *self,
+                              GcrViewer *viewer,
+                              GtkMenu *menu);
+

Called by GcrViewer when about to display a popup menu for the content +displayed by the renderer. The renderer can add a menu item if desired.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

The renderer

 

viewer

The viewer that is displaying a popup

 

menu

The popup menu being displayed

 
+
+
+
+
+

gcr_renderer_render_view ()

+
void
+gcr_renderer_render_view (GcrRenderer *self,
+                          GcrViewer *viewer);
+

Render the contents of the renderer to the given viewer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The renderer

 

viewer

The viewer to render to.

 
+
+
+
+
+

gcr_renderer_emit_data_changed ()

+
void
+gcr_renderer_emit_data_changed (GcrRenderer *self);
+

Emit the “data-changed” signal on the renderer. This is used by +renderer implementations.

+
+

Parameters

+
+++++ + + + + + +

self

The renderer

 
+
+
+
+
+

gcr_renderer_register_well_known ()

+
void
+gcr_renderer_register_well_known (void);
+

Register all the well known renderers for certificates and keys known to the +Gcr library.

+
+
+
+

Types and Values

+
+

GcrRenderer

+
typedef struct _GcrRenderer GcrRenderer;
+

A renderer.

+
+
+
+

struct GcrRendererIface

+
struct GcrRendererIface {
+	GTypeInterface parent;
+
+	/* signals */
+	void (*data_changed) (GcrRenderer *self);
+
+	/* virtual */
+	void (*render_view) (GcrRenderer *self, GcrViewer *viewer);
+
+	void (*populate_popup) (GcrRenderer *self, GcrViewer *viewer, GtkMenu *menu);
+};
+
+

The interface for GcrRenderer

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

GTypeInterface parent;

the parent interface type

 

data_changed ()

signal emitted when data being rendered changes

 

render_view ()

method invoked to render the data into a viewer

 

populate_popup ()

method invoked to populate a popup menu with additional +renderer options

 
+
+
+
+
+

Property Details

+
+

The “attributes” property

+
  “attributes”               GckAttributes *
+

The attributes to display.

+

Flags: Read / Write

+
+
+
+

The “label” property

+
  “label”                    gchar *
+

The label to display.

+

Flags: Read / Write

+

Default value: ""

+
+
+
+

Signal Details

+
+

The “data-changed” signal

+
void
+user_function (GcrRenderer *gcrrenderer,
+               gpointer     user_data)
+

A signal that is emitted by the renderer when it's data +changed and should be rerendered.

+
+

Parameters

+
+++++ + + + + + +

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrSecretExchange.html b/docs/reference/gcr/html/GcrSecretExchange.html new file mode 100644 index 0000000..9a6e771 --- /dev/null +++ b/docs/reference/gcr/html/GcrSecretExchange.html @@ -0,0 +1,387 @@ + + + + +GcrSecretExchange: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrSecretExchange

+

GcrSecretExchange — Exchange secrets between processes in an unexposed way.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrSecretExchange * + +gcr_secret_exchange_new () +
+gchar * + +gcr_secret_exchange_begin () +
+gboolean + +gcr_secret_exchange_receive () +
const gchar * + +gcr_secret_exchange_get_protocol () +
const gchar * + +gcr_secret_exchange_get_secret () +
+gchar * + +gcr_secret_exchange_send () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
structGcrSecretExchange
structGcrSecretExchangeClass
#defineGCR_SECRET_EXCHANGE_PROTOCOL_1
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrSecretExchange
+
+
+
+

Description

+

Allows exchange of secrets between two processes on the same system without +exposing those secrets to things like loggers, non-pageable memory etc.

+

This does not protect against active attacks like MITM attacks.

+

Each side creates a GcrSecretExchange object, and one of the sides calls +gcr_secret_exchange_begin(). This creates a string, which should be passed +to the other side. Each side passes the strings it receives into +gcr_secret_exchange_receive().

+

In order to send a reply (either with or without a secret) use +gcr_secret_exchange_send(). A side must have had gcr_secret_exchange_receive() +successfully called before it can use gcr_secret_exchange_send().

+

The GcrSecretExchange objects can be used for multiple iterations of the +conversation, or for just one request/reply. The only limitation being that +the initial request cannot contain a secret.

+

Caveat: Information about the approximate length (rounded up to the nearest +16 bytes) may be leaked. If this is considered inacceptable, do not use +GcrSecretExchange.

+
+
+

Functions

+
+

gcr_secret_exchange_new ()

+
GcrSecretExchange *
+gcr_secret_exchange_new (const gchar *protocol);
+

Create a new secret exchange object.

+

Specify a protocol of NULL to allow any protocol. This is especially +relevant on the side of the exchange that does not call +gcr_secret_exchange_begin(), that is the originator. Currently the only +protocol supported is GCR_SECRET_EXCHANGE_PROTOCOL_1.

+
+

Parameters

+
+++++ + + + + + +

protocol

the exchange protocol to use.

[allow-none]
+
+
+

Returns

+

A new GcrSecretExchange object.

+

[transfer full]

+
+
+
+
+

gcr_secret_exchange_begin ()

+
gchar *
+gcr_secret_exchange_begin (GcrSecretExchange *self);
+

Begin the secret exchange. The resulting string should be sent to the other +side of the exchange. The other side should use gcr_secret_exchange_receive() +to process the string.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrSecretExchange object

 
+
+
+

Returns

+

A newly allocated string to be sent to the other +side of the secret exchange.

+

[transfer full]

+
+
+
+
+

gcr_secret_exchange_receive ()

+
gboolean
+gcr_secret_exchange_receive (GcrSecretExchange *self,
+                             const gchar *exchange);
+

Receive a string from the other side of secret exchange. This string will +have been created by gcr_secret_exchange_begin() or gcr_secret_exchange_send().

+

After this call completes successfully the value returned from +gcr_secret_exchange_get_secret() will have changed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrSecretExchange object

 

exchange

the string received

 
+
+
+

Returns

+

whether the string was successfully parsed and received

+
+
+
+
+

gcr_secret_exchange_get_protocol ()

+
const gchar *
+gcr_secret_exchange_get_protocol (GcrSecretExchange *self);
+

Will return NULL if no protocol was specified, and either +gcr_secret_exchange_begin() or gcr_secret_exchange_receive() have not been +called successfully.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrSecretExchange object +Get the secret exchange protocol.

 
+
+
+

Returns

+

the protocol or NULL

+
+
+
+
+

gcr_secret_exchange_get_secret ()

+
const gchar *
+gcr_secret_exchange_get_secret (GcrSecretExchange *self,
+                                gsize *secret_len);
+

Returns the last secret received. If no secret has yet been received this +will return NULL. The string is owned by the GcrSecretExchange object +and will be valid until the next time that gcr_secret_exchange_receive() +is called on this object, or the object is destroyed.

+

Depending on the secret passed into the other side of the secret exchange, +the result may be a binary string. It does however have a null terminator, +so if you're certain that it is does not contain arbitrary binary data, +it can be used as a string.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a GcrSecretExchange object

 

secret_len

optionally, a location to store the length of returned secret.

[allow-none]
+
+
+

Returns

+

the last secret received.

+

[transfer none][array length=secret_len]

+
+
+
+
+

gcr_secret_exchange_send ()

+
gchar *
+gcr_secret_exchange_send (GcrSecretExchange *self,
+                          const gchar *secret,
+                          gssize secret_len);
+

Send a reply to the other side of the secret exchange, optionally sending a +secret.

+

gcr_secret_exchange_receive() must have been successfully called at least +once on this object. In other words this object must have received data +from the other side of the secret exchange, before we can send a secret.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a GcrSecretExchange object

 

secret

optionally, a secret to send to the other side.

[allow-none]

secret_len

length of secret +, or -1 if null terminated

 
+
+
+

Returns

+

a newly allocated string to be sent to the other +side of the secret exchange.

+

[transfer full]

+
+
+
+
+

Types and Values

+
+

struct GcrSecretExchange

+
struct GcrSecretExchange;
+

An object representing one side of a secret exchange.

+
+
+
+

struct GcrSecretExchangeClass

+
struct GcrSecretExchangeClass {
+};
+
+

The class for GcrSecretExchange

+
+
+
+

GCR_SECRET_EXCHANGE_PROTOCOL_1

+
#define GCR_SECRET_EXCHANGE_PROTOCOL_1 "sx-aes-1"
+
+

The current secret exchange protocol. Key agreement is done using DH with the +1536 bit IKE parameter group. Keys are derived using SHA256 with HKDF. The +transport encryption is done with 128 bit AES.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrSecureEntryBuffer.html b/docs/reference/gcr/html/GcrSecureEntryBuffer.html new file mode 100644 index 0000000..1d5e77d --- /dev/null +++ b/docs/reference/gcr/html/GcrSecureEntryBuffer.html @@ -0,0 +1,136 @@ + + + + +GcrSecureEntryBuffer: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrSecureEntryBuffer

+

GcrSecureEntryBuffer — a GtkEntryBuffer that uses non-pageable memory

+
+
+

Functions

+
++++ + + + + +
+GtkEntryBuffer * + +gcr_secure_entry_buffer_new () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrSecureEntryBuffer
structGcrSecureEntryBufferClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GtkEntryBuffer
+        ╰── GcrSecureEntryBuffer
+
+
+
+

Description

+

It's good practice to try to keep passwords or sensitive secrets out of +pageable memory whenever possible, so that they don't get written to disk.

+

This is a GtkEntryBuffer to be used with GtkEntry which uses non-pageable +memory to store a password placed in the entry. In order to make any sense +at all, the entry must have it's visibility turned off, and just be displaying +place holder characters for the text. That is, a password style entry.

+

Use gtk_entry_new_with_buffer() or gtk_entry_set_buffer() to set this buffer +on an entry.

+
+
+

Functions

+
+

gcr_secure_entry_buffer_new ()

+
GtkEntryBuffer *
+gcr_secure_entry_buffer_new (void);
+

Create a new GcrSecureEntryBuffer, a GtkEntryBuffer which uses +non-pageable memory for the text.

+
+

Returns

+

the new entry buffer.

+

[transfer full]

+
+
+
+
+

Types and Values

+
+

struct GcrSecureEntryBuffer

+
struct GcrSecureEntryBuffer;
+

A GtkEntryBuffer which uses non-pageable memory for passwords or secrets.

+
+
+
+

struct GcrSecureEntryBufferClass

+
struct GcrSecureEntryBufferClass {
+	GtkEntryBufferClass parent_class;
+};
+
+

The class for GcrSecureEntryBuffer.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrSimpleCertificate.html b/docs/reference/gcr/html/GcrSimpleCertificate.html new file mode 100644 index 0000000..47606d9 --- /dev/null +++ b/docs/reference/gcr/html/GcrSimpleCertificate.html @@ -0,0 +1,214 @@ + + + + +GcrSimpleCertificate: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrSimpleCertificate

+

GcrSimpleCertificate — A certificate loaded from a memory buffer

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrSimpleCertificate
structGcrSimpleCertificateClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrSimpleCertificate
+
+
+
+

Implemented Interfaces

+

+GcrSimpleCertificate implements + GcrComparable and GcrCertificate.

+
+
+

Description

+

An implementation of GcrCertificate which loads a certificate from DER +data already located in memory.

+

To create a GcrSimpleCertificate object use the +gcr_simple_certificate_new() or gcr_simple_certificate_new_static() +functions.

+
+
+

Functions

+
+

gcr_simple_certificate_new ()

+
GcrCertificate *
+gcr_simple_certificate_new (const guchar *data,
+                            gsize n_data);
+

Create a new GcrSimpleCertificate for the raw DER data. The data + memory is +copied so you can dispose of it after this function returns.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

data

the raw DER certificate data.

[array length=n_data]

n_data

The length of data +

 
+
+
+

Returns

+

a new GcrSimpleCertificate.

+

[transfer full][type Gcr.SimpleCertificate]

+
+
+
+
+

gcr_simple_certificate_new_static ()

+
GcrCertificate *
+gcr_simple_certificate_new_static (const guchar *data,
+                                   gsize n_data);
+

Create a new GcrSimpleCertificate for the raw DER data. The data + memory is +not copied and must persist until the GcrSimpleCertificate object is +destroyed.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

data

The raw DER certificate data.

[array length=n_data]

n_data

The length of data +

 
+
+
+

Returns

+

a new GcrSimpleCertificate.

+

[transfer full][type Gcr.SimpleCertificate]

+
+
+
+
+

Types and Values

+
+

struct GcrSimpleCertificate

+
struct GcrSimpleCertificate;
+

A GcrCertificate which represents a certificate already in memory.

+
+
+
+

struct GcrSimpleCertificateClass

+
struct GcrSimpleCertificateClass {
+	GObjectClass parent_class;
+};
+
+

The class for GcrSimpleCertificate.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrSimpleCollection.html b/docs/reference/gcr/html/GcrSimpleCollection.html new file mode 100644 index 0000000..0a89006 --- /dev/null +++ b/docs/reference/gcr/html/GcrSimpleCollection.html @@ -0,0 +1,215 @@ + + + + +GcrSimpleCollection: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrSimpleCollection

+

GcrSimpleCollection — A simple implementation of GcrCollection

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+GcrCollection * + +gcr_simple_collection_new () +
+void + +gcr_simple_collection_add () +
+void + +gcr_simple_collection_remove () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrSimpleCollection
structGcrSimpleCollectionClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrSimpleCollection
+
+
+
+

Implemented Interfaces

+

+GcrSimpleCollection implements + GcrCollection.

+
+
+

Description

+

A simple implementation of GcrCollection, which you can add and remove +objects from. Use gcr_simple_collection_add() to do this +gcr_simple_collection_remove().

+
+
+

Functions

+
+

gcr_simple_collection_new ()

+
GcrCollection *
+gcr_simple_collection_new (void);
+

Create a new GcrSimpleCollection.

+
+

Returns

+

a newly allocated +collection, which should be freed with g_object_unref().

+

[transfer full][type Gcr.SimpleCollection]

+
+
+
+
+

gcr_simple_collection_add ()

+
void
+gcr_simple_collection_add (GcrSimpleCollection *self,
+                           GObject *object);
+

Add an object to this collection

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The collection

 

object

The object to add

 
+
+
+
+
+

gcr_simple_collection_remove ()

+
void
+gcr_simple_collection_remove (GcrSimpleCollection *self,
+                              GObject *object);
+

Remove an object from the collection.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The collection

 

object

The object to remove from the collection

 
+
+
+
+
+

Types and Values

+
+

struct GcrSimpleCollection

+
struct GcrSimpleCollection;
+

A simple implementation of GcrCollection.

+
+
+
+

struct GcrSimpleCollectionClass

+
struct GcrSimpleCollectionClass {
+	GObjectClass parent_class;
+};
+
+

The class for GcrSimpleCollection.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrSystemPrompt.html b/docs/reference/gcr/html/GcrSystemPrompt.html new file mode 100644 index 0000000..d6f8ca9 --- /dev/null +++ b/docs/reference/gcr/html/GcrSystemPrompt.html @@ -0,0 +1,711 @@ + + + + +GcrSystemPrompt: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrSystemPrompt

+

GcrSystemPrompt — a system modal prompt

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrPrompt * + +gcr_system_prompt_open () +
+void + +gcr_system_prompt_open_async () +
+GcrPrompt * + +gcr_system_prompt_open_finish () +
+GcrPrompt * + +gcr_system_prompt_open_for_prompter () +
+void + +gcr_system_prompt_open_for_prompter_async () +
+GcrSecretExchange * + +gcr_system_prompt_get_secret_exchange () +
+gboolean + +gcr_system_prompt_close () +
+void + +gcr_system_prompt_close_async () +
+gboolean + +gcr_system_prompt_close_finish () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + +
+gchar *bus-nameRead / Write / Construct Only
+GcrSecretExchange *secret-exchangeRead / Write
ginttimeout-secondsWrite / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + +
structGcrSystemPrompt
structGcrSystemPromptClass
#defineGCR_SYSTEM_PROMPT_ERROR
enumGcrSystemPromptError
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrSystemPrompt
+
+
+
+

Implemented Interfaces

+

+GcrSystemPrompt implements + GcrPrompt, GInitable and GAsyncInitable.

+
+
+

Description

+

A GcrPrompt implementation which calls to the system prompter to +display prompts in a system modal fashion.

+

Since the system prompter usually only displays one prompt at a time, you +may have to wait for the prompt to be displayed. Use gcr_system_prompt_open() +or a related function to open a prompt. Since this can take a long time, you +should always check that the prompt is still needed after it is opened. A +previous prompt may have already provided the information needed and you +may no longer need to prompt.

+

Use gcr_system_prompt_close() to close the prompt when you're done with it.

+
+
+

Functions

+
+

gcr_system_prompt_open ()

+
GcrPrompt *
+gcr_system_prompt_open (gint timeout_seconds,
+                        GCancellable *cancellable,
+                        GError **error);
+

Opens a system prompt with the default prompter.

+

Most system prompters only allow showing one prompt at a time, and if +another prompt is shown then this method will block for up to +timeout_seconds + seconds. If timeout_seconds + is equal to -1, then this +will block indefinitely until the prompt can be opened. If timeout_seconds + +expires, then this function will fail with a GCR_SYSTEM_PROMPT_IN_PROGRESS +error.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

timeout_seconds

the number of seconds to wait to access the prompt, or -1

 

cancellable

optional cancellation object

 

error

location to place error on failure

 
+
+
+

Returns

+

the prompt, or NULL if +prompt could not be opened.

+

[transfer full][type Gcr.SystemPrompt]

+
+
+
+
+

gcr_system_prompt_open_async ()

+
void
+gcr_system_prompt_open_async (gint timeout_seconds,
+                              GCancellable *cancellable,
+                              GAsyncReadyCallback callback,
+                              gpointer user_data);
+

Asynchronously open a system prompt with the default system prompter.

+

Most system prompters only allow showing one prompt at a time, and if +another prompt is shown then this method will block for up to +timeout_seconds + seconds. If timeout_seconds + is equal to -1, then this +will block indefinitely until the prompt can be opened. If timeout_seconds + +expires, then this operation will fail with a GCR_SYSTEM_PROMPT_IN_PROGRESS +error.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

timeout_seconds

the number of seconds to wait to access the prompt, or -1

 

cancellable

optional cancellation object

 

callback

called when the operation completes

 

user_data

data to pass the callback

 
+
+
+
+
+

gcr_system_prompt_open_finish ()

+
GcrPrompt *
+gcr_system_prompt_open_finish (GAsyncResult *result,
+                               GError **error);
+

Complete an operation to asynchronously open a system prompt.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the asynchronous result

 

error

location to place an error on failure

 
+
+
+

Returns

+

the prompt, or NULL if +prompt could not be opened.

+

[transfer full][type Gcr.SystemPrompt]

+
+
+
+
+

gcr_system_prompt_open_for_prompter ()

+
GcrPrompt *
+gcr_system_prompt_open_for_prompter (const gchar *prompter_name,
+                                     gint timeout_seconds,
+                                     GCancellable *cancellable,
+                                     GError **error);
+

Opens a system prompt. If prompter_name is NULL, then the default +system prompter is used.

+

Most system prompters only allow showing one prompt at a time, and if +another prompt is shown then this method will block for up to +timeout_seconds + seconds. If timeout_seconds + is equal to -1, then this +will block indefinitely until the prompt can be opened. If timeout_seconds + +expires, then this function will fail with a GCR_SYSTEM_PROMPT_IN_PROGRESS +error.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

prompter_name

the prompter dbus name.

[allow-none]

timeout_seconds

the number of seconds to wait to access the prompt, or -1

 

cancellable

optional cancellation object

 

error

location to place error on failure

 
+
+
+

Returns

+

the prompt, or NULL if +prompt could not be opened.

+

[transfer full][type Gcr.SystemPrompt]

+
+
+
+
+

gcr_system_prompt_open_for_prompter_async ()

+
void
+gcr_system_prompt_open_for_prompter_async
+                               (const gchar *prompter_name,
+                                gint timeout_seconds,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Opens a system prompt asynchronously. If prompter_name is NULL, then the +default system prompter is used.

+

Most system prompters only allow showing one prompt at a time, and if +another prompt is shown then this method will block for up to +timeout_seconds + seconds. If timeout_seconds + is equal to -1, then this +will block indefinitely until the prompt can be opened. If timeout_seconds + +expires, then this operation will fail with a GCR_SYSTEM_PROMPT_IN_PROGRESS +error.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

prompter_name

the prompter dbus name.

[allow-none]

timeout_seconds

the number of seconds to wait to access the prompt, or -1

 

cancellable

optional cancellation object

 

callback

called when the operation completes

 

user_data

data to pass the callback

 
+
+
+
+
+

gcr_system_prompt_get_secret_exchange ()

+
GcrSecretExchange *
+gcr_system_prompt_get_secret_exchange (GcrSystemPrompt *self);
+

Get the current GcrSecretExchange used to transfer secrets in this prompt.

+
+

Parameters

+
+++++ + + + + + +

self

a prompter

 
+
+
+

Returns

+

the secret exchange.

+

[transfer none]

+
+
+
+
+

gcr_system_prompt_close ()

+
gboolean
+gcr_system_prompt_close (GcrSystemPrompt *self,
+                         GCancellable *cancellable,
+                         GError **error);
+

Close this prompt. After calling this function, no further prompts will +succeed on this object. The prompt object is not unreferenced by this +function, and you must unreference it once done.

+

This call may block, use the gcr_system_prompt_close_async() to perform +this action indefinitely.

+

Whether or not this function returns TRUE, the system prompt object is +still closed and may not be further used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the prompt

 

cancellable

an optional cancellation object

 

error

location to place an error on failure

 
+
+
+

Returns

+

whether close was cleanly completed

+
+
+
+
+

gcr_system_prompt_close_async ()

+
void
+gcr_system_prompt_close_async (GcrSystemPrompt *self,
+                               GCancellable *cancellable,
+                               GAsyncReadyCallback callback,
+                               gpointer user_data);
+

Close this prompt asynchronously. After calling this function, no further +methods may be called on this object. The prompt object is not unreferenced +by this function, and you must unreference it once done.

+

This call returns immediately and completes asynchronously.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

the prompt

 

cancellable

an optional cancellation object

 

callback

called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gcr_system_prompt_close_finish ()

+
gboolean
+gcr_system_prompt_close_finish (GcrSystemPrompt *self,
+                                GAsyncResult *result,
+                                GError **error);
+

Complete operation to close this prompt.

+

Whether or not this function returns TRUE, the system prompt object is +still closed and may not be further used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

the prompt

 

result

asynchronous operation result

 

error

location to place an error on failure

 
+
+
+

Returns

+

whether close was cleanly completed

+
+
+
+
+

Types and Values

+
+

struct GcrSystemPrompt

+
struct GcrSystemPrompt;
+

A GcrPrompt which shows a system prompt. This is usually a system modal +dialog.

+
+
+
+

struct GcrSystemPromptClass

+
struct GcrSystemPromptClass {
+	GObjectClass parent_class;
+};
+
+

The class for GcrSystemPrompt.

+
+

Members

+
+++++ + +
+
+
+
+
+

GCR_SYSTEM_PROMPT_ERROR

+
#define GCR_SYSTEM_PROMPT_ERROR              (gcr_system_prompt_error_get_domain ())
+
+

The domain for errors returned from GcrSystemPrompt methods.

+
+
+
+

enum GcrSystemPromptError

+

No error returned by the GcrSystemPrompt is suitable for display or +to the user.

+

If the system prompter can only show one prompt at a time, and there is +already a prompt being displayed, and the timeout waiting to open the +prompt expires, then GCR_SYSTEM_PROMPT_IN_PROGRESS is returned.

+
+

Members

+
+++++ + + + + + +

GCR_SYSTEM_PROMPT_IN_PROGRESS

+

another prompt is already in progress

+
 
+
+
+
+
+

Property Details

+
+

The “bus-name” property

+
  “bus-name”                 gchar *
+

The DBus bus name of the prompter to use for prompting, or NULL +for the default prompter.

+

Flags: Read / Write / Construct Only

+

Default value: NULL

+
+
+
+

The “secret-exchange” property

+
  “secret-exchange”          GcrSecretExchange *
+

The GcrSecretExchange to use when transferring passwords. A default +secret exchange will be used if this is not set.

+

Flags: Read / Write

+
+
+
+

The “timeout-seconds” property

+
  “timeout-seconds”          gint
+

The timeout in seconds to wait when opening the prompt.

+

Flags: Write / Construct Only

+

Allowed values: >= -1

+

Default value: -1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrSystemPrompter.html b/docs/reference/gcr/html/GcrSystemPrompter.html new file mode 100644 index 0000000..5ee78c9 --- /dev/null +++ b/docs/reference/gcr/html/GcrSystemPrompter.html @@ -0,0 +1,505 @@ + + + + +GcrSystemPrompter: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrSystemPrompter

+

GcrSystemPrompter — a prompter which displays system prompts

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrSystemPrompter * + +gcr_system_prompter_new () +
+void + +gcr_system_prompter_register () +
+void + +gcr_system_prompter_unregister () +
+GcrSystemPrompterMode + +gcr_system_prompter_get_mode () +
+GType + +gcr_system_prompter_get_prompt_type () +
+gboolean + +gcr_system_prompter_get_prompting () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + + + + + + +
GcrSystemPrompterModemodeRead / Write / Construct Only
+GType *prompt-typeRead / Write / Construct Only
gbooleanpromptingRead
+
+
+

Signals

+
+++++ + + + + + +
+GcrPrompt*new-promptRun Last
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
structGcrSystemPrompter
structGcrSystemPrompterClass
enumGcrSystemPrompterMode
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GcrSystemPrompter
+
+
+
+

Description

+

This is a DBus service which is rarely implemented. Use GcrSystemPrompt +to display system prompts.

+

The GcrSystemPrompter service responds to dbus requests to create system +prompts and creates GcrPrompt type objects to display those prompts.

+

Pass the GType of the implementation of GcrPrompt to gcr_system_prompter_new().

+
+
+

Functions

+
+

gcr_system_prompter_new ()

+
GcrSystemPrompter *
+gcr_system_prompter_new (GcrSystemPrompterMode mode,
+                         GType prompt_type);
+

Create a new system prompter service. This prompter won't do anything unless +you connect to its signals and show appropriate prompts.

+

If prompt_type + is zero, then the new-prompt signal must be handled and +return a valid prompt object implementing the GcrPrompt interface.

+

If prompt_type + is non-zero then the GType must implement the GcrPrompt +interface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mode

the mode for the prompt

 

prompt_type

the gobject type for prompts created by this prompter

 
+
+
+

Returns

+

a new prompter service.

+

[transfer full]

+
+
+
+
+

gcr_system_prompter_register ()

+
void
+gcr_system_prompter_register (GcrSystemPrompter *self,
+                              GDBusConnection *connection);
+

Register this system prompter on the DBus connection +.

+

This makes the prompter available for clients to call. The prompter will +remain registered until gcr_system_prompter_unregister() is called, or the +prompter is unreferenced.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the system prompter

 

connection

a DBus connection

 
+
+
+
+
+

gcr_system_prompter_unregister ()

+
void
+gcr_system_prompter_unregister (GcrSystemPrompter *self,
+                                gboolean wait);
+

Unregister this system prompter on the DBus connection +.

+

The prompter must have previously been registered with gcr_system_prompter_register().

+

If wait + is set then this function will wait until all prompts have been closed +or cancelled. This is usually only used by tests.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the system prompter

 

wait

whether to wait for closing prompts

 
+
+
+
+
+

gcr_system_prompter_get_mode ()

+
GcrSystemPrompterMode
+gcr_system_prompter_get_mode (GcrSystemPrompter *self);
+

Get the mode for this prompter.

+

Most system prompters only display one prompt at a time and therefore +return GCR_SYSTEM_PROMPTER_SINGLE.

+
+

Parameters

+
+++++ + + + + + +

self

the prompter

 
+
+
+

Returns

+

the prompter mode

+
+
+
+
+

gcr_system_prompter_get_prompt_type ()

+
GType
+gcr_system_prompter_get_prompt_type (GcrSystemPrompter *self);
+

Get the GType for prompts created by this prompter.

+

The returned GType will be a GcrPrompt implementation.

+
+

Parameters

+
+++++ + + + + + +

self

the prompter

 
+
+
+

Returns

+

the prompt GType

+
+
+
+
+

gcr_system_prompter_get_prompting ()

+
gboolean
+gcr_system_prompter_get_prompting (GcrSystemPrompter *self);
+

Get whether prompting or not.

+
+

Parameters

+
+++++ + + + + + +

self

the prompter

 
+
+
+

Returns

+

whether prompting or not

+
+
+
+
+

Types and Values

+
+

struct GcrSystemPrompter

+
struct GcrSystemPrompter;
+

A prompter used by implementations of system prompts.

+
+
+
+

struct GcrSystemPrompterClass

+
struct GcrSystemPrompterClass {
+	GObjectClass parent_class;
+
+	/* signals */
+
+	GcrPrompt *    (* new_prompt)     (GcrSystemPrompter *self);
+};
+
+

The class for GcrSystemPrompter.

+
+

Members

+
+++++ + + + + + +

new_prompt ()

default handler for the “new-prompt” signal

 
+
+
+
+
+

enum GcrSystemPrompterMode

+

The mode for the system prompter. Most system prompters can only show +one prompt at a time and would use the GCR_SYSTEM_PROMPTER_SINGLE mode.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GCR_SYSTEM_PROMPTER_SINGLE

+

only one prompt shown at a time

+
 

GCR_SYSTEM_PROMPTER_MULTIPLE

+

more than one prompt shown at a time

+
 
+
+
+
+
+

Property Details

+
+

The “mode” property

+
  “mode”                     GcrSystemPrompterMode
+

The mode for this prompter.

+

Most system prompters only display one prompt at a time and therefore +return GCR_SYSTEM_PROMPTER_SINGLE.

+

Flags: Read / Write / Construct Only

+

Default value: GCR_SYSTEM_PROMPTER_SINGLE

+
+
+
+

The “prompt-type” property

+
  “prompt-type”              GType *
+

The GType for prompts created by this prompter. This must be a +GcrPrompt implementation.

+

Flags: Read / Write / Construct Only

+

Allowed values: GcrPrompt

+
+
+
+

The “prompting” property

+
  “prompting”                gboolean
+

Whether the prompter is prompting or not.

+

Flags: Read

+

Default value: FALSE

+
+
+
+

Signal Details

+
+

The “new-prompt” signal

+
GcrPrompt*
+user_function (GcrSystemPrompter *Returns,
+               gpointer           user_data)
+

Signal emitted to create a new prompt when needed.

+

The default implementation of this signal creates a prompt of the type +gcr_system_prompter_get_prompt_type().

+
+

Parameters

+
+++++ + + + + + +

user_data

user data set when the signal handler was connected.

 
+
+
+

Returns

+

the new prompt.

+

[transfer full]

+
+

Flags: Run Last

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrTreeSelector.html b/docs/reference/gcr/html/GcrTreeSelector.html new file mode 100644 index 0000000..57768b1 --- /dev/null +++ b/docs/reference/gcr/html/GcrTreeSelector.html @@ -0,0 +1,338 @@ + + + + +GcrTreeSelector: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrTreeSelector

+

GcrTreeSelector — A selector widget to select certificates or keys.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+GcrCollection * + +gcr_tree_selector_get_collection () +
const GcrColumn * + +gcr_tree_selector_get_columns () +
+GcrTreeSelector * + +gcr_tree_selector_new () +
+GList * + +gcr_tree_selector_get_selected () +
+void + +gcr_tree_selector_set_selected () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + +
+GcrCollection *collectionRead / Write / Construct Only
gpointercolumnsRead / Write / Construct Only
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGcrTreeSelector
structGcrTreeSelectorClass
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GInitiallyUnowned
+        ╰── GtkWidget
+            ╰── GtkContainer
+                ╰── GtkTreeView
+                    ╰── GcrTreeSelector
+
+
+
+

Implemented Interfaces

+

+GcrTreeSelector implements + AtkImplementorIface, GtkBuildable and GtkScrollable.

+
+
+

Description

+

The GcrTreeSelector can be used to select certificates or keys. It allows +the user to select multiple objects from a tree.

+
+
+

Functions

+
+

gcr_tree_selector_get_collection ()

+
GcrCollection *
+gcr_tree_selector_get_collection (GcrTreeSelector *self);
+

Get the collection that this selector is displaying objects from.

+
+

Parameters

+
+++++ + + + + + +

self

The selector

 
+
+
+

Returns

+

the collection, owned by the selector.

+

[transfer none]

+
+
+
+
+

gcr_tree_selector_get_columns ()

+
const GcrColumn *
+gcr_tree_selector_get_columns (GcrTreeSelector *self);
+

Get the columns displayed in a selector in multiple mode.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

self

The selector

 
+
+
+

Returns

+

The columns, owned by the selector.

+

[transfer none]

+
+
+
+
+

gcr_tree_selector_new ()

+
GcrTreeSelector *
+gcr_tree_selector_new (GcrCollection *collection,
+                       const GcrColumn *columns);
+

Create a new GcrTreeSelector.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

collection

The collection that contains the objects to display

 

columns

The columns to use to display the objects

 
+
+
+

Returns

+

a newly allocated selector, which should be +released with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_tree_selector_get_selected ()

+
GList *
+gcr_tree_selector_get_selected (GcrTreeSelector *self);
+

Get a list of selected objects.

+
+

Parameters

+
+++++ + + + + + +

self

The selector

 
+
+
+

Returns

+

the list of selected +objects, to be released with g_list_free().

+

[transfer container][element-type GObject.Object]

+
+
+
+
+

gcr_tree_selector_set_selected ()

+
void
+gcr_tree_selector_set_selected (GcrTreeSelector *self,
+                                GList *selected);
+

Select certain objects in the selector.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

The selector

 

selected

the list of objects to select.

[element-type GObject.Object]
+
+
+
+
+

Types and Values

+
+

struct GcrTreeSelector

+
struct GcrTreeSelector;
+

A tree selector widget.

+
+
+
+

struct GcrTreeSelectorClass

+
struct GcrTreeSelectorClass {
+};
+
+

The class for GcrTreeSelector.

+
+
+
+

Property Details

+
+

The “collection” property

+
  “collection”               GcrCollection *
+

The collection which contains the objects to display in the selector.

+

Flags: Read / Write / Construct Only

+
+
+
+

The “columns” property

+
  “columns”                  gpointer
+

The columns to use to display the objects.

+

Flags: Read / Write / Construct Only

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrViewer.html b/docs/reference/gcr/html/GcrViewer.html new file mode 100644 index 0000000..2c8ab50 --- /dev/null +++ b/docs/reference/gcr/html/GcrViewer.html @@ -0,0 +1,408 @@ + + + + +GcrViewer: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrViewer

+

GcrViewer — A viewer which can hold renderers

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrViewer * + +gcr_viewer_new () +
+GcrViewer * + +gcr_viewer_new_scrolled () +
+void + +gcr_viewer_add_renderer () +
+void + +gcr_viewer_insert_renderer () +
+void + +gcr_viewer_remove_renderer () +
+guint + +gcr_viewer_count_renderers () +
+GcrRenderer * + +gcr_viewer_get_renderer () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrViewer
structGcrViewerIface
+
+
+

Object Hierarchy

+
    GInterface
+    ╰── GcrViewer
+
+
+
+

Prerequisites

+

+GcrViewer requires + GtkWidget.

+
+
+

Description

+

A GcrViewer is an abstract interface that represents a widget that can hold +various renderers and display their contents.

+

The interaction between GcrRenderer and GcrViewer is not stable yet, and +so viewers cannot be implemented outside the Gcr library at this time.

+

Use the gcr_viewer_new() and gcr_viewer_new_scrolled() to get default +implementations of viewers.

+
+
+

Functions

+
+

gcr_viewer_new ()

+
GcrViewer *
+gcr_viewer_new (void);
+

Get an implementation of GcrViewer that supports a view +of multiple renderers.

+
+

Returns

+

a newly allocated GcrViewer, which should be +released with g_object_unref().

+

[transfer full]

+
+
+
+
+

gcr_viewer_new_scrolled ()

+
GcrViewer *
+gcr_viewer_new_scrolled (void);
+

Get an implementation of GcrViewer that supports a scrolled view +of multiple renderers.

+
+

Returns

+

a GcrViewer which is also a GtkWidget.

+

[transfer floating]

+
+
+
+
+

gcr_viewer_add_renderer ()

+
void
+gcr_viewer_add_renderer (GcrViewer *viewer,
+                         GcrRenderer *renderer);
+

Add a renderer to this viewer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

viewer

The viewer

 

renderer

The renderer to add

 
+
+
+
+
+

gcr_viewer_insert_renderer ()

+
void
+gcr_viewer_insert_renderer (GcrViewer *viewer,
+                            GcrRenderer *renderer,
+                            GcrRenderer *before);
+

Insert a renderer at a specific point in the viewer

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

viewer

the viewer

 

renderer

the renderer to insert

 

before

the renderer to insert before.

[allow-none]
+
+
+
+
+

gcr_viewer_remove_renderer ()

+
void
+gcr_viewer_remove_renderer (GcrViewer *viewer,
+                            GcrRenderer *renderer);
+

Remove a renderer from this viewer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

viewer

The viewer

 

renderer

The renderer to remove

 
+
+
+
+
+

gcr_viewer_count_renderers ()

+
guint
+gcr_viewer_count_renderers (GcrViewer *viewer);
+

Get the number of renderers present in the viewer.

+
+

Parameters

+
+++++ + + + + + +

viewer

The viewer

 
+
+
+

Returns

+

The number of renderers.

+
+
+
+
+

gcr_viewer_get_renderer ()

+
GcrRenderer *
+gcr_viewer_get_renderer (GcrViewer *viewer,
+                         guint index_);
+

Get a pointer to the renderer at the given index. It is an error to request +an index that is out of bounds.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

viewer

The viewer

 

index_

The index of the renderer to get

 
+
+
+

Returns

+

the render, owned by the viewer.

+

[transfer none]

+
+
+
+
+

Types and Values

+
+

GcrViewer

+
typedef struct _GcrViewer GcrViewer;
+

An abstract viewer which displays renderers contents.

+
+
+
+

struct GcrViewerIface

+
struct GcrViewerIface {
+	GTypeInterface parent;
+
+	void (*add_renderer) (GcrViewer *viewer,
+	                      GcrRenderer *renderer);
+
+	void (*insert_renderer) (GcrViewer *viewer,
+	                         GcrRenderer *renderer,
+	                         GcrRenderer *before);
+
+	void (*remove_renderer) (GcrViewer *viewer,
+	                         GcrRenderer *renderer);
+
+	guint (*count_renderers) (GcrViewer *viewer);
+
+	GcrRenderer* (*get_renderer) (GcrViewer *viewer,
+	                              guint index_);
+};
+
+

The interface for GcrViewer

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GTypeInterface parent;

The parent interface

 

add_renderer ()

Virtual method to add a renderer

 

insert_renderer ()

Virtual method to insert a renderer

 

remove_renderer ()

Virtual method to remove a renderer

 

count_renderers ()

Virtual method to count renderers

 

get_renderer ()

Virtual method to get a renderer

 
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/GcrViewerWidget.html b/docs/reference/gcr/html/GcrViewerWidget.html new file mode 100644 index 0000000..939006d --- /dev/null +++ b/docs/reference/gcr/html/GcrViewerWidget.html @@ -0,0 +1,582 @@ + + + + +GcrViewerWidget: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrViewerWidget

+

GcrViewerWidget — A widget which shows certificates or keys

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GcrViewerWidget * + +gcr_viewer_widget_new () +
+void + +gcr_viewer_widget_load_bytes () +
+void + +gcr_viewer_widget_load_data () +
+void + +gcr_viewer_widget_load_file () +
+GcrParser * + +gcr_viewer_widget_get_parser () +
+GcrViewer * + +gcr_viewer_widget_get_viewer () +
+void + +gcr_viewer_widget_show_error () +
+void + +gcr_viewer_widget_clear_error () +
const gchar * + +gcr_viewer_widget_get_display_name () +
+void + +gcr_viewer_widget_set_display_name () +
+
+
+

Properties

+
+++++ + + + + + + + + + + + + +
+gchar *display-nameRead / Write
+GcrParser *parserRead
+
+
+

Signals

+
+++++ + + + + + +
voidaddedRun Last
+
+
+

Types and Values

+
++++ + + + + +
 GcrViewerWidget
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GInitiallyUnowned
+        ╰── GtkWidget
+            ╰── GtkContainer
+                ╰── GtkBox
+                    ╰── GcrViewerWidget
+
+
+
+

Implemented Interfaces

+

+GcrViewerWidget implements + AtkImplementorIface, GtkBuildable and GtkOrientable.

+
+
+

Description

+

A viewer widget which can display certificates and keys that are +located in files.

+
+
+

Functions

+
+

gcr_viewer_widget_new ()

+
GcrViewerWidget *
+gcr_viewer_widget_new (void);
+

Create a new viewer widget.

+
+

Returns

+

A new GcrViewerWidget object.

+

[transfer full]

+
+
+
+
+

gcr_viewer_widget_load_bytes ()

+
void
+gcr_viewer_widget_load_bytes (GcrViewerWidget *self,
+                              const gchar *display_name,
+                              GBytes *data);
+

Parse and load some data to be displayed into the viewer widgets. The data +may contain multiple parseable items if the format can contain multiple +items.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a viewer widget

 

display_name

label for the loaded data.

[allow-none]

data

data to load

 
+
+
+
+
+

gcr_viewer_widget_load_data ()

+
void
+gcr_viewer_widget_load_data (GcrViewerWidget *self,
+                             const gchar *display_name,
+                             const guchar *data,
+                             gsize n_data);
+

Parse and load some data to be displayed into the viewer widgets. The data +may contain multiple parseable items if the format can contain multiple +items.

+

This function will copy the data. Use gcr_viewer_widget_load_bytes() to avoid +copying the data.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

a viewer widget

 

display_name

label for the loaded data.

[allow-none]

data

data to load.

[array length=n_data]

n_data

length of data to load

 
+
+
+
+
+

gcr_viewer_widget_load_file ()

+
void
+gcr_viewer_widget_load_file (GcrViewerWidget *self,
+                             GFile *file);
+

Display contents of a file in the viewer widget. Multiple files can +be loaded.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a viewer widget

 

file

a file to load

 
+
+
+
+
+

gcr_viewer_widget_get_parser ()

+
GcrParser *
+gcr_viewer_widget_get_parser (GcrViewerWidget *self);
+

Get the parser used to parse loaded data into viewable items.

+
+

Parameters

+
+++++ + + + + + +

self

a viewer widget

 
+
+
+

Returns

+

the parser.

+

[transfer none]

+
+
+
+
+

gcr_viewer_widget_get_viewer ()

+
GcrViewer *
+gcr_viewer_widget_get_viewer (GcrViewerWidget *self);
+

Get the viewer used to display the viewable items.

+
+

Parameters

+
+++++ + + + + + +

self

a viewer widget

 
+
+
+

Returns

+

the viewer.

+

[transfer none]

+
+
+
+
+

gcr_viewer_widget_show_error ()

+
void
+gcr_viewer_widget_show_error (GcrViewerWidget *self,
+                              const gchar *message,
+                              GError *error);
+

Show an error on the viewer widget. This is displayed on a info bar near +the edge of the widget.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a viewer widget

 

message

descriptive error message

 

error

detailed error.

[allow-none]
+
+
+
+
+

gcr_viewer_widget_clear_error ()

+
void
+gcr_viewer_widget_clear_error (GcrViewerWidget *self);
+

Clear the error displayed on the viewer widget.

+
+

Parameters

+
+++++ + + + + + +

self

a viewer widget

 
+
+
+
+
+

gcr_viewer_widget_get_display_name ()

+
const gchar *
+gcr_viewer_widget_get_display_name (GcrViewerWidget *self);
+

Get the display name for data being displayed. This is automatically +calculated from a loaded file, or can be explicitly set.

+

Used as a hint when displaying a title for the data, but may be +overridden by the parsed data.

+
+

Parameters

+
+++++ + + + + + +

self

a viewer widget

 
+
+
+

Returns

+

the display name

+
+
+
+
+

gcr_viewer_widget_set_display_name ()

+
void
+gcr_viewer_widget_set_display_name (GcrViewerWidget *self,
+                                    const gchar *display_name);
+

Set the display name for data being displayed. Once explicitly +set it will no longer be calculated automatically by loading data.

+

Used as a hint when displaying a title for the data, but may be +overridden by the parsed data.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

a viewer widget

 

display_name

the display name

 
+
+
+
+
+

Types and Values

+
+

GcrViewerWidget

+
typedef struct _GcrViewerWidget GcrViewerWidget;
+

A viewer widget object.

+
+
+
+

Property Details

+
+

The “display-name” property

+
  “display-name”             gchar *
+

Display name for data being displayed. This is automatically +calculated from a loaded file, or can be explicitly set.

+

Used as a hint when displaying a title for the data, but may be +overridden by the parsed data.

+

Flags: Read / Write

+

Default value: NULL

+
+
+
+

The “parser” property

+
  “parser”                   GcrParser *
+

The parser used to parse loaded data into viewable items.

+

Flags: Read

+
+
+
+

Signal Details

+
+

The “added” signal

+
void
+user_function (GcrViewerWidget *self,
+               GObject         *renderer,
+               GcrParsed       *parsed,
+               gpointer         user_data)
+

This signal is emitted when an item is added to the viewer widget.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

the viewer widget

 

renderer

the renderer that was added.

[type GcrUi.Renderer]

parsed

the parsed item that was added.

[type Gcr.Parsed]

user_data

user data set when the signal handler was connected.

 
+
+

Flags: Run Last

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/annotation-glossary.html b/docs/reference/gcr/html/annotation-glossary.html new file mode 100644 index 0000000..e97aa53 --- /dev/null +++ b/docs/reference/gcr/html/annotation-glossary.html @@ -0,0 +1,61 @@ + + + + +Annotation Glossary: Gcr Library Reference Manual + + + + + + + + + + + + + + + +
+

+Annotation Glossary

+

A

+
allow-none
+

NULL is OK, both for passing and for returning.

+
array
+

Parameter points to an array of items.

+

E

+
element-type
+

Generics and defining elements of containers and arrays.

+

O

+
out
+

Parameter for returning results. Default is transfer full.

+

S

+
skip
+

Exposed in C code, not necessarily available in other languages.

+

T

+
transfer container
+

Free data container after the code is done.

+
transfer floating
+

Alias for transfer none, used for objects with floating refs.

+
transfer full
+

Free data after the code is done.

+
transfer none
+

Don't free data after the code is done.

+
type
+

Override the parsed C type with given type.

+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/certificate-widget.png b/docs/reference/gcr/html/certificate-widget.png new file mode 100644 index 0000000..e3c9158 Binary files /dev/null and b/docs/reference/gcr/html/certificate-widget.png differ diff --git a/docs/reference/gcr/html/certificates.html b/docs/reference/gcr/html/certificates.html new file mode 100644 index 0000000..662d9a2 --- /dev/null +++ b/docs/reference/gcr/html/certificates.html @@ -0,0 +1,49 @@ + + + + +Part I. Certificates: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+

+Part I. Certificates

+
+

Table of Contents

+
+
+GcrCertificate — Represents an X.509 certificate +
+
+GcrSimpleCertificate — A certificate loaded from a memory buffer +
+
+GcrPkcs11Certificate — A certificate loaded from PKCS#11 storage +
+
+GcrCertificateChain — A certificate chain +
+
+GcrCertificateRequest — Represents a certificate request +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/ch01.html b/docs/reference/gcr/html/ch01.html new file mode 100644 index 0000000..ffe18f5 --- /dev/null +++ b/docs/reference/gcr/html/ch01.html @@ -0,0 +1,54 @@ + + + + +Widget Gallery: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+

+Widget Gallery

+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/collections.html b/docs/reference/gcr/html/collections.html new file mode 100644 index 0000000..fb161eb --- /dev/null +++ b/docs/reference/gcr/html/collections.html @@ -0,0 +1,46 @@ + + + + +Part II. Collections: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+

+Part II. Collections

+
+

Table of Contents

+
+
+GcrCollection — A collection of objects. +
+
+GcrComparable — Interface for comparing objects +
+
+GcrSimpleCollection — A simple implementation of GcrCollection +
+
+GcrCollectionModel — A GtkTreeModel that represents a collection +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/combo-selector.png b/docs/reference/gcr/html/combo-selector.png new file mode 100644 index 0000000..073f483 Binary files /dev/null and b/docs/reference/gcr/html/combo-selector.png differ diff --git a/docs/reference/gcr/html/gcr-GcrCertificateRequest.html b/docs/reference/gcr/html/gcr-GcrCertificateRequest.html new file mode 100644 index 0000000..ad665d5 --- /dev/null +++ b/docs/reference/gcr/html/gcr-GcrCertificateRequest.html @@ -0,0 +1,616 @@ + + + + +GcrCertificateRequest: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrCertificateRequest

+

GcrCertificateRequest — Represents a certificate request

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+gboolean + +gcr_certificate_request_capable () +
+void + +gcr_certificate_request_capable_async () +
+gboolean + +gcr_certificate_request_capable_finish () +
+GcrCertificateRequest * + +gcr_certificate_request_prepare () +
+GcrCertificateRequestFormat + +gcr_certificate_request_get_format () +
+GckObject * + +gcr_certificate_request_get_private_key () +
+void + +gcr_certificate_request_set_cn () +
+gboolean + +gcr_certificate_request_complete () +
+void + +gcr_certificate_request_complete_async () +
+gboolean + +gcr_certificate_request_complete_finish () +
+guchar * + +gcr_certificate_request_encode () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrCertificateRequest
enumGcrCertificateRequestFormat
+
+
+

Description

+

This is an object that allows creation of certificate requests. A +certificate request is sent to a certificate authority to request an +X.509 certificate.

+

Use gcr_certificate_request_prepare() to create a blank certificate +request for a given private key. Set the common name on the certificate +request with gcr_certificate_request_set_cn(), and then sign the request +with gcr_certificate_request_complete_async().

+
+
+

Functions

+
+

gcr_certificate_request_capable ()

+
gboolean
+gcr_certificate_request_capable (GckObject *private_key,
+                                 GCancellable *cancellable,
+                                 GError **error);
+

Check whether GcrCertificateRequest is capable of creating a request +for the given private_key +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

private_key

a private key

 

cancellable

cancellation object

 

error

location to place an error

 
+
+
+

Returns

+

whether a request can be created

+
+
+
+
+

gcr_certificate_request_capable_async ()

+
void
+gcr_certificate_request_capable_async (GckObject *private_key,
+                                       GCancellable *cancellable,
+                                       GAsyncReadyCallback callback,
+                                       gpointer user_data);
+

Asynchronously check whether GcrCertificateRequest is capable of creating +a request for the given private_key +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

private_key

a private key

 

cancellable

cancellation object

 

callback

will be called when the operation completes

 

user_data

data to be passed to callback

 
+
+
+
+
+

gcr_certificate_request_capable_finish ()

+
gboolean
+gcr_certificate_request_capable_finish
+                               (GAsyncResult *result,
+                                GError **error);
+

Get the result for asynchronously check whether GcrCertificateRequest is +capable of creating a request for the given private_key +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

asynchronous result

 

error

location to place an error

 
+
+
+

Returns

+

whether a request can be created

+
+
+
+
+

gcr_certificate_request_prepare ()

+
GcrCertificateRequest *
+gcr_certificate_request_prepare (GcrCertificateRequestFormat format,
+                                 GckObject *private_key);
+

Create a new certificate request, in the given format for the private key.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

format

the format for the certificate request

 

private_key

the private key the the certificate is being requested for

 
+
+
+

Returns

+

a new GcrCertificate request.

+

[transfer full]

+
+
+
+
+

gcr_certificate_request_get_format ()

+
GcrCertificateRequestFormat
+gcr_certificate_request_get_format (GcrCertificateRequest *self);
+

Get the format of this certificate request.

+
+

Parameters

+
+++++ + + + + + +

self

the certificate request

 
+
+
+

Returns

+

the format

+
+
+
+
+

gcr_certificate_request_get_private_key ()

+
GckObject *
+gcr_certificate_request_get_private_key
+                               (GcrCertificateRequest *self);
+

Get the private key this certificate request is for.

+
+

Parameters

+
+++++ + + + + + +

self

the certificate request

 
+
+
+

Returns

+

the private key,.

+

[transfer none]

+
+
+
+
+

gcr_certificate_request_set_cn ()

+
void
+gcr_certificate_request_set_cn (GcrCertificateRequest *self,
+                                const gchar *cn);
+

Set the common name encoded in the certificate request.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

self

the certificate request

 

cn

common name to set on the request

 
+
+
+
+
+

gcr_certificate_request_complete ()

+
gboolean
+gcr_certificate_request_complete (GcrCertificateRequest *self,
+                                  GCancellable *cancellable,
+                                  GError **error);
+

Complete and sign a certificate request, so that it can be encoded +and sent to a certificate authority.

+

This call may block as it signs the request using the private key.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a certificate request

 

cancellable

a cancellation object

 

error

location to place an error on failure

 
+
+
+

Returns

+

whether certificate request was successfully completed or not

+
+
+
+
+

gcr_certificate_request_complete_async ()

+
void
+gcr_certificate_request_complete_async
+                               (GcrCertificateRequest *self,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Asynchronously complete and sign a certificate request, so that it can +be encoded and sent to a certificate authority.

+

This call will return immediately and complete later.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

self

a certificate request

 

cancellable

a cancellation object

 

callback

called when the operation completes

 

user_data

data to pass to the callback

 
+
+
+
+
+

gcr_certificate_request_complete_finish ()

+
gboolean
+gcr_certificate_request_complete_finish
+                               (GcrCertificateRequest *self,
+                                GAsyncResult *result,
+                                GError **error);
+

Finish an asynchronous operation to complete and sign a certificate +request.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a certificate request

 

result

result of the asynchronous operation

 

error

location to place an error on failure

 
+
+
+

Returns

+

whether certificate request was successfully completed or not

+
+
+
+
+

gcr_certificate_request_encode ()

+
guchar *
+gcr_certificate_request_encode (GcrCertificateRequest *self,
+                                gboolean textual,
+                                gsize *length);
+

Encode the certificate request. It must have been completed with +gcr_certificate_request_complete() or gcr_certificate_request_complete_async()

+

If textual + is FALSE, the output is a DER encoded certificate request.

+

If textual + is TRUE, the output is encoded as text. For PKCS#10 requests this +is done using the OpenSSL style PEM encoding.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

self

a certificate request

 

textual

whether to encode output as text

 

length

location to place length of returned data

 
+
+
+

Returns

+

the encoded certificate request.

+

[transfer full][array length=length]

+
+
+
+
+

Types and Values

+
+

GcrCertificateRequest

+
typedef struct _GcrCertificateRequest GcrCertificateRequest;
+

Represents a certificate request.

+
+
+
+

enum GcrCertificateRequestFormat

+

The format of a certificate request. Currently only PKCS#10 is supported.

+
+

Members

+
+++++ + + + + + +

GCR_CERTIFICATE_REQUEST_PKCS10

+

certificate request is in PKCS#10 format

+
 
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-GcrColumn.html b/docs/reference/gcr/html/gcr-GcrColumn.html new file mode 100644 index 0000000..5f5fbfe --- /dev/null +++ b/docs/reference/gcr/html/gcr-GcrColumn.html @@ -0,0 +1,186 @@ + + + + +GcrColumn: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrColumn

+

GcrColumn — Column information for selector or model.

+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrColumn
enumGcrColumnFlags
+
+
+

Description

+

A GcrColumn is used with GcrTreeSelector or GcrCollectionModel to define +the columns to display.

+
+
+

Functions

+

+
+
+

Types and Values

+
+

GcrColumn

+
typedef struct {
+	const gchar *property_name;     /* The property to retrieve */
+	GType property_type;            /* The property type */
+	GType column_type;              /* The resulting property type for this column */
+
+	const gchar *label;             /* The label for this column, or NULL */
+	GcrColumnFlags flags;           /* Column flags */
+
+	GValueTransform transformer;    /* The way to transform to this type or NULL */
+
+	gpointer user_data;
+} GcrColumn;
+
+

Represents a column to display in a GcrCollectionModel or GcrTreeSelector.

+

The label should be set as a translatable string with a context of

+"column". This should be done with with this macro: +
+ + + + + + + +
1
NC_("column", "My Column Name")
+
+ +
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

const gchar *property_name;

The name of the property this column will display

 

GType property_type;

The type of the property

 

GType column_type;

The eventual type of the column

 

const gchar *label;

The display label for the column

 

GcrColumnFlags flags;

Flags from GcrColumnFlags

 

GValueTransform transformer;

A transformer function used to convert the value from +the property type to the column type. Can be NULL if the types +are the same.

 

gpointer user_data;

User data associated with the column

 
+
+
+
+
+

enum GcrColumnFlags

+

Flags to be used with GcrColumn

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

GCR_COLUMN_NONE

+

No column flags

+
 

GCR_COLUMN_HIDDEN

+

Don't display this column.

+
 

GCR_COLUMN_SORTABLE

+

This column is sortable.

+
 
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-GcrImportInteraction.html b/docs/reference/gcr/html/gcr-GcrImportInteraction.html new file mode 100644 index 0000000..aac048f --- /dev/null +++ b/docs/reference/gcr/html/gcr-GcrImportInteraction.html @@ -0,0 +1,362 @@ + + + + +GcrImportInteraction: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrImportInteraction

+

GcrImportInteraction — User interaction during importing

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
+void + +gcr_import_interaction_supplement_prep () +
+GTlsInteractionResult + +gcr_import_interaction_supplement () +
+void + +gcr_import_interaction_supplement_async () +
+GTlsInteractionResult + +gcr_import_interaction_supplement_finish () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
 GcrImportInteraction
structGcrImportInteractionIface
+
+
+

Description

+

This is an interface implemented by a caller performing an import. It allows +the importer to ask the caller for further information about the import.

+

It must be implemented on a derived class of GTlsInteraction

+
+
+

Functions

+
+

gcr_import_interaction_supplement_prep ()

+
void
+gcr_import_interaction_supplement_prep
+                               (GcrImportInteraction *interaction,
+                                GckBuilder *builder);
+

Prepare for supplementing the given attributes before import. This means +prompting the user for things like labels and the like. The attributes +will contain attributes for values that the importer needs, either empty +or prefilled with suggested values.

+

This method does not prompt the user, but rather just prepares the +interaction that these are the attributes that are needed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

interaction

the interaction

 

builder

attributes to supplement

 
+
+
+
+
+

gcr_import_interaction_supplement ()

+
GTlsInteractionResult
+gcr_import_interaction_supplement (GcrImportInteraction *interaction,
+                                   GckBuilder *builder,
+                                   GCancellable *cancellable,
+                                   GError **error);
+

Supplement attributes before import. This means prompting the user for +things like labels and the like. The needed attributes will have been passed +to gcr_import_interaction_supplement_prep().

+

This method prompts the user and fills in the attributes. If the user or +cancellable cancels the operation the error should be set with G_IO_ERROR_CANCELLED.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

interaction

the interaction

 

builder

supplemented attributes

 

cancellable

optional cancellable object

 

error

location to store error on failure

 
+
+
+

Returns

+

G_TLS_INTERACTION_HANDLED if successful or G_TLS_INTERACTION_FAILED

+
+
+
+
+

gcr_import_interaction_supplement_async ()

+
void
+gcr_import_interaction_supplement_async
+                               (GcrImportInteraction *interaction,
+                                GckBuilder *builder,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Asynchronously supplement attributes before import. This means prompting the +user for things like labels and the like. The needed attributes will have +been passed to gcr_import_interaction_supplement_prep().

+

This method prompts the user and fills in the attributes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

interaction

the interaction

 

builder

supplemented attributes

 

cancellable

optional cancellable object

 

callback

called when the operation completes

 

user_data

data to be passed to the callback

 
+
+
+
+
+

gcr_import_interaction_supplement_finish ()

+
GTlsInteractionResult
+gcr_import_interaction_supplement_finish
+                               (GcrImportInteraction *interaction,
+                                GAsyncResult *result,
+                                GError **error);
+

Complete operation to asynchronously supplement attributes before import.

+

If the user or cancellable cancels the operation the error should be set +with G_IO_ERROR_CANCELLED.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

interaction

the interaction

 

result

the asynchronous result

 

error

location to place an error on failure

 
+
+
+

Returns

+

G_TLS_INTERACTION_HANDLED if successful or G_TLS_INTERACTION_FAILED

+
+
+
+
+

Types and Values

+
+

GcrImportInteraction

+
typedef struct _GcrImportInteraction GcrImportInteraction;
+

Interface implemented by the caller performing an import.

+
+
+
+

struct GcrImportInteractionIface

+
struct GcrImportInteractionIface {
+	GTypeInterface parent;
+
+	void                    (*supplement_prep)   (GcrImportInteraction *interaction,
+	                                              GckBuilder *builder);
+
+	GTlsInteractionResult   (*supplement)        (GcrImportInteraction *interaction,
+	                                              GckBuilder *builder,
+	                                              GCancellable *cancellable,
+	                                              GError **error);
+
+	void                    (*supplement_async)  (GcrImportInteraction *interaction,
+	                                              GckBuilder *builder,
+	                                              GCancellable *cancellable,
+	                                              GAsyncReadyCallback callback,
+	                                              gpointer user_data);
+
+	GTlsInteractionResult   (*supplement_finish) (GcrImportInteraction *interaction,
+	                                              GAsyncResult *result,
+	                                              GError **error);
+};
+
+

Interface implemented by implementations of GcrImportInteraction.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GTypeInterface parent;

parent interface

 

supplement_prep ()

method which prepares for supplementing the given attributes before import

 

supplement ()

method which synchronously supplements attributes before import

 

supplement_async ()

method which asynchronously supplements attributes before import

 

supplement_finish ()

method which completes supplement_async +

 
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-GcrSshAskpass.html b/docs/reference/gcr/html/gcr-GcrSshAskpass.html new file mode 100644 index 0000000..4d60507 --- /dev/null +++ b/docs/reference/gcr/html/gcr-GcrSshAskpass.html @@ -0,0 +1,181 @@ + + + + +GcrSshAskpass: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GcrSshAskpass

+

GcrSshAskpass — Allows an ssh command to callback for a password

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+GcrSshAskpass * + +gcr_ssh_askpass_new () +
+GTlsInteraction * + +gcr_ssh_askpass_get_interaction () +
+void + +gcr_ssh_askpass_child_setup () +
+
+
+

Types and Values

+
++++ + + + + +
 GcrSshAskpass
+
+
+

Description

+

When used as the setup function while spawning an ssh command like ssh-add +or ssh, this allows callbacks for passwords on the provided interaction.

+
+
+

Functions

+
+

gcr_ssh_askpass_new ()

+
GcrSshAskpass *
+gcr_ssh_askpass_new (GTlsInteraction *interaction);
+

Create a new GcrSshAskpass object which can be used to spawn an +ssh command and prompt for any necessary passwords.

+

Use the gcr_ssh_askpass_child_setup() function as a callback with +g_spawn_sync(), g_spawn_async() or g_spawn_async_with_pipes().

+
+

Parameters

+
+++++ + + + + + +

interaction

the interaction to use for prompting paswords

 
+
+
+

Returns

+

A new GcrSshAskpass object.

+

[transfer full]

+
+
+
+
+

gcr_ssh_askpass_get_interaction ()

+
GTlsInteraction *
+gcr_ssh_askpass_get_interaction (GcrSshAskpass *self);
+

Get the interaction associated with this object.

+
+

Parameters

+
+++++ + + + + + +

self

a GcrSshAskpass object

 
+
+
+

Returns

+

the interaction.

+

[transfer none]

+
+
+
+
+

gcr_ssh_askpass_child_setup ()

+
void
+gcr_ssh_askpass_child_setup (gpointer askpass);
+

Use this function as a callback setup function passed to g_spawn_sync(), +g_spawn_async(), g_spawn_async_with_pipes().

+
+

Parameters

+
+++++ + + + + + +

askpass

a GcrSshAskpass object

 
+
+
+
+
+

Types and Values

+
+

GcrSshAskpass

+
typedef struct _GcrSshAskpass GcrSshAskpass;
+

An object containing the password prompting state.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-Key-Fingerprints.html b/docs/reference/gcr/html/gcr-Key-Fingerprints.html new file mode 100644 index 0000000..378152b --- /dev/null +++ b/docs/reference/gcr/html/gcr-Key-Fingerprints.html @@ -0,0 +1,173 @@ + + + + +Key Fingerprints: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Key Fingerprints

+

Key Fingerprints — Fingerprints for public and private keys

+
+
+

Functions

+
++++ + + + + + + + + + + +
+guchar * + +gcr_fingerprint_from_attributes () +
+guchar * + +gcr_fingerprint_from_subject_public_key_info () +
+
+
+

Description

+

These functions generate key fingerprints for public keys, certificates and +key data. The fingerprints are created so that they they will be identical +for a key and its corresponding certificate.

+

Note that in the case of certificates these are not fingerprints of the +actual certificate data, but rather of the public key contained in a +certificate.

+

These fingerprints are created using the subjectPublicKeyInfo ASN.1 structure.

+
+
+

Functions

+
+

gcr_fingerprint_from_attributes ()

+
guchar *
+gcr_fingerprint_from_attributes (GckAttributes *attrs,
+                                 GChecksumType checksum_type,
+                                 gsize *n_fingerprint);
+

Create a key fingerprint for a certificate, public key or private key. +Note that this is not a fingerprint of certificate data, which you would +use gcr_certificate_get_fingerprint() for.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

attrs

attributes for key or certificate

 

checksum_type

the type of fingerprint to create

 

n_fingerprint

the length of fingerprint returned

 
+
+
+

Returns

+

the +fingerprint or NULL if the input was invalid.

+

[transfer full][allow-none][array length=n_fingerprint]

+
+
+
+
+

gcr_fingerprint_from_subject_public_key_info ()

+
guchar *
+gcr_fingerprint_from_subject_public_key_info
+                               (const guchar *key_info,
+                                gsize n_key_info,
+                                GChecksumType checksum_type,
+                                gsize *n_fingerprint);
+

Create a key fingerprint for a DER encoded subjectPublicKeyInfo.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

key_info

DER encoded subjectPublicKeyInfo structure.

[array length=n_key_info]

n_key_info

length of DER encoded structure

 

checksum_type

the type of fingerprint to create

 

n_fingerprint

the length of fingerprint returned

 
+
+
+

Returns

+

the +fingerprint or NULL if the input was invalid.

+

[transfer full][allow-none][array length=n_fingerprint]

+
+
+
+
+

Types and Values

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-Library-PKCS#11.html b/docs/reference/gcr/html/gcr-Library-PKCS#11.html new file mode 100644 index 0000000..b1ad3e9 --- /dev/null +++ b/docs/reference/gcr/html/gcr-Library-PKCS#11.html @@ -0,0 +1,498 @@ + + + + +Library PKCS#11: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Library PKCS#11

+

Library PKCS#11 — functions for manipulating GCR library global settings.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+gboolean + +gcr_pkcs11_initialize () +
+void + +gcr_pkcs11_initialize_async () +
+gboolean + +gcr_pkcs11_initialize_finish () +
+GList * + +gcr_pkcs11_get_modules () +
+void + +gcr_pkcs11_set_modules () +
+void + +gcr_pkcs11_add_module () +
+gboolean + +gcr_pkcs11_add_module_from_file () +
+GList * + +gcr_pkcs11_get_trust_lookup_slots () +
+GckSlot * + +gcr_pkcs11_get_trust_store_slot () +
const gchar ** + +gcr_pkcs11_get_trust_lookup_uris () +
+void + +gcr_pkcs11_set_trust_lookup_uris () +
const gchar * + +gcr_pkcs11_get_trust_store_uri () +
+void + +gcr_pkcs11_set_trust_store_uri () +
+
+
+

Description

+

Manage or lookup various global aspesct and settings of the library.

+

The GCR library maintains a global list of PKCS#11 modules to use for +its various lookups and storage operations. Each module is represented by +a GckModule object. You can examine this list by using +gcr_pkcs11_get_modules().

+

The list is configured automatically by looking for system installed +PKCS#11 modules. It's not not normally necessary to modify this list. But +if you have special needs, you can use the gcr_pkcs11_set_modules() and +gcr_pkcs11_add_module() to do so.

+

Trust assertions are stored and looked up in specific PKCS#11 slots. +You can examine this list with gcr_pkcs11_get_trust_lookup_slots()

+
+
+

Functions

+
+

gcr_pkcs11_initialize ()

+
gboolean
+gcr_pkcs11_initialize (GCancellable *cancellable,
+                       GError **error);
+

Asynchronously initialize the registered PKCS#11 modules.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cancellable

optional cancellable used to cancel the operation

 

error

location to place an error on failure

 
+
+
+

Returns

+

whether the operation was successful or not.

+
+
+
+
+

gcr_pkcs11_initialize_async ()

+
void
+gcr_pkcs11_initialize_async (GCancellable *cancellable,
+                             GAsyncReadyCallback callback,
+                             gpointer user_data);
+

Asynchronously initialize the registered PKCS#11 modules.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cancellable

optional cancellable used to cancel the operation

 

callback

callback which will be called when the operation completes

 

user_data

data passed to the callback

 
+
+
+
+
+

gcr_pkcs11_initialize_finish ()

+
gboolean
+gcr_pkcs11_initialize_finish (GAsyncResult *result,
+                              GError **error);
+

Complete the asynchronous operation to initialize the registered PKCS#11 +modules.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the asynchronous result

 

error

location to place an error on failure

 
+
+
+

Returns

+

whether the operation was successful or not.

+
+
+
+
+

gcr_pkcs11_get_modules ()

+
GList *
+gcr_pkcs11_get_modules (void);
+

List all the PKCS#11 modules that are used by the GCR library. +Each module is a GckModule object.

+

An empty list of modules will be returned if gcr_pkcs11_set_modules(), +or gcr_pkcs11_initialize() has not yet run.

+

When done with the list, free it with gck_list_unref_free().

+
+

Returns

+

a newly allocated list +of GckModule objects.

+

[transfer full][element-type Gck.Module]

+
+
+
+
+

gcr_pkcs11_set_modules ()

+
void
+gcr_pkcs11_set_modules (GList *modules);
+

Set the list of PKCS#11 modules that are used by the GCR library. +Each module in the list is a GckModule object.

+

It is not normally necessary to call this function. The available +PKCS#11 modules installed on the system are automatically loaded +by the GCR library.

+
+

Parameters

+
+++++ + + + + + +

modules

a list of GckModule.

[element-type Gck.Module]
+
+
+
+
+

gcr_pkcs11_add_module ()

+
void
+gcr_pkcs11_add_module (GckModule *module);
+

Add a GckModule to the list of PKCS#11 modules that are used by the +GCR library.

+

It is not normally necessary to call this function. The available +PKCS#11 modules installed on the system are automatically loaded +by the GCR library.

+
+

Parameters

+
+++++ + + + + + +

module

a GckModule

 
+
+
+
+
+

gcr_pkcs11_add_module_from_file ()

+
gboolean
+gcr_pkcs11_add_module_from_file (const gchar *module_path,
+                                 gpointer unused,
+                                 GError **error);
+

Initialize a PKCS#11 module and add it to the modules that are +used by the GCR library. Note that is an error to initialize the same +PKCS#11 module twice.

+

It is not normally necessary to call this function. The available +PKCS#11 modules installed on the system are automatically loaded +by the GCR library.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

module_path

the full file path of the PKCS#11 module

 

unused

unused

 

error

a GError or NULL

 
+
+
+

Returns

+

whether the module was sucessfully added.

+
+
+
+
+

gcr_pkcs11_get_trust_lookup_slots ()

+
GList *
+gcr_pkcs11_get_trust_lookup_slots (void);
+

List all the PKCS#11 slots that are used by the GCR library for lookup +of trust assertions. Each slot is a GckSlot object.

+

This will return an empty list if the gcr_pkcs11_initialize() function has +not yet been called.

+

When done with the list, free it with gck_list_unref_free().

+
+

Returns

+

a list of GckSlot objects +to use for lookup of trust.

+

[transfer full][element-type Gck.Slot]

+
+
+
+
+

gcr_pkcs11_get_trust_store_slot ()

+
GckSlot *
+gcr_pkcs11_get_trust_store_slot (void);
+

Selects an appropriate PKCS#11 slot to store trust assertions. The slot +to use is normally configured automatically by the system.

+

This will only return a valid result after the gcr_pkcs11_initialize() +method has been called.

+

When done with the GckSlot, use g_object_unref() to release it.

+
+

Returns

+

the GckSlot to use for trust assertions.

+

[transfer full]

+
+
+
+
+

gcr_pkcs11_get_trust_lookup_uris ()

+
const gchar **
+gcr_pkcs11_get_trust_lookup_uris (void);
+

Get the PKCS#11 URIs that are used to identify which slots to use for +lookup trust assertions.

+
+

Returns

+

the uri which identifies trust storage slot.

+

[allow-none][transfer none]

+
+
+
+
+

gcr_pkcs11_set_trust_lookup_uris ()

+
void
+gcr_pkcs11_set_trust_lookup_uris (const gchar **pkcs11_uris);
+

Set the PKCS#11 URIs that are used to identify which slots to use for +lookup of trust assertions.

+

It is not normally necessary to call this function. The relevant +PKCS#11 slots are automatically configured by the GCR library.

+
+

Parameters

+
+++++ + + + + + +

pkcs11_uris

the uris which identifies trust lookup slots.

[allow-none]
+
+
+
+
+

gcr_pkcs11_get_trust_store_uri ()

+
const gchar *
+gcr_pkcs11_get_trust_store_uri (void);
+

Get the PKCS#11 URI that is used to identify which slot to use for +storing trust storage.

+
+

Returns

+

the uri which identifies trust storage slot.

+

[allow-none]

+
+
+
+
+

gcr_pkcs11_set_trust_store_uri ()

+
void
+gcr_pkcs11_set_trust_store_uri (const gchar *pkcs11_uri);
+

Set the PKCS#11 URI that is used to identify which slot to use for +storing trust assertions.

+

It is not normally necessary to call this function. The relevant +PKCS#11 slot is automatically configured by the GCR library.

+
+

Parameters

+
+++++ + + + + + +

pkcs11_uri

the uri which identifies trust storage slot.

[allow-none]
+
+
+
+
+

Types and Values

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-Library-Utilities.html b/docs/reference/gcr/html/gcr-Library-Utilities.html new file mode 100644 index 0000000..a16e9d5 --- /dev/null +++ b/docs/reference/gcr/html/gcr-Library-Utilities.html @@ -0,0 +1,162 @@ + + + + +Library Utilities: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Library Utilities

+

Library Utilities — Library utilities such as version checks

+
+
+

Functions

+
++++ + + + + +
#define +GCR_CHECK_VERSION() +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
#defineGCR_MAJOR_VERSION
#defineGCR_MICRO_VERSION
#defineGCR_MINOR_VERSION
+
+
+

Description

+

Basic library utilities such as version checks.

+
+
+

Functions

+
+

GCR_CHECK_VERSION()

+
#define             GCR_CHECK_VERSION(major,minor,micro)
+

Checks the version of the Gcr libarry that is being compiled +against.

+
+

Example 1. Checking the version of the Gcr library

+
+ + + + + + + +
1
+2
+3
#if !GCR_CHECK_VERSION (3, 0, 0)
+#warning Old Gcr version, disabling functionality
+#endif
+
+ +
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

major

the major version to check for

 

minor

the minor version to check for

 

micro

the micro version to check for

 
+
+
+

Returns

+

TRUE if the version of the Gcr header files +is the same as or newer than the passed-in version.

+
+
+
+
+

Types and Values

+
+

GCR_MAJOR_VERSION

+
#define GCR_MAJOR_VERSION (3)
+
+

The major version number of the Gcr library.

+
+
+
+

GCR_MICRO_VERSION

+
#define GCR_MICRO_VERSION (0)
+
+

The micro version number of the Gcr library.

+
+
+
+

GCR_MINOR_VERSION

+
#define GCR_MINOR_VERSION (28)
+
+

The minor version number of the Gcr library.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-Non-pageable-Memory.html b/docs/reference/gcr/html/gcr-Non-pageable-Memory.html new file mode 100644 index 0000000..127d693 --- /dev/null +++ b/docs/reference/gcr/html/gcr-Non-pageable-Memory.html @@ -0,0 +1,418 @@ + + + + +Non-pageable Memory: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Non-pageable Memory

+

Non-pageable Memory — Secure non-pageable memory

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define +gcr_secure_memory_new() +
+gpointer + +gcr_secure_memory_alloc () +
+gpointer + +gcr_secure_memory_try_alloc () +
+gpointer + +gcr_secure_memory_realloc () +
+gpointer + +gcr_secure_memory_try_realloc () +
+gchar * + +gcr_secure_memory_strdup () +
+void + +gcr_secure_memory_strfree () +
+void + +gcr_secure_memory_free () +
+gboolean + +gcr_secure_memory_is_secure () +
+
+
+

Description

+

Normal allocated memory can be paged to disk at the whim of the operating +system. This can be a problem for sensitive information like passwords, keys +and secrets.

+

The Gcr library holds passwords and keys in non-pageable, or locked memory. +This is only possible if the OS contains support for it.

+

These functions allow applications to use secure memory to hold passwords +and other sensitive information.

+
+
+

Functions

+
+

gcr_secure_memory_new()

+
#define             gcr_secure_memory_new(type, n_objects)
+

Allocate objects in non-pageable memory.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

type

C type of the objects to allocate

 

n_objects

number of objects to allocate

 
+
+
+

Returns

+

the new block of memory.

+

[transfer full]

+
+
+
+
+

gcr_secure_memory_alloc ()

+
gpointer
+gcr_secure_memory_alloc (gsize size);
+

Allocate a block of non-pageable memory.

+

If non-pageable memory cannot be allocated then normal memory will be +returned.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

size

The new desired size of the memory block.

 
+
+
+

Returns

+

new memory block which should be freed +with gcr_secure_memory_free().

+

[transfer full]

+
+
+
+
+

gcr_secure_memory_try_alloc ()

+
gpointer
+gcr_secure_memory_try_alloc (gsize size);
+

Allocate a block of non-pageable memory.

+

If non-pageable memory cannot be allocated, then NULL is returned.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

size

new desired size of the memory block

 
+
+
+

Returns

+

new block, or NULL if memory cannot be +allocated; memory block should be freed with gcr_secure_memory_free().

+

[transfer full]

+
+
+
+
+

gcr_secure_memory_realloc ()

+
gpointer
+gcr_secure_memory_realloc (gpointer memory,
+                           gsize size);
+

Reallocate a block of non-pageable memory.

+

Glib memory is also reallocated correctly. If called with a null pointer, +then a new block of memory is allocated. If called with a zero size, +then the block of memory is freed.

+

If non-pageable memory cannot be allocated then normal memory will be +returned.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

memory

pointer to reallocate or NULL to allocate a new block.

[allow-none]

size

new desired size of the memory block, or 0 to free the memory

 
+
+
+

Returns

+

new block, or NULL if the block was +freed; memory block should be freed with gcr_secure_memory_free().

+

[transfer full]

+
+
+
+
+

gcr_secure_memory_try_realloc ()

+
gpointer
+gcr_secure_memory_try_realloc (gpointer memory,
+                               gsize size);
+

Reallocate a block of non-pageable memory.

+

Glib memory is also reallocated correctly when passed to this function. +If called with a null pointer, then a new block of memory is allocated. +If called with a zero size, then the block of memory is freed.

+

If memory cannot be allocated, NULL is returned and the original block +of memory remains intact.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

memory

pointer to reallocate or NULL to allocate a new block.

[allow-none]

size

new desired size of the memory block

 
+
+
+

Returns

+

the new block, or NULL if memory cannot be +allocated; the memory block should be freed with gcr_secure_memory_free().

+

[transfer full]

+
+
+
+
+

gcr_secure_memory_strdup ()

+
gchar *
+gcr_secure_memory_strdup (const gchar *string);
+

Copy a string into non-pageable memory. If the input string is NULL, then +NULL will be returned.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

string

null terminated string to copy.

[allow-none]
+
+
+

Returns

+

copied string, should be freed with gcr_secure_memory_free()

+
+
+
+
+

gcr_secure_memory_strfree ()

+
void
+gcr_secure_memory_strfree (gchar *string);
+

Free a string, whether securely allocated using these functions or not. +This will also clear out the contents of the string so they do not +remain in memory.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

string

null terminated string to fere.

[allow-none]
+
+
+
+
+

gcr_secure_memory_free ()

+
void
+gcr_secure_memory_free (gpointer memory);
+

Free a block of non-pageable memory.

+

Glib memory is also freed correctly when passed to this function. If called +with a NULL pointer then no action is taken.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

memory

pointer to the beginning of the block of memory to free.

[allow-none]
+
+
+
+
+

gcr_secure_memory_is_secure ()

+
gboolean
+gcr_secure_memory_is_secure (gpointer memory);
+

Check if a pointer is in non-pageable memory allocated by.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

memory

pointer to check

 
+
+
+

Returns

+

whether the memory is secure non-pageable memory allocated by the +Gcr library or not

+
+
+
+
+

Types and Values

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr-Trust-Storage-and-Lookups.html b/docs/reference/gcr/html/gcr-Trust-Storage-and-Lookups.html new file mode 100644 index 0000000..01d3dec --- /dev/null +++ b/docs/reference/gcr/html/gcr-Trust-Storage-and-Lookups.html @@ -0,0 +1,858 @@ + + + + +Trust Storage and Lookups: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Trust Storage and Lookups

+

Trust Storage and Lookups — Store and lookup bits of information used for +verifying certificates.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+gboolean + +gcr_trust_is_certificate_anchored () +
+void + +gcr_trust_is_certificate_anchored_async () +
+gboolean + +gcr_trust_is_certificate_anchored_finish () +
+gboolean + +gcr_trust_is_certificate_pinned () +
+void + +gcr_trust_is_certificate_pinned_async () +
+gboolean + +gcr_trust_is_certificate_pinned_finish () +
+gboolean + +gcr_trust_add_pinned_certificate () +
+void + +gcr_trust_add_pinned_certificate_async () +
+gboolean + +gcr_trust_add_pinned_certificate_finish () +
+gboolean + +gcr_trust_remove_pinned_certificate () +
+void + +gcr_trust_remove_pinned_certificate_async () +
+gboolean + +gcr_trust_remove_pinned_certificate_finish () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + +
#defineGCR_PURPOSE_SERVER_AUTH
#defineGCR_PURPOSE_CLIENT_AUTH
#defineGCR_PURPOSE_EMAIL
#defineGCR_PURPOSE_CODE_SIGNING
+
+
+

Description

+

These functions provide access to stored information about which +certificates the system and user trusts as certificate authority trust +anchors, or overrides to the normal verification of certificates.

+

Trust anchors are used to verify the certificate authority in a certificate +chain. Trust anchors are always valid for a given purpose. The most common +purpose is the GCR_PURPOSE_SERVER_AUTH and is used for a client application +to verify that the certificate at the server side of a TLS connection is +authorized to act as such. To check if a certificate is a trust anchor use +gcr_trust_is_certificate_anchored().

+

Pinned certificates are used when a user overrides the default trust +decision for a given certificate. They're often used with self-signed +certificates. Pinned certificates are always only valid for a single peer +such as the remote host with which TLS is being performed. To lookup +pinned certificates use gcr_trust_is_certificate_pinned().

+

After the user has requested to override the trust decision +about a given certificate then a pinned certificates can be added by using +the gcr_trust_add_pinned_certificate() function.

+

These functions do not constitute a viable method for verifying certificates +used in TLS or other locations. Instead they support such verification +by providing some of the needed data for a trust decision.

+

The storage is provided by pluggable PKCS#11 modules.

+
+
+

Functions

+
+

gcr_trust_is_certificate_anchored ()

+
gboolean
+gcr_trust_is_certificate_anchored (GcrCertificate *certificate,
+                                   const gchar *purpose,
+                                   GCancellable *cancellable,
+                                   GError **error);
+

Check if the certificate + is a trust anchor for the given purpose +. A trust +anchor is used to verify the signatures on other certificates when verifying +a certificate chain. Also known as a trusted certificate authority.

+

This call may block, see gcr_trust_is_certificate_anchored_async() for the +non-blocking version.

+

In the case of an error, FALSE is also returned. Check error + to detect +if an error occurred.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate to check

 

purpose

the purpose string

 

cancellable

a GCancellable

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the certificate is a trust anchor

+
+
+
+
+

gcr_trust_is_certificate_anchored_async ()

+
void
+gcr_trust_is_certificate_anchored_async
+                               (GcrCertificate *certificate,
+                                const gchar *purpose,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Check if the certificate + is a trust anchor for the given purpose +. A trust +anchor is used to verify the signatures on other certificates when verifying +a certificate chain. Also known as a trusted certificate authority.

+

When the operation is finished, callback will be called. You can then call +gcr_trust_is_certificate_anchored_finish() to get the result of the operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate to check

 

purpose

the purpose string

 

cancellable

a GCancellable

 

callback

a GAsyncReadyCallback to call when the operation completes

 

user_data

the data to pass to callback function

 
+
+
+
+
+

gcr_trust_is_certificate_anchored_finish ()

+
gboolean
+gcr_trust_is_certificate_anchored_finish
+                               (GAsyncResult *result,
+                                GError **error);
+

Finishes an asynchronous operation started by +gcr_trust_is_certificate_anchored_async().

+

In the case of an error, FALSE is also returned. Check error + to detect +if an error occurred.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the GAsyncResult passed to the callback

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the certificate is a trust anchor

+
+
+
+
+

gcr_trust_is_certificate_pinned ()

+
gboolean
+gcr_trust_is_certificate_pinned (GcrCertificate *certificate,
+                                 const gchar *purpose,
+                                 const gchar *peer,
+                                 GCancellable *cancellable,
+                                 GError **error);
+

Check if certificate + is pinned for purpose + to communicate with peer +. +A pinned certificate overrides all other certificate verification.

+

This call may block, see gcr_trust_is_certificate_pinned_async() for the +non-blocking version.

+

In the case of an error, FALSE is also returned. Check error + to detect +if an error occurred.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate to check

 

purpose

the purpose string

 

peer

the peer for this pinned

 

cancellable

a GCancellable

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the certificate is pinned for the host and purpose

+
+
+
+
+

gcr_trust_is_certificate_pinned_async ()

+
void
+gcr_trust_is_certificate_pinned_async (GcrCertificate *certificate,
+                                       const gchar *purpose,
+                                       const gchar *peer,
+                                       GCancellable *cancellable,
+                                       GAsyncReadyCallback callback,
+                                       gpointer user_data);
+

Check if certificate + is pinned for purpose + to communicate with peer +. A +pinned certificate overrides all other certificate verification.

+

When the operation is finished, callback will be called. You can then call +gcr_trust_is_certificate_pinned_finish() to get the result of the +operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate to check

 

purpose

the purpose string

 

peer

the peer for this pinned

 

cancellable

a GCancellable

 

callback

a GAsyncReadyCallback to call when the operation completes

 

user_data

the data to pass to callback function

 
+
+
+
+
+

gcr_trust_is_certificate_pinned_finish ()

+
gboolean
+gcr_trust_is_certificate_pinned_finish
+                               (GAsyncResult *result,
+                                GError **error);
+

Finishes an asynchronous operation started by +gcr_trust_is_certificate_pinned_async().

+

In the case of an error, FALSE is also returned. Check error + to detect +if an error occurred.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the GAsyncResult passed to the callback

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the certificate is pinned.

+
+
+
+
+

gcr_trust_add_pinned_certificate ()

+
gboolean
+gcr_trust_add_pinned_certificate (GcrCertificate *certificate,
+                                  const gchar *purpose,
+                                  const gchar *peer,
+                                  GCancellable *cancellable,
+                                  GError **error);
+

Add a pinned certificate + for connections to peer + for purpose +. A pinned +certificate overrides all other certificate verification and should be +used with care.

+

If the same pinned certificate already exists, then this operation +does not add another, and succeeds without error.

+

This call may block, see gcr_trust_add_pinned_certificate_async() for the +non-blocking version.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate

 

purpose

the purpose string

 

peer

the peer for this pinned certificate

 

cancellable

a GCancellable

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the pinned certificate is recorded successfully

+
+
+
+
+

gcr_trust_add_pinned_certificate_async ()

+
void
+gcr_trust_add_pinned_certificate_async
+                               (GcrCertificate *certificate,
+                                const gchar *purpose,
+                                const gchar *peer,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Add a pinned certificate for communication with peer + for purpose +. A pinned +certificate overrides all other certificate verification and should be used +with care.

+

If the same pinned certificate already exists, then this operation +does not add another, and succeeds without error.

+

When the operation is finished, callback will be called. You can then call +gcr_trust_add_pinned_certificate_finish() to get the result of the +operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate

 

purpose

the purpose string

 

peer

the peer for this pinned certificate

 

cancellable

a GCancellable

 

callback

a GAsyncReadyCallback to call when the operation completes

 

user_data

the data to pass to callback function

 
+
+
+
+
+

gcr_trust_add_pinned_certificate_finish ()

+
gboolean
+gcr_trust_add_pinned_certificate_finish
+                               (GAsyncResult *result,
+                                GError **error);
+

Finishes an asynchronous operation started by +gcr_trust_add_pinned_certificate_async().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the GAsyncResult passed to the callback

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the pinned certificate is recorded successfully

+
+
+
+
+

gcr_trust_remove_pinned_certificate ()

+
gboolean
+gcr_trust_remove_pinned_certificate (GcrCertificate *certificate,
+                                     const gchar *purpose,
+                                     const gchar *peer,
+                                     GCancellable *cancellable,
+                                     GError **error);
+

Remove a pinned certificate for communication with peer + for purpose +.

+

If the same pinned certificate does not exist, or was already removed, +then this operation succeeds without error.

+

This call may block, see gcr_trust_remove_pinned_certificate_async() for the +non-blocking version.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate

 

purpose

the purpose string

 

peer

the peer for this pinned certificate

 

cancellable

a GCancellable

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the pinned certificate no longer exists

+
+
+
+
+

gcr_trust_remove_pinned_certificate_async ()

+
void
+gcr_trust_remove_pinned_certificate_async
+                               (GcrCertificate *certificate,
+                                const gchar *purpose,
+                                const gchar *peer,
+                                GCancellable *cancellable,
+                                GAsyncReadyCallback callback,
+                                gpointer user_data);
+

Remove a pinned certificate for communication with peer + for purpose +.

+

If the same pinned certificate does not exist, or was already removed, +then this operation succeeds without error.

+

When the operation is finished, callback will be called. You can then call +gcr_trust_remove_pinned_certificate_finish() to get the result of the +operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

certificate

a GcrCertificate

 

purpose

the purpose string

 

peer

the peer for this pinned certificate

 

cancellable

a GCancellable

 

callback

a GAsyncReadyCallback to call when the operation completes

 

user_data

the data to pass to callback function

 
+
+
+
+
+

gcr_trust_remove_pinned_certificate_finish ()

+
gboolean
+gcr_trust_remove_pinned_certificate_finish
+                               (GAsyncResult *result,
+                                GError **error);
+

Finishes an asynchronous operation started by +gcr_trust_remove_pinned_certificate_async().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

the GAsyncResult passed to the callback

 

error

a GError, or NULL

 
+
+
+

Returns

+

TRUE if the pinned certificate no longer exists

+
+
+
+
+

Types and Values

+
+

GCR_PURPOSE_SERVER_AUTH

+
#define GCR_PURPOSE_SERVER_AUTH "1.3.6.1.5.5.7.3.1"
+
+

The purpose used to verify the server certificate in a TLS connection. This +is the most common purpose in use.

+
+
+
+

GCR_PURPOSE_CLIENT_AUTH

+
#define GCR_PURPOSE_CLIENT_AUTH "1.3.6.1.5.5.7.3.2"
+
+

The purpose used to verify the client certificate in a TLS connection.

+
+
+
+

GCR_PURPOSE_EMAIL

+
#define GCR_PURPOSE_EMAIL "1.3.6.1.5.5.7.3.4"
+
+

The purpose used to verify certificates that are used in email communication +such as S/MIME.

+
+
+
+

GCR_PURPOSE_CODE_SIGNING

+
#define GCR_PURPOSE_CODE_SIGNING "1.3.6.1.5.5.7.3.3"
+
+

The purpose used to verify certificate used for the signature on signed code.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/gcr.devhelp2 b/docs/reference/gcr/html/gcr.devhelp2 new file mode 100644 index 0000000..e1326c4 --- /dev/null +++ b/docs/reference/gcr/html/gcr.devhelp2 @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gcr/html/home.png b/docs/reference/gcr/html/home.png new file mode 100644 index 0000000..9346b33 Binary files /dev/null and b/docs/reference/gcr/html/home.png differ diff --git a/docs/reference/gcr/html/import-button.png b/docs/reference/gcr/html/import-button.png new file mode 100644 index 0000000..9166bb8 Binary files /dev/null and b/docs/reference/gcr/html/import-button.png differ diff --git a/docs/reference/gcr/html/index.html b/docs/reference/gcr/html/index.html new file mode 100644 index 0000000..83c00f2 --- /dev/null +++ b/docs/reference/gcr/html/index.html @@ -0,0 +1,155 @@ + + + + +Gcr Library Reference Manual: Gcr Library Reference Manual + + + + + + + +
+
+
+
+

+ for Gcr 3.28.0 +. + An online version of this documentation can be found at + http://developer.gnome.org/gcr/stable/. +

+
+
+
+
+
I. Certificates
+
+
+GcrCertificate — Represents an X.509 certificate +
+
+GcrSimpleCertificate — A certificate loaded from a memory buffer +
+
+GcrPkcs11Certificate — A certificate loaded from PKCS#11 storage +
+
+GcrCertificateChain — A certificate chain +
+
+GcrCertificateRequest — Represents a certificate request +
+
+
II. Collections
+
+
+GcrCollection — A collection of objects. +
+
+GcrComparable — Interface for comparing objects +
+
+GcrSimpleCollection — A simple implementation of GcrCollection +
+
+GcrCollectionModel — A GtkTreeModel that represents a collection +
+
+
III. Widgets
+
+
+GcrCertificateWidget — Certificate widget and renderer +
+
+GcrKeyWidget — Key widget and renderer +
+
+GcrColumn — Column information for selector or model. +
+
+GcrComboSelector — A selector widget to select a single certificate or key. +
+
+GcrImportButton — Button which imports parsed certificates and keys +
+
+GcrListSelector — A selector widget to one or more certificates from a list. +
+
+GcrTreeSelector — A selector widget to select certificates or keys. +
+
+GcrRenderer — An interface implemented by renderers. +
+
+GcrViewer — A viewer which can hold renderers +
+
+GcrViewerWidget — A widget which shows certificates or keys +
+
Widget Gallery
+
+
IV. Prompting
+
+
+GcrPrompt — a user prompt +
+
+GcrPromptDialog — a GTK+ dialog prompt +
+
+GcrSystemPrompt — a system modal prompt +
+
+GcrSystemPrompter — a prompter which displays system prompts +
+
+GcrSshAskpass — Allows an ssh command to callback for a password +
+
+
V. Storage
+
+
+Trust Storage and Lookups — Store and lookup bits of information used for +verifying certificates. +
+
+GcrImporter — Import certificates and keys +
+
+GcrImportInteraction — User interaction during importing +
+
+GcrParser — Parser for certificate and key files +
+
+
VI. Miscellaneous
+
+
+Library Utilities — Library utilities such as version checks +
+
+Library PKCS#11 — functions for manipulating GCR library global settings. +
+
+Key Fingerprints — Fingerprints for public and private keys +
+
+GcrSecretExchange — Exchange secrets between processes in an unexposed way. +
+
+Non-pageable Memory — Secure non-pageable memory +
+
+GcrSecureEntryBuffer — a GtkEntryBuffer that uses non-pageable memory +
+
+
Annotation Glossary
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/key-widget.png b/docs/reference/gcr/html/key-widget.png new file mode 100644 index 0000000..db3a371 Binary files /dev/null and b/docs/reference/gcr/html/key-widget.png differ diff --git a/docs/reference/gcr/html/left-insensitive.png b/docs/reference/gcr/html/left-insensitive.png new file mode 100644 index 0000000..3269393 Binary files /dev/null and b/docs/reference/gcr/html/left-insensitive.png differ diff --git a/docs/reference/gcr/html/left.png b/docs/reference/gcr/html/left.png new file mode 100644 index 0000000..2abde03 Binary files /dev/null and b/docs/reference/gcr/html/left.png differ diff --git a/docs/reference/gcr/html/list-selector.png b/docs/reference/gcr/html/list-selector.png new file mode 100644 index 0000000..7f9c688 Binary files /dev/null and b/docs/reference/gcr/html/list-selector.png differ diff --git a/docs/reference/gcr/html/misc.html b/docs/reference/gcr/html/misc.html new file mode 100644 index 0000000..839ea6b --- /dev/null +++ b/docs/reference/gcr/html/misc.html @@ -0,0 +1,52 @@ + + + + +Part VI. Miscellaneous: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+

+Part VI. Miscellaneous

+
+

Table of Contents

+
+
+Library Utilities — Library utilities such as version checks +
+
+Library PKCS#11 — functions for manipulating GCR library global settings. +
+
+Key Fingerprints — Fingerprints for public and private keys +
+
+GcrSecretExchange — Exchange secrets between processes in an unexposed way. +
+
+Non-pageable Memory — Secure non-pageable memory +
+
+GcrSecureEntryBuffer — a GtkEntryBuffer that uses non-pageable memory +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/prompts.html b/docs/reference/gcr/html/prompts.html new file mode 100644 index 0000000..8e21f4f --- /dev/null +++ b/docs/reference/gcr/html/prompts.html @@ -0,0 +1,49 @@ + + + + +Part IV. Prompting: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+

+Part IV. Prompting

+
+

Table of Contents

+
+
+GcrPrompt — a user prompt +
+
+GcrPromptDialog — a GTK+ dialog prompt +
+
+GcrSystemPrompt — a system modal prompt +
+
+GcrSystemPrompter — a prompter which displays system prompts +
+
+GcrSshAskpass — Allows an ssh command to callback for a password +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/right-insensitive.png b/docs/reference/gcr/html/right-insensitive.png new file mode 100644 index 0000000..4c95785 Binary files /dev/null and b/docs/reference/gcr/html/right-insensitive.png differ diff --git a/docs/reference/gcr/html/right.png b/docs/reference/gcr/html/right.png new file mode 100644 index 0000000..76260ec Binary files /dev/null and b/docs/reference/gcr/html/right.png differ diff --git a/docs/reference/gcr/html/storage.html b/docs/reference/gcr/html/storage.html new file mode 100644 index 0000000..50d337b --- /dev/null +++ b/docs/reference/gcr/html/storage.html @@ -0,0 +1,47 @@ + + + + +Part V. Storage: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+

+Part V. Storage

+
+

Table of Contents

+
+
+Trust Storage and Lookups — Store and lookup bits of information used for +verifying certificates. +
+
+GcrImporter — Import certificates and keys +
+
+GcrImportInteraction — User interaction during importing +
+
+GcrParser — Parser for certificate and key files +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/html/style.css b/docs/reference/gcr/html/style.css new file mode 100644 index 0000000..4be4ede --- /dev/null +++ b/docs/reference/gcr/html/style.css @@ -0,0 +1,483 @@ +body +{ + font-family: cantarell, sans-serif; +} +.synopsis, .classsynopsis +{ + /* tango:aluminium 1/2 */ + background: #eeeeec; + background: rgba(238, 238, 236, 0.5); + border: solid 1px rgb(238, 238, 236); + padding: 0.5em; +} +.programlisting +{ + /* tango:sky blue 0/1 */ + /* fallback for no rgba support */ + background: #e6f3ff; + border: solid 1px #729fcf; + background: rgba(114, 159, 207, 0.1); + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0.5em; +} +.variablelist +{ + padding: 4px; + margin-left: 3em; +} +.variablelist td:first-child +{ + vertical-align: top; +} + +span.nowrap { + white-space: nowrap; +} + +div.gallery-float +{ + float: left; + padding: 10px; +} +div.gallery-float img +{ + border-style: none; +} +div.gallery-spacer +{ + clear: both; +} + +a, a:visited +{ + text-decoration: none; + /* tango:sky blue 2 */ + color: #3465a4; +} +a:hover +{ + text-decoration: underline; + /* tango:sky blue 1 */ + color: #729fcf; +} + +div.informaltable table +{ + border-collapse: separate; + border-spacing: 1em 0.3em; + border: none; +} + +div.informaltable table td, div.informaltable table th +{ + vertical-align: top; +} + +.function_type, +.variable_type, +.property_type, +.signal_type, +.parameter_name, +.struct_member_name, +.union_member_name, +.define_keyword, +.datatype_keyword, +.typedef_keyword +{ + text-align: right; +} + +/* dim non-primary columns */ +.c_punctuation, +.function_type, +.variable_type, +.property_type, +.signal_type, +.define_keyword, +.datatype_keyword, +.typedef_keyword, +.property_flags, +.signal_flags, +.parameter_annotations, +.enum_member_annotations, +.struct_member_annotations, +.union_member_annotations +{ + color: #888a85; +} + +.function_type a, +.function_type a:visited, +.function_type a:hover, +.property_type a, +.property_type a:visited, +.property_type a:hover, +.signal_type a, +.signal_type a:visited, +.signal_type a:hover, +.signal_flags a, +.signal_flags a:visited, +.signal_flags a:hover +{ + color: #729fcf; +} + +td p +{ + margin: 0.25em; +} + +div.table table +{ + border-collapse: collapse; + border-spacing: 0px; + /* tango:aluminium 3 */ + border: solid 1px #babdb6; +} + +div.table table td, div.table table th +{ + /* tango:aluminium 3 */ + border: solid 1px #babdb6; + padding: 3px; + vertical-align: top; +} + +div.table table th +{ + /* tango:aluminium 2 */ + background-color: #d3d7cf; +} + +h4 +{ + color: #555753; + margin-top: 1em; + margin-bottom: 1em; +} + +hr +{ + /* tango:aluminium 1 */ + color: #d3d7cf; + background: #d3d7cf; + border: none 0px; + height: 1px; + clear: both; + margin: 2.0em 0em 2.0em 0em; +} + +dl.toc dt +{ + padding-bottom: 0.25em; +} + +dl.toc > dt +{ + padding-top: 0.25em; + padding-bottom: 0.25em; + font-weight: bold; +} + +dl.toc > dl +{ + padding-bottom: 0.5em; +} + +.parameter +{ + font-style: normal; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.informalfigure, +.figure +{ + margin: 1em; +} + +.informalexample, +.example +{ + margin-top: 1em; + margin-bottom: 1em; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + background: rgba(252, 175, 62, 0.1); + border-color: #ffb04f; + border-color: rgba(252, 175, 62, 0.2); +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + background: rgba(138, 226, 52, 0.1); + border-color: #abf562; + border-color: rgba(138, 226, 52, 0.2); +} +div.blockquote +{ + border-color: #eeeeec; +} +.note, .warning, div.blockquote +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; + margin: 2em; +} +.note p, .warning p +{ + margin: 0; +} + +div.warning h3.title, +div.note h3.title +{ + display: none; +} + +p + div.section +{ + margin-top: 1em; +} + +div.refnamediv, +div.refsynopsisdiv, +div.refsect1, +div.refsect2, +div.toc, +div.section +{ + margin-bottom: 1em; +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.lineart +{ + color: #d3d7cf; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-weight: normal; +} + +.structfield +{ + font-style: normal; + font-weight: normal; +} + +acronym,abbr +{ + border-bottom: 1px dotted gray; +} + +/* code listings */ + +.listing_code .programlisting .normal, +.listing_code .programlisting .normal a, +.listing_code .programlisting .number, +.listing_code .programlisting .cbracket, +.listing_code .programlisting .symbol { color: #555753; } +.listing_code .programlisting .comment, +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .function, +.listing_code .programlisting .function a, +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #ad7fa8; } /* tango: plum */ +.listing_code .programlisting .keyword, +.listing_code .programlisting .usertype, +.listing_code .programlisting .type, +.listing_code .programlisting .type a { color: #4e9a06; } /* tango: chameleon 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + background: rgba(114, 159, 207, 0.2); + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; + background: rgba(114, 159, 207, 0.1); +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; + background: none; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} + +@media screen { + /* these have a as a first child, but since there are no parent selectors + * we can't use that. */ + a.footnote + { + position: relative; + top: 0em ! important; + } + /* this is needed so that the local anchors are displayed below the naviagtion */ + div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] + { + display: inline-block; + position: relative; + top:-5em; + } + /* this seems to be a bug in the xsl style sheets when generating indexes */ + div.index div.index + { + top: 0em; + } + /* make space for the fixed navigation bar and add space at the bottom so that + * link targets appear somewhat close to top + */ + body + { + padding-top: 2.5em; + padding-bottom: 500px; + max-width: 60em; + } + p + { + max-width: 60em; + } + /* style and size the navigation bar */ + table.navigation#top + { + position: fixed; + background: #e2e2e2; + border-bottom: solid 1px #babdb6; + border-spacing: 5px; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + z-index: 10; + } + table.navigation#top td + { + padding-left: 6px; + padding-right: 6px; + } + .navigation a, .navigation a:visited + { + /* tango:sky blue 3 */ + color: #204a87; + } + .navigation a:hover + { + /* tango:sky blue 2 */ + color: #3465a4; + } + td.shortcuts + { + /* tango:sky blue 2 */ + color: #3465a4; + font-size: 80%; + white-space: nowrap; + } + td.shortcuts .dim + { + color: #babdb6; + } + .navigation .title + { + font-size: 80%; + max-width: none; + margin: 0px; + font-weight: normal; + } +} +@media screen and (min-width: 60em) { + /* screen larger than 60em */ + body { margin: auto; } +} +@media screen and (max-width: 60em) { + /* screen less than 60em */ + #nav_hierarchy { display: none; } + #nav_interfaces { display: none; } + #nav_prerequisites { display: none; } + #nav_derived_interfaces { display: none; } + #nav_implementations { display: none; } + #nav_child_properties { display: none; } + #nav_style_properties { display: none; } + #nav_index { display: none; } + #nav_glossary { display: none; } + .gallery_image { display: none; } + .property_flags { display: none; } + .signal_flags { display: none; } + .parameter_annotations { display: none; } + .enum_member_annotations { display: none; } + .struct_member_annotations { display: none; } + .union_member_annotations { display: none; } + /* now that a column is hidden, optimize space */ + col.parameters_name { width: auto; } + col.parameters_description { width: auto; } + col.struct_members_name { width: auto; } + col.struct_members_description { width: auto; } + col.enum_members_name { width: auto; } + col.enum_members_description { width: auto; } + col.union_members_name { width: auto; } + col.union_members_description { width: auto; } + .listing_lines { display: none; } +} +@media print { + table.navigation { + visibility: collapse; + display: none; + } + div.titlepage table.navigation { + visibility: visible; + display: table; + background: #e2e2e2; + border: solid 1px #babdb6; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + } +} + diff --git a/docs/reference/gcr/html/tree-selector.png b/docs/reference/gcr/html/tree-selector.png new file mode 100644 index 0000000..7bcd1a1 Binary files /dev/null and b/docs/reference/gcr/html/tree-selector.png differ diff --git a/docs/reference/gcr/html/up-insensitive.png b/docs/reference/gcr/html/up-insensitive.png new file mode 100644 index 0000000..f404986 Binary files /dev/null and b/docs/reference/gcr/html/up-insensitive.png differ diff --git a/docs/reference/gcr/html/up.png b/docs/reference/gcr/html/up.png new file mode 100644 index 0000000..80b4b37 Binary files /dev/null and b/docs/reference/gcr/html/up.png differ diff --git a/docs/reference/gcr/html/viewer-widget.png b/docs/reference/gcr/html/viewer-widget.png new file mode 100644 index 0000000..1933e04 Binary files /dev/null and b/docs/reference/gcr/html/viewer-widget.png differ diff --git a/docs/reference/gcr/html/widgets.html b/docs/reference/gcr/html/widgets.html new file mode 100644 index 0000000..73d89ee --- /dev/null +++ b/docs/reference/gcr/html/widgets.html @@ -0,0 +1,65 @@ + + + + +Part III. Widgets: Gcr Library Reference Manual + + + + + + + + + + + + + + + + +
+

+Part III. Widgets

+
+

Table of Contents

+
+
+GcrCertificateWidget — Certificate widget and renderer +
+
+GcrKeyWidget — Key widget and renderer +
+
+GcrColumn — Column information for selector or model. +
+
+GcrComboSelector — A selector widget to select a single certificate or key. +
+
+GcrImportButton — Button which imports parsed certificates and keys +
+
+GcrListSelector — A selector widget to one or more certificates from a list. +
+
+GcrTreeSelector — A selector widget to select certificates or keys. +
+
+GcrRenderer — An interface implemented by renderers. +
+
+GcrViewer — A viewer which can hold renderers +
+
+GcrViewerWidget — A widget which shows certificates or keys +
+
Widget Gallery
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gcr/images/certificate-widget.png b/docs/reference/gcr/images/certificate-widget.png new file mode 100644 index 0000000..e3c9158 Binary files /dev/null and b/docs/reference/gcr/images/certificate-widget.png differ diff --git a/docs/reference/gcr/images/combo-selector.png b/docs/reference/gcr/images/combo-selector.png new file mode 100644 index 0000000..073f483 Binary files /dev/null and b/docs/reference/gcr/images/combo-selector.png differ diff --git a/docs/reference/gcr/images/import-button.png b/docs/reference/gcr/images/import-button.png new file mode 100644 index 0000000..9166bb8 Binary files /dev/null and b/docs/reference/gcr/images/import-button.png differ diff --git a/docs/reference/gcr/images/key-widget.png b/docs/reference/gcr/images/key-widget.png new file mode 100644 index 0000000..db3a371 Binary files /dev/null and b/docs/reference/gcr/images/key-widget.png differ diff --git a/docs/reference/gcr/images/list-selector.png b/docs/reference/gcr/images/list-selector.png new file mode 100644 index 0000000..7f9c688 Binary files /dev/null and b/docs/reference/gcr/images/list-selector.png differ diff --git a/docs/reference/gcr/images/tree-selector.png b/docs/reference/gcr/images/tree-selector.png new file mode 100644 index 0000000..7bcd1a1 Binary files /dev/null and b/docs/reference/gcr/images/tree-selector.png differ diff --git a/docs/reference/gcr/images/viewer-widget.png b/docs/reference/gcr/images/viewer-widget.png new file mode 100644 index 0000000..1933e04 Binary files /dev/null and b/docs/reference/gcr/images/viewer-widget.png differ diff --git a/docs/reference/gcr/version.xml.in b/docs/reference/gcr/version.xml.in new file mode 100644 index 0000000..27323da --- /dev/null +++ b/docs/reference/gcr/version.xml.in @@ -0,0 +1 @@ +@VERSION@ \ No newline at end of file diff --git a/egg/Makefile.am b/egg/Makefile.am new file mode 100644 index 0000000..b4b8c3b --- /dev/null +++ b/egg/Makefile.am @@ -0,0 +1,152 @@ +# included in top-level Makefile.am + +noinst_LTLIBRARIES += \ + libegg.la \ + libegg-asn1x.la \ + libegg-hex.la \ + libegg-secmem.la \ + libegg-test.la + +libegg_la_CFLAGS = \ + $(GLIB_CFLAGS) \ + $(LIBGCRYPT_CFLAGS) + +libegg_la_LIBADD = \ + $(GLIB_LIBS) \ + $(LIBGCRYPT_LIBS) + +libegg_la_SOURCES = \ + egg/egg-armor.c egg/egg-armor.h \ + egg/egg-asn1x.c egg/egg-asn1x.h \ + egg/egg-asn1-defs.c egg/egg-asn1-defs.h \ + egg/egg-buffer.c egg/egg-buffer.h \ + egg/egg-dh.c egg/egg-dh.h \ + egg/egg-dn.c egg/egg-dn.h \ + egg/egg-error.h \ + egg/egg-decimal.c egg/egg-decimal.h \ + egg/egg-hex.c egg/egg-hex.h \ + egg/egg-hkdf.c egg/egg-hkdf.h \ + egg/egg-libgcrypt.c egg/egg-libgcrypt.h \ + egg/egg-oid.c egg/egg-oid.h \ + egg/egg-padding.c egg/egg-padding.h \ + egg/egg-openssl.c egg/egg-openssl.h \ + egg/egg-secure-memory.c egg/egg-secure-memory.h \ + egg/egg-symkey.c egg/egg-symkey.h \ + egg/egg-testing.c egg/egg-testing.h \ + egg/egg-timegm.c egg/egg-timegm.h \ + egg/pk.asn.h egg/pkix.asn.h \ + $(NULL) + +# -------------------------------------------------------------------- +# COMMON STUFF COMPILED INTO SMALLER COMPONENTS + +libegg_asn1x_la_SOURCES = \ + egg/egg-asn1x.c egg/egg-asn1x.h + +libegg_asn1x_la_CFLAGS = \ + $(GLIB_CFLAGS) + +libegg_hex_la_SOURCES = \ + egg/egg-hex.c egg/egg-hex.h + +libegg_hex_la_CFLAGS = \ + $(GLIB_CFLAGS) + +libegg_hex_la_LIBADD = \ + $(GLIB_LIBS) + +libegg_secmem_la_SOURCES = \ + egg/egg-secure-memory.c egg/egg-secure-memory.h + +libegg_test_la_SOURCES = \ + egg/egg-testing.c egg/egg-testing.h \ + egg/mock-interaction.c egg/mock-interaction.h + +libegg_test_la_CFLAGS = \ + $(GLIB_CFLAGS) + +libegg_test_la_LIBADD = \ + $(GLIB_LIBS) + +# ------------------------------------------------------------------- + +egg_LDADD = \ + libegg.la \ + $(LIBGCRYPT_LIBS) \ + $(GLIB_LIBS) + +egg_TESTS = \ + test-asn1 \ + test-asn1x \ + test-dn \ + test-decimal \ + test-hex \ + test-hkdf \ + test-oid \ + test-secmem \ + test-padding \ + test-symkey \ + test-armor \ + test-openssl \ + test-dh + +test_armor_SOURCES = egg/test-armor.c +test_armor_LDADD = $(egg_LDADD) + +test_asn1_SOURCES = egg/test-asn1.c egg/test.asn.h +test_asn1_LDADD = $(egg_LDADD) + +test_asn1x_SOURCES = egg/test-asn1x.c +test_asn1x_LDADD = $(egg_LDADD) + +test_decimal_SOURCES = egg/test-decimal.c +test_decimal_LDADD = $(egg_LDADD) + +test_dh_SOURCES = egg/test-dh.c +test_dh_LDADD = $(egg_LDADD) + +test_dn_SOURCES = egg/test-dn.c +test_dn_LDADD = $(egg_LDADD) + +test_hex_SOURCES = egg/test-hex.c +test_hex_LDADD = $(egg_LDADD) + +test_hkdf_SOURCES = egg/test-hkdf.c +test_hkdf_LDADD = $(egg_LDADD) + +test_oid_SOURCES = egg/test-oid.c +test_oid_LDADD = $(egg_LDADD) + +test_openssl_SOURCES = egg/test-openssl.c +test_openssl_LDADD = $(egg_LDADD) + +test_padding_SOURCES = egg/test-padding.c +test_padding_LDADD = $(egg_LDADD) + +test_secmem_SOURCES = egg/test-secmem.c +test_secmem_LDADD = $(egg_LDADD) + +test_symkey_SOURCES = egg/test-symkey.c +test_symkey_LDADD = $(egg_LDADD) + +check_PROGRAMS += $(egg_TESTS) +TESTS += $(egg_TESTS) + +ASN_SRCS = \ + egg/pk.asn \ + egg/pkix.asn \ + egg/test.asn \ + $(NULL) + +asn: + for asn in $(ASN_SRCS); do \ + asn1Parser -o $(srcdir)/$$asn.h.tmp $(srcdir)/$$asn && \ + sed 's|#include.*|/* \0 */|' < $(srcdir)/$$asn.h.tmp > $(srcdir)/$$asn.h.tmp2 && \ + mv $(srcdir)/$$asn.h.tmp2 $(srcdir)/$$asn.h && \ + rm -f $(srcdir)/$$asn.h.tmp $(srcdir)/$$asn.h.tmp2; \ + done + +EXTRA_DIST += \ + egg/fixtures \ + $(ASN_SRCS) \ + $(NULL) diff --git a/egg/egg-armor.c b/egg/egg-armor.c new file mode 100644 index 0000000..7d1355c --- /dev/null +++ b/egg/egg-armor.c @@ -0,0 +1,414 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-openssl.c - OpenSSL compatibility functionality + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg-hex.h" +#include "egg-armor.h" +#include "egg-secure-memory.h" + +#include + +#include + +#include +#include + +/* + * Armor looks like: + * + * -----BEGIN RSA PRIVATE KEY----- + * Proc-Type: 4,ENCRYPTED + * DEK-Info: DES-EDE3-CBC,704CFFD62FBA03E9 + * + * 4AV/g0BiTeb07hzo4/Ct47HGhHEshMhBPGJ843QzuAinpZBbg3OxwPsQsLgoPhJL + * Bg6Oxyz9M4UN1Xlx6Lyo2lRT908mBP6dl/OItLsVArqAzM+e29KHQVNjV1h7xN9F + * u84tOgZftKun+ZkQUOoRvMLLu4yV4CUraks9tgyXquugGba/tbeyj2MYsC8wwSJX + * ................................................................ + * =on29 + * -----END RSA PRIVATE KEY----- + * + * The last line before END is an option OpenPGP armor checksum + */ + +EGG_SECURE_DECLARE (armor); + +#define ARMOR_SUFF "-----" +#define ARMOR_SUFF_L 5 +#define ARMOR_PREF_BEGIN "-----BEGIN " +#define ARMOR_PREF_BEGIN_L 11 +#define ARMOR_PREF_END "-----END " +#define ARMOR_PREF_END_L 9 + +static void +parse_header_lines (const gchar *hbeg, + const gchar *hend, + GHashTable **result) +{ + gchar **lines, **l; + gchar *line, *name, *value; + gchar *copy; + + copy = g_strndup (hbeg, hend - hbeg); + lines = g_strsplit (copy, "\n", 0); + g_free (copy); + + for (l = lines; l && *l; ++l) { + line = *l; + g_strstrip (line); + + /* Look for the break between name: value */ + value = strchr (line, ':'); + if (value == NULL) + continue; + + *value = 0; + value = g_strdup (value + 1); + g_strstrip (value); + + name = g_strdup (line); + g_strstrip (name); + + if (!*result) + *result = egg_armor_headers_new (); + g_hash_table_replace (*result, name, value); + } + + g_strfreev (lines); +} + +static const gchar* +armor_find_begin (const gchar *data, + gsize n_data, + GQuark *type, + const gchar **outer) +{ + const gchar *pref, *suff; + const gchar *at; + gchar *stype; + gsize len; + + /* Look for a prefix */ + pref = g_strstr_len ((gchar*)data, n_data, ARMOR_PREF_BEGIN); + if (!pref) + return NULL; + + len = n_data - ((pref - data) + ARMOR_PREF_BEGIN_L); + at = pref + ARMOR_PREF_BEGIN_L; + + /* Look for the end of that begin */ + suff = g_strstr_len ((gchar *)at, len, ARMOR_SUFF); + if (!suff) + return NULL; + + /* Make sure on the same line */ + if (memchr (pref, '\n', suff - pref)) + return NULL; + + if (outer) + *outer = pref; + + if (type) { + *type = 0; + pref += ARMOR_PREF_BEGIN_L; + g_assert (suff > pref); + stype = g_alloca (suff - pref + 1); + memcpy (stype, pref, suff - pref); + stype[suff - pref] = 0; + *type = g_quark_from_string (stype); + } + + /* The byte after this ---BEGIN--- */ + return suff + ARMOR_SUFF_L; +} + +static const gchar* +armor_find_end (const gchar *data, + gsize n_data, + GQuark type, + const gchar **outer) +{ + const gchar *stype; + const gchar *pref; + const gchar *line; + const gchar *at; + gsize len; + gsize n_type; + + /* Look for a prefix */ + pref = g_strstr_len (data, n_data, ARMOR_PREF_END); + if (!pref) + return NULL; + + len = n_data - ((pref - data) + ARMOR_PREF_END_L); + at = pref + ARMOR_PREF_END_L; + + /* Next comes the type string */ + stype = g_quark_to_string (type); + n_type = strlen (stype); + if (n_type > len || strncmp ((gchar*)at, stype, n_type) != 0) + return NULL; + + len -= n_type; + at += n_type; + + /* Next comes the suffix */ + if (ARMOR_SUFF_L > len || strncmp ((gchar *)at, ARMOR_SUFF, ARMOR_SUFF_L) != 0) + return NULL; + + /* + * Check if there's a OpenPGP style armor checksum line. OpenPGP + * does not insist that we validate this line, and is more useful + * for PGP messages, rather than the keys we usually see. + */ + line = g_strrstr_len (data, (pref - 1) - data, "\n"); + if (line && line[1] == '=') + pref = line; + + if (outer != NULL) { + at += ARMOR_SUFF_L; + if (isspace (at[0])) + at++; + *outer = at; + } + + /* The end of the data */ + return pref; +} + +static gboolean +armor_parse_block (const gchar *data, + gsize n_data, + guchar **decoded, + gsize *n_decoded, + GHashTable **headers) +{ + const gchar *x, *hbeg, *hend; + const gchar *p, *end; + gint state = 0; + guint save = 0; + + g_assert (data); + g_assert (n_data); + + g_assert (decoded); + g_assert (n_decoded); + + p = data; + end = p + n_data; + + hbeg = hend = NULL; + + /* Try and find a pair of blank lines with only white space between */ + while (hend == NULL) { + x = memchr (p, '\n', end - p); + if (!x) + break; + ++x; + while (isspace (*x)) { + /* Found a second line, with only spaces between */ + if (*x == '\n') { + hbeg = data; + hend = x; + break; + /* Found a space between two lines */ + } else { + ++x; + } + } + + /* Try next line */ + p = x; + } + + /* Headers found? */ + if (hbeg && hend) { + data = hend; + n_data = end - data; + } + + *n_decoded = (n_data * 3) / 4 + 1; + if (egg_secure_check (data)) + *decoded = egg_secure_alloc (*n_decoded); + else + *decoded = g_malloc0 (*n_decoded); + g_return_val_if_fail (*decoded, FALSE); + + *n_decoded = g_base64_decode_step (data, n_data, *decoded, &state, &save); + if (!*n_decoded) { + egg_secure_free (*decoded); + return FALSE; + } + + if (headers && hbeg && hend) + parse_header_lines (hbeg, hend, headers); + + return TRUE; +} + +GHashTable* +egg_armor_headers_new (void) +{ + return g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); +} + +guint +egg_armor_parse (GBytes *data, + EggArmorCallback callback, + gpointer user_data) +{ + const gchar *beg, *end, *at; + const gchar *outer_beg, *outer_end; + guint nfound = 0; + guchar *decoded = NULL; + gsize n_decoded = 0; + GHashTable *headers = NULL; + GBytes *dec; + GBytes *outer; + GQuark type; + gsize n_at; + + g_return_val_if_fail (data != NULL, 0); + at = g_bytes_get_data (data, &n_at); + + while (n_at > 0) { + + /* This returns the first character after the PEM BEGIN header */ + beg = armor_find_begin (at, n_at, &type, &outer_beg); + if (beg == NULL) + break; + + g_assert (type); + + /* This returns the character position before the PEM END header */ + end = armor_find_end (beg, n_at - (beg - at), type, &outer_end); + if (end == NULL) + break; + + if (beg != end) { + if (armor_parse_block (beg, end - beg, &decoded, &n_decoded, &headers)) { + g_assert (outer_end > outer_beg); + dec = g_bytes_new_with_free_func (decoded, n_decoded, + egg_secure_free, decoded); + if (callback != NULL) { + outer = g_bytes_new_with_free_func (outer_beg, outer_end - outer_beg, + (GDestroyNotify)g_bytes_unref, + g_bytes_ref (data)); + (callback) (type, dec, outer, headers, user_data); + g_bytes_unref (outer); + } + g_bytes_unref (dec); + ++nfound; + if (headers) + g_hash_table_remove_all (headers); + } + } + + /* Try for another block */ + end += ARMOR_SUFF_L; + n_at -= (const gchar*)end - (const gchar*)at; + at = end; + } + + if (headers) + g_hash_table_destroy (headers); + + return nfound; +} + +static void +append_each_header (gpointer key, gpointer value, gpointer user_data) +{ + GString *string = (GString*)user_data; + + g_string_append (string, (gchar*)key); + g_string_append (string, ": "); + g_string_append (string, (gchar*)value); + g_string_append_c (string, '\n'); +} + +guchar* +egg_armor_write (const guchar *data, + gsize n_data, + GQuark type, + GHashTable *headers, + gsize *n_result) +{ + GString *string; + gint state, save; + gsize i, length; + gsize n_prefix, estimate; + + g_return_val_if_fail (data || !n_data, NULL); + g_return_val_if_fail (type, NULL); + g_return_val_if_fail (n_result, NULL); + + string = g_string_sized_new (4096); + + /* The prefix */ + g_string_append_len (string, ARMOR_PREF_BEGIN, ARMOR_PREF_BEGIN_L); + g_string_append (string, g_quark_to_string (type)); + g_string_append_len (string, ARMOR_SUFF, ARMOR_SUFF_L); + g_string_append_c (string, '\n'); + + /* The headers */ + if (headers && g_hash_table_size (headers) > 0) { + g_hash_table_foreach (headers, append_each_header, string); + g_string_append_c (string, '\n'); + } + + /* Resize string to fit the base64 data. Algorithm from Glib reference */ + estimate = n_data * 4 / 3 + n_data * 4 / (3 * 65) + 7; + n_prefix = string->len; + g_string_set_size (string, n_prefix + estimate); + + /* The actual base64 data, without line breaks */ + state = save = 0; + length = g_base64_encode_step (data, n_data, FALSE, + string->str + n_prefix, &state, &save); + length += g_base64_encode_close (TRUE, string->str + n_prefix + length, + &state, &save); + + g_assert (length <= estimate); + g_string_set_size (string, n_prefix + length); + + /* + * OpenSSL is absolutely certain that it wants its PEM base64 + * lines to be 64 characters in length. So go through and break + * those lines up. + */ + + for (i = 64; i < length; i += 64) { + g_string_insert_c (string, n_prefix + i, '\n'); + ++length; + ++i; + } + + /* The suffix */ + g_string_append_len (string, ARMOR_PREF_END, ARMOR_PREF_END_L); + g_string_append (string, g_quark_to_string (type)); + g_string_append_len (string, ARMOR_SUFF, ARMOR_SUFF_L); + g_string_append_c (string, '\n'); + + *n_result = string->len; + return (guchar*)g_string_free (string, FALSE); +} diff --git a/egg/egg-armor.h b/egg/egg-armor.h new file mode 100644 index 0000000..c26abca --- /dev/null +++ b/egg/egg-armor.h @@ -0,0 +1,46 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-armor.h - Armor routines + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGG_ARMOR_H_ +#define EGG_ARMOR_H_ + +#include + +typedef void (*EggArmorCallback) (GQuark type, + GBytes *data, + GBytes *outer, + GHashTable *headers, + gpointer user_data); + +GHashTable* egg_armor_headers_new (void); + +guint egg_armor_parse (GBytes *data, + EggArmorCallback callback, + gpointer user_data); + +guchar* egg_armor_write (const guchar *data, + gsize n_data, + GQuark type, + GHashTable *headers, + gsize *n_result); + +#endif /* EGG_ARMOR_H_ */ diff --git a/egg/egg-asn1-defs.c b/egg/egg-asn1-defs.c new file mode 100644 index 0000000..7ee1ff3 --- /dev/null +++ b/egg/egg-asn1-defs.c @@ -0,0 +1,33 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-asn1-defs.c - ASN.1 definitions + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg-asn1-defs.h" + +#include + +typedef struct _EggAsn1xDef ASN1_ARRAY_TYPE; +typedef struct _EggAsn1xDef asn1_static_node; + +#include "pk.asn.h" +#include "pkix.asn.h" diff --git a/egg/egg-asn1-defs.h b/egg/egg-asn1-defs.h new file mode 100644 index 0000000..aeed791 --- /dev/null +++ b/egg/egg-asn1-defs.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-asn1-defs.h - ASN.1 definitions + + Copyright (C) 2010 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGG_ASN1_DEFS_H_ +#define EGG_ASN1_DEFS_H_ + +struct _EggAsn1xDef { + const char *name; + unsigned int type; + const void *value; +}; + +extern const struct _EggAsn1xDef pkix_asn1_tab[]; +extern const struct _EggAsn1xDef pk_asn1_tab[]; + +#endif /* EGG_ASN1_DEFS_H_ */ diff --git a/egg/egg-asn1x.c b/egg/egg-asn1x.c new file mode 100644 index 0000000..9e427ee --- /dev/null +++ b/egg/egg-asn1x.c @@ -0,0 +1,4784 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-asn1x.c - ASN.1/DER parse and coding routines + + Copyright (C) 2009 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +/* + * Some portions are: + * + * Copyright (C) 2004, 2006, 2008, 2009 Free Software Foundation + * Copyright (C) 2002 Fabio Fiorina + * + * This file is part of LIBTASN1. + * + * The LIBTASN1 library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + */ + +#include "config.h" + +#include "egg-asn1x.h" +#include "egg-asn1-defs.h" +#include "egg-timegm.h" + +#include +#include + +/* From libtasn1's libtasn.h */ + +enum { + ASN1_CLASS_UNIVERSAL = 0x00, + ASN1_CLASS_APPLICATION = 0x40, + ASN1_CLASS_CONTEXT_SPECIFIC = 0x80, + ASN1_CLASS_PRIVATE = 0xC0, + ASN1_CLASS_STRUCTURED = 0x20, +}; + +enum { + ASN1_TAG_BOOLEAN = 0x01, + ASN1_TAG_INTEGER = 0x02, + ASN1_TAG_SEQUENCE = 0x10, + ASN1_TAG_SET = 0x11, + ASN1_TAG_OCTET_STRING = 0x04, + ASN1_TAG_BIT_STRING = 0x03, + ASN1_TAG_UTC_TIME = 0x17, + ASN1_TAG_GENERALIZED_TIME = 0x18, + ASN1_TAG_OBJECT_ID = 0x06, + ASN1_TAG_ENUMERATED = 0x0A, + ASN1_TAG_NULL = 0x05, + ASN1_TAG_GENERAL_STRING = 0x1B, + ASN1_TAG_NUMERIC_STRING = 0x12, + ASN1_TAG_IA5_STRING = 0x16, + ASN1_TAG_TELETEX_STRING = 0x14, + ASN1_TAG_PRINTABLE_STRING = 0x13, + ASN1_TAG_UNIVERSAL_STRING = 0x1C, + ASN1_TAG_BMP_STRING = 0x1E, + ASN1_TAG_UTF8_STRING = 0x0C, + ASN1_TAG_VISIBLE_STRING = 0x1A, +}; + +/* From libtasn1's int.h */ + +enum { + FLAG_UNIVERSAL = (1<<8), + FLAG_PRIVATE = (1<<9), + FLAG_APPLICATION = (1<<10), + FLAG_EXPLICIT = (1<<11), + FLAG_IMPLICIT = (1<<12), + FLAG_TAG = (1<<13), + FLAG_OPTION = (1<<14), + FLAG_DEFAULT = (1<<15), + FLAG_TRUE = (1<<16), + FLAG_FALSE = (1<<17), + FLAG_LIST = (1<<18), + FLAG_MIN_MAX = (1<<19), + FLAG_1_PARAM = (1<<20), + FLAG_SIZE = (1<<21), + FLAG_DEFINED_BY = (1<<22), + FLAG_GENERALIZED = (1<<23), + FLAG_UTC = (1<<24), + FLAG_IMPORTS = (1<<25), + FLAG_NOT_USED = (1<<26), + FLAG_SET = (1<<27), + FLAG_ASSIGN = (1<<28), + FLAG_DOWN = (1<<29), + FLAG_RIGHT = (1<<30), +}; + +typedef struct _Atlv Atlv; +typedef struct _Anode Anode; + +struct _Atlv { + guchar cls; + gulong tag; + gint off; + gint len; + + /* An actual value here */ + GBytes *value; + + /* Reference to what was decoded */ + GBytes *decoded; + + /* Chain this into a tree */ + struct _Atlv *child; + struct _Atlv *next; + + /* Used during encoding */ + + /* Encoding: for bitstring, the number of empty bits at end */ + guint bits_empty : 3; + + /* Encoding: tell us whether we're dealing with a bit string */ + guint prefix_for_bit_string : 1; + + /* Encoding: prefix a zero byte for unsigned integers */ + guint prefix_with_zero_byte : 1; + + /* Encoding: sort children of this tlv (ie: SETOF) */ + guint sorted : 1; +}; + +struct _Anode { + const EggAsn1xDef *def; + const EggAsn1xDef *join; + GList *opts; + + GBytes *value; + Atlv *parsed; + + gchar* failure; + + /* If this node was chosen out of a choice */ + guint chosen : 1; + + /* For bitstring the number of empty bits */ + guint bits_empty : 3; + + /* Whether we need to prefix a zero byte to make unsigned */ + guint guarantee_unsigned : 1; +}; + +/* Forward Declarations */ +static gboolean anode_decode_anything (GNode *, Atlv *); +static gboolean anode_decode_one (GNode *, Atlv *); +static GBytes * anode_default_boolean (GNode *node); +static GBytes * anode_default_integer (GNode *node); +static gboolean anode_validate_anything (GNode *, gboolean); +static Atlv * anode_build_anything (GNode*, gboolean want); + +static gint +atoin (const char *p, gint digits) +{ + gint ret = 0, base = 1; + while(--digits >= 0) { + if (p[digits] < '0' || p[digits] > '9') + return -1; + ret += (p[digits] - '0') * base; + base *= 10; + } + return ret; +} + +static const guchar * +bytes_get_end (GBytes *data) +{ + const guchar *beg; + gsize size; + beg = g_bytes_get_data (data, &size); + return beg + size; +} + +typedef struct { + EggAllocator allocator; + gpointer allocated; +} AllocatorClosure; + +static void +allocator_closure_free (gpointer data) +{ + AllocatorClosure *closure = data; + g_assert (closure->allocator); + (closure->allocator) (closure->allocated, 0); + g_slice_free (AllocatorClosure, closure); +} + +static GBytes * +bytes_new_with_allocator (EggAllocator allocator, + guchar **data, + gsize length) +{ + AllocatorClosure *closure; + + if (allocator == g_realloc) + allocator = NULL; + + if (allocator) { + *data = (allocator) (NULL, length + 1); + g_return_val_if_fail (*data != NULL, NULL); + closure = g_slice_new (AllocatorClosure); + closure->allocated = *data; + closure->allocator = allocator; + return g_bytes_new_with_free_func (*data, length, + allocator_closure_free, + closure); + } else { + *data = g_malloc (length); + return g_bytes_new_take (*data, length); + } +} + +static GNode* +anode_new (const EggAsn1xDef *def) +{ + Anode *an = g_slice_new0 (Anode); + an->def = def; + return g_node_new (an); +} + +static gpointer +anode_copy_func (gconstpointer src, gpointer unused) +{ + const Anode *san = src; + Anode *an = g_slice_new0 (Anode); + an->def = san->def; + an->join = san->join; + an->opts = g_list_copy (san->opts); + return an; +} + +static GNode* +anode_clone (GNode *node) +{ + return g_node_copy_deep (node, anode_copy_func, NULL); +} + +static int +anode_def_type (GNode *node) +{ + Anode *an = node->data; + gint type = an->join ? an->join->type : an->def->type; + return type & 0xFF; +} + +static gboolean +anode_def_type_is_real (GNode *node) +{ + switch (anode_def_type (node)) { + case EGG_ASN1X_INTEGER: + case EGG_ASN1X_BOOLEAN: + case EGG_ASN1X_BIT_STRING: + case EGG_ASN1X_OCTET_STRING: + case EGG_ASN1X_OBJECT_ID: + case EGG_ASN1X_TIME: + case EGG_ASN1X_UTC_TIME: + case EGG_ASN1X_GENERALIZED_TIME: + case EGG_ASN1X_NULL: + case EGG_ASN1X_ENUMERATED: + case EGG_ASN1X_GENERAL_STRING: + case EGG_ASN1X_NUMERIC_STRING: + case EGG_ASN1X_IA5_STRING: + case EGG_ASN1X_TELETEX_STRING: + case EGG_ASN1X_PRINTABLE_STRING: + case EGG_ASN1X_UNIVERSAL_STRING: + case EGG_ASN1X_BMP_STRING: + case EGG_ASN1X_UTF8_STRING: + case EGG_ASN1X_VISIBLE_STRING: + return TRUE; + case EGG_ASN1X_SEQUENCE: + case EGG_ASN1X_SEQUENCE_OF: + case EGG_ASN1X_ANY: + case EGG_ASN1X_SET: + case EGG_ASN1X_SET_OF: + case EGG_ASN1X_CHOICE: + return TRUE; + case EGG_ASN1X_CONSTANT: + case EGG_ASN1X_IDENTIFIER: + case EGG_ASN1X_TAG: + case EGG_ASN1X_DEFAULT: + case EGG_ASN1X_SIZE: + case EGG_ASN1X_DEFINITIONS: + case EGG_ASN1X_IMPORTS: + return FALSE; + } + + g_return_val_if_reached (FALSE); +} + +static int +anode_def_flags (GNode *node) +{ + Anode *an = node->data; + gint type = an->def->type; + if (an->join) + type |= an->join->type; + return type & 0xFFFFFF00; +} + +static const gchar* +anode_def_name (GNode *node) +{ + Anode *an = node->data; + return an->def->name; +} + +static const gchar* +anode_def_value (GNode *node) +{ + Anode *an = node->data; + return an->def->value; +} + +static gulong +anode_def_value_as_ulong (const EggAsn1xDef *def) +{ + gchar *end = NULL; + gulong lval; + + g_return_val_if_fail (def->value, G_MAXULONG); + lval = strtoul (def->value, &end, 10); + g_return_val_if_fail (end && !end[0], G_MAXULONG); + return lval; +} + +static GNode* +anode_child_with_name (GNode *node, const gchar *name) +{ + GNode *child; + + for (child = node->children; child; child = child->next) { + if (g_str_equal (name, anode_def_name (child))) + return child; + } + + return NULL; +} + +static void +anode_opt_add (GNode *node, + const EggAsn1xDef *def) +{ + Anode *an = node->data; + an->opts = g_list_append (an->opts, (gpointer)def); +} + +static EggAsn1xDef * +anode_opt_lookup (GNode *node, + gint type, + const gchar *name) +{ + Anode *an = node->data; + EggAsn1xDef *def; + GList *l; + + for (l = an->opts; l; l = g_list_next (l)) { + def = l->data; + if (name && def->name && !g_str_equal (name, def->name)) + continue; + if ((def->type & 0xFF) == type) + return def; + } + + return NULL; +} + +static EggAsn1xDef * +anode_opt_lookup_value (GNode *node, + gint type, + const gchar *value) +{ + Anode *an = node->data; + EggAsn1xDef *def; + GList *l; + + for (l = an->opts; l; l = g_list_next (l)) { + def = l->data; + if (value && def->value && !g_str_equal (value, def->value)) + continue; + if ((def->type & 0xFF) == type) + return def; + } + + return NULL; +} + +static GList* +anode_opts_lookup (GNode *node, gint type, const gchar *name) +{ + Anode *an = node->data; + EggAsn1xDef *def; + GList *l, *res = NULL; + + for (l = an->opts; l; l = g_list_next (l)) { + def = l->data; + if (name && def->name && !g_str_equal (name, def->name)) + continue; + if ((def->type & 0xFF) == type) + res = g_list_prepend (res, def); + } + + return g_list_reverse (res); +} + +static Atlv * +atlv_new (void) +{ + return g_slice_new0 (Atlv); +} + +static void +atlv_free (Atlv *tlv) +{ + if (!tlv) + return; + + /* Free attached TLVs */ + atlv_free (tlv->child); + atlv_free (tlv->next); + + /* Free the TLV */ + if (tlv->decoded) + g_bytes_unref (tlv->decoded); + if (tlv->value) + g_bytes_unref (tlv->value); + + g_slice_free (Atlv, tlv); +} + +static Atlv * +atlv_dup (Atlv *tlv, + gboolean siblings) +{ + Atlv *copy; + + if (!tlv) + return NULL; + + copy = g_slice_new0 (Atlv); + memcpy (copy, tlv, sizeof (Atlv)); + + if (tlv->value != NULL) + copy->value = g_bytes_ref (tlv->value); + if (tlv->decoded != NULL) + copy->decoded = g_bytes_ref (tlv->decoded); + + copy->child = atlv_dup (tlv->child, TRUE); + if (siblings) + copy->next = atlv_dup (tlv->next, TRUE); + else + copy->next = NULL; + + return copy; +} + +static inline GBytes * +anode_get_value (GNode *node) +{ + Anode *an = node->data; + return an->value; +} + +static inline void +anode_clr_value (GNode *node) +{ + Anode *an = node->data; + if (an->value) + g_bytes_unref (an->value); + an->value = NULL; + + atlv_free (an->parsed); + an->parsed = NULL; +} + +static inline void +anode_take_value (GNode *node, + GBytes *value) +{ + Anode *an = node->data; + anode_clr_value (node); + an->value = value; +} + +static inline void +anode_set_value (GNode *node, + GBytes *value) +{ + anode_take_value (node, g_bytes_ref (value)); +} + +static inline Atlv * +anode_get_parsed (GNode *node) +{ + Anode *an = node->data; + return an->parsed; +} + +static gboolean +anode_failure (GNode *node, const gchar *failure) +{ + Anode *an = node->data; + const gchar *prefix = an->def->name; + if (!prefix && an->join) + prefix = an->join->name; + if (!prefix) + prefix = an->def->value; + if (!prefix && an->join) + prefix = an->join->value; + if (!prefix) + prefix = "unknown"; + + g_free (an->failure); + an->failure = g_strdup_printf ("%s: %s", prefix, failure); + g_debug ("%s %s", prefix, an->failure); + return FALSE; /* So this can be chained */ +} + +static const gchar* +anode_failure_get (GNode *node) +{ + Anode *an = node->data; + return an->failure; +} + +static void +anode_clear (GNode *node) +{ + Anode *an = node->data; + anode_clr_value (node); + g_free (an->failure); + an->failure = NULL; +} + +static gboolean +anode_free_func (GNode *node, gpointer unused) +{ + Anode *an = node->data; + anode_clear (node); + g_list_free (an->opts); + g_slice_free (Anode, an); + return FALSE; +} + +static void +anode_destroy (GNode *node) +{ + if (!G_NODE_IS_ROOT (node)) + g_node_unlink (node); + g_node_traverse (node, G_IN_ORDER, G_TRAVERSE_ALL, -1, anode_free_func, NULL); + g_node_destroy (node); +} + +static gulong +anode_calc_tag_for_flags (GNode *node, gint flags) +{ + EggAsn1xDef *def; + + /* A context specific tag */ + if (flags & FLAG_TAG) { + def = anode_opt_lookup (node, EGG_ASN1X_TAG, NULL); + g_return_val_if_fail (def, G_MAXULONG); + return anode_def_value_as_ulong (def); + } + + /* A tag from the universal set */ + switch (anode_def_type (node)) { + case EGG_ASN1X_INTEGER: + return ASN1_TAG_INTEGER; + case EGG_ASN1X_ENUMERATED: + return ASN1_TAG_ENUMERATED; + case EGG_ASN1X_BOOLEAN: + return ASN1_TAG_BOOLEAN; + case EGG_ASN1X_BIT_STRING: + return ASN1_TAG_BIT_STRING; + case EGG_ASN1X_OCTET_STRING: + return ASN1_TAG_OCTET_STRING; + case EGG_ASN1X_OBJECT_ID: + return ASN1_TAG_OBJECT_ID; + case EGG_ASN1X_NULL: + return ASN1_TAG_NULL; + case EGG_ASN1X_GENERAL_STRING: + return ASN1_TAG_GENERAL_STRING; + case EGG_ASN1X_NUMERIC_STRING: + return ASN1_TAG_NUMERIC_STRING; + case EGG_ASN1X_IA5_STRING: + return ASN1_TAG_IA5_STRING; + case EGG_ASN1X_TELETEX_STRING: + return ASN1_TAG_TELETEX_STRING; + case EGG_ASN1X_PRINTABLE_STRING: + return ASN1_TAG_PRINTABLE_STRING; + case EGG_ASN1X_UNIVERSAL_STRING: + return ASN1_TAG_UNIVERSAL_STRING; + case EGG_ASN1X_BMP_STRING: + return ASN1_TAG_BMP_STRING; + case EGG_ASN1X_UTF8_STRING: + return ASN1_TAG_UTF8_STRING; + case EGG_ASN1X_VISIBLE_STRING: + return ASN1_TAG_VISIBLE_STRING; + case EGG_ASN1X_TIME: + if (flags & FLAG_GENERALIZED) + return ASN1_TAG_GENERALIZED_TIME; + else if (flags & FLAG_UTC) + return ASN1_TAG_UTC_TIME; + else + g_return_val_if_reached (G_MAXULONG); + case EGG_ASN1X_UTC_TIME: + return ASN1_TAG_UTC_TIME; + case EGG_ASN1X_GENERALIZED_TIME: + return ASN1_TAG_GENERALIZED_TIME; + case EGG_ASN1X_SEQUENCE: + case EGG_ASN1X_SEQUENCE_OF: + return ASN1_TAG_SEQUENCE; + case EGG_ASN1X_SET: + case EGG_ASN1X_SET_OF: + return ASN1_TAG_SET; + + /* These should be handled specially */ + case EGG_ASN1X_ANY: + case EGG_ASN1X_CHOICE: + return G_MAXULONG; + + /* These are not real nodes */ + case EGG_ASN1X_CONSTANT: + case EGG_ASN1X_IDENTIFIER: + case EGG_ASN1X_TAG: + case EGG_ASN1X_DEFAULT: + case EGG_ASN1X_SIZE: + case EGG_ASN1X_DEFINITIONS: + case EGG_ASN1X_IMPORTS: + g_return_val_if_reached (G_MAXULONG); + } + + g_return_val_if_reached (G_MAXULONG); +} + +static gulong +anode_calc_tag (GNode *node) +{ + return anode_calc_tag_for_flags (node, anode_def_flags (node)); +} + +static gboolean +anode_calc_explicit_for_flags (GNode *node, + gint flags, + guchar *cls_type) +{ + const EggAsn1xDef *opt; + if ((flags & FLAG_TAG) != FLAG_TAG) + return FALSE; + opt = anode_opt_lookup (node, EGG_ASN1X_TAG, NULL); + g_return_val_if_fail (opt, FALSE); + if (cls_type) { + if (opt->type & FLAG_UNIVERSAL) + *cls_type = ASN1_CLASS_UNIVERSAL; + else if (opt->type & FLAG_APPLICATION) + *cls_type = ASN1_CLASS_APPLICATION; + else if (opt->type & FLAG_PRIVATE) + *cls_type = ASN1_CLASS_PRIVATE; + else + *cls_type = ASN1_CLASS_CONTEXT_SPECIFIC; + } + if ((opt->type & FLAG_IMPLICIT) == FLAG_IMPLICIT) + return FALSE; + return TRUE; +} + +/* ------------------------------------------------------------------------- + * PARSING + */ + +static gboolean +atlv_parse_cls_tag (const guchar *at, + const guchar *end, + guchar *cls, + gulong *tag, + gint *off) +{ + gint punt, ris, last; + gint n_data; + guchar val; + + g_assert (end >= at); + g_assert (cls != NULL); + g_assert (off != NULL); + + n_data = end - at; + + if (n_data < 2) + return FALSE; + + *cls = at[0] & 0xE0; + + /* short form */ + if ((at[0] & 0x1F) != 0x1F) { + *off = 1; + ris = at[0] & 0x1F; + + /* Long form */ + } else { + punt = 1; + ris = 0; + while (punt <= n_data) { + val = at[punt++]; + last = ris; + ris = ris * 128; + + /* wrapper around, and no bignums... */ + if (ris < last) + return FALSE; + + last = ris; + ris += (val & 0x7F); + + /* wrapper around, and no bignums... */ + if (ris < last) + return FALSE; + + if ((val & 0x7F) == val) + break; + } + + if (punt >= n_data) + return FALSE; + + *off = punt; + } + + if (tag) + *tag = ris; + + return TRUE; +} + +static gint +atlv_parse_length (const guchar *at, + const guchar *end, + gint *off) +{ + gint ans, last; + gint k, punt; + gint n_data; + + g_assert (at != NULL); + g_assert (end != NULL); + g_assert (end > at); + g_assert (off != NULL); + + *off = 0; + n_data = end - at; + + /* short form */ + if (!(at[0] & 128)) { + *off = 1; + return at[0]; + + /* Long form */ + } else { + k = at[0] & 0x7F; + punt = 1; + + /* definite length method */ + if (k) { + ans = 0; + while (punt <= k && punt < n_data) { + last = ans; + ans = ans * 256; + + /* we wrapped around, no bignum support... */ + if (ans < last) + return -2; + + last = ans; + ans += at[punt++]; + + /* we wrapped around, no bignum support... */ + if (ans < last) + return -2; + } + + /* indefinite length method */ + } else { + ans = -1; + } + + *off = punt; + return ans; + } +} + +static gboolean +atlv_parse_cls_tag_len (const guchar *at, + const guchar *end, + guchar *cls, + gulong *tag, + gint *off, + gint *len) +{ + gint cb1, cb2; + + g_assert (at != NULL); + g_assert (end != NULL); + g_assert (end >= at); + g_assert (off != NULL); + g_assert (len != NULL); + + if (!atlv_parse_cls_tag (at, end, cls, tag, &cb1)) + return FALSE; + *len = atlv_parse_length (at + cb1, end, &cb2); + if (*len < -1) + return FALSE; + *off = cb1 + cb2; + if (*len >= 0 && at + *off + *len > end) + return FALSE; + return TRUE; +} + +static const gchar * +atlv_parse_der_tag (guchar cls, + gulong tag, + gint off, + gint len, + GBytes *data, + const guchar **at, + Atlv *tlv) +{ + const guchar *end; + const gchar *ret; + const guchar *beg; + guchar ccls; + gulong ctag; + gint clen; + gint coff; + Atlv *child; + Atlv *last; + + g_assert (at != NULL); + g_assert (tlv != NULL); + + end = bytes_get_end (data); + g_assert (*at <= end); + + g_return_val_if_fail (*at + off + len <= end, "invalid length of tlv"); + if (len < 0 && !(cls & ASN1_CLASS_STRUCTURED)) + return "indefinite length on non-structured type"; + + beg = *at; + + tlv->cls = cls; + tlv->tag = tag; + tlv->off = off; + tlv->len = len; + (*at) += off; + + /* Structured TLV, with further TLVs inside */ + if (cls & ASN1_CLASS_STRUCTURED) { + /* If not indefinite length, then calculate end up front */ + if (len >= 0) + end = (*at) + len; + last = NULL; + while (*at < end) { + if (!atlv_parse_cls_tag_len (*at, end, &ccls, &ctag, &coff, &clen)) + return "content is not encoded properly"; + + /* End if indefinite length? */ + if (len < 0 && ccls == ASN1_CLASS_UNIVERSAL && ctag == 0 && clen == 0) { + (*at) += coff; + break; + } + + /* Parse the child */ + child = atlv_new (); + ret = atlv_parse_der_tag (ccls, ctag, coff, clen, data, at, child); + if (ret != NULL) { + atlv_free (child); + return ret; + } + + /* Add the child to the right place */ + if (last == NULL) + tlv->child = child; + else + last->next = child; + last = child; + } + + /* Non-structured TLV, just a value */ + } else { + tlv->value = g_bytes_new_with_free_func (*at, len, + (GDestroyNotify)g_bytes_unref, + g_bytes_ref (data)); + (*at) += len; + } + + /* Note the actual DER that we decoded */ + tlv->decoded = g_bytes_new_with_free_func (beg, *at - beg, + (GDestroyNotify)g_bytes_unref, + g_bytes_ref (data)); + + return NULL; /* Success */ +} + +static const gchar * +atlv_parse_der (GBytes *data, + Atlv *tlv) +{ + const guchar *end; + const guchar *at; + const gchar *ret; + guchar cls; + gulong tag; + gint off; + gint len; + gsize size; + + at = g_bytes_get_data (data, &size); + g_return_val_if_fail (at != NULL, FALSE); + end = at + size; + + if (!atlv_parse_cls_tag_len (at, end, &cls, &tag, &off, &len)) + return "content is not encoded properly"; + + ret = atlv_parse_der_tag (cls, tag, off, len, data, &at, tlv); + if (ret != NULL) + return ret; + + if (at != end) + return "extra unexpected trailing data"; + + return NULL; /* Success */ +} + +/* ------------------------------------------------------------------------- + * DECODING + */ + +static gboolean +anode_decode_choice (GNode *node, + Atlv *tlv) +{ + gboolean have = FALSE; + GNode *child; + Anode *an; + + for (child = node->children; child; child = child->next) { + an = (Anode*)child->data; + if (anode_decode_one (child, tlv)) { + an->chosen = 1; + have = TRUE; + } else { + an->chosen = 0; + } + } + + if (!have) + return anode_failure (node, "no choice is present"); + + return TRUE; +} + +static gboolean +anode_decode_sequence_or_set (GNode *node, + Atlv *tlv) +{ + Atlv *ctlv; + gulong tag; + gint i; + + /* + * The reason we can parse a set just like a sequence, is because in DER, + * the order of the SET is predefined by the tags. In addition the definitions + * we have are sorted. + */ + + /* Tags must be in ascending order */ + if (anode_def_type (node) == EGG_ASN1X_SET) { + for (ctlv = tlv->child, i = 0; ctlv != NULL; ctlv = ctlv->next, i++) { + if (i > 0 && tag > ctlv->tag) + return anode_failure (node, "content must be in ascending order"); + tag = ctlv->tag; + } + } + + return anode_decode_anything (node->children, tlv->child); +} + +static gboolean +anode_decode_sequence_or_set_of (GNode *node, + Atlv *tlv) +{ + Atlv *ctlv; + GNode *child, *other; + gulong tag; + gint i; + + /* The first child */ + child = node->children; + g_return_val_if_fail (child, FALSE); + + for (ctlv = tlv->child, i = 0; ctlv != NULL; ctlv = ctlv->next, i++) { + + /* Tag must have same tag as top */ + if (i == 0) + tag = anode_calc_tag (child); + else if (tag != G_MAXULONG && ctlv->tag != tag) + return anode_failure (node, "invalid mismatched content"); + + /* TODO: Set of must be in ascending order in DER encoding */ + + if (i == 0) { + other = child; + } else { + other = anode_clone (child); + g_node_append (node, other); + } + + if (!anode_decode_one (other, ctlv)) + return FALSE; + } + + return TRUE; +} + +static gboolean +anode_decode_bit_string (GNode *node, + Atlv *tlv) +{ + Anode *an = node->data; + guchar empty, mask; + GBytes *value; + const guchar *buf; + gsize len; + + buf = g_bytes_get_data (tlv->value, &len); + if (len == 0) + return anode_failure (node, "invalid length bit string"); + + /* The first byte is the number of empty bits */ + empty = buf[0]; + if (empty >= 8) + return anode_failure (node, "invalid number of empty bits"); + + /* Free bits at end must be zero */ + mask = 0xFF >> (8 - empty); + if (len > 1 && buf[len - 1] & mask) + return anode_failure (node, "bit string has invalid trailing bits"); + + value = g_bytes_new_from_bytes (tlv->value, 1, len - 1); + anode_take_value (node, value); + an = node->data; + an->bits_empty = empty; + return TRUE; +} + +static gboolean +anode_decode_primitive (GNode *node, + Atlv *tlv, + gint flags) +{ + /* Must not have any tlv children */ + g_assert (tlv->child == NULL); + + switch (anode_def_type (node)) { + + /* Handle bit strings specially */ + case EGG_ASN1X_BIT_STRING: + return anode_decode_bit_string (node, tlv); + + /* The primitive value types */ + case EGG_ASN1X_INTEGER: + case EGG_ASN1X_ENUMERATED: + case EGG_ASN1X_BOOLEAN: + case EGG_ASN1X_OCTET_STRING: + case EGG_ASN1X_OBJECT_ID: + case EGG_ASN1X_NULL: + case EGG_ASN1X_TIME: + case EGG_ASN1X_UTC_TIME: + case EGG_ASN1X_GENERALIZED_TIME: + case EGG_ASN1X_GENERAL_STRING: + case EGG_ASN1X_NUMERIC_STRING: + case EGG_ASN1X_IA5_STRING: + case EGG_ASN1X_TELETEX_STRING: + case EGG_ASN1X_PRINTABLE_STRING: + case EGG_ASN1X_UNIVERSAL_STRING: + case EGG_ASN1X_BMP_STRING: + case EGG_ASN1X_UTF8_STRING: + case EGG_ASN1X_VISIBLE_STRING: + anode_set_value (node, tlv->value); + return TRUE; + + /* Just use the 'parsed' which is automatically set */ + case EGG_ASN1X_ANY: + return TRUE; + + case EGG_ASN1X_CHOICE: + return anode_decode_choice (node, tlv); + } + + return anode_failure (node, "primitive value of an unexpected type"); /* UNREACHABLE: tag validation? */ +} + +static gboolean +anode_decode_structured (GNode *node, + Atlv *tlv, + gint flags) +{ + switch (anode_def_type (node)) { + + /* Just use the 'parsed' which is automatically set */ + case EGG_ASN1X_ANY: + case EGG_ASN1X_GENERAL_STRING: + case EGG_ASN1X_OCTET_STRING: + case EGG_ASN1X_NUMERIC_STRING: + case EGG_ASN1X_IA5_STRING: + case EGG_ASN1X_TELETEX_STRING: + case EGG_ASN1X_PRINTABLE_STRING: + case EGG_ASN1X_UNIVERSAL_STRING: + case EGG_ASN1X_BMP_STRING: + case EGG_ASN1X_UTF8_STRING: + case EGG_ASN1X_VISIBLE_STRING: + return TRUE; + + case EGG_ASN1X_CHOICE: + return anode_decode_choice (node, tlv); + + case EGG_ASN1X_SEQUENCE: + case EGG_ASN1X_SET: + return anode_decode_sequence_or_set (node, tlv); + + case EGG_ASN1X_SEQUENCE_OF: + case EGG_ASN1X_SET_OF: + return anode_decode_sequence_or_set_of (node, tlv); + + default: + return anode_failure (node, "structured value of an unexpected type"); /* UNREACHABLE: tag validation? */ + } +} + +static gboolean +anode_decode_one_without_tag (GNode *node, + Atlv *tlv, + gint flags) +{ + gboolean ret; + Anode *an; + + /* An explicit, wrapped tag */ + if (anode_calc_explicit_for_flags (node, flags, NULL)) { + if ((tlv->cls & ASN1_CLASS_CONTEXT_SPECIFIC) == 0) + return anode_failure (node, "missing context specific tag"); + if (tlv->child == NULL) + return anode_failure (node, "missing context specific child"); + if (tlv->child->next != NULL) + return anode_failure (node, "multiple context specific children"); + flags &= ~FLAG_TAG; + ret = anode_decode_one_without_tag (node, tlv->child, flags); + + /* Structured value */ + } else if (tlv->cls & ASN1_CLASS_STRUCTURED) { + ret = anode_decode_structured (node, tlv, flags); + + /* A primitive simple value */ + } else { + ret = anode_decode_primitive (node, tlv, flags); + } + + /* Mark which tlv we used for this node */ + if (ret) { + an = node->data; + atlv_free (an->parsed); + an->parsed = atlv_dup (tlv, FALSE); + } + + return ret; +} + +static gboolean +anode_decode_one (GNode *node, + Atlv *tlv) +{ + gint flags = anode_def_flags (node); + gulong tag; + + tag = anode_calc_tag_for_flags (node, flags); + + /* We don't know what the tag is supposed to be */ + if (tag == G_MAXULONG) + tag = tlv->tag; + + /* We have no match */ + if (tag != tlv->tag) + return anode_failure (node, "decoded tag did not match expected"); + + return anode_decode_one_without_tag (node, tlv, flags); +} + +static gboolean +anode_decode_option_or_default (GNode *node) +{ + gint flags = anode_def_flags (node); + + if (flags & FLAG_OPTION || flags & FLAG_DEFAULT) { + anode_clr_value (node); + return TRUE; + } + + return FALSE; +} + +static gboolean +anode_decode_anything (GNode *node, + Atlv *tlv) +{ + GNode *prev = NULL; + GNode *next; + gulong tag; + gint flags; + + g_assert (node != NULL); + + while (tlv != NULL) { + if (node == NULL) + return anode_failure (prev, "encountered extra tag"); + + flags = anode_def_flags (node); + tag = anode_calc_tag_for_flags (node, flags); + + /* We don't know what the tag is supposed to be */ + if (tag == G_MAXULONG) + tag = tlv->tag; + + /* We have no match */ + if (tag != tlv->tag) { + + /* See if we can skip this node */ + if (anode_decode_option_or_default (node)) + next = g_node_next_sibling (node); + else + next = NULL; + + if (next == NULL) + return anode_failure (node, "decoded tag did not match expected"); + + prev = node; + node = next; + continue; + } + + if (!anode_decode_one_without_tag (node, tlv, flags)) + return FALSE; + + /* Next node and tag */ + prev = node; + node = g_node_next_sibling (node); + tlv = tlv->next; + } + + /* We have no values for these nodes */ + while (node != NULL) { + if (anode_decode_option_or_default (node)) + node = g_node_next_sibling (node); + else + return anode_failure (node, "no decoded value"); + } + + return TRUE; +} + +gboolean +egg_asn1x_decode_full (GNode *asn, + GBytes *data, + gint options) +{ + const gchar *msg; + gboolean ret; + Anode *an; + Atlv *tlv; + + g_return_val_if_fail (asn != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + egg_asn1x_clear (asn); + + tlv = atlv_new (); + msg = atlv_parse_der (data, tlv); + if (msg == NULL) { + ret = anode_decode_anything (asn, tlv); + + /* A failure, set the message manually so it doesn't get a prefix */ + } else { + an = asn->data; + g_free (an->failure); + an->failure = g_strdup (msg); + ret = FALSE; + } + + atlv_free (tlv); + if (ret == FALSE) + return FALSE; + + return egg_asn1x_validate (asn, !(options & EGG_ASN1X_NO_STRICT)); +} + +gboolean +egg_asn1x_decode (GNode *asn, + GBytes *data) +{ + g_return_val_if_fail (asn != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + return egg_asn1x_decode_full (asn, data, 0); +} + +/* ----------------------------------------------------------------------------------- + * UNPARSE + */ + +static void +atlv_unparse_len (gulong len, + guchar *ans, + gint *cb) +{ + guchar temp[sizeof (gulong)]; + gint k; + + g_assert (cb); + + /* short form */ + if (len < 128) { + if (ans != NULL) + ans[0] = (unsigned char)len; + *cb = 1; + + /* Long form */ + } else { + k = 0; + while (len) { + temp[k++] = len & 0xFF; + len = len >> 8; + } + *cb = k + 1; + if (ans != NULL) { + ans[0] = ((unsigned char) k & 0x7F) + 128; + while (k--) + ans[*cb - 1 - k] = temp[k]; + } + } +} + +static gint +atlv_unparse_cls_tag_len (guchar *data, + gsize n_data, + guchar cls, + gulong tag, + gint len) +{ + guchar temp[sizeof(gulong)]; + gint cb; + gint off = 0; + gint k; + + /* Short form */ + if (tag < 31) { + off += 1; + if (data) { + g_assert (n_data >= off); + data[0] = (cls & 0xE0) + ((guchar) (tag & 0x1F)); + } + /* Long form */ + } else { + k = 0; + while (tag) { + temp[k++] = tag & 0x7F; + tag = tag >> 7; + } + off = k + 1; + if (data) { + g_assert (n_data >= off); + data[0] = (cls & 0xE0) + 31; + while (data && k--) + data[off - 1 - k] = temp[k] + 128; + data[off - 1] -= 128; + } + } + + /* And now the length */ + cb = n_data - off; + atlv_unparse_len (len, data ? data + off : NULL, &cb); + off += cb; + + g_assert (!data || n_data >= off); + return off; +} + +static void +atlv_unparse_der (Atlv *tlv, + guchar **at, + guchar *end) +{ + const guchar *exp; + const guchar *buf; + guchar *p; + guchar mask; + Atlv *ctlv; + gint off; + gsize len; + + g_assert (*at <= end); + + off = atlv_unparse_cls_tag_len (*at, end - *at, tlv->cls, + tlv->tag, tlv->len); + g_assert (off == tlv->off); + (*at) += off; + + /* Write a value */ + if (tlv->value) { + buf = g_bytes_get_data (tlv->value, &len); + p = *at; + + /* Special behavior for bit strings */ + if (tlv->prefix_for_bit_string) { + g_assert (len + 1 == tlv->len); + p[0] = (guchar)tlv->bits_empty; + memcpy (p + 1, buf, len); + + /* Set the extra bits to zero */ + if (len && tlv->bits_empty) { + mask = 0xFF >> (8 - tlv->bits_empty); + p[len] &= ~mask; + } + p += len + 1; + + /* Special behavior for prefixed integers */ + } else if (tlv->prefix_with_zero_byte) { + g_assert (len + 1 == tlv->len); + p[0] = 0; + memcpy (p + 1, buf, len); + p += len + 1; + + /* Standard behavior */ + } else { + g_assert (len == tlv->len); + memcpy (p, buf, len); + p += len; + } + + *at = p; + + /* Write a bunch of child TLV's */ + } else { + for (ctlv = tlv->child; ctlv != NULL; ctlv = ctlv->next) { + exp = *at + ctlv->len + ctlv->off; + atlv_unparse_der (ctlv, at, end); + g_assert (exp == *at); + } + } + + g_assert (*at <= end); +} + +static GBytes * +atlv_unparse_to_bytes (Atlv *tlv, + EggAllocator allocator) +{ + GBytes *bytes; + guchar *data; + guchar *at; + gint len; + + /* Allocate enough memory for entire thingy */ + len = tlv->off + tlv->len; + g_return_val_if_fail (len != 0, NULL); + + bytes = bytes_new_with_allocator (allocator, &data, len); + g_return_val_if_fail (bytes != NULL, NULL); + + at = data; + atlv_unparse_der (tlv, &at, data + len); + g_assert (at == data + len); + + return bytes; +} + +typedef struct { + GBytes *bytes; + Atlv *tlv; +} SortPair; + +static gint +compare_sort_pair (gconstpointer a, + gconstpointer b) +{ + const SortPair *sa = a; + const SortPair *sb = b; + return g_bytes_compare (sa->bytes, sb->bytes); +} + +static void +atlv_sort_perform (Atlv *tlv, + EggAllocator allocator) +{ + GList *pairs, *l; + SortPair *pair; + GBytes *bytes; + Atlv *ctlv; + Atlv *last; + gboolean sort; + + for (ctlv = tlv->child; ctlv != NULL; ctlv = ctlv->next) + atlv_sort_perform (ctlv, allocator); + + if (!tlv->sorted) + return; + + pairs = NULL; + for (ctlv = tlv->child; ctlv != NULL; ctlv = ctlv->next) { + bytes = atlv_unparse_to_bytes (ctlv, allocator); + g_return_if_fail (bytes != NULL); + + pair = g_slice_new0 (SortPair); + pair->bytes = bytes; + pair->tlv = ctlv; + pairs = g_list_prepend (pairs, pair); + } + + /* Only sort of the above unparse completed for all */ + sort = ctlv == NULL; + last = NULL; + + pairs = g_list_sort (pairs, compare_sort_pair); + for (l = pairs; l != NULL; l = g_list_next (l)) { + pair = l->data; + + /* Only if the sort completed */ + if (sort) { + if (last == NULL) + tlv->child = pair->tlv; + else + last->next = pair->tlv; + last = pair->tlv; + } + + g_bytes_unref (pair->bytes); + g_slice_free (SortPair, pair); + } + + g_list_free (pairs); +} + +static void +anode_build_cls_tag_len (GNode *node, + Atlv *tlv, + gint len) +{ + gboolean explicit = FALSE; + guchar cls_type; + gint flags; + + /* One for the prefix character */ + if (tlv->prefix_for_bit_string || + tlv->prefix_with_zero_byte) + len += 1; + + /* Figure out the basis if the class */ + switch (anode_def_type (node)) { + case EGG_ASN1X_INTEGER: + case EGG_ASN1X_BOOLEAN: + case EGG_ASN1X_BIT_STRING: + case EGG_ASN1X_OCTET_STRING: + case EGG_ASN1X_OBJECT_ID: + case EGG_ASN1X_TIME: + case EGG_ASN1X_UTC_TIME: + case EGG_ASN1X_GENERALIZED_TIME: + case EGG_ASN1X_ENUMERATED: + case EGG_ASN1X_GENERAL_STRING: + case EGG_ASN1X_NUMERIC_STRING: + case EGG_ASN1X_IA5_STRING: + case EGG_ASN1X_TELETEX_STRING: + case EGG_ASN1X_PRINTABLE_STRING: + case EGG_ASN1X_UNIVERSAL_STRING: + case EGG_ASN1X_BMP_STRING: + case EGG_ASN1X_UTF8_STRING: + case EGG_ASN1X_VISIBLE_STRING: + case EGG_ASN1X_NULL: + tlv->cls = ASN1_CLASS_UNIVERSAL; + break; + /* Container types */ + case EGG_ASN1X_SEQUENCE: + case EGG_ASN1X_SET: + case EGG_ASN1X_SEQUENCE_OF: + case EGG_ASN1X_SET_OF: + tlv->cls = (ASN1_CLASS_STRUCTURED | ASN1_CLASS_UNIVERSAL); + break; + + /* Transparent types shouldn't get here */ + case EGG_ASN1X_ANY: + case EGG_ASN1X_CHOICE: + default: + g_assert_not_reached (); + }; + + flags = anode_def_flags (node); + + /* Build up the class */ + if (flags & FLAG_TAG) { + explicit = anode_calc_explicit_for_flags (node, flags, &cls_type); + if (explicit) + flags &= ~FLAG_TAG; + else + tlv->cls |= cls_type; + } + + /* Setup the class */ + tlv->tag = anode_calc_tag_for_flags (node, flags); + + /* The offset and length */ + tlv->len = len; + tlv->off = atlv_unparse_cls_tag_len (NULL, 0, tlv->cls, tlv->tag, len); +} + +static Atlv * +anode_build_value (GNode *node) +{ + Anode *an = node->data; + Atlv *tlv; + gsize len; + + /* Fill this in based on the value */ + if (an->value == NULL) + return NULL; + + tlv = atlv_new (); + tlv->value = g_bytes_ref (an->value); + + len = g_bytes_get_size (an->value); + anode_build_cls_tag_len (node, tlv, len); + return tlv; +} + +static Atlv * +anode_build_bit_string (GNode *node) +{ + Anode *an = node->data; + Atlv *tlv; + gsize len; + + if (an->value == NULL) + return NULL; + + tlv = atlv_new (); + tlv->value = g_bytes_ref (an->value); + tlv->bits_empty = an->bits_empty; + tlv->prefix_for_bit_string = 1; + + len = g_bytes_get_size (an->value); + anode_build_cls_tag_len (node, tlv, len); + return tlv; +} + +static Atlv * +anode_build_integer (GNode *node) +{ + Anode *an = node->data; + const guchar *buf; + gboolean sign; + gsize len; + Atlv *tlv; + + if (an->value == NULL) + return NULL; + + tlv = atlv_new (); + tlv->value = g_bytes_ref (an->value); + + buf = g_bytes_get_data (an->value, &len); + if (an->guarantee_unsigned) { + + /* + * In two's complement (which DER is) this would be negative, add a zero + * byte so that it isn't. Here we just note that the result will be one + * byte longer. + */ + sign = !!(buf[0] & 0x80); + if (sign) + tlv->prefix_with_zero_byte = 1; + } + + anode_build_cls_tag_len (node, tlv, len); + return tlv; +} + +static Atlv * +anode_build_any (GNode *node) +{ + Atlv *parsed; + + /* + * Fill this in based on already parsed TLVs. It is assumed + * that any explicit tags are already present, and the functions + * for managing ANY try to enforce this. + */ + + parsed = anode_get_parsed (node); + if (parsed != NULL) + return atlv_dup (parsed, FALSE); + + return NULL; +} + +static Atlv * +anode_build_choice (GNode *node, + gboolean want) +{ + GNode *child; + + g_assert (anode_def_type (node) == EGG_ASN1X_CHOICE); + + child = egg_asn1x_get_choice (node); + + /* Should have been checked by a previous validate */ + g_return_val_if_fail (child != NULL, NULL); + + return anode_build_anything (child, want); +} + +static Atlv * +anode_build_structured (GNode *node, + gboolean want) +{ + gboolean child_want; + Atlv *last; + Atlv *ctlv; + Atlv *tlv; + GNode *child; + gint type; + gint len; + + type = anode_def_type (node); + child_want = want; + last = NULL; + len = 0; + + if (type == EGG_ASN1X_SEQUENCE_OF || type == EGG_ASN1X_SET_OF) + child_want = FALSE; + if (anode_def_flags (node) & FLAG_OPTION) + want = FALSE; + + tlv = atlv_new (); + for (child = node->children; child != NULL; child = child->next) { + ctlv = anode_build_anything (child, child_want); + if (ctlv != NULL) { + if (last == NULL) + tlv->child = ctlv; + else + last->next = ctlv; + last = ctlv; + len += ctlv->off + ctlv->len; + } + } + + if (last == NULL) { + /* See if we should encode an empty set or seq of */ + if (type == EGG_ASN1X_SEQUENCE_OF || type == EGG_ASN1X_SET_OF) { + if (!want) { + atlv_free (tlv); + return NULL; + } + } else if (!want) { + atlv_free (tlv); + return NULL; + } + } + + anode_build_cls_tag_len (node, tlv, len); + + if (type == EGG_ASN1X_SET_OF) + tlv->sorted = 1; + + return tlv; +} + +static Atlv * +anode_build_maybe_explicit (GNode *node, + Atlv *tlv, + gint flags) +{ + guchar cls_type; + Atlv *wrap; + + /* Now wrap in explicit tag if that's the case */ + if (anode_calc_explicit_for_flags (node, flags, &cls_type)) { + wrap = atlv_new (); + wrap->cls = (ASN1_CLASS_STRUCTURED | cls_type); + wrap->tag = anode_calc_tag (node); + wrap->len = tlv->off + tlv->len; + wrap->off = atlv_unparse_cls_tag_len (NULL, 0, wrap->cls, wrap->tag, wrap->len); + wrap->child = tlv; + tlv = wrap; + } + + return tlv; +} + +static Atlv * +anode_build_anything_for_flags (GNode *node, + gboolean want, + gint flags) +{ + Atlv *tlv; + + switch (anode_def_type (node)) { + case EGG_ASN1X_BIT_STRING: + tlv = anode_build_bit_string (node); + break; + case EGG_ASN1X_INTEGER: + tlv = anode_build_integer (node); + break; + case EGG_ASN1X_BOOLEAN: + case EGG_ASN1X_OCTET_STRING: + case EGG_ASN1X_OBJECT_ID: + case EGG_ASN1X_TIME: + case EGG_ASN1X_UTC_TIME: + case EGG_ASN1X_GENERALIZED_TIME: + case EGG_ASN1X_ENUMERATED: + case EGG_ASN1X_GENERAL_STRING: + case EGG_ASN1X_NUMERIC_STRING: + case EGG_ASN1X_IA5_STRING: + case EGG_ASN1X_TELETEX_STRING: + case EGG_ASN1X_PRINTABLE_STRING: + case EGG_ASN1X_UNIVERSAL_STRING: + case EGG_ASN1X_BMP_STRING: + case EGG_ASN1X_UTF8_STRING: + case EGG_ASN1X_VISIBLE_STRING: + case EGG_ASN1X_NULL: + tlv = anode_build_value (node); + break; + + /* Any should already have explicit tagging, so just return */ + case EGG_ASN1X_ANY: + return anode_build_any (node); + + case EGG_ASN1X_SEQUENCE: + case EGG_ASN1X_SEQUENCE_OF: + case EGG_ASN1X_SET: + case EGG_ASN1X_SET_OF: + tlv = anode_build_structured (node, want); + break; + + case EGG_ASN1X_CHOICE: + tlv = anode_build_choice (node, want); + break; + + default: + g_assert_not_reached (); + } + + if (tlv == NULL) + return NULL; + + /* Now wrap in explicit tag if that's the case */ + return anode_build_maybe_explicit (node, tlv, flags); +} + +static Atlv * +anode_build_anything (GNode *node, + gboolean want) +{ + return anode_build_anything_for_flags (node, want, + anode_def_flags (node)); +} + +GBytes * +egg_asn1x_encode (GNode *asn, + EggAllocator allocator) +{ + GBytes *bytes; + Atlv *tlv; + + g_return_val_if_fail (asn != NULL, NULL); + g_return_val_if_fail (anode_def_type_is_real (asn), NULL); + + if (!egg_asn1x_validate (asn, TRUE)) + return NULL; + + tlv = anode_build_anything (asn, TRUE); + + /* The above validate should cause build not to return NULL */ + g_return_val_if_fail (tlv != NULL, NULL); + + atlv_sort_perform (tlv, allocator); + + bytes = atlv_unparse_to_bytes (tlv, allocator); + atlv_free (tlv); + return bytes; +} + +/* ---------------------------------------------------------------------------- + * VALUE READ/WRITE + */ + +static int +two_to_four_digit_year (int year) +{ + time_t now; + struct tm tm; + int century, current; + + g_return_val_if_fail (year >= 0 && year <= 99, -1); + + /* Get the current year */ + now = time (NULL); + g_return_val_if_fail (now >= 0, -1); + if (!gmtime_r (&now, &tm)) + g_return_val_if_reached (-1); + + current = (tm.tm_year % 100); + century = (tm.tm_year + 1900) - current; + + /* + * Check if it's within 40 years before the + * current date. + */ + if (current < 40) { + if (year < current) + return century + year; + if (year > 100 - (40 - current)) + return (century - 100) + year; + } else { + if (year < current && year > (current - 40)) + return century + year; + } + + /* + * If it's after then adjust for overflows to + * the next century. + */ + if (year < current) + return century + 100 + year; + else + return century + year; +} + +static gboolean +parse_utc_time (const gchar *time, gsize n_time, + struct tm* when, gint *offset) +{ + const char *p, *e; + int year; + + g_assert (when); + g_assert (time); + g_assert (offset); + + /* YYMMDDhhmmss.ffff Z | +0000 */ + if (n_time < 6 || n_time >= 28) + return FALSE; + + /* Reset everything to default legal values */ + memset (when, 0, sizeof (*when)); + *offset = 0; + when->tm_mday = 1; + + /* Select the digits part of it */ + p = time; + for (e = p; *e >= '0' && *e <= '9'; ++e); + + if (p + 2 <= e) { + year = atoin (p, 2); + p += 2; + + /* + * 40 years in the past is our century. 60 years + * in the future is the next century. + */ + when->tm_year = two_to_four_digit_year (year) - 1900; + } + if (p + 2 <= e) { + when->tm_mon = atoin (p, 2) - 1; + p += 2; + } + if (p + 2 <= e) { + when->tm_mday = atoin (p, 2); + p += 2; + } + if (p + 2 <= e) { + when->tm_hour = atoin (p, 2); + p += 2; + } + if (p + 2 <= e) { + when->tm_min = atoin (p, 2); + p += 2; + } + if (p + 2 <= e) { + when->tm_sec = atoin (p, 2); + p += 2; + } + + if (when->tm_year < 0 || when->tm_year > 9999 || + when->tm_mon < 0 || when->tm_mon > 11 || + when->tm_mday < 1 || when->tm_mday > 31 || + when->tm_hour < 0 || when->tm_hour > 23 || + when->tm_min < 0 || when->tm_min > 59 || + when->tm_sec < 0 || when->tm_sec > 59) + return FALSE; + + /* Make sure all that got parsed */ + if (p != e) + return FALSE; + + /* Now the remaining optional stuff */ + e = time + n_time; + + /* See if there's a fraction, and discard it if so */ + if (p < e && *p == '.' && p + 5 <= e) + p += 5; + + /* See if it's UTC */ + if (p < e && *p == 'Z') { + p += 1; + + /* See if it has a timezone */ + } else if ((*p == '-' || *p == '+') && p + 3 <= e) { + int off, neg; + + neg = *p == '-'; + ++p; + + off = atoin (p, 2) * 3600; + if (off < 0 || off > 86400) + return -1; + p += 2; + + if (p + 2 <= e) { + off += atoin (p, 2) * 60; + p += 2; + } + + /* Use TZ offset */ + if (neg) + *offset = 0 - off; + else + *offset = off; + } + + /* Make sure everything got parsed */ + if (p != e) + return FALSE; + + return TRUE; +} + +static gboolean +parse_general_time (const gchar *time, gsize n_time, + struct tm* when, gint *offset) +{ + const char *p, *e; + + g_assert (time); + g_assert (when); + g_assert (offset); + + /* YYYYMMDDhhmmss.ffff Z | +0000 */ + if (n_time < 8 || n_time >= 30) + return FALSE; + + /* Reset everything to default legal values */ + memset (when, 0, sizeof (*when)); + *offset = 0; + when->tm_mday = 1; + + /* Select the digits part of it */ + p = time; + for (e = p; *e >= '0' && *e <= '9'; ++e); + + if (p + 4 <= e) { + when->tm_year = atoin (p, 4) - 1900; + p += 4; + } + if (p + 2 <= e) { + when->tm_mon = atoin (p, 2) - 1; + p += 2; + } + if (p + 2 <= e) { + when->tm_mday = atoin (p, 2); + p += 2; + } + if (p + 2 <= e) { + when->tm_hour = atoin (p, 2); + p += 2; + } + if (p + 2 <= e) { + when->tm_min = atoin (p, 2); + p += 2; + } + if (p + 2 <= e) { + when->tm_sec = atoin (p, 2); + p += 2; + } + + if (when->tm_year < 0 || when->tm_year > 9999 || + when->tm_mon < 0 || when->tm_mon > 11 || + when->tm_mday < 1 || when->tm_mday > 31 || + when->tm_hour < 0 || when->tm_hour > 23 || + when->tm_min < 0 || when->tm_min > 59 || + when->tm_sec < 0 || when->tm_sec > 59) + return FALSE; + + /* Make sure all that got parsed */ + if (p != e) + return FALSE; + + /* Now the remaining optional stuff */ + e = time + n_time; + + /* See if there's a fraction, and discard it if so */ + if (p < e && *p == '.' && p + 5 <= e) + p += 5; + + /* See if it's UTC */ + if (p < e && *p == 'Z') { + p += 1; + + /* See if it has a timezone */ + } else if ((*p == '-' || *p == '+') && p + 3 <= e) { + int off, neg; + + neg = *p == '-'; + ++p; + + off = atoin (p, 2) * 3600; + if (off < 0 || off > 86400) + return -1; + p += 2; + + if (p + 2 <= e) { + off += atoin (p, 2) * 60; + p += 2; + } + + /* Use TZ offset */ + if (neg) + *offset = 0 - off; + else + *offset = off; + } + + /* Make sure everything got parsed */ + if (p != e) + return FALSE; + + return TRUE; +} + +static gboolean +anode_read_time (GNode *node, + GBytes *data, + struct tm *when, + glong *value) +{ + const gchar *buf; + gboolean ret; + gint offset = 0; + gint flags; + gint type; + gsize len; + + g_assert (data != NULL); + g_assert (when != NULL); + g_assert (value != NULL); + + flags = anode_def_flags (node); + type = anode_def_type (node); + buf = g_bytes_get_data (data, &len); + + if (type == EGG_ASN1X_GENERALIZED_TIME) + ret = parse_general_time (buf, len, when, &offset); + else if (type == EGG_ASN1X_UTC_TIME) + ret = parse_utc_time (buf, len, when, &offset); + else if (flags & FLAG_GENERALIZED) + ret = parse_general_time (buf, len, when, &offset); + else if (flags & FLAG_UTC) + ret = parse_utc_time (buf, len, when, &offset); + else + g_return_val_if_reached (FALSE); + + if (!ret) + return anode_failure (node, "invalid time content"); + + /* In order to work with 32 bit time_t. */ + if (sizeof (time_t) <= 4 && when->tm_year >= 138) { + *value = (time_t)2145914603; /* 2037-12-31 23:23:23 */ + + /* Convert to seconds since epoch */ + } else { + *value = timegm (when); + g_return_val_if_fail (*value >= 0, FALSE); + *value += offset; + } + + return TRUE; +} + +static gboolean +anode_read_integer_ulong (GNode *node, + GBytes *data, + gulong *value) +{ + const guchar *p; + gsize len; + gsize k; + + p = g_bytes_get_data (data, &len); + if (len < 1 || len > sizeof (gulong)) + return FALSE; + + *value = 0; + for (k = 0; k < len; ++k) + *value |= p[k] << (8 * ((len - 1) - k)); + + return TRUE; +} + +static void +anode_write_integer_ulong (gulong value, + guchar *data, + gsize *n_data) +{ + guchar buf[sizeof (gulong)]; + gint bytes, i, off; + guchar *at; + gboolean sign; + gsize len; + + for (i = 0; i < sizeof (gulong); ++i) { + off = sizeof (gulong) - (i + 1); + buf[i] = (value >> (off * 8)) & 0xFF; + } + + for (bytes = sizeof (gulong) - 1; bytes >= 0; --bytes) + if (!buf[bytes]) + break; + + bytes = sizeof (gulong) - (bytes + 1); + if (bytes == 0) + bytes = 1; + + /* If the first byte would make this negative, then add a zero */ + at = buf + (sizeof (gulong) - bytes); + sign = !!(at[0] & 0x80); + len = bytes + (sign ? 1 : 0); + + if (data) { + g_assert (*n_data >= len); + if (sign) { + data[0] = 0; + data++; + } + memcpy (data, at, bytes); + } + + *n_data = len; +} + +static GBytes * +anode_default_integer (GNode *node) +{ + const gchar *defval; + EggAsn1xDef *opt; + gchar *end; + gulong value; + guchar *data; + gsize len; + + if (!(anode_def_flags (node) & FLAG_DEFAULT)) + return NULL; + + /* Try to get a default */ + opt = anode_opt_lookup (node, EGG_ASN1X_DEFAULT, NULL); + g_return_val_if_fail (opt != NULL, NULL); + g_return_val_if_fail (opt->value != NULL, NULL); + defval = opt->value; + + opt = anode_opt_lookup (node, EGG_ASN1X_CONSTANT, defval); + if (opt != NULL) { + g_return_val_if_fail (opt->value != NULL, NULL); + defval = opt->value; + } + + /* Parse out the default value */ + value = strtoul (defval, &end, 10); + g_return_val_if_fail (end && !end[0], NULL); + + anode_write_integer_ulong (value, NULL, &len); + data = g_malloc (len); + anode_write_integer_ulong (value, data, &len); + return g_bytes_new_take (data, len); +} + +static gboolean +anode_read_string_struct (GNode *node, + Atlv *tlv, + gpointer value, + gsize *n_value) +{ + const guchar *buf; + gsize len; + Atlv *ctlv; + guchar *at; + gint remaining; + + g_assert (tlv != NULL); + g_assert (tlv->cls & ASN1_CLASS_STRUCTURED); + g_assert (n_value != NULL); + + at = value; + remaining = *n_value; + *n_value = 0; + + for (ctlv = tlv->child; ctlv != NULL; ctlv = ctlv->next) { + if (ctlv->cls & ASN1_CLASS_STRUCTURED || + ctlv->value == NULL) + return FALSE; + buf = g_bytes_get_data (ctlv->value, &len); + *n_value += len; + if (value) { + if (remaining >= len) + memcpy (at, buf, len); + at += len; + remaining -= len; + } + } + + if (value) + g_return_val_if_fail (remaining >= 0, FALSE); + + return TRUE; +} + +static gboolean +anode_read_string_simple (GNode *node, + GBytes *data, + gpointer value, + gsize *n_value) +{ + const guchar *buf; + gsize len; + + g_assert (data != NULL); + g_assert (n_value != NULL); + + buf = g_bytes_get_data (data, &len); + if (value) { + g_return_val_if_fail (*n_value >= len, FALSE); + memcpy (value, buf, len); + } + + *n_value = len; + return TRUE; +} + +static gboolean +anode_read_boolean (GNode *node, + GBytes *data, + gboolean *value) +{ + const guchar *buf; + gsize len; + + g_assert (node != NULL); + g_assert (data != NULL); + g_assert (value != NULL); + + buf = g_bytes_get_data (data, &len); + g_return_val_if_fail (len == 1, FALSE); + if (buf[0] == 0x00) + *value = FALSE; + else if (buf[0] == 0xFF) + *value = TRUE; + else + g_return_val_if_reached (FALSE); + return TRUE; +} + +static void +anode_write_boolean (gboolean value, + guchar *data, + gsize *n_data) +{ + if (data) { + g_assert (*n_data >= 1); + if (value) + data[0] = 0xFF; + else + data[0] = 0x00; + } + *n_data = 1; +} + +static GBytes * +anode_default_boolean (GNode *node) +{ + EggAsn1xDef *opt; + gboolean value; + guchar *data; + gsize len; + + if (!(anode_def_flags (node) & FLAG_DEFAULT)) + return NULL; + + /* Try to get a default */ + opt = anode_opt_lookup (node, EGG_ASN1X_DEFAULT, NULL); + g_return_val_if_fail (opt != NULL, NULL); + + /* Parse out the default value */ + if ((opt->type & FLAG_TRUE) == FLAG_TRUE) + value = TRUE; + else if ((opt->type & FLAG_FALSE) == FLAG_FALSE) + value = FALSE; + else + g_return_val_if_reached (FALSE); + + anode_write_boolean (value, NULL, &len); + data = g_malloc (len); + anode_write_boolean (value, data, &len); + return g_bytes_new_take (data, len); +} + +static gboolean +anode_read_object_id (GNode *node, + GBytes *data, + gchar **oid) +{ + GString *result = NULL; + const guchar *p; + gboolean lead; + guint val, pval; + gsize len; + gint k; + + g_assert (data != NULL); + p = g_bytes_get_data (data, &len); + + if (oid) + result = g_string_sized_new (32); + + pval = p[0] / 40; + val = p[0] - pval * 40; + + if (result) + g_string_append_printf (result, "%u.%u", pval, val); + + /* TODO: Validate first byte? */ + for (k = 1, lead = 1, val = 0, pval = 0; k < len; ++k) { + /* X.690: the leading byte must never be 0x80 */ + if (lead && p[k] == 0x80) { + anode_failure (node, "object id encoding is invalid"); + break; + } + val = val << 7; + val |= p[k] & 0x7F; + /* Check for wrap around */ + if (val < pval) { + anode_failure (node, "object id encoding is invalid"); + break; + } + pval = val; + if (!(p[k] & 0x80)) { + if (result) + g_string_append_printf (result, ".%u", val); + pval = val = 0; + lead = 1; + } + } + + if (k < len) { + if (result) + g_string_free (result, TRUE); /* UNREACHABLE: caught by validation */ + return FALSE; + } + + if (result) + *oid = g_string_free (result, FALSE); + return TRUE; +} + +static gboolean +anode_write_object_id (const gchar *oid, + guchar *data, + gsize *n_data) +{ + const gchar *p, *next; + gint num, num1; + guchar bit7; + gboolean had; + gint i, k, at; + + at = 0; + num1 = 0; + + for (i = 0; oid[0]; ++i, oid = next) { + p = strchr (oid, '.'); + if (p == NULL) + next = p = oid + strlen (oid); + else + next = p + 1; + if (p == oid) + return FALSE; + num = atoin (oid, p - oid); + if (num < 0) + return FALSE; + if (i == 0) { + num1 = num; + } else if (i == 1) { + if (data) { + g_assert (*n_data > at); + data[at] = 40 * num1 + num; + } + ++at; + } else { + for (had = FALSE, k = 4; k >= 0; k--) { + bit7 = (num >> (k * 7)) & 0x7F; + if (bit7 || had || !k) { + if (k) + bit7 |= 0x80; + if (data) { + g_assert (*n_data > at); + data[at] = bit7; + } + ++at; + had = 1; + } + } + } + } + + if (at < 2) + return FALSE; + if (data) + g_assert (*n_data >= at); + *n_data = at; + return TRUE; +} + +/* ----------------------------------------------------------------------------------- + * GETTING, SETTING + */ + +GNode* +egg_asn1x_node (GNode *asn, ...) +{ + GNode *node = asn; + const gchar *name; + va_list va; + gint type; + gint index; + + g_return_val_if_fail (asn, NULL); + va_start (va, asn); + + for (;;) { + type = anode_def_type (node); + + /* Use integer indexes for these */ + if (type == EGG_ASN1X_SEQUENCE_OF || type == EGG_ASN1X_SET_OF) { + index = va_arg (va, gint); + if (index == 0) + return node; + + /* Only consider nodes that have data */ + node = g_node_nth_child (node, 0); + while (node) { + if (egg_asn1x_have (node)) { + --index; + if (index == 0) + break; + } + node = g_node_next_sibling (node); + } + + if (node == NULL) + return NULL; + + /* Use strings for these */ + } else { + name = va_arg (va, const gchar*); + if (name == NULL) + return node; + /* Warn if they're using indexes here */ + if (name <= (const gchar*)4096) { + g_warning ("possible misuse of egg_asn1x_node, expected a string, but got an index"); + return NULL; + } + node = anode_child_with_name (node, name); + if (node == NULL) + return NULL; + } + } +} + +const gchar* +egg_asn1x_name (GNode *node) +{ + g_return_val_if_fail (node != NULL, NULL); + return anode_def_name (node); +} + +EggAsn1xType +egg_asn1x_type (GNode *node) +{ + g_return_val_if_fail (node != NULL, 0); + return anode_def_type (node); +} + +guint +egg_asn1x_count (GNode *node) +{ + guint result = 0; + GNode *child; + gint type; + + g_return_val_if_fail (node, 0); + + type = anode_def_type (node); + if (type != EGG_ASN1X_SEQUENCE_OF && type != EGG_ASN1X_SET_OF) { + g_warning ("node passed to egg_asn1x_count was not a sequence of or set of"); + return 0; + } + + for (child = node->children; child; child = child->next) { + if (egg_asn1x_have (child)) + ++result; + } + + return result; +} + +GNode* +egg_asn1x_append (GNode *node) +{ + GNode *child; + gint type; + + g_return_val_if_fail (node, NULL); + + type = anode_def_type (node); + if (type != EGG_ASN1X_SEQUENCE_OF && type != EGG_ASN1X_SET_OF) { + g_warning ("node passed to egg_asn1x_append was not a sequence of or set of"); + return NULL; + } + + /* There must be at least one child */ + child = node->children; + g_return_val_if_fail (child, NULL); + + child = anode_clone (child); + anode_clear (child); + g_node_append (node, child); + + return child; +} + +gboolean +egg_asn1x_have (GNode *node) +{ + GNode *child; + + g_return_val_if_fail (node, FALSE); + + if (anode_get_value (node) || anode_get_parsed (node)) + return TRUE; + + for (child = node->children; child != NULL; child = child->next) { + if (egg_asn1x_have (child)) + return TRUE; + } + + return FALSE; +} + +gboolean +egg_asn1x_get_boolean (GNode *node, + gboolean *value) +{ + gboolean ret; + GBytes *data; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (value != NULL, FALSE); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_BOOLEAN, FALSE); + + data = anode_get_value (node); + if (data == NULL) + data = anode_default_boolean (node); + else + g_bytes_ref (data); + if (data == NULL) + return FALSE; + + ret = anode_read_boolean (node, data, value); + g_bytes_unref (data); + return ret; +} + +void +egg_asn1x_set_boolean (GNode *node, gboolean value) +{ + GBytes *data, *def; + guchar *buf; + gsize len; + + g_return_if_fail (node != NULL); + g_return_if_fail (anode_def_type (node) == EGG_ASN1X_BOOLEAN); + + len = 1; + buf = g_malloc0 (1); + anode_write_boolean (value, buf, &len); + data = g_bytes_new_take (buf, len); + + /* If it's equal to default, then clear */ + def = anode_default_boolean (node); + if (def) { + if (g_bytes_equal (def, data)) { + anode_clr_value (node); + g_bytes_unref (data); + data = NULL; + } + g_bytes_unref (def); + } + + if (data != NULL) + anode_take_value (node, data); +} + +void +egg_asn1x_set_null (GNode *node) +{ + g_return_if_fail (node != NULL); + g_return_if_fail (anode_def_type (node) == EGG_ASN1X_NULL); + + /* Encode zero characters */ + anode_clr_value (node); + anode_take_value (node, g_bytes_new_static ("", 0)); +} + +GQuark +egg_asn1x_get_enumerated (GNode *node) +{ + gchar buf[sizeof (gulong) * 3]; + EggAsn1xDef *opt; + gulong val; + GBytes *data; + + g_return_val_if_fail (node != NULL, 0); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_ENUMERATED, 0); + + data = anode_get_value (node); + if (data == NULL) + return 0; + + if (!anode_read_integer_ulong (node, data, &val)) + g_return_val_if_reached (0); + + /* Format that as a string */ + if (g_snprintf (buf, sizeof (buf), "%lu", val) < 0) + g_return_val_if_reached (0); + + /* Lookup that value in our table */ + opt = anode_opt_lookup_value (node, EGG_ASN1X_CONSTANT, buf); + if (opt == NULL || opt->name == NULL) + return 0; + + return g_quark_from_static_string (opt->name); +} + +void +egg_asn1x_set_enumerated (GNode *node, + GQuark value) +{ + EggAsn1xDef *opt; + const gchar *name; + gpointer data; + gsize n_data; + gulong val; + + g_return_if_fail (node != NULL); + g_return_if_fail (value != 0); + g_return_if_fail (anode_def_type (node) == EGG_ASN1X_ENUMERATED); + + name = g_quark_to_string (value); + g_return_if_fail (name != NULL); + + opt = anode_opt_lookup (node, EGG_ASN1X_CONSTANT, name); + g_return_if_fail (opt && opt->value); + + /* TODO: Signed values */ + + val = anode_def_value_as_ulong (opt); + g_return_if_fail (val != G_MAXULONG); + + n_data = sizeof (gulong) + 1; + data = g_malloc0 (n_data); + anode_write_integer_ulong (val, data, &n_data); + + anode_clr_value (node); + anode_take_value (node, g_bytes_new_take (data, n_data)); +} + +gboolean +egg_asn1x_get_integer_as_ulong (GNode *node, + gulong *value) +{ + gboolean ret; + GBytes *data; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (value != NULL, FALSE); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_INTEGER, FALSE); + + data = anode_get_value (node); + if (data == NULL) + data = anode_default_integer (node); + else + g_bytes_ref (data); + if (data == NULL) + return FALSE; + + ret = anode_read_integer_ulong (node, data, value); + g_bytes_unref (data); + return ret; +} + +void +egg_asn1x_set_integer_as_ulong (GNode *node, + gulong value) +{ + GBytes *data, *def; + guchar *buf; + gsize len; + + g_return_if_fail (node != NULL); + g_return_if_fail (anode_def_type (node) == EGG_ASN1X_INTEGER); + + len = sizeof (gulong) + 1; + buf = g_malloc0 (len); + anode_write_integer_ulong (value, buf, &len); + data = g_bytes_new_take (buf, len); + + /* If it's equal to default, then clear */ + def = anode_default_integer (node); + if (def) { + if (g_bytes_equal (def, data)) { + anode_clr_value (node); + g_bytes_unref (data); + data = NULL; + } + g_bytes_unref (def); + } + + if (data != NULL) + anode_take_value (node, data); +} + +GBytes * +egg_asn1x_get_integer_as_raw (GNode *node) +{ + Anode *an; + GBytes *raw; + + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_INTEGER, NULL); + + an = node->data; + if (an->guarantee_unsigned) { + g_warning ("cannot read integer set with " /* UNREACHABLE: */ + "egg_asn1x_set_integer_as_raw() " /* UNREACHABLE: */ + "via egg_asn1x_get_integer_as_raw()"); /* UNREACHABLE: */ + return NULL; /* UNREACHABLE: unreachable by coverage testing */ + } + + raw = anode_get_value (node); + if (raw != NULL) + g_bytes_ref (raw); + return raw; +} + +typedef struct { + EggAllocator allocator; + gpointer data; +} AllocatedData; + +static void +allocator_free (gpointer data) +{ + AllocatedData *alloc = data; + (alloc->allocator) (alloc->data, 0); + g_free (data); +} + +GBytes * +egg_asn1x_get_string_as_usg (GNode *node, + EggAllocator allocator) +{ + AllocatedData *alloc; + guchar *raw; + const guchar *p; + gsize len; + + g_return_val_if_fail (node != NULL, FALSE); + + p = raw = egg_asn1x_get_string_as_raw (node, allocator, &len); + if (raw == NULL) + return NULL; + + /* Strip off the extra zero bytes */ + while (p[0] == 0 && len > 1) { + p++; + len--; + } + + alloc = g_new0 (AllocatedData, 1); + alloc->allocator = allocator ? allocator : g_realloc; + alloc->data = raw; + + return g_bytes_new_with_free_func (p, len, allocator_free, alloc); +} + +GBytes * +egg_asn1x_get_integer_as_usg (GNode *node) +{ + const guchar *p; + Anode *an; + gboolean sign; + gsize len; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_INTEGER, FALSE); + + an = node->data; + if (an->value == NULL) + return NULL; + + p = g_bytes_get_data (an->value, &len); + + if (!an->guarantee_unsigned) { + sign = !!(p[0] & 0x80); + if (sign) { + g_warning ("invalid two's complement integer"); /* UNREACHABLE: */ + return NULL; /* UNREACHABLE: by coverage testing */ + } + + /* Strip off the extra zero byte that was preventing it from being negative */ + while (p[0] == 0 && len > 1) { + p++; + len--; + } + } + + return g_bytes_new_with_free_func (p, len, + (GDestroyNotify)g_bytes_unref, + g_bytes_ref (an->value)); +} + +void +egg_asn1x_set_integer_as_raw (GNode *node, + GBytes *value) +{ + g_return_if_fail (value != NULL); + egg_asn1x_take_integer_as_raw (node, g_bytes_ref (value)); +} + +void +egg_asn1x_take_integer_as_raw (GNode *node, + GBytes *value) +{ + gboolean sign; + const guchar *p; + Anode *an; + + g_return_if_fail (node != NULL); + g_return_if_fail (value != NULL); + g_return_if_fail (anode_def_type (node) == EGG_ASN1X_INTEGER); + + /* Make sure the integer is properly encoded in twos complement*/ + p = g_bytes_get_data (value, NULL); + g_return_if_fail (p != NULL); + + sign = !!(p[0] & 0x80); + if (sign) { + g_warning ("integer is not two's complement"); /* UNREACHABLE: */ + return; /* UNREACHABLE: unless warning */ + } + + anode_clr_value (node); + anode_take_value (node, value); + + an = node->data; + an->guarantee_unsigned = 0; +} + +void +egg_asn1x_set_integer_as_usg (GNode *node, + GBytes *value) +{ + g_return_if_fail (value != NULL); + egg_asn1x_take_integer_as_usg (node, g_bytes_ref (value)); +} + +void +egg_asn1x_take_integer_as_usg (GNode *node, + GBytes *value) +{ + Anode *an; + + g_return_if_fail (node != NULL); + g_return_if_fail (value != NULL); + g_return_if_fail (anode_def_type (node) == EGG_ASN1X_INTEGER); + + anode_take_value (node, value); + an = node->data; + an->guarantee_unsigned = 1; +} + +GNode * +egg_asn1x_get_any_as (GNode *node, + const EggAsn1xDef *defs, + const gchar *type) +{ + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (type != NULL, NULL); + g_return_val_if_fail (egg_asn1x_type (node) == EGG_ASN1X_ANY, NULL); + + return egg_asn1x_get_any_as_full (node, defs, type, 0); +} + +GNode * +egg_asn1x_get_any_as_full (GNode *node, + const EggAsn1xDef *defs, + const gchar *type, + gint options) +{ + GNode *asn; + + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (type != NULL, NULL); + g_return_val_if_fail (egg_asn1x_type (node) == EGG_ASN1X_ANY, NULL); + + asn = egg_asn1x_create (defs, type); + g_return_val_if_fail (asn != NULL, NULL); + + if (!egg_asn1x_get_any_into_full (node, asn, options)) { + egg_asn1x_destroy (asn); + return NULL; + } + + return asn; +} + +gboolean +egg_asn1x_get_any_into (GNode *node, + GNode *into) +{ + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (into != NULL, FALSE); + g_return_val_if_fail (egg_asn1x_type (node) == EGG_ASN1X_ANY, FALSE); + + return egg_asn1x_get_any_into_full (node, into, 0); +} + +gboolean +egg_asn1x_get_any_into_full (GNode *node, + GNode *into, + gint options) +{ + Atlv *tlv; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (into != NULL, FALSE); + g_return_val_if_fail (egg_asn1x_type (node) == EGG_ASN1X_ANY, FALSE); + + tlv = anode_get_parsed (node); + if (tlv == NULL) + return FALSE; + + /* If this node is explicit, then just get the contents */ + if (anode_calc_explicit_for_flags (node, anode_def_flags (node), NULL)) { + tlv = tlv->child; + g_return_val_if_fail (tlv != NULL, FALSE); + } + + if (!anode_decode_anything (into, tlv)) + return FALSE; + + return egg_asn1x_validate (into, !(options & EGG_ASN1X_NO_STRICT)); +} + +void +egg_asn1x_set_any_from (GNode *node, + GNode *from) +{ + Anode *an; + Atlv *tlv; + + g_return_if_fail (node != NULL); + g_return_if_fail (from != NULL); + g_return_if_fail (egg_asn1x_type (node) == EGG_ASN1X_ANY); + + tlv = anode_build_anything (from, TRUE); + g_return_if_fail (tlv != NULL); + + /* Wrap this in an explicit tag if necessary */ + tlv = anode_build_maybe_explicit (node, tlv, anode_def_flags (node)); + + /* Mark down the tlvs for this node */ + an = node->data; + atlv_free (an->parsed); + an->parsed = tlv; +} + +GBytes * +egg_asn1x_get_any_raw (GNode *node, + EggAllocator allocator) +{ + GBytes *bytes; + Atlv *tlv; + + g_return_val_if_fail (node != NULL, NULL); + + tlv = anode_build_anything (node, TRUE); + if (tlv == NULL) { + anode_failure (node, "missing value(s)"); + return NULL; + } + + atlv_sort_perform (tlv, allocator); + + bytes = atlv_unparse_to_bytes (tlv, allocator); + atlv_free (tlv); + return bytes; +} + +gboolean +egg_asn1x_set_any_raw (GNode *node, + GBytes *raw) +{ + const gchar *msg; + Anode *an; + Atlv *tlv; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (raw != NULL, FALSE); + + an = node->data; + tlv = atlv_new (); + msg = atlv_parse_der (raw, tlv); + if (msg == NULL) { + + /* Wrap this in an explicit tag if necessary */ + tlv = anode_build_maybe_explicit (node, tlv, anode_def_flags (node)); + + atlv_free (an->parsed); + an->parsed = tlv; + return TRUE; + + /* A failure, set the message manually so it doesn't get a prefix */ + } else { + atlv_free (tlv); + an = node->data; + g_free (an->failure); + an->failure = g_strdup (msg); + return FALSE; + } +} + +GBytes * +egg_asn1x_get_element_raw (GNode *node) +{ + Anode *an; + Atlv *tlv; + + g_return_val_if_fail (node != NULL, NULL); + + an = node->data; + tlv = an->parsed; + + /* If this node is explicit, then just get the contents */ + if (tlv && anode_calc_explicit_for_flags (node, anode_def_flags (node), NULL)) + tlv = tlv->child; + + if (!tlv || !tlv->decoded) + return NULL; + + return g_bytes_ref (tlv->decoded); +} + +GBytes * +egg_asn1x_get_value_raw (GNode *node) +{ + GBytes *raw; + + g_return_val_if_fail (node != NULL, NULL); + raw = anode_get_value (node); + if (raw != NULL) + g_bytes_ref (raw); + return raw; +} + +guchar * +egg_asn1x_get_string_as_raw (GNode *node, + EggAllocator allocator, + gsize *n_string) +{ + gsize length; + guchar *string; + GBytes *data; + Atlv *tlv; + gint type; + + g_return_val_if_fail (node, NULL); + g_return_val_if_fail (n_string, NULL); + + if (!allocator) + allocator = g_realloc; + + type = anode_def_type (node); + g_return_val_if_fail (type == EGG_ASN1X_OCTET_STRING || + type == EGG_ASN1X_GENERAL_STRING || + type == EGG_ASN1X_NUMERIC_STRING || + type == EGG_ASN1X_IA5_STRING || + type == EGG_ASN1X_TELETEX_STRING || + type == EGG_ASN1X_PRINTABLE_STRING || + type == EGG_ASN1X_UNIVERSAL_STRING || + type == EGG_ASN1X_BMP_STRING || + type == EGG_ASN1X_UTF8_STRING || + type == EGG_ASN1X_VISIBLE_STRING, NULL); + + data = anode_get_value (node); + if (data != NULL) { + if (!anode_read_string_simple (node, data, NULL, &length)) + g_return_val_if_reached (NULL); + + string = (allocator) (NULL, length + 1); + if (string == NULL) + return NULL; /* UNREACHABLE: unless odd allocator */ + + if (!anode_read_string_simple (node, data, string, &length)) + g_return_val_if_reached (NULL); + + /* Courtesy null termination, string must however be validated! */ + string[length] = 0; + *n_string = length; + return string; + } + + tlv = anode_get_parsed (node); + if (tlv != NULL) { + if (!anode_read_string_struct (node, tlv, NULL, &length)) + return NULL; + + string = (allocator) (NULL, length + 1); + if (string == NULL) + return NULL; /* UNREACHABLE: unless odd allocator */ + + if (!anode_read_string_struct (node, tlv, string, &length)) + g_return_val_if_reached (NULL); /* should have failed above */ + + /* Courtesy null termination, string must however be validated! */ + string[length] = 0; + *n_string = length; + return string; + } + + return NULL; +} + +void +egg_asn1x_set_string_as_raw (GNode *node, + guchar *data, + gsize n_data, + GDestroyNotify destroy) +{ + gint type; + + g_return_if_fail (node != NULL); + g_return_if_fail (data != NULL); + + type = anode_def_type (node); + g_return_if_fail (type == EGG_ASN1X_OCTET_STRING || + type == EGG_ASN1X_GENERAL_STRING || + type == EGG_ASN1X_NUMERIC_STRING || + type == EGG_ASN1X_IA5_STRING || + type == EGG_ASN1X_TELETEX_STRING || + type == EGG_ASN1X_PRINTABLE_STRING || + type == EGG_ASN1X_UNIVERSAL_STRING || + type == EGG_ASN1X_BMP_STRING || + type == EGG_ASN1X_UTF8_STRING || + type == EGG_ASN1X_VISIBLE_STRING); + + anode_take_value (node, g_bytes_new_with_free_func (data, n_data, + destroy, data)); +} + +void +egg_asn1x_set_string_as_bytes (GNode *node, + GBytes *bytes) +{ + gint type; + + g_return_if_fail (node != NULL); + g_return_if_fail (bytes != NULL); + + type = anode_def_type (node); + g_return_if_fail (type == EGG_ASN1X_OCTET_STRING || + type == EGG_ASN1X_GENERAL_STRING || + type == EGG_ASN1X_NUMERIC_STRING || + type == EGG_ASN1X_IA5_STRING || + type == EGG_ASN1X_TELETEX_STRING || + type == EGG_ASN1X_PRINTABLE_STRING || + type == EGG_ASN1X_UNIVERSAL_STRING || + type == EGG_ASN1X_BMP_STRING || + type == EGG_ASN1X_UTF8_STRING || + type == EGG_ASN1X_VISIBLE_STRING); + + anode_set_value (node, bytes); +} + +GBytes * +egg_asn1x_get_string_as_bytes (GNode *node) +{ + gpointer raw; + gsize length; + + g_return_val_if_fail (node != NULL, NULL); + + raw = egg_asn1x_get_string_as_raw (node, NULL, &length); + if (raw == NULL) + return NULL; + + return g_bytes_new_take (raw, length); +} + +gchar * +egg_asn1x_get_bmpstring_as_utf8 (GNode *node) +{ + gchar *string; + gsize n_string; + gchar *utf8; + + g_return_val_if_fail (node, NULL); + + string = (gchar*)egg_asn1x_get_string_as_raw (node, NULL, &n_string); + if (!string) + return NULL; + + utf8 = g_convert (string, n_string, "UTF-8", "UTF-16BE", NULL, NULL, NULL); + g_free (string); + + return utf8; +} + +gchar* +egg_asn1x_get_string_as_utf8 (GNode *node, + EggAllocator allocator) +{ + gchar *string; + gsize n_string; + + g_return_val_if_fail (node, NULL); + + if (allocator == NULL) + allocator = g_realloc; + + string = (gchar*)egg_asn1x_get_string_as_raw (node, allocator, &n_string); + if (!string) + return NULL; + + if (!g_utf8_validate (string, n_string, NULL)) { + (allocator) (string, 0); + return NULL; + } + + return string; +} + +gboolean +egg_asn1x_set_string_as_utf8 (GNode *node, + gchar *data, + GDestroyNotify destroy) +{ + gsize n_data; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + n_data = strlen (data); + if (!g_utf8_validate (data, n_data, NULL)) + return FALSE; + + egg_asn1x_set_string_as_raw (node, (guchar*)data, n_data, destroy); + return TRUE; +} + +GBytes * +egg_asn1x_get_bits_as_raw (GNode *node, + guint *n_bits) +{ + gsize len; + GBytes *data; + Anode *an; + + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (n_bits != NULL, NULL); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_BIT_STRING, NULL); + + data = anode_get_value (node); + if (data == NULL) + return NULL; + + len = g_bytes_get_size (data); + an = node->data; + + *n_bits = (len * 8) - an->bits_empty; + return g_bytes_ref (data); +} + +void +egg_asn1x_set_bits_as_raw (GNode *node, + GBytes *value, + guint n_bits) +{ + g_return_if_fail (node != NULL); + g_return_if_fail (value != NULL); + + egg_asn1x_take_bits_as_raw (node, g_bytes_ref (value), n_bits); +} + +void +egg_asn1x_take_bits_as_raw (GNode *node, + GBytes *value, + guint n_bits) +{ + Anode *an; + gint type; + gsize len; + guchar empty; + + g_return_if_fail (node != NULL); + g_return_if_fail (value != NULL); + + type = anode_def_type (node); + g_return_if_fail (type == EGG_ASN1X_BIT_STRING); + + len = (n_bits / 8); + if (n_bits % 8) + len += 1; + + empty = n_bits % 8; + if (empty > 0) + empty = 8 - empty; + + anode_take_value (node, value); + an = node->data; + an->bits_empty = empty; +} + +gboolean +egg_asn1x_get_bits_as_ulong (GNode *node, + gulong *bits, + guint *n_bits) +{ + GBytes *data; + const guchar *buf; + gsize len; + guint i, length; + guchar empty; + const guchar *p; + gulong value; + Anode *an; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (bits != NULL, FALSE); + g_return_val_if_fail (n_bits != NULL, FALSE); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_BIT_STRING, FALSE); + + data = anode_get_value (node); + if (data == NULL) + return FALSE; + + buf = g_bytes_get_data (data, &len); + an = node->data; + empty = an->bits_empty; + + length = (len * 8) - empty; + if (length > sizeof (gulong) * 8) + return FALSE; + + value = 0; + p = buf; + + for (i = 0; i < len; ++i) + value = value << 8 | p[i]; + + *bits = value >> empty; + *n_bits = length; + return TRUE; +} + +void +egg_asn1x_set_bits_as_ulong (GNode *node, + gulong bits, + guint n_bits) +{ + guchar *data; + gulong value; + gsize i, len; + guchar empty; + Anode *an; + gint type; + + g_return_if_fail (node != NULL); + g_return_if_fail (n_bits <= sizeof (gulong) * 8); + + type = anode_def_type (node); + g_return_if_fail (type == EGG_ASN1X_BIT_STRING); + + empty = n_bits % 8; + if (empty > 0) + empty = 8 - empty; + len = (n_bits / 8) + (empty ? 1 : 0); + + data = g_malloc0 (sizeof (gulong)); + value = bits << empty; + + for (i = 0; i < len; ++i) + data[len - i - 1] = (value >> i * 8) & 0xFF; + + an = node->data; + an->bits_empty = empty; + anode_take_value (node, g_bytes_new_take (data, len)); +} + +glong +egg_asn1x_get_time_as_long (GNode *node) +{ + struct tm when; + GBytes *data; + glong time; + gint type; + + g_return_val_if_fail (node, -1); + type = anode_def_type (node); + + /* Time is often represented as a choice, so work than in here */ + if (type == EGG_ASN1X_CHOICE) { + node = egg_asn1x_get_choice (node); + if (node == NULL) + return -1; + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_TIME || + anode_def_type (node) == EGG_ASN1X_UTC_TIME || + anode_def_type (node) == EGG_ASN1X_GENERALIZED_TIME, -1); + return egg_asn1x_get_time_as_long (node); + } + + g_return_val_if_fail (type == EGG_ASN1X_TIME || + type == EGG_ASN1X_UTC_TIME || + type == EGG_ASN1X_GENERALIZED_TIME, -1); + + data = anode_get_value (node); + if (data == NULL) + return -1; + + if (!anode_read_time (node, data, &when, &time)) + g_return_val_if_reached (-1); /* already validated */ + return time; +} + +gboolean +egg_asn1x_get_time_as_date (GNode *node, + GDate *date) +{ + struct tm when; + GBytes *data; + glong time; + gint type; + + g_return_val_if_fail (node, FALSE); + type = anode_def_type (node); + + /* Time is often represented as a choice, so work than in here */ + if (type == EGG_ASN1X_CHOICE) { + node = egg_asn1x_get_choice (node); + if (node == NULL) + return FALSE; + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_TIME || + anode_def_type (node) == EGG_ASN1X_UTC_TIME || + anode_def_type (node) == EGG_ASN1X_GENERALIZED_TIME, FALSE); + return egg_asn1x_get_time_as_date (node, date); + } + + g_return_val_if_fail (type == EGG_ASN1X_TIME || + type == EGG_ASN1X_UTC_TIME || + type == EGG_ASN1X_GENERALIZED_TIME, FALSE); + + data = anode_get_value (node); + if (data == NULL) + return FALSE; + + if (!anode_read_time (node, data, &when, &time)) + g_return_val_if_reached (FALSE); /* already validated */ + + g_date_set_dmy (date, when.tm_mday, when.tm_mon + 1, when.tm_year + 1900); + return TRUE; +} + +gchar* +egg_asn1x_get_oid_as_string (GNode *node) +{ + GBytes *data; + gchar *oid; + + g_return_val_if_fail (node, NULL); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_OBJECT_ID, NULL); + + data = anode_get_value (node); + if (data == NULL) + return NULL; + + if (!anode_read_object_id (node, data, &oid)) + g_return_val_if_reached (NULL); /* should have been validated */ + + return oid; +} + +gboolean +egg_asn1x_set_oid_as_string (GNode *node, + const gchar *oid) +{ + guchar *data; + gsize n_data; + + g_return_val_if_fail (oid != NULL, FALSE); + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_OBJECT_ID, FALSE); + + /* Encoding will always be shorter than string */ + n_data = strlen (oid); + data = g_malloc0 (n_data); + + if (!anode_write_object_id (oid, data, &n_data)) { + g_free (data); + return FALSE; + } + + anode_take_value (node, g_bytes_new_take (data, n_data)); + return TRUE; +} + +GQuark +egg_asn1x_get_oid_as_quark (GNode *node) +{ + GQuark quark; + gchar *oid; + + oid = egg_asn1x_get_oid_as_string (node); + if (!oid) + return 0; + quark = g_quark_from_string (oid); + g_free (oid); + return quark; +} + +gboolean +egg_asn1x_set_oid_as_quark (GNode *node, + GQuark oid) +{ + const gchar *str; + + g_return_val_if_fail (oid != 0, FALSE); + + str = g_quark_to_string (oid); + g_return_val_if_fail (str != NULL, FALSE); + + return egg_asn1x_set_oid_as_string (node, str); +} + +GNode* +egg_asn1x_get_choice (GNode *node) +{ + GNode *child; + Anode *an; + + g_return_val_if_fail (node, NULL); + + /* One and only one of the children must be set */ + for (child = node->children; child; child = child->next) { + an = (Anode*)child->data; + if (an->chosen) + return child; + } + + return NULL; +} + +gboolean +egg_asn1x_set_choice (GNode *node, + GNode *choice) +{ + GNode *child; + Anode *an; + + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (anode_def_type (node) == EGG_ASN1X_CHOICE, FALSE); + + /* One and only one of the children must be set */ + for (child = node->children; child; child = child->next) { + an = (Anode*)child->data; + if (child == choice) { + an->chosen = 1; + choice = NULL; + } else { + an->chosen = 0; + } + } + + /* The choice is not one of the child nodes */ + g_return_val_if_fail (!choice, FALSE); + + return TRUE; +} + +/* ----------------------------------------------------------------------------------- + * VALIDATION + */ + +static gboolean +anode_parse_size (GNode *node, + const gchar *text, + gulong *value) +{ + EggAsn1xDef *def; + gchar *end = NULL; + + if (text == NULL) { + *value = 0; + return FALSE; + } else if (g_str_equal (text, "MAX")) { + *value = G_MAXULONG; + return TRUE; + } else if (g_ascii_isalpha (text[0])) { + def = anode_opt_lookup (node, EGG_ASN1X_INTEGER, text); + g_return_val_if_fail (def, FALSE); + return anode_parse_size (node, def->value, value); + } + + *value = strtoul (text, &end, 10); + g_return_val_if_fail (end && !end[0], FALSE); + return TRUE; +} + + +static gboolean +anode_validate_size (GNode *node, + gulong length) +{ + EggAsn1xDef *size; + gulong value1 = 0; + gulong value2 = G_MAXULONG; + + if (anode_def_flags (node) & FLAG_SIZE) { + size = anode_opt_lookup (node, EGG_ASN1X_SIZE, NULL); + g_return_val_if_fail (size, FALSE); + if (!anode_parse_size (node, size->value, &value1)) + g_return_val_if_reached (FALSE); + if (size->type & FLAG_MIN_MAX) { + if (!anode_parse_size (node, size->name, &value2)) + g_return_val_if_reached (FALSE); + if (length < value1 || length >= value2) + return anode_failure (node, "content size is out of bounds"); + } else { + if (length != value1) + return anode_failure (node, "content size is not correct"); + } + } + + return TRUE; +} + +static gboolean +anode_validate_integer (GNode *node, + GBytes *value) +{ + GList *constants, *l; + gulong val, check; + gsize len; + gboolean found; + gint flags; + + g_assert (value != NULL); + len = g_bytes_get_size (value); + + /* Integers must be at least one byte long */ + if (len == 0) + return anode_failure (node, "zero length integer"); + + flags = anode_def_flags (node); + if (flags & FLAG_LIST) { + /* Parse out the value, we only support small integers*/ + if (!anode_read_integer_ulong (node, value, &val)) + return anode_failure (node, "integer not part of list"); + + /* Look through the list of constants */ + found = FALSE; + constants = anode_opts_lookup (node, EGG_ASN1X_CONSTANT, NULL); + for (l = constants; l; l = g_list_next (l)) { + check = anode_def_value_as_ulong (l->data); + g_return_val_if_fail (check != G_MAXULONG, FALSE); + if (check == val) { + found = TRUE; + break; + } + } + g_list_free (constants); + + if (!found) + return anode_failure (node, "integer not part of listed set"); + } + + return TRUE; +} + +static gboolean +anode_validate_enumerated (GNode *node, + GBytes *value) +{ + const guchar *buf; + gsize length; + + g_assert (value != NULL); + + buf = g_bytes_get_data (value, &length); + + /* Enumerated must be positive */ + if (length > 0 && (buf[0] & 0x80)) + return anode_failure (node, "enumerated must be positive"); + + return anode_validate_integer (node, value); +} + +static gboolean +anode_validate_boolean (GNode *node, + GBytes *value) +{ + const guchar *buf; + gsize len; + + g_assert (value != NULL); + buf = g_bytes_get_data (value, &len); + + /* Must one byte, and zero or all ones */ + if (len != 1) + return anode_failure (node, "invalid length boolean"); + if (buf[0] != 0x00 && buf[0] != 0xFF) + return anode_failure (node, "boolean must be true or false"); + return TRUE; +} + +static gboolean +anode_validate_bit_string (GNode *node, + GBytes *value) +{ + g_assert (value != NULL); + + /* All the decode validation done in anode_decode_bit_string */ + return TRUE; +} + +static gboolean +anode_validate_string (GNode *node, + GBytes *value) +{ + gsize length; + + if (!anode_read_string_simple (node, value, NULL, &length)) + g_return_val_if_reached (FALSE); + + return anode_validate_size (node, (gulong)length); +} + +static gboolean +anode_validate_object_id (GNode *node, + GBytes *value) +{ + return anode_read_object_id (node, value, NULL); +} + +static gboolean +anode_validate_null (GNode *node, + GBytes *value) +{ + g_assert (value != NULL); + return (g_bytes_get_size (value) == 0); +} + +static gboolean +anode_validate_time (GNode *node, + GBytes *value) +{ + glong time; + struct tm when; + return anode_read_time (node, value, &when, &time); +} + +static gboolean +anode_validate_choice (GNode *node, + gboolean strict) +{ + GNode *child, *choice; + Anode *an; + + /* One and only one of the children must be set */ + choice = egg_asn1x_get_choice (node); + if (!choice) + return anode_failure (node, "one choice must be set"); + + if (!anode_validate_anything (choice, strict)) + return FALSE; + + for (child = node->children; child; child = child->next) { + if (child != choice) { + an = (Anode*)child->data; + if (an->chosen) + return anode_failure (node, "only one choice may be set"); + } + } + + return TRUE; +} + +static gboolean +anode_validate_sequence_or_set (GNode *node, + gboolean strict) +{ + GNode *child; + + /* If this is optional, and has no values, then that's all good */ + if (anode_def_flags (node) & FLAG_OPTION) { + if (!egg_asn1x_have (node)) + return TRUE; + } + + /* All of the children must validate properly */ + for (child = node->children; child; child = child->next) { + if (!anode_validate_anything (child, strict)) + return FALSE; + } + + return TRUE; +} + +static gboolean +anode_validate_sequence_or_set_of (GNode *node, + gboolean strict) +{ + GNode *child; + gulong count; + + count = 0; + + /* All the children must validate properly */ + for (child = node->children; child; child = child->next) { + if (egg_asn1x_have (child)) { + if (!anode_validate_anything (child, strict)) + return FALSE; + count++; + } + } + + if (count == 0 && anode_def_flags (node) & FLAG_OPTION) + return TRUE; + + return anode_validate_size (node, count); +} + +static gboolean +anode_validate_anything (GNode *node, + gboolean strict) +{ + GBytes *value; + Atlv *tlv; + gint type; + gint flags; + + type = anode_def_type (node); + flags = anode_def_flags (node); + + /* Handle these specially */ + switch (type) { + case EGG_ASN1X_CHOICE: + return anode_validate_choice (node, strict); + + case EGG_ASN1X_SEQUENCE: + case EGG_ASN1X_SET: + return anode_validate_sequence_or_set (node, strict); + + case EGG_ASN1X_SEQUENCE_OF: + case EGG_ASN1X_SET_OF: + return anode_validate_sequence_or_set_of (node, strict); + + default: + break; + } + + /* Values that have been configured */ + value = anode_get_value (node); + if (value) { + switch (type) { + case EGG_ASN1X_INTEGER: + return anode_validate_integer (node, value); + case EGG_ASN1X_ENUMERATED: + return anode_validate_enumerated (node, value); + case EGG_ASN1X_BOOLEAN: + return anode_validate_boolean (node, value); + case EGG_ASN1X_BIT_STRING: + return anode_validate_bit_string (node, value); + case EGG_ASN1X_OCTET_STRING: + case EGG_ASN1X_GENERAL_STRING: + case EGG_ASN1X_NUMERIC_STRING: + case EGG_ASN1X_IA5_STRING: + case EGG_ASN1X_TELETEX_STRING: + case EGG_ASN1X_PRINTABLE_STRING: + case EGG_ASN1X_UTF8_STRING: + case EGG_ASN1X_VISIBLE_STRING: + return anode_validate_string (node, value); + case EGG_ASN1X_BMP_STRING: + case EGG_ASN1X_UNIVERSAL_STRING: + return TRUE; /* TODO: Need to validate strings more completely */ + case EGG_ASN1X_OBJECT_ID: + return anode_validate_object_id (node, value); + case EGG_ASN1X_NULL: + return anode_validate_null (node, value); + case EGG_ASN1X_TIME: + case EGG_ASN1X_UTC_TIME: + case EGG_ASN1X_GENERALIZED_TIME: + return anode_validate_time (node, value); + default: + g_assert_not_reached (); + } + } + + /* See if there's a tlv parsed */ + tlv = anode_get_parsed (node); + if (tlv) { + switch (type) { + case EGG_ASN1X_ANY: + case EGG_ASN1X_GENERAL_STRING: + case EGG_ASN1X_OCTET_STRING: + case EGG_ASN1X_NUMERIC_STRING: + case EGG_ASN1X_IA5_STRING: + case EGG_ASN1X_TELETEX_STRING: + case EGG_ASN1X_PRINTABLE_STRING: + case EGG_ASN1X_UTF8_STRING: + case EGG_ASN1X_VISIBLE_STRING: + case EGG_ASN1X_BMP_STRING: + case EGG_ASN1X_UNIVERSAL_STRING: + return TRUE; + default: + break; /* UNREACHABLE: fix compiler warning */ + } + } + + if (flags & FLAG_OPTION) + return TRUE; + if (flags & FLAG_DEFAULT) + return TRUE; + return anode_failure (node, "missing value"); +} + +gboolean +egg_asn1x_validate (GNode *asn, + gboolean strict) +{ + g_return_val_if_fail (asn, FALSE); + return anode_validate_anything (asn, strict); +} + +/* ----------------------------------------------------------------------------------- + * TREE CREATION + */ + +static gint +compare_nodes_by_tag (gconstpointer a, gconstpointer b) +{ + GNode *na = (gpointer)a; + GNode *nb = (gpointer)b; + gulong taga, tagb; + + g_return_val_if_fail (anode_def_flags (na) & FLAG_TAG, 0); + g_return_val_if_fail (anode_def_flags (nb) & FLAG_TAG, 0); + + taga = anode_calc_tag (na); + g_return_val_if_fail (taga != G_MAXULONG, 0); + + tagb = anode_calc_tag (nb); + g_return_val_if_fail (tagb != G_MAXULONG, 0); + + if (taga == tagb) + return 0; + return (taga < tagb) ? -1 : 1; +} + +static const EggAsn1xDef * +adef_next_sibling (const EggAsn1xDef *def) +{ + int depth = 0; + + g_assert (def); + g_assert (def->value || def->type || def->name); + + if ((def->type & FLAG_RIGHT) == 0) + return NULL; + + /* Skip past any children */ + if ((def->type & FLAG_DOWN) == FLAG_DOWN) { + depth += 1; + while (depth > 0) { + ++def; + if ((def->type & FLAG_DOWN) == FLAG_DOWN) + depth += 1; + if ((def->type & FLAG_RIGHT) == 0) + depth -= 1; + } + } + + ++def; + g_return_val_if_fail (def->value || def->type || def->name, NULL); + return def; +} + +static const EggAsn1xDef * +adef_first_child (const EggAsn1xDef *def) +{ + g_assert (def); + g_assert (def->value || def->type || def->name); + + if ((def->type & FLAG_DOWN) == 0) + return NULL; + + ++def; + g_return_val_if_fail (def->value || def->type || def->name, NULL); + return def; +} + +static const EggAsn1xDef * +lookup_def_of_type (const EggAsn1xDef *defs, + const gchar *name, + gint type) +{ + const EggAsn1xDef *def; + + g_assert (defs); + g_assert (defs->value || defs->type || defs->name); + + for (def = adef_first_child (defs); def; def = adef_next_sibling (def)) { + if ((def->type & 0xFF) == type && def->name && g_str_equal (name, def->name)) + return def; + } + + return NULL; +} + +static gboolean +traverse_and_prepare (GNode *node, gpointer data) +{ + const EggAsn1xDef *defs = data; + const EggAsn1xDef *def; + const gchar *identifier; + Anode *an, *anj; + GNode *join = NULL; + GNode *child, *next; + GList *list = NULL, *l; + + /* A while, because the stuff we join, could also be an identifier */ + while (anode_def_type (node) == EGG_ASN1X_IDENTIFIER) { + an = node->data; + identifier = an->join ? an->join->value : an->def->value; + g_return_val_if_fail (identifier, TRUE); + egg_asn1x_destroy (join); + join = egg_asn1x_create (defs, identifier); + g_return_val_if_fail (join, TRUE); + anj = join->data; + an->join = anj->def; + } + + /* Move all the children of join node into our node */ + if (join) { + list = NULL; + for (child = join->children, list = NULL; child; child = child->next) + list = g_list_prepend (list, child); + list = g_list_reverse (list); + for (l = list; l; l = g_list_next (l)) { + child = l->data; + g_node_unlink (child); + g_node_append (node, child); + } + g_list_free (list); + list = NULL; + } + + /* Lookup the max set size */ + if (anode_def_type (node) == EGG_ASN1X_SIZE) { + identifier = anode_def_name (node); + if (identifier && !g_str_equal (identifier, "MAX") && + g_ascii_isalpha (identifier[0])) { + def = lookup_def_of_type (defs, identifier, EGG_ASN1X_INTEGER); + g_return_val_if_fail (def, TRUE); + anode_opt_add (node, def); + } + } + + /* Anything child not a real node, we put into opts */ + if (anode_def_type_is_real (node)) { + child = node->children; + while (child) { + next = child->next; + if (!anode_def_type_is_real (child)) { + an = child->data; + anode_opt_add (node, an->def); + for (l = an->opts; l; l = g_list_next (l)) + anode_opt_add (node, l->data); + g_node_unlink (child); + anode_destroy (child); + } + child = next; + } + } + + if (join) { + an = join->data; + for (l = an->opts; l; l = g_list_next (l)) + anode_opt_add (node, l->data); + egg_asn1x_destroy (join); + } + + /* Sort the children of any sets */ + if (anode_def_type (node) == EGG_ASN1X_SET) { + for (child = node->children; child; child = child->next) + list = g_list_prepend (list, child); + list = g_list_sort (list, compare_nodes_by_tag); + for (l = list; l; l = g_list_next (l)) + g_node_unlink (l->data); + for (l = list; l; l = g_list_next (l)) + g_node_append (node, l->data); + g_list_free (list); + list = NULL; + } + + /* Continue traversal */ + return FALSE; +} + +static const EggAsn1xDef * +match_oid_in_definition (const EggAsn1xDef *def, + GHashTable *names, + const gchar *match, + const gchar **problem) +{ + const EggAsn1xDef *result = NULL; + const EggAsn1xDef *odef; + const gchar *value; + GString *oid = NULL; + + g_assert (match); + g_assert (problem); + g_assert (names); + + for (odef = adef_first_child (def); odef; odef = adef_next_sibling (odef)) { + if ((odef->type & 0xFF) != EGG_ASN1X_CONSTANT) + continue; + + g_return_val_if_fail (odef->value, NULL); + if (strspn (odef->value, "01234567890") == strlen (odef->value)) { + value = odef->value; + + } else { + value = g_hash_table_lookup (names, odef->value); + + /* A name resolution problem */ + if (!value) { + if (oid) + g_string_free (oid, TRUE); + *problem = odef->value; + return NULL; + } + } + + if (oid) { + g_string_append_c (oid, '.'); + g_string_append (oid, value); + } else { + oid = g_string_new (value); + } + } + + if (oid != NULL) { + if (g_str_equal (oid->str, match)) + result = adef_next_sibling (def); + g_assert (def->name); + g_hash_table_insert (names, (gchar*)def->name, g_string_free (oid, FALSE)); + } + + return result; +} + +static const EggAsn1xDef * +match_oid_in_definitions (const EggAsn1xDef *defs, + const gchar *match) +{ + const EggAsn1xDef *def; + const EggAsn1xDef *result; + GHashTable *names; + gboolean progress; + const gchar *problem; + + names = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); + result = NULL; + + for (;;) { + progress = FALSE; + problem = NULL; + + for (def = adef_first_child (defs); def; def = adef_next_sibling (def)) { + + /* Only work with object ids, and ones with names */ + if ((def->type & 0xFF) != EGG_ASN1X_OBJECT_ID || !def->name) + continue; + + /* If we've already seen this one, skip */ + if (g_hash_table_lookup (names, def->name)) + continue; + + progress = TRUE; + result = match_oid_in_definition (def, names, match, &problem); + if (result != NULL) + break; + } + + if (!problem || result) { + break; + } else if (problem && !progress) { + g_warning ("couldn't find oid definition in ASN.1 for: %s", problem); + g_return_val_if_reached (NULL); + } + } + + g_hash_table_destroy (names); + return result; +} + +static gboolean +is_oid_number (const gchar *p) +{ + gboolean must = TRUE; + gint i; + + for (i = 0; p[i] != '\0'; i++) { + if (g_ascii_isdigit (p[i])) { + must = FALSE; + } else if (must) { + return FALSE; + } else { + if (p[i] != '.') + return FALSE; + must = TRUE; + } + } + + return !must; +} + +GNode* +egg_asn1x_create (const EggAsn1xDef *defs, + const gchar *type) +{ + const EggAsn1xDef *def; + GNode *root, *parent, *node; + int flags; + + g_return_val_if_fail (defs, NULL); + g_return_val_if_fail (type, NULL); + + /* An OID */ + if (is_oid_number (type)) { + def = match_oid_in_definitions (defs, type); + + /* An Identifier */ + } else { + for (def = adef_first_child (defs); def; def = adef_next_sibling (def)) { + if (def->name && g_str_equal (type, def->name)) + break; + } + } + + if (def == NULL || !def->name || !def->type) + return NULL; + + /* The node for this item */ + root = anode_new (def); + + /* Build up nodes for underlying level */ + if (def->type & FLAG_DOWN) { + node = root; + for (;;) { + if (def->type & FLAG_DOWN) { + parent = node; + } else if (def->type & FLAG_RIGHT) { + g_assert (node->parent); + parent = node->parent; + } else { + parent = node->parent; + while (parent) { + flags = anode_def_flags (parent); + parent = parent->parent; + if (flags & FLAG_RIGHT) + break; + } + } + + if (!parent) + break; + + ++def; + node = anode_new (def); + g_node_append (parent, node); + } + } + + /* Load up sub identifiers */ + g_node_traverse (root, G_POST_ORDER, G_TRAVERSE_ALL, -1, + traverse_and_prepare, (gpointer)defs); + + return root; +} + +GNode* +egg_asn1x_create_quark (const EggAsn1xDef *defs, + GQuark type) +{ + g_return_val_if_fail (type, NULL); + return egg_asn1x_create (defs, g_quark_to_string (type)); +} + +GNode * +egg_asn1x_create_and_decode_full (const EggAsn1xDef *defs, + const gchar *identifier, + GBytes *data, + gint options) +{ + GNode *asn; + + g_return_val_if_fail (defs != NULL, NULL); + g_return_val_if_fail (identifier != NULL, NULL); + g_return_val_if_fail (data != NULL, NULL); + + asn = egg_asn1x_create (defs, identifier); + g_return_val_if_fail (asn, NULL); + + if (!egg_asn1x_decode_full (asn, data, options)) { + egg_asn1x_destroy (asn); + return NULL; + } + + return asn; + +} + +GNode* +egg_asn1x_create_and_decode (const EggAsn1xDef *defs, + const gchar *identifier, + GBytes *data) +{ + g_return_val_if_fail (defs != NULL, NULL); + g_return_val_if_fail (identifier != NULL, NULL); + g_return_val_if_fail (data != NULL, NULL); + + return egg_asn1x_create_and_decode_full (defs, identifier, data, 0); +} + +/* ----------------------------------------------------------------------------------- + * DUMPING and MESSAGES + */ + +static void +dump_append_type (GString *output, gint type) +{ + #define XX(x) if (type == EGG_ASN1X_##x) g_string_append (output, #x " ") + XX(CONSTANT); XX(IDENTIFIER); XX(INTEGER); XX(BOOLEAN); XX(SEQUENCE); XX(BIT_STRING); + XX(OCTET_STRING); XX(TAG); XX(DEFAULT); XX(SIZE); XX(SEQUENCE_OF); XX(OBJECT_ID); XX(ANY); + XX(SET); XX(SET_OF); XX(DEFINITIONS); XX(TIME); XX(UTC_TIME); XX(GENERALIZED_TIME); XX(CHOICE); XX(IMPORTS); XX(NULL); + XX(ENUMERATED); XX(GENERAL_STRING); XX(NUMERIC_STRING); XX(IA5_STRING); XX(TELETEX_STRING); + XX(PRINTABLE_STRING); XX(UNIVERSAL_STRING); XX(BMP_STRING); XX(UTF8_STRING); XX(VISIBLE_STRING); + + if (output->len == 0) + g_string_printf (output, "%d ", (int)type); + #undef XX +} + +static void +dump_append_flags (GString *output, gint flags) +{ + #define XX(x) if ((FLAG_##x & flags) == FLAG_##x) g_string_append (output, #x " ") + XX(UNIVERSAL); XX(PRIVATE); XX(APPLICATION); XX(EXPLICIT); XX(IMPLICIT); XX(TAG); XX(OPTION); + XX(DEFAULT); XX(TRUE); XX(FALSE); XX(LIST); XX(MIN_MAX); XX(1_PARAM); XX(SIZE); XX(DEFINED_BY); + XX(GENERALIZED); XX(UTC); XX(IMPORTS); XX(NOT_USED); XX(SET); XX(ASSIGN); + /* XX(DOWN); XX(RIGHT); */ + #undef XX +} + +static gboolean +traverse_and_dump (GNode *node, gpointer unused) +{ + EggAsn1xDef *def; + guint i, depth; + GString *output; + gchar *string; + const gchar *suff; + Anode *an; + GList *l; + + depth = g_node_depth (node); + for (i = 0; i < depth - 1; ++i) + g_print (" "); + + an = node->data; + output = g_string_new (""); + dump_append_type (output, anode_def_type (node)); + dump_append_flags (output, anode_def_flags (node)); + string = g_utf8_casefold (output->str, output->len - 1); + g_string_free (output, TRUE); + suff = ""; + if (an->value) + suff = " *"; + else if (an->parsed) + suff = " ."; + g_print ("+ %s: %s [%s]%s\n", anode_def_name (node), anode_def_value (node), + string, suff); + g_free (string); + + /* Print out all the options */ + for (l = an->opts; l; l = g_list_next (l)) { + for (i = 0; i < depth; ++i) + g_print (" "); + + def = l->data; + output = g_string_new (""); + dump_append_type (output, def->type & 0xFF); + dump_append_flags (output, def->type); + string = g_utf8_casefold (output->str, output->len - 1); + g_string_free (output, TRUE); + g_print ("- %s: %s [%s]\n", def->name, (const gchar*)def->value, string); + g_free (string); + } + + return FALSE; +} + +void +egg_asn1x_dump (GNode *asn) +{ + g_return_if_fail (asn); + g_node_traverse (asn, G_PRE_ORDER, G_TRAVERSE_ALL, -1, traverse_and_dump, NULL); +} + +static gboolean +traverse_and_get_failure (GNode *node, gpointer user_data) +{ + const gchar **failure = user_data; + g_assert (!*failure); + *failure = anode_failure_get (node); + return (*failure != NULL); +} + +const gchar* +egg_asn1x_message (GNode *asn) +{ + const gchar *failure = NULL; + g_return_val_if_fail (asn, NULL); + g_node_traverse (asn, G_POST_ORDER, G_TRAVERSE_ALL, -1, traverse_and_get_failure, &failure); + return failure; +} + +/* ----------------------------------------------------------------------------------- + * CLEARING and DESTROYING + */ + +static gboolean +traverse_and_clear (GNode *node, gpointer unused) +{ + GNode *child, *next; + gint type; + + anode_clear (node); + + type = anode_def_type (node); + if (type == EGG_ASN1X_SET_OF || type == EGG_ASN1X_SEQUENCE_OF) { + + /* The first 'real' child is the template */ + child = node->children; + g_return_val_if_fail (child, TRUE); + + /* And any others are extras */ + child = child->next; + while (child) { + next = child->next; + anode_destroy (child); + child = next; + } + } + + /* Don't stop traversal */ + return FALSE; +} + +void +egg_asn1x_clear (GNode *asn) +{ + g_return_if_fail (asn); + g_node_traverse (asn, G_POST_ORDER, G_TRAVERSE_ALL, -1, traverse_and_clear, NULL); +} + +void +egg_asn1x_destroy (gpointer data) +{ + GNode *node = data; + + if (node != NULL) { + g_return_if_fail (G_NODE_IS_ROOT (node)); + anode_destroy (node); + } +} + +/* -------------------------------------------------------------------------------- + * TIME PARSING + */ + +glong +egg_asn1x_parse_time_general (const gchar *time, gssize n_time) +{ + gboolean ret; + glong value; + struct tm when; + gint offset = 0; + + g_return_val_if_fail (time, -1); + + if (n_time < 0) + n_time = strlen (time); + + ret = parse_general_time (time, n_time, &when, &offset); + if (!ret) + return -1; + + /* In order to work with 32 bit time_t. */ + if (sizeof (time_t) <= 4 && when.tm_year >= 138) { + value = (time_t)2145914603; /* 2037-12-31 23:23:23 */ + + /* Convert to seconds since epoch */ + } else { + value = timegm (&when); + g_return_val_if_fail (*time >= 0, FALSE); + value += offset; + } + + return value; +} + +glong +egg_asn1x_parse_time_utc (const gchar *time, gssize n_time) +{ + gboolean ret; + glong value; + struct tm when; + gint offset = 0; + + g_return_val_if_fail (time, -1); + + if (n_time < 0) + n_time = strlen (time); + + ret = parse_utc_time (time, n_time, &when, &offset); + if (!ret) + return -1; + + /* In order to work with 32 bit time_t. */ + if (sizeof (time_t) <= 4 && when.tm_year >= 138) { + value = (time_t)2145914603; /* 2037-12-31 23:23:23 */ + + /* Convert to seconds since epoch */ + } else { + value = timegm (&when); + g_return_val_if_fail (*time >= 0, FALSE); + value += offset; + } + + return value; +} + +/* -------------------------------------------------------------------------------- + * BASIC RAW ELEMENT INFO + */ + +gssize +egg_asn1x_element_length (const guchar *data, + gsize n_data) +{ + guchar cls; + int counter = 0; + int cb, len; + gulong tag; + + if (atlv_parse_cls_tag (data, data + n_data, &cls, &tag, &cb)) { + counter += cb; + len = atlv_parse_length (data + cb, data + n_data, &cb); + counter += cb; + if (len >= 0) { + len += counter; + if (n_data >= len) + return len; + } + } + + return -1; +} + +gconstpointer +egg_asn1x_element_content (const guchar *data, + gsize n_data, + gsize *n_content) +{ + int counter = 0; + guchar cls; + gulong tag; + int cb, len; + + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (n_content != NULL, NULL); + + /* Now get the data out of this element */ + if (!atlv_parse_cls_tag (data, data + n_data, &cls, &tag, &cb)) + return NULL; + + counter += cb; + len = atlv_parse_length (data + cb, data + n_data, &cb); + if (len < 0) + return NULL; + counter += cb; + + *n_content = len; + return (const guchar*)data + counter; +} diff --git a/egg/egg-asn1x.h b/egg/egg-asn1x.h new file mode 100644 index 0000000..2dac1a9 --- /dev/null +++ b/egg/egg-asn1x.h @@ -0,0 +1,282 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-asn1.h - ASN.1/DER parsing and encoding routines + + Copyright (C) 2009 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGG_ASN1X_H_ +#define EGG_ASN1X_H_ + +#include + +#ifndef HAVE_EGG_ALLOCATOR +typedef void* (*EggAllocator) (void* p, gsize); +#define HAVE_EGG_ALLOCATOR +#endif + +typedef struct _EggAsn1xDef EggAsn1xDef; + +typedef enum { + EGG_ASN1X_CONSTANT = 1, + EGG_ASN1X_IDENTIFIER = 2, + EGG_ASN1X_INTEGER = 3, + EGG_ASN1X_BOOLEAN = 4, + EGG_ASN1X_SEQUENCE = 5, + EGG_ASN1X_BIT_STRING = 6, + EGG_ASN1X_OCTET_STRING = 7, + EGG_ASN1X_TAG = 8, + EGG_ASN1X_DEFAULT = 9, + EGG_ASN1X_SIZE = 10, + EGG_ASN1X_SEQUENCE_OF = 11, + EGG_ASN1X_OBJECT_ID = 12, + EGG_ASN1X_ANY = 13, + EGG_ASN1X_SET = 14, + EGG_ASN1X_SET_OF = 15, + EGG_ASN1X_DEFINITIONS = 16, + EGG_ASN1X_TIME = 17, + EGG_ASN1X_CHOICE = 18, + EGG_ASN1X_IMPORTS = 19, + EGG_ASN1X_NULL = 20, + EGG_ASN1X_ENUMERATED = 21, + EGG_ASN1X_GENERAL_STRING = 27, + EGG_ASN1X_NUMERIC_STRING = 28, + EGG_ASN1X_IA5_STRING = 29, + EGG_ASN1X_TELETEX_STRING = 30, + EGG_ASN1X_PRINTABLE_STRING = 31, + EGG_ASN1X_UNIVERSAL_STRING = 32, + EGG_ASN1X_BMP_STRING = 33, + EGG_ASN1X_UTF8_STRING = 34, + EGG_ASN1X_VISIBLE_STRING = 35, + EGG_ASN1X_UTC_TIME = 36, + EGG_ASN1X_GENERALIZED_TIME = 37, +} EggAsn1xType; + +typedef enum { + EGG_ASN1X_NO_STRICT = 0x01, +} EggAsn1xFlags; + +GNode* egg_asn1x_create (const EggAsn1xDef *defs, + const gchar *type); + +GNode* egg_asn1x_create_quark (const EggAsn1xDef *defs, + GQuark type); + +GNode* egg_asn1x_create_and_decode (const EggAsn1xDef *defs, + const gchar *type, + GBytes *data); + +GNode* egg_asn1x_create_and_decode_full (const EggAsn1xDef *defs, + const gchar *type, + GBytes *data, + gint options); + +void egg_asn1x_dump (GNode *asn); + +void egg_asn1x_clear (GNode *asn); + +gboolean egg_asn1x_decode (GNode *asn, + GBytes *data); + +gboolean egg_asn1x_decode_full (GNode *asn, + GBytes *data, + gint options); + +void egg_asn1x_set_any_from (GNode *node, + GNode *from); + +gboolean egg_asn1x_set_any_raw (GNode *node, + GBytes *raw); + +gboolean egg_asn1x_get_any_into (GNode *node, + GNode *into); + +gboolean egg_asn1x_get_any_into_full (GNode *node, + GNode *into, + gint options); + +GNode * egg_asn1x_get_any_as (GNode *node, + const EggAsn1xDef *defs, + const gchar *type); + +GNode * egg_asn1x_get_any_as_full (GNode *node, + const EggAsn1xDef *defs, + const gchar *type, + gint options); + +GBytes * egg_asn1x_get_any_raw (GNode *node, + EggAllocator allocator); + +gboolean egg_asn1x_validate (GNode *asn, + gboolean strict); + +GBytes * egg_asn1x_encode (GNode *asn, + EggAllocator allocator); + +const gchar* egg_asn1x_message (GNode *asn); + +GNode* egg_asn1x_node (GNode *asn, + ...) G_GNUC_NULL_TERMINATED; + +const gchar* egg_asn1x_name (GNode *asn); + +EggAsn1xType egg_asn1x_type (GNode *asn); + +guint egg_asn1x_count (GNode *node); + +GNode* egg_asn1x_append (GNode *node); + +gboolean egg_asn1x_have (GNode *node); + +GNode* egg_asn1x_get_choice (GNode *node); + +gboolean egg_asn1x_set_choice (GNode *node, + GNode *choice); + +gboolean egg_asn1x_get_boolean (GNode *node, + gboolean *value); + +void egg_asn1x_set_boolean (GNode *node, + gboolean value); + +void egg_asn1x_set_null (GNode *node); + +GQuark egg_asn1x_get_enumerated (GNode *node); + +void egg_asn1x_set_enumerated (GNode *node, + GQuark value); + +gboolean egg_asn1x_get_integer_as_ulong (GNode *node, + gulong *value); + +void egg_asn1x_set_integer_as_ulong (GNode *node, + gulong value); + +GBytes * egg_asn1x_get_integer_as_raw (GNode *node); + +void egg_asn1x_set_integer_as_raw (GNode *node, + GBytes *value); + +void egg_asn1x_take_integer_as_raw (GNode *node, + GBytes *value); + +GBytes * egg_asn1x_get_integer_as_usg (GNode *node); + +void egg_asn1x_set_integer_as_usg (GNode *node, + GBytes *value); + +void egg_asn1x_take_integer_as_usg (GNode *node, + GBytes *value); + +GBytes * egg_asn1x_get_value_raw (GNode *node); + +GBytes * egg_asn1x_get_element_raw (GNode *node); + +guchar* egg_asn1x_get_string_as_raw (GNode *node, + EggAllocator allocator, + gsize *n_string); + +void egg_asn1x_set_string_as_raw (GNode *node, + guchar *data, + gsize n_data, + GDestroyNotify destroy); + +GBytes * egg_asn1x_get_string_as_bytes (GNode *node); + +void egg_asn1x_set_string_as_bytes (GNode *node, + GBytes *bytes); + +GBytes * egg_asn1x_get_string_as_usg (GNode *node, + EggAllocator allocator); + +GBytes * egg_asn1x_get_bits_as_raw (GNode *node, + guint *n_bits); + +void egg_asn1x_set_bits_as_raw (GNode *node, + GBytes *value, + guint n_bits); + +void egg_asn1x_take_bits_as_raw (GNode *node, + GBytes *value, + guint n_bits); + +gboolean egg_asn1x_get_bits_as_ulong (GNode *node, + gulong *value, + guint *n_bits); + +void egg_asn1x_set_bits_as_ulong (GNode *node, + gulong value, + guint n_bits); + +gchar * egg_asn1x_get_string_as_utf8 (GNode *node, + EggAllocator allocator); + +gboolean egg_asn1x_set_string_as_utf8 (GNode *node, + gchar *data, + GDestroyNotify destroy); + +gchar * egg_asn1x_get_bmpstring_as_utf8 (GNode *node); + +glong egg_asn1x_get_time_as_long (GNode *node); + +gboolean egg_asn1x_set_time_as_long (GNode *node, + glong time); + +gboolean egg_asn1x_get_time_as_date (GNode *node, + GDate *date); + +gboolean egg_asn1x_set_time_as_date (GNode *node, + GDate *date); + +GQuark egg_asn1x_get_oid_as_quark (GNode *node); + +gboolean egg_asn1x_set_oid_as_quark (GNode *node, + GQuark oid); + +gchar * egg_asn1x_get_oid_as_string (GNode *node); + +gboolean egg_asn1x_set_oid_as_string (GNode *node, + const gchar *oid); + +void egg_asn1x_destroy (gpointer asn); + +glong egg_asn1x_parse_time_general (const gchar *time, + gssize n_time); + +glong egg_asn1x_parse_time_utc (const gchar *time, + gssize n_time); + +gssize egg_asn1x_element_length (const guchar *data, + gsize n_data); + +gconstpointer egg_asn1x_element_content (const guchar *data, + gsize n_data, + gsize *n_content); + +#define egg_asn1x_assert(expr, node) \ + do { if G_LIKELY(expr) ; else \ + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + egg_asn1x_message (node) ? \ + egg_asn1x_message (node) : "[no message]"); } while(0) + +#define egg_asn1x_assert_not_reached(node) \ + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + egg_asn1x_message (node) ? \ + egg_asn1x_message (node) : "[no message]") + +#endif /*EGG_ASN1X_H_*/ diff --git a/egg/egg-buffer.c b/egg/egg-buffer.c new file mode 100644 index 0000000..e108bda --- /dev/null +++ b/egg/egg-buffer.c @@ -0,0 +1,581 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-buffer.c - Generic data buffer, used by openssh, gnome-keyring + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ +#include "config.h" + +#include +#include + +#include "egg-buffer.h" + +#define DEFAULT_ALLOCATOR ((EggBufferAllocator)realloc) + +int +egg_buffer_init (EggBuffer *buffer, size_t reserve) +{ + return egg_buffer_init_full (buffer, reserve, NULL); +} + +int +egg_buffer_init_full (EggBuffer *buffer, size_t reserve, EggBufferAllocator allocator) +{ + memset (buffer, 0, sizeof (*buffer)); + + if (!allocator) + allocator = DEFAULT_ALLOCATOR; + if (reserve == 0) + reserve = 64; + + buffer->buf = (allocator) (NULL, reserve); + if (!buffer->buf) { + buffer->failures++; + return 0; + } + + buffer->len = 0; + buffer->allocated_len = reserve; + buffer->failures = 0; + buffer->allocator = allocator; + + return 1; +} + +void +egg_buffer_init_static (EggBuffer* buffer, const unsigned char *buf, size_t len) +{ + memset (buffer, 0, sizeof (*buffer)); + + buffer->buf = (unsigned char*)buf; + buffer->len = len; + buffer->allocated_len = len; + buffer->failures = 0; + + /* A null allocator, and the buffer can't change in size */ + buffer->allocator = NULL; +} + +void +egg_buffer_init_allocated (EggBuffer *buffer, unsigned char *buf, size_t len, + EggBufferAllocator allocator) +{ + memset (buffer, 0, sizeof (*buffer)); + + if (!allocator) + allocator = DEFAULT_ALLOCATOR; + + buffer->buf = buf; + buffer->len = len; + buffer->allocated_len = len; + buffer->failures = 0; + buffer->allocator = allocator; +} + +void +egg_buffer_reset (EggBuffer *buffer) +{ + memset (buffer->buf, 0, buffer->allocated_len); + buffer->len = 0; + buffer->failures = 0; +} + +void +egg_buffer_uninit (EggBuffer *buffer) +{ + if (!buffer) + return; + + /* + * Free the memory block using allocator. If no allocator, + * then this memory is ownerd elsewhere and not to be freed. + */ + if (buffer->buf && buffer->allocator) + (buffer->allocator) (buffer->buf, 0); + + memset (buffer, 0, sizeof (*buffer)); +} + +unsigned char* +egg_buffer_uninit_steal (EggBuffer *buffer, size_t *n_result) +{ + unsigned char *result; + + if (n_result) + *n_result = buffer->len; + result = buffer->buf; + + memset (buffer, 0, sizeof (*buffer)); + + return result; +} + +int +egg_buffer_set_allocator (EggBuffer *buffer, EggBufferAllocator allocator) +{ + unsigned char *buf = NULL; + + if (!allocator) + allocator = DEFAULT_ALLOCATOR; + if (buffer->allocator == allocator) + return 1; + + if (buffer->allocated_len) { + /* Reallocate memory block using new allocator */ + buf = (allocator) (NULL, buffer->allocated_len); + if (buf == NULL) + return 0; + + /* Copy stuff into new memory */ + memcpy (buf, buffer->buf, buffer->allocated_len); + } + + /* If old wasn't static, then free it */ + if (buffer->allocator && buffer->buf) + (buffer->allocator) (buffer->buf, 0); + + buffer->buf = buf; + buffer->allocator = allocator; + + return 1; +} + +int +egg_buffer_equal (EggBuffer *b1, EggBuffer *b2) +{ + if (b1->len != b2->len) + return 0; + return memcmp (b1->buf, b2->buf, b1->len) == 0; +} + +int +egg_buffer_reserve (EggBuffer *buffer, size_t len) +{ + unsigned char *newbuf; + size_t newlen; + + if (len < buffer->allocated_len) + return 1; + + /* Calculate a new length, minimize number of buffer allocations */ + newlen = buffer->allocated_len * 2; + if (len > newlen) + newlen += len; + + /* Memory owned elsewhere can't be reallocated */ + if (!buffer->allocator) { + buffer->failures++; + return 0; + } + + /* Reallocate built in buffer using allocator */ + newbuf = (buffer->allocator) (buffer->buf, newlen); + if (!newbuf) { + buffer->failures++; + return 0; + } + + buffer->buf = newbuf; + buffer->allocated_len = newlen; + + return 1; +} + +int +egg_buffer_resize (EggBuffer *buffer, size_t len) +{ + if (!egg_buffer_reserve (buffer, len)) + return 0; + + buffer->len = len; + return 1; +} + +unsigned char* +egg_buffer_add_empty (EggBuffer *buffer, size_t len) +{ + size_t pos = buffer->len; + if (!egg_buffer_reserve (buffer, buffer->len + len)) + return NULL; + buffer->len += len; + return buffer->buf + pos; +} + +int +egg_buffer_append (EggBuffer *buffer, const unsigned char *val, + size_t len) +{ + if (!egg_buffer_reserve (buffer, buffer->len + len)) + return 0; /* failures already incremented */ + memcpy (buffer->buf + buffer->len, val, len); + buffer->len += len; + return 1; +} + +int +egg_buffer_add_byte (EggBuffer *buffer, unsigned char val) +{ + if (!egg_buffer_reserve (buffer, buffer->len + 1)) + return 0; /* failures already incremented */ + buffer->buf[buffer->len] = val; + buffer->len++; + return 1; +} + +int +egg_buffer_get_byte (EggBuffer *buffer, size_t offset, + size_t *next_offset, unsigned char *val) +{ + unsigned char *ptr; + if (buffer->len < 1 || offset > buffer->len - 1) { + buffer->failures++; + return 0; + } + ptr = (unsigned char*)buffer->buf + offset; + if (val != NULL) + *val = *ptr; + if (next_offset != NULL) + *next_offset = offset + 1; + return 1; +} + +void +egg_buffer_encode_uint16 (unsigned char* buf, uint16_t val) +{ + buf[0] = (val >> 8) & 0xff; + buf[1] = (val >> 0) & 0xff; +} + +uint16_t +egg_buffer_decode_uint16 (unsigned char* buf) +{ + uint16_t val = buf[0] << 8 | buf[1]; + return val; +} + +int +egg_buffer_add_uint16 (EggBuffer *buffer, uint16_t val) +{ + if (!egg_buffer_reserve (buffer, buffer->len + 2)) + return 0; /* failures already incremented */ + buffer->len += 2; + egg_buffer_set_uint16 (buffer, buffer->len - 2, val); + return 1; +} + +int +egg_buffer_set_uint16 (EggBuffer *buffer, size_t offset, uint16_t val) +{ + unsigned char *ptr; + if (buffer->len < 2 || offset > buffer->len - 2) { + buffer->failures++; + return 0; + } + ptr = (unsigned char*)buffer->buf + offset; + egg_buffer_encode_uint16 (ptr, val); + return 1; +} + +int +egg_buffer_get_uint16 (EggBuffer *buffer, size_t offset, + size_t *next_offset, uint16_t *val) +{ + unsigned char *ptr; + if (buffer->len < 2 || offset > buffer->len - 2) { + buffer->failures++; + return 0; + } + ptr = (unsigned char*)buffer->buf + offset; + if (val != NULL) + *val = egg_buffer_decode_uint16 (ptr); + if (next_offset != NULL) + *next_offset = offset + 2; + return 1; +} + +void +egg_buffer_encode_uint32 (unsigned char* buf, uint32_t val) +{ + buf[0] = (val >> 24) & 0xff; + buf[1] = (val >> 16) & 0xff; + buf[2] = (val >> 8) & 0xff; + buf[3] = (val >> 0) & 0xff; +} + +uint32_t +egg_buffer_decode_uint32 (unsigned char* ptr) +{ + uint32_t val = ptr[0] << 24 | ptr[1] << 16 | ptr[2] << 8 | ptr[3]; + return val; +} + +int +egg_buffer_add_uint32 (EggBuffer *buffer, uint32_t val) +{ + if (!egg_buffer_reserve (buffer, buffer->len + 4)) + return 0; /* failures already incremented */ + buffer->len += 4; + egg_buffer_set_uint32 (buffer, buffer->len - 4, val); + return 1; +} + +int +egg_buffer_set_uint32 (EggBuffer *buffer, size_t offset, uint32_t val) +{ + unsigned char *ptr; + if (buffer->len < 4 || offset > buffer->len - 4) { + buffer->failures++; + return 0; + } + ptr = (unsigned char*)buffer->buf + offset; + egg_buffer_encode_uint32 (ptr, val); + return 1; +} + +int +egg_buffer_get_uint32 (EggBuffer *buffer, size_t offset, size_t *next_offset, + uint32_t *val) +{ + unsigned char *ptr; + if (buffer->len < 4 || offset > buffer->len - 4) { + buffer->failures++; + return 0; + } + ptr = (unsigned char*)buffer->buf + offset; + if (val != NULL) + *val = egg_buffer_decode_uint32 (ptr); + if (next_offset != NULL) + *next_offset = offset + 4; + return 1; +} + +int +egg_buffer_add_uint64 (EggBuffer *buffer, uint64_t val) +{ + if (!egg_buffer_add_uint32 (buffer, ((val >> 32) & 0xffffffff))) + return 0; + return egg_buffer_add_uint32 (buffer, (val & 0xffffffff)); +} + +int +egg_buffer_get_uint64 (EggBuffer *buffer, size_t offset, + size_t *next_offset, uint64_t *val) +{ + uint32_t a, b; + if (!egg_buffer_get_uint32 (buffer, offset, &offset, &a)) + return 0; + if (!egg_buffer_get_uint32 (buffer, offset, &offset, &b)) + return 0; + if (val != NULL) + *val = ((uint64_t)a) << 32 | b; + if (next_offset != NULL) + *next_offset = offset; + return 1; +} + +int +egg_buffer_add_byte_array (EggBuffer *buffer, const unsigned char *val, + size_t len) +{ + if (val == NULL) + return egg_buffer_add_uint32 (buffer, 0xffffffff); + if (len >= 0x7fffffff) { + buffer->failures++; + return 0; + } + if (!egg_buffer_add_uint32 (buffer, len)) + return 0; + return egg_buffer_append (buffer, val, len); +} + +unsigned char* +egg_buffer_add_byte_array_empty (EggBuffer *buffer, size_t vlen) +{ + if (vlen >= 0x7fffffff) { + buffer->failures++; + return NULL; + } + if (!egg_buffer_add_uint32 (buffer, vlen)) + return NULL; + return egg_buffer_add_empty (buffer, vlen); +} + +int +egg_buffer_get_byte_array (EggBuffer *buffer, size_t offset, + size_t *next_offset, const unsigned char **val, + size_t *vlen) +{ + uint32_t len; + if (!egg_buffer_get_uint32 (buffer, offset, &offset, &len)) + return 0; + if (len == 0xffffffff) { + if (next_offset) + *next_offset = offset; + if (val) + *val = NULL; + if (vlen) + *vlen = 0; + return 1; + } else if (len >= 0x7fffffff) { + buffer->failures++; + return 0; + } + + if (buffer->len < len || offset > buffer->len - len) { + buffer->failures++; + return 0; + } + + if (val) + *val = buffer->buf + offset; + if (vlen) + *vlen = len; + if (next_offset) + *next_offset = offset + len; + + return 1; +} + +int +egg_buffer_add_string (EggBuffer *buffer, const char *str) +{ + if (str == NULL) { + return egg_buffer_add_uint32 (buffer, 0xffffffff); + } else { + size_t len = strlen (str); + if (len >= 0x7fffffff) + return 0; + if (!egg_buffer_add_uint32 (buffer, len)) + return 0; + return egg_buffer_append (buffer, (unsigned char*)str, len); + } +} + +int +egg_buffer_get_string (EggBuffer *buffer, size_t offset, size_t *next_offset, + char **str_ret, EggBufferAllocator allocator) +{ + uint32_t len; + + if (!allocator) + allocator = buffer->allocator; + if (!allocator) + allocator = DEFAULT_ALLOCATOR; + + if (!egg_buffer_get_uint32 (buffer, offset, &offset, &len)) { + return 0; + } + if (len == 0xffffffff) { + *next_offset = offset; + *str_ret = NULL; + return 1; + } else if (len >= 0x7fffffff) { + return 0; + } + + if (buffer->len < len || + offset > buffer->len - len) { + return 0; + } + + /* Make sure no null characters in string */ + if (memchr (buffer->buf + offset, 0, len) != NULL) + return 0; + + /* The passed allocator may be for non-pageable memory */ + *str_ret = (allocator) (NULL, len + 1); + if (!*str_ret) + return 0; + memcpy (*str_ret, buffer->buf + offset, len); + + /* Always zero terminate */ + (*str_ret)[len] = 0; + *next_offset = offset + len; + + return 1; +} + +int +egg_buffer_add_stringv (EggBuffer *buffer, const char** strv) +{ + const char **v; + uint32_t n = 0; + + if (!strv) + return 0; + + /* Add the number of strings coming */ + for (v = strv; *v; ++v) + ++n; + if (!egg_buffer_add_uint32 (buffer, n)) + return 0; + + /* Add the individual strings */ + for (v = strv; *v; ++v) { + if (!egg_buffer_add_string (buffer, *v)) + return 0; + } + + return 1; +} + +int +egg_buffer_get_stringv (EggBuffer *buffer, size_t offset, size_t *next_offset, + char ***strv_ret, EggBufferAllocator allocator) +{ + uint32_t n, i, j; + size_t len; + + if (!allocator) + allocator = buffer->allocator; + if (!allocator) + allocator = DEFAULT_ALLOCATOR; + + /* First the number of environment variable lines */ + if (!egg_buffer_get_uint32 (buffer, offset, &offset, &n)) + return 0; + + /* Then that number of strings */ + len = (n + 1) * sizeof (char*); + *strv_ret = (char**)(allocator) (NULL, len); + if (!*strv_ret) + return 0; + + /* All null strings */ + memset (*strv_ret, 0, len); + + for (i = 0; i < n; ++i) { + if (!egg_buffer_get_string (buffer, offset, &offset, + &((*strv_ret)[i]), allocator)) { + + /* Free all the strings on failure */ + for (j = 0; j < i; ++j) { + if ((*strv_ret)[j]) + (allocator) ((*strv_ret)[j], 0); + } + + return 0; + } + } + + if (next_offset != NULL) + *next_offset = offset; + + return 1; +} diff --git a/egg/egg-buffer.h b/egg/egg-buffer.h new file mode 100644 index 0000000..6291f1b --- /dev/null +++ b/egg/egg-buffer.h @@ -0,0 +1,196 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-buffer.h - Generic data buffer, used by openssh, gnome-keyring + + Copyright (C) 2007, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGG_BUFFER_H +#define EGG_BUFFER_H + +#include +#include + +/* ------------------------------------------------------------------- + * EggBuffer + * + * IMPORTANT: This is pure vanila standard C, no glib. We need this + * because certain consumers of this protocol need to be built + * without linking in any special libraries. ie: the PKCS#11 module. + * + * Memory Allocation + * + * Callers can set their own allocator. If NULL is used then standard + * C library heap memory is used and failures will not be fatal. Memory + * failures will instead result in a zero return value or + * egg_buffer_has_error() returning one. + * + * If you use something like g_realloc as the allocator, then memory + * failures become fatal just like in a standard GTK program. + * + * Don't change the allocator manually in the EggBuffer structure. The + * egg_buffer_set_allocator() func will reallocate and handle things + * properly. + * + * Pointers into the Buffer + * + * Any write operation has the posibility of reallocating memory + * and invalidating any direct pointers into the buffer. + */ + +/* The allocator for the EggBuffer. This follows the realloc() syntax and logic */ +typedef void* (*EggBufferAllocator) (void* p, size_t len); + +typedef struct _EggBuffer { + unsigned char *buf; + size_t len; + size_t allocated_len; + int failures; + EggBufferAllocator allocator; +} EggBuffer; + +#define EGG_BUFFER_EMPTY { NULL, 0, 0, 0, NULL } + +int egg_buffer_init (EggBuffer *buffer, size_t reserve); + +int egg_buffer_init_full (EggBuffer *buffer, + size_t reserve, + EggBufferAllocator allocator); + +void egg_buffer_init_static (EggBuffer *buffer, + const unsigned char *buf, + size_t len); + +void egg_buffer_init_allocated (EggBuffer *buffer, + unsigned char *buf, + size_t len, + EggBufferAllocator allocator); + +void egg_buffer_uninit (EggBuffer *buffer); + +unsigned char* egg_buffer_uninit_steal (EggBuffer *buffer, + size_t *n_result); + +int egg_buffer_set_allocator (EggBuffer *buffer, + EggBufferAllocator allocator); + +void egg_buffer_reset (EggBuffer *buffer); + +int egg_buffer_equal (EggBuffer *b1, + EggBuffer *b2); + +int egg_buffer_reserve (EggBuffer *buffer, + size_t len); + +int egg_buffer_resize (EggBuffer *buffer, + size_t len); + +int egg_buffer_append (EggBuffer *buffer, + const unsigned char *val, + size_t len); + +unsigned char* egg_buffer_add_empty (EggBuffer *buffer, + size_t len); + +int egg_buffer_add_byte (EggBuffer *buffer, + unsigned char val); + +int egg_buffer_get_byte (EggBuffer *buffer, + size_t offset, + size_t *next_offset, + unsigned char *val); + +void egg_buffer_encode_uint32 (unsigned char* buf, + uint32_t val); + +uint32_t egg_buffer_decode_uint32 (unsigned char* buf); + +int egg_buffer_add_uint32 (EggBuffer *buffer, + uint32_t val); + +int egg_buffer_set_uint32 (EggBuffer *buffer, + size_t offset, + uint32_t val); + +int egg_buffer_get_uint32 (EggBuffer *buffer, + size_t offset, + size_t *next_offset, + uint32_t *val); + +void egg_buffer_encode_uint16 (unsigned char* buf, + uint16_t val); + +uint16_t egg_buffer_decode_uint16 (unsigned char* buf); + +int egg_buffer_add_uint16 (EggBuffer *buffer, + uint16_t val); + +int egg_buffer_set_uint16 (EggBuffer *buffer, + size_t offset, + uint16_t val); + +int egg_buffer_get_uint16 (EggBuffer *buffer, + size_t offset, + size_t *next_offset, + uint16_t *val); + +int egg_buffer_add_byte_array (EggBuffer *buffer, + const unsigned char *val, + size_t len); + +int egg_buffer_get_byte_array (EggBuffer *buffer, + size_t offset, + size_t *next_offset, + const unsigned char **val, + size_t *vlen); + +unsigned char* egg_buffer_add_byte_array_empty (EggBuffer *buffer, + size_t vlen); + +int egg_buffer_add_string (EggBuffer *buffer, + const char *str); + +int egg_buffer_get_string (EggBuffer *buffer, + size_t offset, + size_t *next_offset, + char **str_ret, + EggBufferAllocator allocator); + +int egg_buffer_add_stringv (EggBuffer *buffer, + const char** strv); + +int egg_buffer_get_stringv (EggBuffer *buffer, + size_t offset, + size_t *next_offset, + char ***strv_ret, + EggBufferAllocator allocator); + +int egg_buffer_add_uint64 (EggBuffer *buffer, + uint64_t val); + +int egg_buffer_get_uint64 (EggBuffer *buffer, + size_t offset, + size_t *next_offset, + uint64_t *val); + +#define egg_buffer_length(b) ((b)->len) + +#define egg_buffer_has_error(b) ((b)->failures > 0) + +#endif /* EGG_BUFFER_H */ + diff --git a/egg/egg-decimal.c b/egg/egg-decimal.c new file mode 100644 index 0000000..ee3a806 --- /dev/null +++ b/egg/egg-decimal.c @@ -0,0 +1,101 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "egg-decimal.h" + +#include + +gpointer +egg_decimal_decode (const gchar *data, + gssize n_data, + gsize *n_decoded) +{ + gboolean saw_non_zero = FALSE; + guint8 *digits = NULL; + guint n_digits = 0; + guchar *usg; + gchar ch; + guint carry; + guint i; + guint cleared; + guchar *at_byte; + guint at_bit; + gsize length; + + g_return_val_if_fail (data, NULL); + + if (n_data < 0) + n_data = strlen (data); + + /* Convert everything to an array of digits */ + digits = g_new0 (guint8, n_data); + for (i = 0; i < n_data; i++) { + ch = data[i]; + if (ch < '0' || ch > '9') { + g_free (digits); + return NULL; + } else if (ch != '0' || saw_non_zero) { + digits[n_digits] = ch - '0'; + n_digits++; + saw_non_zero = TRUE; + } + } + + usg = g_new0 (guchar, n_data); + cleared = 0; + at_byte = usg + n_data - 1; + at_bit = 0; + + /* for every digit ... */ + while (cleared < n_digits) { + /* ... store the bit depending on whether last digit is odd */ + guchar bit = (digits[n_digits - 1] % 2); + *at_byte |= (bit << at_bit); + if (at_bit++ == 7) { + at_bit = 0; + at_byte--; + g_assert (at_byte >= usg); + } + + /* ... divide digits by two */ + carry = 0; + for (i = cleared; i < n_digits; i++) { + gboolean odd = (digits[i] % 2); + digits[i] = digits[i] / 2 + carry; + carry = odd ? 5 : 0; + if (i == cleared && digits[i] == 0) + cleared++; + } + } + + if (at_bit == 0) + at_byte++; + + length = n_data - (at_byte - usg); + memmove (usg, at_byte, length); + if (n_decoded) + *n_decoded = length; + + g_free (digits); + return usg; +} diff --git a/egg/egg-decimal.h b/egg/egg-decimal.h new file mode 100644 index 0000000..adfb602 --- /dev/null +++ b/egg/egg-decimal.h @@ -0,0 +1,31 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef EGG_DECIMAL_H_ +#define EGG_DECIMAL_H_ + +#include + +gpointer egg_decimal_decode (const gchar *data, + gssize n_data, + gsize *n_decoded); + +#endif /* EGG_DECIMAL_H_ */ diff --git a/egg/egg-dh.c b/egg/egg-dh.c new file mode 100644 index 0000000..b8b4d39 --- /dev/null +++ b/egg/egg-dh.c @@ -0,0 +1,351 @@ +/* + * gnome-keyring + * + * Copyright (C) 2009 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "egg-dh.h" +#include "egg-secure-memory.h" + +/* Enabling this is a complete security compromise */ +#define DEBUG_DH_SECRET 0 + +EGG_SECURE_DECLARE (dh); + +typedef struct _DHGroup { + const gchar *name; + guint bits; + const guchar *prime; + gsize n_prime; + const guchar base[1]; + gsize n_base; +} DHGroup; + +static const guchar dh_group_768_prime[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x3A, 0x36, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +static const guchar dh_group_1024_prime[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +static const guchar dh_group_1536_prime[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +static const guchar dh_group_2048_prime[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +static const guchar dh_group_3072_prime[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +static const guchar dh_group_4096_prime[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +static const guchar dh_group_8192_prime[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92, + 0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26, 0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE, 0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD, + 0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E, 0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE, 0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31, + 0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18, 0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED, 0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B, + 0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B, 0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42, 0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF, + 0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC, 0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03, 0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6, + 0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82, 0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E, 0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3, + 0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE, 0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5, 0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA, + 0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8, 0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0, 0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28, + 0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76, 0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0, 0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C, + 0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32, 0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68, 0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE, + 0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6, 0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xBE, 0x11, 0x59, 0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4, + 0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C, 0xD8, 0xBE, 0xC4, 0xD0, 0x73, 0xB9, 0x31, 0xBA, 0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00, + 0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED, 0x25, 0x76, 0xF6, 0x93, 0x6B, 0xA4, 0x24, 0x66, 0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68, + 0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78, 0x23, 0x8F, 0x16, 0xCB, 0xE3, 0x9D, 0x65, 0x2D, 0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9, + 0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07, 0x13, 0xEB, 0x57, 0xA8, 0x1A, 0x23, 0xF0, 0xC7, 0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B, + 0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD, 0xFA, 0x9D, 0x4B, 0x7F, 0xA2, 0xC0, 0x87, 0xE8, 0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A, + 0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6, 0x6D, 0x2A, 0x13, 0xF8, 0x3F, 0x44, 0xF8, 0x2D, 0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36, + 0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1, 0x64, 0xF3, 0x1C, 0xC5, 0x08, 0x46, 0x85, 0x1D, 0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1, + 0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73, 0xFA, 0xF3, 0x6B, 0xC3, 0x1E, 0xCF, 0xA2, 0x68, 0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92, + 0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7, 0x88, 0x9A, 0x00, 0x2E, 0xD5, 0xEE, 0x38, 0x2B, 0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47, + 0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA, 0x9E, 0x30, 0x50, 0xE2, 0x76, 0x56, 0x94, 0xDF, 0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71, + 0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +static const DHGroup dh_groups[] = { + { + "ietf-ike-grp-modp-768", 768, + dh_group_768_prime, G_N_ELEMENTS (dh_group_768_prime), + { 0x02 }, 1 + }, + { + "ietf-ike-grp-modp-1024", 1024, + dh_group_1024_prime, G_N_ELEMENTS (dh_group_1024_prime), + { 0x02 }, 1 + }, + { + "ietf-ike-grp-modp-1536", 1536, + dh_group_1536_prime, G_N_ELEMENTS (dh_group_1536_prime), + { 0x02 }, 1 + }, + { + "ietf-ike-grp-modp-2048", 2048, + dh_group_2048_prime, G_N_ELEMENTS (dh_group_2048_prime), + { 0x02 }, 1 + }, + { + "ietf-ike-grp-modp-3072", 3072, + dh_group_3072_prime, G_N_ELEMENTS (dh_group_3072_prime), + { 0x02 }, 1 + }, + { + "ietf-ike-grp-modp-4096", 4096, + dh_group_4096_prime, G_N_ELEMENTS (dh_group_4096_prime), + { 0x02 }, 1 + }, + { + "ietf-ike-grp-modp-8192", 8192, + dh_group_8192_prime, G_N_ELEMENTS (dh_group_8192_prime), + { 0x02 }, 1 + }, + { + NULL + } +}; + +gboolean +egg_dh_default_params_raw (const gchar *name, gconstpointer *prime, + gsize *n_prime, gconstpointer *base, gsize *n_base) +{ + const DHGroup *group; + + g_return_val_if_fail (name, FALSE); + g_return_val_if_fail (prime, FALSE); + g_return_val_if_fail (n_prime, FALSE); + g_return_val_if_fail (base, FALSE); + g_return_val_if_fail (n_base, FALSE); + + for (group = dh_groups; group->name; ++group) { + if (g_str_equal (group->name, name)) { + *prime = group->prime; + *n_prime = group->n_prime; + *base = group->base; + *n_base = group->n_base; + return TRUE; + } + } + + return FALSE; +} + +gboolean +egg_dh_default_params (const gchar *name, gcry_mpi_t *prime, gcry_mpi_t *base) +{ + const DHGroup *group; + gcry_error_t gcry; + + g_return_val_if_fail (name, FALSE); + + for (group = dh_groups; group->name; ++group) { + if (g_str_equal (group->name, name)) { + if (prime) { + gcry = gcry_mpi_scan (prime, GCRYMPI_FMT_USG, group->prime, group->n_prime, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + g_return_val_if_fail (gcry_mpi_get_nbits (*prime) == group->bits, FALSE); + } + if (base) { + gcry = gcry_mpi_scan (base, GCRYMPI_FMT_USG, group->base, group->n_base, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + } + return TRUE; + } + } + + return FALSE; +} + +gboolean +egg_dh_gen_pair (gcry_mpi_t prime, gcry_mpi_t base, guint bits, + gcry_mpi_t *pub, gcry_mpi_t *priv) +{ + guint pbits; + + g_return_val_if_fail (prime, FALSE); + g_return_val_if_fail (base, FALSE); + g_return_val_if_fail (pub, FALSE); + g_return_val_if_fail (priv, FALSE); + + pbits = gcry_mpi_get_nbits (prime); + g_return_val_if_fail (pbits > 1, FALSE); + + if (bits == 0) { + bits = pbits; + } else if (bits > pbits) { + g_return_val_if_reached (FALSE); + } + + /* + * Generate a strong random number of bits, and not zero. + * gcry_mpi_randomize bumps up to the next byte. Since we + * need to have a value less than half of prime, we make sure + * we bump down. + */ + *priv = gcry_mpi_snew (bits); + g_return_val_if_fail (*priv, FALSE); + while (gcry_mpi_cmp_ui (*priv, 0) == 0) + gcry_mpi_randomize (*priv, bits, GCRY_STRONG_RANDOM); + + /* Secret key value must be less than half of p */ + if (gcry_mpi_get_nbits (*priv) > bits) + gcry_mpi_clear_highbit (*priv, bits); + if (gcry_mpi_get_nbits (*priv) > pbits - 1) + gcry_mpi_clear_highbit (*priv, pbits - 1); + g_assert (gcry_mpi_cmp (prime, *priv) > 0); + + *pub = gcry_mpi_new (gcry_mpi_get_nbits (*priv)); + g_return_val_if_fail (*pub, FALSE); + gcry_mpi_powm (*pub, base, *priv, prime); + + return TRUE; +} + +gpointer +egg_dh_gen_secret (gcry_mpi_t peer, gcry_mpi_t priv, + gcry_mpi_t prime, gsize *bytes) +{ + gcry_error_t gcry; + guchar *value; + gsize n_value; + gcry_mpi_t k; + gint bits; + + g_return_val_if_fail (peer, NULL); + g_return_val_if_fail (priv, NULL); + g_return_val_if_fail (prime, NULL); + + bits = gcry_mpi_get_nbits (prime); + g_return_val_if_fail (bits >= 0, NULL); + + k = gcry_mpi_snew (bits); + g_return_val_if_fail (k, NULL); + gcry_mpi_powm (k, peer, priv, prime); + + /* Write out the secret */ + gcry = gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &n_value, k); + g_return_val_if_fail (gcry == 0, NULL); + value = egg_secure_alloc (n_value); + gcry = gcry_mpi_print (GCRYMPI_FMT_USG, value, n_value, &n_value, k); + g_return_val_if_fail (gcry == 0, NULL); + +#if DEBUG_DH_SECRET + g_printerr ("DH SECRET: "); + gcry_mpi_dump (k); +#endif + + gcry_mpi_release (k); + *bytes = n_value; + +#if DEBUG_DH_SECRET + gcry_mpi_scan (&k, GCRYMPI_FMT_USG, value, bytes, NULL); + g_printerr ("RAW SECRET: "); + gcry_mpi_dump (k); + gcry_mpi_release (k); +#endif + + return value; +} diff --git a/egg/egg-dh.h b/egg/egg-dh.h new file mode 100644 index 0000000..5d180a9 --- /dev/null +++ b/egg/egg-dh.h @@ -0,0 +1,48 @@ +/* + * gnome-keyring + * + * Copyright (C) 2009 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef EGG_DH_H_ +#define EGG_DH_H_ + +#include + +#include + +gboolean egg_dh_default_params (const gchar *name, + gcry_mpi_t *prime, + gcry_mpi_t *base); + +gboolean egg_dh_default_params_raw (const gchar *name, + gconstpointer *prime, + gsize *n_prime, + gconstpointer *base, + gsize *n_base); + +gboolean egg_dh_gen_pair (gcry_mpi_t prime, + gcry_mpi_t base, + guint bits, + gcry_mpi_t *pub, + gcry_mpi_t *priv); + +gpointer egg_dh_gen_secret (gcry_mpi_t peer, + gcry_mpi_t priv, + gcry_mpi_t prime, + gsize *bytes); + +#endif /* EGG_DH_H_ */ diff --git a/egg/egg-dn.c b/egg/egg-dn.c new file mode 100644 index 0000000..601dccc --- /dev/null +++ b/egg/egg-dn.c @@ -0,0 +1,368 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-asn1.c - ASN.1 helper routines + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg-asn1-defs.h" +#include "egg-asn1x.h" +#include "egg-dn.h" +#include "egg-oid.h" + +#include + +static const char HEXC[] = "0123456789ABCDEF"; + +static gchar* +dn_print_hex_value (GBytes *val) +{ + const gchar *data = g_bytes_get_data (val, NULL); + gsize size = g_bytes_get_size (val); + GString *result = g_string_sized_new (size * 2 + 1); + gsize i; + + g_string_append_c (result, '#'); + for (i = 0; i < size; ++i) { + g_string_append_c (result, HEXC[data[i] >> 4 & 0xf]); + g_string_append_c (result, HEXC[data[i] & 0xf]); + } + + return g_string_free (result, FALSE); +} + +static gchar* +dn_print_oid_value_parsed (GQuark oid, + guint flags, + GNode *val) +{ + GNode *asn1, *node; + GBytes *value; + const gchar *data; + gsize size; + gchar *result; + + g_assert (val != NULL); + + asn1 = egg_asn1x_create_quark (pkix_asn1_tab, oid); + g_return_val_if_fail (asn1, NULL); + + if (!egg_asn1x_get_any_into (val, asn1)) { + g_message ("couldn't decode value for OID: %s: %s", + g_quark_to_string (oid), egg_asn1x_message (asn1)); + egg_asn1x_destroy (asn1); + return NULL; + } + + /* + * If it's a choice element, then we have to read depending + * on what's there. + */ + if (flags & EGG_OID_IS_CHOICE) + node = egg_asn1x_get_choice (asn1); + else + node = asn1; + + value = egg_asn1x_get_value_raw (node); + data = g_bytes_get_data (value, &size); + + /* + * Now we make sure it's UTF-8. + */ + + if (!value) { + g_message ("couldn't read value for OID: %s", g_quark_to_string (oid)); + result = NULL; + + } else if (!g_utf8_validate (data, size, NULL)) { + result = dn_print_hex_value (value); + + } else { + result = g_strndup (data, size); + } + + g_bytes_unref (value); + egg_asn1x_destroy (asn1); + + return result; +} + +static gchar* +dn_print_oid_value (GQuark oid, + guint flags, + GNode *val) +{ + GBytes *der; + gchar *value; + + g_assert (val != NULL); + + if (flags & EGG_OID_PRINTABLE) { + value = dn_print_oid_value_parsed (oid, flags, val); + if (value != NULL) + return value; + } + + der = egg_asn1x_get_element_raw (val); + value = dn_print_hex_value (der); + g_bytes_unref (der); + + return value; +} + +static gchar* +dn_parse_rdn (GNode *asn) +{ + const gchar *name; + guint flags; + GQuark oid; + GNode *value; + gchar *display; + gchar *result; + + g_assert (asn); + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "type", NULL)); + g_return_val_if_fail (oid, NULL); + + flags = egg_oid_get_flags (oid); + name = egg_oid_get_name (oid); + + value = egg_asn1x_node (asn, "value", NULL); + g_return_val_if_fail (value, NULL); + + display = dn_print_oid_value (oid, flags, value); + result = g_strconcat ((flags & EGG_OID_PRINTABLE) ? name : g_quark_to_string (oid), + "=", display, NULL); + g_free (display); + + return result; +} + +gchar* +egg_dn_read (GNode* asn) +{ + gboolean done = FALSE; + GString *result; + GNode *node; + gchar *rdn; + gint i, j; + + g_return_val_if_fail (asn, NULL); + + result = g_string_sized_new (64); + + /* Each (possibly multi valued) RDN */ + for (i = 1; !done; ++i) { + + /* Each type=value pair of an RDN */ + for (j = 1; TRUE; ++j) { + node = egg_asn1x_node (asn, i, j, NULL); + if (!node) { + done = j == 1; + break; + } + + rdn = dn_parse_rdn (node); + g_return_val_if_fail (rdn, NULL); + + /* Account for multi valued RDNs */ + if (j > 1) + g_string_append (result, "+"); + else if (i > 1) + g_string_append (result, ", "); + + g_string_append (result, rdn); + g_free (rdn); + } + } + + /* Returns null when string is empty */ + return g_string_free (result, (result->len == 0)); +} + +gchar* +egg_dn_read_part (GNode *asn, const gchar *match) +{ + gboolean done = FALSE; + const gchar *name; + GNode *node; + GQuark oid; + gint i, j; + + g_return_val_if_fail (asn, NULL); + g_return_val_if_fail (match, NULL); + + /* Each (possibly multi valued) RDN */ + for (i = 1; !done; ++i) { + + /* Each type=value pair of an RDN */ + for (j = 1; TRUE; ++j) { + node = egg_asn1x_node (asn, i, j, "type", NULL); + if (!node) { + done = j == 1; + break; + } + + oid = egg_asn1x_get_oid_as_quark (node); + g_return_val_if_fail (oid, NULL); + + /* Does it match either the OID or the displayable? */ + if (g_ascii_strcasecmp (g_quark_to_string (oid), match) != 0) { + name = egg_oid_get_name (oid); + if (!g_ascii_strcasecmp (name, match) == 0) + continue; + } + + node = egg_asn1x_node (asn, i, j, "value", NULL); + g_return_val_if_fail (node, NULL); + + return dn_print_oid_value (oid, egg_oid_get_flags (oid), node); + } + } + + return NULL; +} + +gboolean +egg_dn_parse (GNode *asn, EggDnCallback callback, gpointer user_data) +{ + gboolean done = FALSE; + GNode *node; + GQuark oid; + guint i, j; + + g_return_val_if_fail (asn, FALSE); + + /* Each (possibly multi valued) RDN */ + for (i = 1; !done; ++i) { + + /* Each type=value pair of an RDN */ + for (j = 1; TRUE; ++j) { + + /* Dig out the type */ + node = egg_asn1x_node (asn, i, j, "type", NULL); + if (!node) { + done = j == 1; + break; + } + + oid = egg_asn1x_get_oid_as_quark (node); + g_return_val_if_fail (oid, FALSE); + + /* Dig out the value */ + node = egg_asn1x_node (asn, i, j, "value", NULL); + if (!node) { + done = j == 1; + break; + } + + if (callback) + (callback) (i, oid, node, user_data); + } + } + + return i > 1; +} + +gchar * +egg_dn_print_value (GQuark oid, + GNode *value) +{ + g_return_val_if_fail (oid != 0, NULL); + g_return_val_if_fail (value != NULL, NULL); + + return dn_print_oid_value (oid, egg_oid_get_flags (oid), value); +} + +static gboolean +is_ascii_string (const gchar *string) +{ + const gchar *p = string; + + g_return_val_if_fail (string != NULL, FALSE); + + for (p = string; *p != '\0'; p++) { + if (!g_ascii_isspace (*p) && *p < ' ') + return FALSE; + } + + return TRUE; +} + +static gboolean +is_printable_string (const gchar *string) +{ + const gchar *p = string; + + g_return_val_if_fail (string != NULL, FALSE); + + for (p = string; *p != '\0'; p++) { + if (!g_ascii_isalnum (*p) && !strchr (" '()+,-./:=?", *p)) + return FALSE; + } + + return TRUE; +} + +void +egg_dn_add_string_part (GNode *asn, + GQuark oid, + const gchar *string) +{ + GNode *node; + GNode *value; + GNode *val; + guint flags; + + g_return_if_fail (asn != NULL); + g_return_if_fail (oid != 0); + g_return_if_fail (string != NULL); + + flags = egg_oid_get_flags (oid); + g_return_if_fail (flags & EGG_OID_PRINTABLE); + + /* Add the RelativeDistinguishedName */ + node = egg_asn1x_append (asn); + + /* Add the AttributeTypeAndValue */ + node = egg_asn1x_append (node); + + egg_asn1x_set_oid_as_quark (egg_asn1x_node (node, "type", NULL), oid); + + value = egg_asn1x_create_quark (pkix_asn1_tab, oid); + + if (egg_asn1x_type (value) == EGG_ASN1X_CHOICE) { + if (is_printable_string (string)) + val = egg_asn1x_node (value, "printableString", NULL); + else if (is_ascii_string (string)) + val = egg_asn1x_node (value, "ia5String", NULL); + else + val = egg_asn1x_node (value, "utf8String", NULL); + egg_asn1x_set_choice (value, val); + } else { + val = value; + } + + egg_asn1x_set_string_as_utf8 (val, g_strdup (string), g_free); + + egg_asn1x_set_any_from (egg_asn1x_node (node, "value", NULL), value); + egg_asn1x_destroy (value); +} diff --git a/egg/egg-dn.h b/egg/egg-dn.h new file mode 100644 index 0000000..eb07736 --- /dev/null +++ b/egg/egg-dn.h @@ -0,0 +1,49 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-dn.h - ASN.1 helper routines + + Copyright (C) 2010 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGG_DN_H_ +#define EGG_DN_H_ + +#include + +gchar* egg_dn_read (GNode *node); + +gchar* egg_dn_read_part (GNode *node, + const gchar *match); + +typedef void (*EggDnCallback) (guint index, + GQuark oid, + GNode *value, + gpointer user_data); + +gboolean egg_dn_parse (GNode *node, + EggDnCallback callback, + gpointer user_data); + +gchar* egg_dn_print_value (GQuark oid, + GNode *value); + +void egg_dn_add_string_part (GNode *node, + GQuark oid, + const gchar *string); + +#endif /* EGG_DN_H_ */ diff --git a/egg/egg-error.h b/egg/egg-error.h new file mode 100644 index 0000000..3f82c39 --- /dev/null +++ b/egg/egg-error.h @@ -0,0 +1,40 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef EGG_ERROR_H_ +#define EGG_ERROR_H_ + +#include + +static inline const gchar * +egg_error_message (GError *error) +{ + g_return_val_if_fail (error, "(unknown)"); + return error->message ? error->message : "(null)"; +} + +static inline const gchar * +egg_error_result_message (GError **error) +{ + if (error == NULL) + return "(unknown)"; + return (*error) && (*error)->message ? (*error)->message : "(null)"; +} + +#endif /* EGG_ERROR_H_ */ diff --git a/egg/egg-hex.c b/egg/egg-hex.c new file mode 100644 index 0000000..d7d05fc --- /dev/null +++ b/egg/egg-hex.c @@ -0,0 +1,155 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "egg-hex.h" + +#include + +static const char HEXC_UPPER[] = "0123456789ABCDEF"; +static const char HEXC_LOWER[] = "0123456789abcdef"; + +gpointer +egg_hex_decode (const gchar *data, gssize n_data, gsize *n_decoded) +{ + return egg_hex_decode_full (data, n_data, 0, 1, n_decoded); +} + +gpointer +egg_hex_decode_full (const gchar *data, + gssize n_data, + const gchar *delim, + guint group, + gsize *n_decoded) +{ + guchar *result; + guchar *decoded; + gsize n_delim; + gushort j; + gint state = 0; + gint part = 0; + const gchar* pos; + + g_return_val_if_fail (data || !n_data, NULL); + g_return_val_if_fail (n_decoded, NULL); + g_return_val_if_fail (group >= 1, NULL); + + if (n_data == -1) + n_data = strlen (data); + n_delim = delim ? strlen (delim) : 0; + decoded = result = g_malloc0 ((n_data / 2) + 1); + *n_decoded = 0; + + while (n_data > 0 && state == 0) { + + if (decoded != result && delim) { + if (n_data < n_delim || memcmp (data, delim, n_delim) != 0) { + state = -1; + break; + } + + data += n_delim; + n_data -= n_delim; + } + + while (part < group && n_data > 0) { + + /* Find the position */ + pos = strchr (HEXC_UPPER, g_ascii_toupper (*data)); + if (pos == 0) { + if (n_data > 0) + state = -1; + break; + } + + j = pos - HEXC_UPPER; + if(!state) { + *decoded = (j & 0xf) << 4; + state = 1; + } else { + *decoded |= (j & 0xf); + (*n_decoded)++; + decoded++; + state = 0; + part++; + } + + ++data; + --n_data; + } + + part = 0; + } + + /* Parsing error */ + if (state != 0) { + g_free (result); + result = NULL; + } + + return result; +} + +gchar* +egg_hex_encode (gconstpointer data, gsize n_data) +{ + return egg_hex_encode_full (data, n_data, TRUE, NULL, 0); +} + +gchar* +egg_hex_encode_full (gconstpointer data, + gsize n_data, + gboolean upper_case, + const gchar *delim, + guint group) +{ + GString *result; + const gchar *input; + const char *hexc; + gsize bytes; + guchar j; + + g_return_val_if_fail (data || !n_data, NULL); + + input = data; + hexc = upper_case ? HEXC_UPPER : HEXC_LOWER; + + result = g_string_sized_new (n_data * 2 + 1); + bytes = 0; + + while (n_data > 0) { + + if (delim && group && bytes && (bytes % group) == 0) + g_string_append (result, delim); + + j = *(input) >> 4 & 0xf; + g_string_append_c (result, hexc[j]); + + j = *(input++) & 0xf; + g_string_append_c (result, hexc[j]); + + ++bytes; + --n_data; + } + + /* Make sure still null terminated */ + return g_string_free (result, FALSE); +} + diff --git a/egg/egg-hex.h b/egg/egg-hex.h new file mode 100644 index 0000000..d5baea6 --- /dev/null +++ b/egg/egg-hex.h @@ -0,0 +1,44 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef EGG_HEX_H_ +#define EGG_HEX_H_ + +#include + +gpointer egg_hex_decode (const gchar *data, + gssize n_data, + gsize *n_decoded); + +gpointer egg_hex_decode_full (const gchar *data, + gssize n_data, + const gchar *delim, + guint group, + gsize *n_decoded); + +gchar* egg_hex_encode (gconstpointer data, + gsize n_data); + +gchar* egg_hex_encode_full (gconstpointer data, + gsize n_data, + gboolean upper_case, + const gchar *delim, + guint group); + +#endif /* EGG_HEX_H_ */ diff --git a/egg/egg-hkdf.c b/egg/egg-hkdf.c new file mode 100644 index 0000000..123b988 --- /dev/null +++ b/egg/egg-hkdf.c @@ -0,0 +1,108 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "egg-hkdf.h" +#include "egg-secure-memory.h" + +#include + +#include + +gboolean +egg_hkdf_perform (const gchar *hash_algo, gconstpointer input, gsize n_input, + gconstpointer salt, gsize n_salt, gconstpointer info, + gsize n_info, gpointer output, gsize n_output) +{ + gpointer alloc = NULL; + gpointer buffer = NULL; + gcry_md_hd_t md1, md2; + guint hash_len; + gint i; + gint flags, algo; + gsize step, n_buffer; + guchar *at; + gcry_error_t gcry; + + algo = gcry_md_map_name (hash_algo); + g_return_val_if_fail (algo != 0, FALSE); + + hash_len = gcry_md_get_algo_dlen (algo); + g_return_val_if_fail (hash_len != 0, FALSE); + g_return_val_if_fail (n_output <= 255 * hash_len, FALSE); + + /* Buffer we need to for intermediate stuff */ + if (gcry_is_secure (input)) { + flags = GCRY_MD_FLAG_SECURE; + buffer = gcry_malloc_secure (hash_len); + } else { + flags = 0; + buffer = gcry_malloc (hash_len); + } + + g_return_val_if_fail (buffer, FALSE); + n_buffer = 0; + + /* Salt defaults to hash_len zeros */ + if (!salt) { + salt = alloc = g_malloc0 (hash_len); + n_salt = hash_len; + } + + /* Step 1: Extract */ + gcry = gcry_md_open (&md1, algo, GCRY_MD_FLAG_HMAC | flags); + g_return_val_if_fail (gcry == 0, FALSE); + gcry = gcry_md_setkey (md1, salt, n_salt); + g_return_val_if_fail (gcry == 0, FALSE); + gcry_md_write (md1, input, n_input); + + /* Step 2: Expand */ + gcry = gcry_md_open (&md2, algo, GCRY_MD_FLAG_HMAC | flags); + g_return_val_if_fail (gcry == 0, FALSE); + gcry = gcry_md_setkey (md2, gcry_md_read (md1, algo), hash_len); + g_return_val_if_fail (gcry == 0, FALSE); + gcry_md_close (md1); + + at = output; + for (i = 1; i < 256; ++i) { + gcry_md_reset (md2); + gcry_md_write (md2, buffer, n_buffer); + gcry_md_write (md2, info, n_info); + gcry_md_putc (md2, i); + + n_buffer = hash_len; + memcpy (buffer, gcry_md_read (md2, algo), n_buffer); + + step = MIN (n_buffer, n_output); + memcpy (at, buffer, step); + n_output -= step; + at += step; + + if (!n_output) + break; + } + + g_free (alloc); + gcry_free (buffer); + gcry_md_close (md2); + return TRUE; +} diff --git a/egg/egg-hkdf.h b/egg/egg-hkdf.h new file mode 100644 index 0000000..d501641 --- /dev/null +++ b/egg/egg-hkdf.h @@ -0,0 +1,37 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef EGG_HKDF_H_ +#define EGG_HKDF_H_ + +#include + +gboolean egg_hkdf_perform (const gchar *hash_algo, + gconstpointer input, + gsize n_input, + gconstpointer salt, + gsize n_salt, + gconstpointer info, + gsize n_info, + gpointer output, + gsize n_output); + +#endif /* EGG_HKDF_H_ */ diff --git a/egg/egg-libgcrypt.c b/egg/egg-libgcrypt.c new file mode 100644 index 0000000..7c3e889 --- /dev/null +++ b/egg/egg-libgcrypt.c @@ -0,0 +1,87 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "egg-libgcrypt.h" +#include "egg-secure-memory.h" + +#include + +#include + +#include +#include + +EGG_SECURE_DECLARE (libgcrypt); + +static void +log_handler (gpointer unused, int unknown, const gchar *msg, va_list va) +{ + /* TODO: Figure out additional arguments */ + g_logv ("gcrypt", G_LOG_LEVEL_MESSAGE, msg, va); +} + +static int +no_mem_handler (gpointer unused, size_t sz, unsigned int unknown) +{ + /* TODO: Figure out additional arguments */ + g_error ("couldn't allocate %lu bytes of memory", + (unsigned long int)sz); + return 0; +} + +static void +fatal_handler (gpointer unused, int unknown, const gchar *msg) +{ + /* TODO: Figure out additional arguments */ + g_log ("gcrypt", G_LOG_LEVEL_ERROR, "%s", msg); +} + +GCRY_THREAD_OPTION_PTHREAD_IMPL; + +void +egg_libgcrypt_initialize (void) +{ + static volatile gsize gcrypt_initialized = 0; + unsigned seed; + + if (g_once_init_enter (&gcrypt_initialized)) { + + /* Only initialize libgcrypt if it hasn't already been initialized */ + if (!gcry_control (GCRYCTL_INITIALIZATION_FINISHED_P)) { + gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); + gcry_check_version (LIBGCRYPT_VERSION); + gcry_set_log_handler (log_handler, NULL); + gcry_set_outofcore_handler (no_mem_handler, NULL); + gcry_set_fatalerror_handler (fatal_handler, NULL); + gcry_set_allocation_handler ((gcry_handler_alloc_t)g_malloc, + (gcry_handler_alloc_t)egg_secure_alloc, + egg_secure_check, + (gcry_handler_realloc_t)egg_secure_realloc, + egg_secure_free); + gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); + } + + gcry_create_nonce (&seed, sizeof (seed)); + srand (seed); + + g_once_init_leave (&gcrypt_initialized, 1); + } +} diff --git a/egg/egg-libgcrypt.h b/egg/egg-libgcrypt.h new file mode 100644 index 0000000..9e33c9a --- /dev/null +++ b/egg/egg-libgcrypt.h @@ -0,0 +1,26 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef EGG_LIBGCRYPT_H_ +#define EGG_LIBGCRYPT_H_ + +/* Initializes libgcrypt for use in a glib program */ +void egg_libgcrypt_initialize (void); + +#endif /* EGG_LIBGCRYPT_H_ */ diff --git a/egg/egg-oid.c b/egg/egg-oid.c new file mode 100644 index 0000000..e604846 --- /dev/null +++ b/egg/egg-oid.c @@ -0,0 +1,185 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-oid.c - OID helper routines + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg-oid.h" + +#include + +#include + +typedef struct _OidInfo { + GQuark oid; + const gchar *oidstr; + const gchar *attr; + const gchar *description; + guint flags; +} OidInfo; + +static OidInfo oid_info[] = { + { 0, "0.9.2342.19200300.100.1.25", "DC", N_("Domain Component"), + EGG_OID_PRINTABLE }, + { 0, "0.9.2342.19200300.100.1.1", "UID", N_("User ID"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + + { 0, "1.2.840.113549.1.9.1", "EMAIL", N_("Email Address"), + EGG_OID_PRINTABLE }, + { 0, "1.2.840.113549.1.9.7", NULL, NULL, + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + + { 0, "1.2.840.113549.1.9.20", NULL, NULL, + EGG_OID_PRINTABLE }, + + { 0, "1.3.6.1.5.5.7.9.1", "dateOfBirth", N_("Date of Birth"), + EGG_OID_PRINTABLE }, + { 0, "1.3.6.1.5.5.7.9.2", "placeOfBirth", N_("Place of Birth"), + EGG_OID_PRINTABLE }, + { 0, "1.3.6.1.5.5.7.9.3", "gender", N_("Gender"), + EGG_OID_PRINTABLE }, + { 0, "1.3.6.1.5.5.7.9.4", "countryOfCitizenship", N_("Country of Citizenship"), + EGG_OID_PRINTABLE }, + { 0, "1.3.6.1.5.5.7.9.5", "countryOfResidence", N_("Country of Residence"), + EGG_OID_PRINTABLE }, + + { 0, "2.5.4.3", "CN", N_("Common Name"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.4", "surName", N_("Surname"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.5", "serialNumber", N_("Serial Number"), + EGG_OID_PRINTABLE }, + { 0, "2.5.4.6", "C", N_("Country"), + EGG_OID_PRINTABLE, }, + { 0, "2.5.4.7", "L", N_("Locality"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.8", "ST", N_("State"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.9", "STREET", N_("Street"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.10", "O", N_("Organization"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.11", "OU", N_("Organizational Unit"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.12", "T", N_("Title"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.20", "telephoneNumber", N_("Telephone Number"), + EGG_OID_PRINTABLE }, + { 0, "2.5.4.42", "givenName", N_("Given Name"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.43", "initials", N_("Initials"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.44", "generationQualifier", N_("Generation Qualifier"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + { 0, "2.5.4.46", "dnQualifier", N_("DN Qualifier"), + EGG_OID_PRINTABLE }, + { 0, "2.5.4.65", "pseudonym", N_("Pseudonym"), + EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE }, + + { 0, "1.2.840.113549.1.1.1", "rsaEncryption", N_("RSA"), 0 }, + { 0, "1.2.840.113549.1.1.2", "md2WithRSAEncryption", N_("MD2 with RSA"), 0 }, + { 0, "1.2.840.113549.1.1.4", "md5WithRSAEncryption", N_("MD5 with RSA"), 0 }, + { 0, "1.2.840.113549.1.1.5", "sha1WithRSAEncryption", N_("SHA1 with RSA"), 0 }, + + { 0, "1.2.840.10040.4.1", "dsa", N_("DSA"), 0 }, + { 0, "1.2.840.10040.4.3", "sha1WithDSA", N_("SHA1 with DSA"), 0 }, + + { 0, "1.2.840.10045.2.1", "ec", N_("Elliptic Curve"), 0, }, + { 0, "1.2.840.10045.4.1", "sha1WithECDSA", N_("SHA1 with ECDSA"), 0 }, + { 0, "1.2.840.10045.4.3.1", "sha224WithECDSA", N_("SHA224 with ECDSA"), 0 }, + { 0, "1.2.840.10045.4.3.2", "sha256WithECDSA", N_("SHA256 with ECDSA"), 0 }, + { 0, "1.2.840.10045.4.3.3", "sha384WithECDSA", N_("SHA384 with ECDSA"), 0 }, + { 0, "1.2.840.10045.4.3.4", "sha512WithECDSA", N_("SHA512 with ECDSA"), 0 }, + + /* Extended Key Usages */ + { 0, "1.3.6.1.5.5.7.3.1", NULL, N_("Server Authentication"), 0 }, + { 0, "1.3.6.1.5.5.7.3.2", NULL, N_("Client Authentication"), 0 }, + { 0, "1.3.6.1.5.5.7.3.3", NULL, N_("Code Signing"), 0 }, + { 0, "1.3.6.1.5.5.7.3.4", NULL, N_("Email Protection"), 0 }, + { 0, "1.3.6.1.5.5.7.3.8", NULL, N_("Time Stamping"), 0 }, + + { 0, NULL, NULL, NULL, FALSE } +}; + +static OidInfo* +find_oid_info (GQuark oid) +{ + static volatile gsize inited_oids = 0; + int i; + + g_return_val_if_fail (oid != 0, NULL); + + /* Initialize first time around */ + if (g_once_init_enter (&inited_oids)) { + for (i = 0; oid_info[i].oidstr != NULL; ++i) + oid_info[i].oid = g_quark_from_static_string (oid_info[i].oidstr); + g_once_init_leave (&inited_oids, 1); + } + + for (i = 0; oid_info[i].oidstr != NULL; ++i) { + if (oid_info[i].oid == oid) + return &oid_info[i]; + } + + return NULL; +} + +const gchar* +egg_oid_get_name (GQuark oid) +{ + OidInfo *info; + + g_return_val_if_fail (oid, NULL); + + info = find_oid_info (oid); + if (info == NULL) + return g_quark_to_string (oid); + + return info->attr; +} + +const gchar* +egg_oid_get_description (GQuark oid) +{ + OidInfo *info; + + g_return_val_if_fail (oid, NULL); + + info = find_oid_info (oid); + if (info == NULL) + return g_quark_to_string (oid); + + return _(info->description); +} + +guint +egg_oid_get_flags (GQuark oid) +{ + OidInfo *info; + + g_return_val_if_fail (oid, 0); + + info = find_oid_info (oid); + if (info == NULL) + return 0; + + return info->flags; +} diff --git a/egg/egg-oid.h b/egg/egg-oid.h new file mode 100644 index 0000000..330a9f3 --- /dev/null +++ b/egg/egg-oid.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-oid.h - OID helper routines + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGGOID_H_ +#define EGGOID_H_ + +#include +enum { + EGG_OID_PRINTABLE = 0x01, + EGG_OID_IS_CHOICE = 0x02 +}; + +const gchar* egg_oid_get_name (GQuark oid); + +guint egg_oid_get_flags (GQuark oid); + +const gchar* egg_oid_get_description (GQuark oid); + +#endif /* EGGOID_H_ */ diff --git a/egg/egg-openssl.c b/egg/egg-openssl.c new file mode 100644 index 0000000..60f4d8f --- /dev/null +++ b/egg/egg-openssl.c @@ -0,0 +1,382 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-openssl.c - OpenSSL compatibility functionality + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg-hex.h" +#include "egg-openssl.h" +#include "egg-secure-memory.h" +#include "egg-symkey.h" + +#include + +#include + +#include +#include + +EGG_SECURE_DECLARE (openssl); + +static const struct { + const gchar *desc; + int algo; + int mode; +} openssl_algos[] = { + { "DES-ECB", GCRY_CIPHER_DES, GCRY_CIPHER_MODE_ECB }, + { "DES-CFB64", GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CFB }, + { "DES-CFB", GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CFB }, + /* DES-CFB1 */ + /* DES-CFB8 */ + /* DESX-CBC */ + /* DES-EDE */ + /* DES-EDE-CBC */ + /* DES-EDE-ECB */ + /* DES-EDE-CFB64 DES-EDE-CFB */ + /* DES-EDE-CFB1 */ + /* DES-EDE-CFB8 */ + /* DES-EDE-OFB */ + /* DES-EDE3 */ + { "DES-EDE3-ECB", GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_ECB }, + { "DES-EDE3-CFB64", GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CFB }, + { "DES-EDE3-CFB", GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CFB }, + /* DES-EDE3-CFB1 */ + /* DES-EDE3-CFB8 */ + { "DES-OFB", GCRY_CIPHER_DES, GCRY_CIPHER_MODE_OFB }, + { "DES-EDE3-OFB", GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_OFB }, + { "DES-CBC", GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CBC }, + { "DES-EDE3-CBC", GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC }, + /* RC2-ECB */ + /* RC2-CBC */ + /* RC2-40-CBC */ + /* RC2-64-CBC */ + /* RC2-CFB64 RC2-CFB */ + /* RC2-OFB */ + { "RC4", GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM }, + { "RC4-40", GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM }, + { "IDEA-ECB", GCRY_CIPHER_IDEA, GCRY_CIPHER_MODE_ECB }, + { "IDEA-CFB64", GCRY_CIPHER_IDEA, GCRY_CIPHER_MODE_CFB }, + { "IDEA-OFB", GCRY_CIPHER_IDEA, GCRY_CIPHER_MODE_OFB }, + { "IDEA-CBC", GCRY_CIPHER_IDEA, GCRY_CIPHER_MODE_CBC }, + { "BF-ECB", GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_ECB }, + { "BF-CBC", GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC }, + { "BF-CFB64", GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CFB }, + { "BF-CFB", GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CFB }, + { "BF-OFB", GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_OFB }, + { "CAST5-ECB", GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_ECB }, + { "CAST5-CBC", GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_CBC }, + { "CAST5-CFB64", GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_CFB }, + { "CAST5-CFB", GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_CFB }, + { "CAST5-OFB", GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_OFB }, + /* RC5-32-12-16-CBC */ + /* RC5-32-12-16-ECB */ + /* RC5-32-12-16-CFB64 RC5-32-12-16-CFB */ + /* RC5-32-12-16-OFB */ + { "AES-128-ECB", GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_ECB }, + { "AES-128-CBC", GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC }, + /* AES-128-CFB1 */ + /* AES-128-CFB8 */ + { "AES-128-CFB128", GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CFB }, + { "AES-128-CFB", GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CFB }, + { "AES-128-OFB", GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_OFB }, + { "AES-128-CTR", GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CTR }, + { "AES-192-ECB", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_ECB }, + { "AES-192-CBC", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CBC }, + /* AES-192-CFB1 */ + /* AES-192-CFB8 */ + { "AES-192-CFB128", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CFB }, + { "AES-192-CFB", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CFB }, + { "AES-192-OFB", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_OFB }, + { "AES-192-CTR", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CTR }, + { "AES-256-ECB", GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB }, + { "AES-256-CBC", GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC }, + /* AES-256-CFB1 */ + /* AES-256-CFB8 */ + { "AES-256-CFB128", GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB }, + { "AES-256-CFB", GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB }, + { "AES-256-OFB", GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_OFB }, + { "AES-256-CTR", GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CTR }, + /* CAMELLIA-128-ECB */ + /* CAMELLIA-128-CBC */ + /* CAMELLIA-128-CFB1 */ + /* CAMELLIA-128-CFB8 */ + /* CAMELLIA-128-CFB128 CAMELLIA-128-CFB */ + /* CAMELLIA-128-OFB */ + /* CAMELLIA-192-ECB */ + /* CAMELLIA-192-CBC */ + /* CAMELLIA-192-CFB1 */ + /* CAMELLIA-192-CFB8 */ + /* CAMELLIA-192-CFB128 CAMELLIA-192-CFB */ + /* CAMELLIA-192_OFB */ + /* CAMELLIA-256-ECB */ + /* CAMELLIA-256-CBC */ + /* CAMELLIA-256-CFB1 */ + /* CAMELLIA-256-CFB8 */ + /* CAMELLIA-256-CFB128 CAMELLIA-256-CFB */ + /* CAMELLIA-256-OFB */ +}; + +/* ------------------------------------------------------------------------- */ + +int +egg_openssl_parse_algo (const char *name, int *mode) +{ + static GQuark openssl_quarks[G_N_ELEMENTS(openssl_algos)] = { 0, }; + static gsize openssl_quarks_inited = 0; + GQuark q; + int i; + + if (g_once_init_enter (&openssl_quarks_inited)) { + for (i = 0; i < G_N_ELEMENTS(openssl_algos); ++i) + openssl_quarks[i] = g_quark_from_static_string (openssl_algos[i].desc); + g_once_init_leave (&openssl_quarks_inited, 1); + } + + q = g_quark_try_string (name); + if (q) { + for (i = 0; i < G_N_ELEMENTS(openssl_algos); ++i) { + if (q == openssl_quarks[i]) { + *mode = openssl_algos[i].mode; + return openssl_algos[i].algo; + } + } + } + + return 0; +} + +static gboolean +parse_dekinfo (const gchar *dek, int *algo, int *mode, guchar **iv) +{ + gboolean success = FALSE; + gchar **parts = NULL; + gcry_error_t gcry; + gsize ivlen, len; + + parts = g_strsplit (dek, ",", 2); + if (!parts || !parts[0] || !parts[1]) + goto done; + + /* Parse the algorithm name */ + *algo = egg_openssl_parse_algo (parts[0], mode); + if (!*algo) + goto done; + + /* Make sure this is usable */ + gcry = gcry_cipher_test_algo (*algo); + if (gcry) + goto done; + + /* Parse the IV */ + ivlen = gcry_cipher_get_algo_blklen (*algo); + + *iv = egg_hex_decode (parts[1], strlen(parts[1]), &len); + if (!*iv || ivlen != len) { + g_free (*iv); + goto done; + } + + success = TRUE; + +done: + g_strfreev (parts); + return success; +} + +guchar * +egg_openssl_decrypt_block (const gchar *dekinfo, + const gchar *password, + gssize n_password, + GBytes *data, + gsize *n_decrypted) +{ + gcry_cipher_hd_t ch; + guchar *key = NULL; + guchar *iv = NULL; + int gcry, ivlen; + int algo = 0; + int mode = 0; + guchar *decrypted; + + if (!parse_dekinfo (dekinfo, &algo, &mode, &iv)) + return FALSE; + + ivlen = gcry_cipher_get_algo_blklen (algo); + + /* We assume the iv is at least as long as at 8 byte salt */ + g_return_val_if_fail (ivlen >= 8, FALSE); + + /* IV is already set from the DEK info */ + if (!egg_symkey_generate_simple (algo, GCRY_MD_MD5, password, + n_password, iv, 8, 1, &key, NULL)) { + g_free (iv); + return NULL; + } + + gcry = gcry_cipher_open (&ch, algo, mode, 0); + g_return_val_if_fail (!gcry, NULL); + + gcry = gcry_cipher_setkey (ch, key, gcry_cipher_get_algo_keylen (algo)); + g_return_val_if_fail (!gcry, NULL); + egg_secure_free (key); + + /* 16 = 128 bits */ + gcry = gcry_cipher_setiv (ch, iv, ivlen); + g_return_val_if_fail (!gcry, NULL); + g_free (iv); + + /* Allocate output area */ + *n_decrypted = g_bytes_get_size (data); + decrypted = egg_secure_alloc (*n_decrypted); + + gcry = gcry_cipher_decrypt (ch, decrypted, *n_decrypted, + g_bytes_get_data (data, NULL), + g_bytes_get_size (data)); + if (gcry) { + egg_secure_free (decrypted); + g_return_val_if_reached (NULL); + } + + gcry_cipher_close (ch); + + return decrypted; +} + +guchar * +egg_openssl_encrypt_block (const gchar *dekinfo, + const gchar *password, + gssize n_password, + GBytes *data, + gsize *n_encrypted) +{ + gsize n_overflow, n_batch, n_padding; + gcry_cipher_hd_t ch; + guchar *key = NULL; + guchar *iv = NULL; + guchar *padded = NULL; + int gcry, ivlen; + int algo = 0; + int mode = 0; + gsize n_data; + guchar *encrypted; + const guchar *dat; + + if (!parse_dekinfo (dekinfo, &algo, &mode, &iv)) + g_return_val_if_reached (NULL); + + ivlen = gcry_cipher_get_algo_blklen (algo); + + /* We assume the iv is at least as long as at 8 byte salt */ + g_return_val_if_fail (ivlen >= 8, NULL); + + /* IV is already set from the DEK info */ + if (!egg_symkey_generate_simple (algo, GCRY_MD_MD5, password, + n_password, iv, 8, 1, &key, NULL)) + g_return_val_if_reached (NULL); + + gcry = gcry_cipher_open (&ch, algo, mode, 0); + g_return_val_if_fail (!gcry, NULL); + + gcry = gcry_cipher_setkey (ch, key, gcry_cipher_get_algo_keylen (algo)); + g_return_val_if_fail (!gcry, NULL); + egg_secure_free (key); + + /* 16 = 128 bits */ + gcry = gcry_cipher_setiv (ch, iv, ivlen); + g_return_val_if_fail (!gcry, NULL); + g_free (iv); + + dat = g_bytes_get_data (data, &n_data); + + /* Allocate output area */ + n_overflow = (n_data % ivlen); + n_padding = n_overflow ? (ivlen - n_overflow) : 0; + n_batch = n_data - n_overflow; + *n_encrypted = n_data + n_padding; + encrypted = g_malloc0 (*n_encrypted); + + g_assert (*n_encrypted % ivlen == 0); + g_assert (*n_encrypted >= n_data); + g_assert (*n_encrypted == n_batch + n_overflow + n_padding); + + /* Encrypt everything but the last bit */ + gcry = gcry_cipher_encrypt (ch, encrypted, n_batch, dat, n_batch); + if (gcry) { + g_free (encrypted); + g_return_val_if_reached (NULL); + } + + /* Encrypt the padded block */ + if (n_overflow) { + padded = egg_secure_alloc (ivlen); + memset (padded, 0, ivlen); + memcpy (padded, dat + n_batch, n_overflow); + gcry = gcry_cipher_encrypt (ch, encrypted + n_batch, ivlen, padded, ivlen); + egg_secure_free (padded); + if (gcry) { + g_free (encrypted); + g_return_val_if_reached (NULL); + } + } + + gcry_cipher_close (ch); + return encrypted; +} + +const gchar* +egg_openssl_get_dekinfo (GHashTable *headers) +{ + const gchar *val; + if (!headers) + return NULL; + val = g_hash_table_lookup (headers, "Proc-Type"); + if (!val || strcmp (val, "4,ENCRYPTED") != 0) + return NULL; + val = g_hash_table_lookup (headers, "DEK-Info"); + g_return_val_if_fail (val, NULL); + return val; +} + +const gchar* +egg_openssl_prep_dekinfo (GHashTable *headers) +{ + gchar *dekinfo, *hex; + gsize ivlen; + guchar *iv; + + /* Create the iv */ + ivlen = gcry_cipher_get_algo_blklen (GCRY_CIPHER_3DES); + g_return_val_if_fail (ivlen, NULL); + iv = g_malloc (ivlen); + gcry_create_nonce (iv, ivlen); + + /* And encode it into the string */ + hex = egg_hex_encode (iv, ivlen); + g_return_val_if_fail (hex, NULL); + dekinfo = g_strdup_printf ("DES-EDE3-CBC,%s", hex); + g_free (hex); + g_free (iv); + + g_hash_table_insert (headers, g_strdup ("DEK-Info"), (void*)dekinfo); + g_hash_table_insert (headers, g_strdup ("Proc-Type"), g_strdup ("4,ENCRYPTED")); + + return dekinfo; +} diff --git a/egg/egg-openssl.h b/egg/egg-openssl.h new file mode 100644 index 0000000..37f232b --- /dev/null +++ b/egg/egg-openssl.h @@ -0,0 +1,46 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-openssl.h - OpenSSL compatibility functionality + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGG_OPENSSL_H_ +#define EGG_OPENSSL_H_ + +#include + +int egg_openssl_parse_algo (const gchar *name, int *mode); + +guchar * egg_openssl_encrypt_block (const gchar *dekinfo, + const gchar *password, + gssize n_password, + GBytes *data, + gsize *n_encrypted); + +guchar * egg_openssl_decrypt_block (const gchar *dekinfo, + const gchar *password, + gssize n_password, + GBytes *data, + gsize *n_decrypted); + +const gchar* egg_openssl_get_dekinfo (GHashTable *headers); + +const gchar* egg_openssl_prep_dekinfo (GHashTable *headers); + +#endif /* EGG_OPENSSL_H_ */ diff --git a/egg/egg-padding.c b/egg/egg-padding.c new file mode 100644 index 0000000..f2577fe --- /dev/null +++ b/egg/egg-padding.c @@ -0,0 +1,300 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "egg-padding.h" + +#include + +#include "egg/egg-secure-memory.h" + +/* ---------------------------------------------------------------------------- + * INTERNAL + */ + +static void +fill_random_nonzero (guchar *data, gsize n_data) +{ + guchar *rnd; + guint n_zero, i, j; + + gcry_randomize (data, n_data, GCRY_STRONG_RANDOM); + + /* Find any zeros in random data */ + n_zero = 0; + for (i = 0; i < n_data; ++i) { + if (data[i] == 0x00) + ++n_zero; + } + + while (n_zero > 0) { + rnd = gcry_random_bytes (n_zero, GCRY_STRONG_RANDOM); + n_zero = 0; + for (i = 0, j = 0; i < n_data; ++i) { + if (data[i] != 0x00) + continue; + + /* Use some of the replacement data */ + data[i] = rnd[j]; + ++j; + + /* It's zero again :( */ + if (data[i] == 0x00) + n_zero++; + } + + gcry_free (rnd); + } +} + +static gboolean +unpad_pkcs1 (guchar bt, EggAllocator alloc, gsize block, const guchar* padded, + gsize n_padded, gpointer *raw, gsize *n_raw) +{ + const guchar *at; + + if (block && n_padded % block != 0) + return FALSE; + + /* Check the header */ + if (padded[0] != 0x00 || padded[1] != bt) + return FALSE; + + /* The first zero byte after the header */ + at = memchr (padded + 2, 0x00, n_padded - 2); + if (!at) + return FALSE; + + if (alloc == NULL) + alloc = g_realloc; + + ++at; + *n_raw = n_padded - (at - padded); + if (raw) { + *raw = (alloc) (NULL, *n_raw + 1); + if (*raw == NULL) + return FALSE; + memcpy (*raw, at, *n_raw); + + /* Convenience null terminate the result */ + memset (((guchar*)*raw) + *n_raw, 0, 1); + } + + return TRUE; +} + +/* ---------------------------------------------------------------------------- + * PUBLIC + */ + +gboolean +egg_padding_zero_pad (EggAllocator alloc, gsize block, gconstpointer raw, + gsize n_raw, gpointer *padded, gsize *n_padded) +{ + guchar *pad; + gsize n_pad; + + /* + * 0x00 0x00 0x00 ... 0x?? 0x?? 0x?? ... + * padding data + */ + + g_return_val_if_fail (block != 0, FALSE); + + *n_padded = ((n_raw + (block - 1)) / block) * block; + g_assert (n_raw <= *n_padded); + n_pad = *n_padded - n_raw; + g_assert (n_pad < block); + + if (alloc == NULL) + alloc = g_realloc; + + if (padded) { + *padded = pad = (alloc) (NULL, MAX (*n_padded, 1)); + if (pad == NULL) + return FALSE; + memset (pad, 0x00, n_pad); + memcpy (pad + n_pad, raw, n_raw); + } + + return TRUE; +} + +gboolean +egg_padding_pkcs1_pad_01 (EggAllocator alloc, gsize block, gconstpointer raw, + gsize n_raw, gpointer *padded, gsize *n_padded) +{ + guchar *pad; + gsize n_pad; + + /* + * 0x00 0x01 0xFF 0xFF ... 0x00 0x?? 0x?? 0x?? ... + * type padding data + */ + + g_return_val_if_fail (block != 0, FALSE); + g_return_val_if_fail (block > 3, FALSE); + + *n_padded = ((n_raw + 3 + (block - 1)) / block) * block; + g_assert (n_raw <= *n_padded); + n_pad = *n_padded - n_raw; + g_assert (n_pad <= block); + g_assert (n_pad >= 3); + + if (alloc == NULL) + alloc = g_realloc; + + if (padded) { + *padded = pad = (alloc) (NULL, MAX (*n_padded, 1)); + if (pad == NULL) + return FALSE; + pad[0] = 0; /* Prefix */ + pad[1] = 1; /* Block type */ + memset (pad + 2, 0xFF, n_pad - 3); + pad[n_pad - 1] = 0; + memcpy (pad + n_pad, raw, n_raw); + } + + return TRUE; +} + +gboolean +egg_padding_pkcs1_pad_02 (EggAllocator alloc, gsize block, gconstpointer raw, + gsize n_raw, gpointer *padded, gsize *n_padded) +{ + guchar *pad; + gsize n_pad; + + /* + * 0x00 0x01 0x?? 0x?? ... 0x00 0x?? 0x?? 0x?? ... + * type padding data + */ + + g_return_val_if_fail (block != 0, FALSE); + g_return_val_if_fail (block > 3, FALSE); + + *n_padded = ((n_raw + 3 + (block - 1)) / block) * block; + g_assert (n_raw <= *n_padded); + n_pad = *n_padded - n_raw; + g_assert (n_pad <= block); + g_assert (n_pad >= 3); + + if (alloc == NULL) + alloc = g_realloc; + + if (padded) { + *padded = pad = (alloc) (NULL, MAX (*n_padded, 1)); + if (pad == NULL) + return FALSE; + pad[0] = 0; /* Prefix */ + pad[1] = 2; /* Block type */ + fill_random_nonzero (pad + 2, n_pad - 3); + pad[n_pad - 1] = 0; + memcpy (pad + n_pad, raw, n_raw); + } + + return TRUE; +} + +gboolean +egg_padding_pkcs1_unpad_01 (EggAllocator alloc, gsize block, gconstpointer padded, + gsize n_padded, gpointer *raw, gsize *n_raw) +{ + return unpad_pkcs1 (0x01, alloc, block, padded, n_padded, raw, n_raw); +} + +gboolean +egg_padding_pkcs1_unpad_02 (EggAllocator alloc, gsize block, gconstpointer padded, + gsize n_padded, gpointer *raw, gsize *n_raw) +{ + return unpad_pkcs1 (0x02, alloc, block, padded, n_padded, raw, n_raw); +} + +gboolean +egg_padding_pkcs7_pad (EggAllocator alloc, gsize block, gconstpointer raw, + gsize n_raw, gpointer *padded, gsize *n_padded) +{ + guchar *pad; + gsize n_pad; + + g_return_val_if_fail (block != 0, FALSE); + g_return_val_if_fail (block < 256, FALSE); + + *n_padded = ((n_raw + block) / block) * block; + g_assert (n_raw < *n_padded); + n_pad = *n_padded - n_raw; + g_assert (n_pad > 0 && n_pad <= block); + + if (alloc == NULL) + alloc = g_realloc; + + if (padded) { + *padded = pad = (alloc) (NULL, MAX (*n_padded, 1)); + if (pad == NULL) + return FALSE; + memcpy (pad, raw, n_raw); + memset (pad + n_raw, n_pad, n_pad); + } + + return TRUE; +} + +gboolean +egg_padding_pkcs7_unpad (EggAllocator alloc, gsize block, gconstpointer padded, + gsize n_padded, gpointer *raw, gsize *n_raw) +{ + const guchar *pad; + gsize n_pad, i; + + if (n_padded == 0) + return FALSE; + + pad = padded; + n_pad = pad[n_padded - 1]; + + /* Validate the padding */ + if (n_pad == 0 || n_pad > 256) + return FALSE; + if (n_pad > n_padded) + return FALSE; + if (block && n_pad > block) + return FALSE; + for (i = n_padded - n_pad; i < n_padded; ++i) { + if (pad[i] != n_pad) + return FALSE; + } + + *n_raw = n_padded - n_pad; + + if (alloc == NULL) + alloc = g_realloc; + + if (raw) { + *raw = (alloc) (NULL, *n_raw + 1); + if (*raw == NULL) + return FALSE; + + /* Output the result, null terminated */ + memcpy (*raw, pad, *n_raw); + memset (((guchar*)*raw) + *n_raw, 0, 1); + } + + return TRUE; +} diff --git a/egg/egg-padding.h b/egg/egg-padding.h new file mode 100644 index 0000000..67df74c --- /dev/null +++ b/egg/egg-padding.h @@ -0,0 +1,86 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef EGG_PADDING_H_ +#define EGG_PADDING_H_ + +#include + +#ifndef HAVE_EGG_ALLOCATOR +typedef void* (*EggAllocator) (void* p, gsize); +#define HAVE_EGG_ALLOCATOR +#endif + +typedef gboolean (*EggPadding) (EggAllocator alloc, + gsize n_block, + gconstpointer input, + gsize n_input, + gpointer *output, + gsize *n_output); + +gboolean egg_padding_zero_pad (EggAllocator alloc, + gsize n_block, + gconstpointer raw, + gsize n_raw, + gpointer *padded, + gsize *n_padded); + +gboolean egg_padding_pkcs1_pad_01 (EggAllocator alloc, + gsize n_block, + gconstpointer raw, + gsize n_raw, + gpointer *padded, + gsize *n_padded); + +gboolean egg_padding_pkcs1_pad_02 (EggAllocator alloc, + gsize n_block, + gconstpointer raw, + gsize n_raw, + gpointer *padded, + gsize *n_padded); + +gboolean egg_padding_pkcs1_unpad_01 (EggAllocator alloc, + gsize n_block, + gconstpointer padded, + gsize n_padded, + gpointer *raw, + gsize *n_raw); + +gboolean egg_padding_pkcs1_unpad_02 (EggAllocator alloc, + gsize n_block, + gconstpointer padded, + gsize n_padded, + gpointer *raw, + gsize *n_raw); + +gboolean egg_padding_pkcs7_pad (EggAllocator alloc, + gsize n_block, + gconstpointer raw, + gsize n_raw, + gpointer *padded, + gsize *n_padded); + +gboolean egg_padding_pkcs7_unpad (EggAllocator alloc, + gsize n_block, + gconstpointer raw, + gsize n_raw, + gpointer *padded, + gsize *n_padded); + +#endif /* EGG_PADDING_H_ */ diff --git a/egg/egg-secure-memory.c b/egg/egg-secure-memory.c new file mode 100644 index 0000000..bcc067e --- /dev/null +++ b/egg/egg-secure-memory.c @@ -0,0 +1,1385 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-secure-memory.h - library for allocating memory that is non-pageable + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +/* + * IMPORTANT: This is pure vanila standard C, no glib. We need this + * because certain consumers of this protocol need to be built + * without linking in any special libraries. ie: the PKCS#11 module. + */ + +#include "config.h" + +#include "egg-secure-memory.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WITH_VALGRIND +#include +#include +#endif + +#define DEBUG_SECURE_MEMORY 0 + +#if DEBUG_SECURE_MEMORY +#define DEBUG_ALLOC(msg, n) fprintf(stderr, "%s %lu bytes\n", msg, n); +#else +#define DEBUG_ALLOC(msg, n) +#endif + +#define DEFAULT_BLOCK_SIZE 16384 + +/* Use our own assert to guarantee no glib allocations */ +#ifndef ASSERT +#ifdef G_DISABLE_ASSERT +#define ASSERT(x) +#else +#define ASSERT(x) assert(x) +#endif +#endif + +#define DO_LOCK() \ + EGG_SECURE_GLOBALS.lock (); + +#define DO_UNLOCK() \ + EGG_SECURE_GLOBALS.unlock (); + +static int show_warning = 1; +int egg_secure_warnings = 1; + +/* + * We allocate all memory in units of sizeof(void*). This + * is our definition of 'word'. + */ +typedef void* word_t; + +/* The amount of extra words we can allocate */ +#define WASTE 4 + +/* + * Track allocated memory or a free block. This structure is not stored + * in the secure memory area. It is allocated from a pool of other + * memory. See meta_pool_xxx (). + */ +typedef struct _Cell { + word_t *words; /* Pointer to secure memory */ + size_t n_words; /* Amount of secure memory in words */ + size_t requested; /* Amount actually requested by app, in bytes, 0 if unused */ + const char *tag; /* Tag which describes the allocation */ + struct _Cell *next; /* Next in memory ring */ + struct _Cell *prev; /* Previous in memory ring */ +} Cell; + +/* + * A block of secure memory. This structure is the header in that block. + */ +typedef struct _Block { + word_t *words; /* Actual memory hangs off here */ + size_t n_words; /* Number of words in block */ + size_t n_used; /* Number of used allocations */ + struct _Cell* used_cells; /* Ring of used allocations */ + struct _Cell* unused_cells; /* Ring of unused allocations */ + struct _Block *next; /* Next block in list */ +} Block; + +/* ----------------------------------------------------------------------------- + * UNUSED STACK + */ + +static inline void +unused_push (void **stack, void *ptr) +{ + ASSERT (ptr); + ASSERT (stack); + *((void**)ptr) = *stack; + *stack = ptr; +} + +static inline void* +unused_pop (void **stack) +{ + void *ptr; + ASSERT (stack); + ptr = *stack; + *stack = *(void**)ptr; + return ptr; + +} + +static inline void* +unused_peek (void **stack) +{ + ASSERT (stack); + return *stack; +} + +/* ----------------------------------------------------------------------------- + * POOL META DATA ALLOCATION + * + * A pool for memory meta data. We allocate fixed size blocks. There are actually + * two different structures stored in this pool: Cell and Block. Cell is allocated + * way more often, and is bigger so we just allocate that size for both. + */ + +/* Pool allocates this data type */ +typedef union _Item { + Cell cell; + Block block; +} Item; + +typedef struct _Pool { + struct _Pool *next; /* Next pool in list */ + size_t length; /* Length in bytes of the pool */ + size_t used; /* Number of cells used in pool */ + void *unused; /* Unused stack of unused stuff */ + size_t n_items; /* Total number of items in pool */ + Item items[1]; /* Actual items hang off here */ +} Pool; + +static void * +pool_alloc (void) +{ + Pool *pool; + void *pages, *item; + size_t len, i; + + if (!EGG_SECURE_GLOBALS.pool_version || + strcmp (EGG_SECURE_GLOBALS.pool_version, EGG_SECURE_POOL_VER_STR) != 0) { + if (show_warning && egg_secure_warnings) + fprintf (stderr, "the secure memory pool version does not match the code '%s' != '%s'\n", + EGG_SECURE_GLOBALS.pool_version ? EGG_SECURE_GLOBALS.pool_version : "(null)", + EGG_SECURE_POOL_VER_STR); + show_warning = 0; + return NULL; + } + + /* A pool with an available item */ + for (pool = EGG_SECURE_GLOBALS.pool_data; pool; pool = pool->next) { + if (unused_peek (&pool->unused)) + break; + } + + /* Create a new pool */ + if (pool == NULL) { + len = getpagesize () * 2; + pages = mmap (0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + if (pages == MAP_FAILED) + return NULL; + + /* Fill in the block header, and inlude in block list */ + pool = pages; + pool->next = EGG_SECURE_GLOBALS.pool_data; + EGG_SECURE_GLOBALS.pool_data = pool; + pool->length = len; + pool->used = 0; + pool->unused = NULL; + + /* Fill block with unused items */ + pool->n_items = (len - sizeof (Pool)) / sizeof (Item); + for (i = 0; i < pool->n_items; ++i) + unused_push (&pool->unused, pool->items + i); + +#ifdef WITH_VALGRIND + VALGRIND_CREATE_MEMPOOL(pool, 0, 0); +#endif + } + + ++pool->used; + ASSERT (unused_peek (&pool->unused)); + item = unused_pop (&pool->unused); + +#ifdef WITH_VALGRIND + VALGRIND_MEMPOOL_ALLOC (pool, item, sizeof (Item)); +#endif + + return memset (item, 0, sizeof (Item)); +} + +static void +pool_free (void* item) +{ + Pool *pool, **at; + char *ptr, *beg, *end; + + ptr = item; + + /* Find which block this one belongs to */ + for (at = (Pool **)&EGG_SECURE_GLOBALS.pool_data, pool = *at; + pool != NULL; at = &pool->next, pool = *at) { + beg = (char*)pool->items; + end = (char*)pool + pool->length - sizeof (Item); + if (ptr >= beg && ptr <= end) { + ASSERT ((ptr - beg) % sizeof (Item) == 0); + break; + } + } + + /* Otherwise invalid meta */ + ASSERT (at); + ASSERT (pool); + ASSERT (pool->used > 0); + + /* No more meta cells used in this block, remove from list, destroy */ + if (pool->used == 1) { + *at = pool->next; + +#ifdef WITH_VALGRIND + VALGRIND_DESTROY_MEMPOOL (pool); +#endif + + munmap (pool, pool->length); + return; + } + +#ifdef WITH_VALGRIND + VALGRIND_MEMPOOL_FREE (pool, item); + VALGRIND_MAKE_MEM_UNDEFINED (item, sizeof (Item)); +#endif + + --pool->used; + memset (item, 0xCD, sizeof (Item)); + unused_push (&pool->unused, item); +} + +#ifndef G_DISABLE_ASSERT + +static int +pool_valid (void* item) +{ + Pool *pool; + char *ptr, *beg, *end; + + ptr = item; + + /* Find which block this one belongs to */ + for (pool = EGG_SECURE_GLOBALS.pool_data; pool; pool = pool->next) { + beg = (char*)pool->items; + end = (char*)pool + pool->length - sizeof (Item); + if (ptr >= beg && ptr <= end) + return (pool->used && (ptr - beg) % sizeof (Item) == 0); + } + + return 0; +} + +#endif /* G_DISABLE_ASSERT */ + +/* ----------------------------------------------------------------------------- + * SEC ALLOCATION + * + * Each memory cell begins and ends with a pointer to its metadata. These are also + * used as guards or red zones. Since they're treated as redzones by valgrind we + * have to jump through a few hoops before reading and/or writing them. + */ + +static inline size_t +sec_size_to_words (size_t length) +{ + return (length % sizeof (void*) ? 1 : 0) + (length / sizeof (void*)); +} + +static inline void +sec_write_guards (Cell *cell) +{ +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_UNDEFINED (cell->words, sizeof (word_t)); + VALGRIND_MAKE_MEM_UNDEFINED (cell->words + cell->n_words - 1, sizeof (word_t)); +#endif + + ((void**)cell->words)[0] = (void*)cell; + ((void**)cell->words)[cell->n_words - 1] = (void*)cell; + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS (cell->words, sizeof (word_t)); + VALGRIND_MAKE_MEM_NOACCESS (cell->words + cell->n_words - 1, sizeof (word_t)); +#endif +} + +static inline void +sec_check_guards (Cell *cell) +{ +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (cell->words, sizeof (word_t)); + VALGRIND_MAKE_MEM_DEFINED (cell->words + cell->n_words - 1, sizeof (word_t)); +#endif + + ASSERT(((void**)cell->words)[0] == (void*)cell); + ASSERT(((void**)cell->words)[cell->n_words - 1] == (void*)cell); + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS (cell->words, sizeof (word_t)); + VALGRIND_MAKE_MEM_NOACCESS (cell->words + cell->n_words - 1, sizeof (word_t)); +#endif +} + +static void +sec_insert_cell_ring (Cell **ring, Cell *cell) +{ + ASSERT (ring); + ASSERT (cell); + ASSERT (cell != *ring); + ASSERT (cell->next == NULL); + ASSERT (cell->prev == NULL); + + /* Insert back into the mix of available memory */ + if (*ring) { + cell->next = (*ring)->next; + cell->prev = *ring; + cell->next->prev = cell; + cell->prev->next = cell; + } else { + cell->next = cell; + cell->prev = cell; + } + + *ring = cell; + ASSERT (cell->next->prev == cell); + ASSERT (cell->prev->next == cell); +} + +static void +sec_remove_cell_ring (Cell **ring, Cell *cell) +{ + ASSERT (ring); + ASSERT (*ring); + ASSERT (cell->next); + ASSERT (cell->prev); + + ASSERT (cell->next->prev == cell); + ASSERT (cell->prev->next == cell); + + if (cell == *ring) { + /* The last meta? */ + if (cell->next == cell) { + ASSERT (cell->prev == cell); + *ring = NULL; + + /* Just pointing to this meta */ + } else { + ASSERT (cell->prev != cell); + *ring = cell->next; + } + } + + cell->next->prev = cell->prev; + cell->prev->next = cell->next; + cell->next = cell->prev = NULL; + + ASSERT (*ring != cell); +} + +static inline void* +sec_cell_to_memory (Cell *cell) +{ + return cell->words + 1; +} + +static inline int +sec_is_valid_word (Block *block, word_t *word) +{ + return (word >= block->words && word < block->words + block->n_words); +} + +static inline void +sec_clear_undefined (void *memory, + size_t from, + size_t to) +{ + char *ptr = memory; + ASSERT (from <= to); +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_UNDEFINED (ptr + from, to - from); +#endif + memset (ptr + from, 0, to - from); +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_UNDEFINED (ptr + from, to - from); +#endif +} +static inline void +sec_clear_noaccess (void *memory, size_t from, size_t to) +{ + char *ptr = memory; + ASSERT (from <= to); +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_UNDEFINED (ptr + from, to - from); +#endif + memset (ptr + from, 0, to - from); +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS (ptr + from, to - from); +#endif +} + +static Cell* +sec_neighbor_before (Block *block, Cell *cell) +{ + word_t *word; + + ASSERT (cell); + ASSERT (block); + + word = cell->words - 1; + if (!sec_is_valid_word (block, word)) + return NULL; + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (word, sizeof (word_t)); +#endif + + cell = *word; + sec_check_guards (cell); + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS (word, sizeof (word_t)); +#endif + + return cell; +} + +static Cell* +sec_neighbor_after (Block *block, Cell *cell) +{ + word_t *word; + + ASSERT (cell); + ASSERT (block); + + word = cell->words + cell->n_words; + if (!sec_is_valid_word (block, word)) + return NULL; + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (word, sizeof (word_t)); +#endif + + cell = *word; + sec_check_guards (cell); + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS (word, sizeof (word_t)); +#endif + + return cell; +} + +static void* +sec_alloc (Block *block, + const char *tag, + size_t length) +{ + Cell *cell, *other; + size_t n_words; + void *memory; + + ASSERT (block); + ASSERT (length); + ASSERT (tag); + + if (!block->unused_cells) + return NULL; + + /* + * Each memory allocation is aligned to a pointer size, and + * then, sandwidched between two pointers to its meta data. + * These pointers also act as guards. + * + * We allocate memory in units of sizeof (void*) + */ + + n_words = sec_size_to_words (length) + 2; + + /* Look for a cell of at least our required size */ + cell = block->unused_cells; + while (cell->n_words < n_words) { + cell = cell->next; + if (cell == block->unused_cells) { + cell = NULL; + break; + } + } + + if (!cell) + return NULL; + + ASSERT (cell->tag == NULL); + ASSERT (cell->requested == 0); + ASSERT (cell->prev); + ASSERT (cell->words); + sec_check_guards (cell); + + /* Steal from the cell if it's too long */ + if (cell->n_words > n_words + WASTE) { + other = pool_alloc (); + if (!other) + return NULL; + other->n_words = n_words; + other->words = cell->words; + cell->n_words -= n_words; + cell->words += n_words; + + sec_write_guards (other); + sec_write_guards (cell); + + cell = other; + } + + if (cell->next) + sec_remove_cell_ring (&block->unused_cells, cell); + + ++block->n_used; + cell->tag = tag; + cell->requested = length; + sec_insert_cell_ring (&block->used_cells, cell); + memory = sec_cell_to_memory (cell); + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_UNDEFINED (memory, length); +#endif + + return memset (memory, 0, length); +} + +static void* +sec_free (Block *block, void *memory) +{ + Cell *cell, *other; + word_t *word; + + ASSERT (block); + ASSERT (memory); + + word = memory; + --word; + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (word, sizeof (word_t)); +#endif + + /* Lookup the meta for this memory block (using guard pointer) */ + ASSERT (sec_is_valid_word (block, word)); + ASSERT (pool_valid (*word)); + cell = *word; + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (cell->words, cell->n_words * sizeof (word_t)); +#endif + + sec_check_guards (cell); + sec_clear_noaccess (memory, 0, cell->requested); + + sec_check_guards (cell); + ASSERT (cell->requested > 0); + ASSERT (cell->tag != NULL); + + /* Remove from the used cell ring */ + sec_remove_cell_ring (&block->used_cells, cell); + + /* Find previous unallocated neighbor, and merge if possible */ + other = sec_neighbor_before (block, cell); + if (other && other->requested == 0) { + ASSERT (other->tag == NULL); + ASSERT (other->next && other->prev); + other->n_words += cell->n_words; + sec_write_guards (other); + pool_free (cell); + cell = other; + } + + /* Find next unallocated neighbor, and merge if possible */ + other = sec_neighbor_after (block, cell); + if (other && other->requested == 0) { + ASSERT (other->tag == NULL); + ASSERT (other->next && other->prev); + other->n_words += cell->n_words; + other->words = cell->words; + if (cell->next) + sec_remove_cell_ring (&block->unused_cells, cell); + sec_write_guards (other); + pool_free (cell); + cell = other; + } + + /* Add to the unused list if not already there */ + if (!cell->next) + sec_insert_cell_ring (&block->unused_cells, cell); + + cell->tag = NULL; + cell->requested = 0; + --block->n_used; + return NULL; +} + +static void +memcpy_with_vbits (void *dest, + void *src, + size_t length) +{ +#ifdef WITH_VALGRIND + int vbits_setup = 0; + void *vbits = NULL; + + if (RUNNING_ON_VALGRIND) { + vbits = malloc (length); + if (vbits != NULL) + vbits_setup = VALGRIND_GET_VBITS (src, vbits, length); + VALGRIND_MAKE_MEM_DEFINED (src, length); + } +#endif + + memcpy (dest, src, length); + +#ifdef WITH_VALGRIND + if (vbits_setup == 1) { + VALGRIND_SET_VBITS (dest, vbits, length); + VALGRIND_SET_VBITS (src, vbits, length); + } + free (vbits); +#endif +} + +static void* +sec_realloc (Block *block, + const char *tag, + void *memory, + size_t length) +{ + Cell *cell, *other; + word_t *word; + size_t n_words; + size_t valid; + void *alloc; + + /* Standard realloc behavior, should have been handled elsewhere */ + ASSERT (memory != NULL); + ASSERT (length > 0); + ASSERT (tag != NULL); + + /* Dig out where the meta should be */ + word = memory; + --word; + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (word, sizeof (word_t)); +#endif + + ASSERT (sec_is_valid_word (block, word)); + ASSERT (pool_valid (*word)); + cell = *word; + + /* Validate that it's actually for real */ + sec_check_guards (cell); + ASSERT (cell->requested > 0); + ASSERT (cell->tag != NULL); + + /* The amount of valid data */ + valid = cell->requested; + + /* How many words we actually want */ + n_words = sec_size_to_words (length) + 2; + + /* Less memory is required than is in the cell */ + if (n_words <= cell->n_words) { + + /* TODO: No shrinking behavior yet */ + cell->requested = length; + alloc = sec_cell_to_memory (cell); + + /* + * Even though we may be reusing the same cell, that doesn't + * mean that the allocation is shrinking. It could have shrunk + * and is now expanding back some. + */ + if (length < valid) + sec_clear_undefined (alloc, length, valid); + + return alloc; + } + + /* Need braaaaaiiiiiinsss... */ + while (cell->n_words < n_words) { + + /* See if we have a neighbor who can give us some memory */ + other = sec_neighbor_after (block, cell); + if (!other || other->requested != 0) + break; + + /* Eat the whole neighbor if not too big */ + if (n_words - cell->n_words + WASTE >= other->n_words) { + cell->n_words += other->n_words; + sec_write_guards (cell); + sec_remove_cell_ring (&block->unused_cells, other); + pool_free (other); + + /* Steal from the neighbor */ + } else { + other->words += n_words - cell->n_words; + other->n_words -= n_words - cell->n_words; + sec_write_guards (other); + cell->n_words = n_words; + sec_write_guards (cell); + } + } + + if (cell->n_words >= n_words) { + cell->requested = length; + cell->tag = tag; + alloc = sec_cell_to_memory (cell); + sec_clear_undefined (alloc, valid, length); + return alloc; + } + + /* That didn't work, try alloc/free */ + alloc = sec_alloc (block, tag, length); + if (alloc) { + memcpy_with_vbits (alloc, memory, valid); + sec_free (block, memory); + } + + return alloc; +} + + +static size_t +sec_allocated (Block *block, void *memory) +{ + Cell *cell; + word_t *word; + + ASSERT (block); + ASSERT (memory); + + word = memory; + --word; + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (word, sizeof (word_t)); +#endif + + /* Lookup the meta for this memory block (using guard pointer) */ + ASSERT (sec_is_valid_word (block, word)); + ASSERT (pool_valid (*word)); + cell = *word; + + sec_check_guards (cell); + ASSERT (cell->requested > 0); + ASSERT (cell->tag != NULL); + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS (word, sizeof (word_t)); +#endif + + return cell->requested; +} + +static void +sec_validate (Block *block) +{ + Cell *cell; + word_t *word, *last; + +#ifdef WITH_VALGRIND + if (RUNNING_ON_VALGRIND) + return; +#endif + + word = block->words; + last = word + block->n_words; + + for (;;) { + ASSERT (word < last); + + ASSERT (sec_is_valid_word (block, word)); + ASSERT (pool_valid (*word)); + cell = *word; + + /* Validate that it's actually for real */ + sec_check_guards (cell); + + /* Is it an allocated block? */ + if (cell->requested > 0) { + ASSERT (cell->tag != NULL); + ASSERT (cell->next != NULL); + ASSERT (cell->prev != NULL); + ASSERT (cell->next->prev == cell); + ASSERT (cell->prev->next == cell); + ASSERT (cell->requested <= (cell->n_words - 2) * sizeof (word_t)); + + /* An unused block */ + } else { + ASSERT (cell->tag == NULL); + ASSERT (cell->next != NULL); + ASSERT (cell->prev != NULL); + ASSERT (cell->next->prev == cell); + ASSERT (cell->prev->next == cell); + } + + word += cell->n_words; + if (word == last) + break; + } +} + +/* ----------------------------------------------------------------------------- + * LOCKED MEMORY + */ + +static void* +sec_acquire_pages (size_t *sz, + const char *during_tag) +{ + void *pages; + unsigned long pgsize; + + ASSERT (sz); + ASSERT (*sz); + ASSERT (during_tag); + + /* Make sure sz is a multiple of the page size */ + pgsize = getpagesize (); + *sz = (*sz + pgsize -1) & ~(pgsize - 1); + +#if defined(HAVE_MLOCK) + pages = mmap (0, *sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + if (pages == MAP_FAILED) { + if (show_warning && egg_secure_warnings) + fprintf (stderr, "couldn't map %lu bytes of memory (%s): %s\n", + (unsigned long)*sz, during_tag, strerror (errno)); + show_warning = 0; + return NULL; + } + + if (mlock (pages, *sz) < 0) { + if (show_warning && egg_secure_warnings && errno != EPERM) { + fprintf (stderr, "couldn't lock %lu bytes of memory (%s): %s\n", + (unsigned long)*sz, during_tag, strerror (errno)); + show_warning = 0; + } + munmap (pages, *sz); + return NULL; + } + + DEBUG_ALLOC ("gkr-secure-memory: new block ", *sz); + + show_warning = 1; + return pages; + +#else + if (show_warning && egg_secure_warnings) + fprintf (stderr, "your system does not support private memory"); + show_warning = 0; + return NULL; +#endif + +} + +static void +sec_release_pages (void *pages, size_t sz) +{ + ASSERT (pages); + ASSERT (sz % getpagesize () == 0); + +#if defined(HAVE_MLOCK) + if (munlock (pages, sz) < 0 && egg_secure_warnings) + fprintf (stderr, "couldn't unlock private memory: %s\n", strerror (errno)); + + if (munmap (pages, sz) < 0 && egg_secure_warnings) + fprintf (stderr, "couldn't unmap private anonymous memory: %s\n", strerror (errno)); + + DEBUG_ALLOC ("gkr-secure-memory: freed block ", sz); + +#else + ASSERT (FALSE); +#endif +} + +/* ----------------------------------------------------------------------------- + * MANAGE DIFFERENT BLOCKS + */ + +static Block *all_blocks = NULL; + +static Block* +sec_block_create (size_t size, + const char *during_tag) +{ + Block *block; + Cell *cell; + + ASSERT (during_tag); + + /* We can force all all memory to be malloced */ + if (getenv ("SECMEM_FORCE_FALLBACK")) + return NULL; + + block = pool_alloc (); + if (!block) + return NULL; + + cell = pool_alloc (); + if (!cell) { + pool_free (block); + return NULL; + } + + /* The size above is a minimum, we're free to go bigger */ + if (size < DEFAULT_BLOCK_SIZE) + size = DEFAULT_BLOCK_SIZE; + + block->words = sec_acquire_pages (&size, during_tag); + block->n_words = size / sizeof (word_t); + if (!block->words) { + pool_free (block); + pool_free (cell); + return NULL; + } + +#ifdef WITH_VALGRIND + VALGRIND_MAKE_MEM_DEFINED (block->words, size); +#endif + + /* The first cell to allocate from */ + cell->words = block->words; + cell->n_words = block->n_words; + cell->requested = 0; + sec_write_guards (cell); + sec_insert_cell_ring (&block->unused_cells, cell); + + block->next = all_blocks; + all_blocks = block; + + return block; +} + +static void +sec_block_destroy (Block *block) +{ + Block *bl, **at; + Cell *cell; + + ASSERT (block); + ASSERT (block->words); + ASSERT (block->n_used == 0); + + /* Remove from the list */ + for (at = &all_blocks, bl = *at; bl; at = &bl->next, bl = *at) { + if (bl == block) { + *at = block->next; + break; + } + } + + /* Must have been found */ + ASSERT (bl == block); + ASSERT (block->used_cells == NULL); + + /* Release all the meta data cells */ + while (block->unused_cells) { + cell = block->unused_cells; + sec_remove_cell_ring (&block->unused_cells, cell); + pool_free (cell); + } + + /* Release all pages of secure memory */ + sec_release_pages (block->words, block->n_words * sizeof (word_t)); + + pool_free (block); +} + +/* ------------------------------------------------------------------------ + * PUBLIC FUNCTIONALITY + */ + +void* +egg_secure_alloc_full (const char *tag, + size_t length, + int flags) +{ + Block *block; + void *memory = NULL; + + if (tag == NULL) + tag = "?"; + + if (length > 0xFFFFFFFF / 2) { + if (egg_secure_warnings) + fprintf (stderr, "tried to allocate an insane amount of memory: %lu\n", + (unsigned long)length); + return NULL; + } + + /* Can't allocate zero bytes */ + if (length == 0) + return NULL; + + DO_LOCK (); + + for (block = all_blocks; block; block = block->next) { + memory = sec_alloc (block, tag, length); + if (memory) + break; + } + + /* None of the current blocks have space, allocate new */ + if (!memory) { + block = sec_block_create (length, tag); + if (block) + memory = sec_alloc (block, tag, length); + } + +#ifdef WITH_VALGRIND + if (memory != NULL) + VALGRIND_MALLOCLIKE_BLOCK (memory, length, sizeof (void*), 1); +#endif + + DO_UNLOCK (); + + if (!memory && (flags & EGG_SECURE_USE_FALLBACK) && EGG_SECURE_GLOBALS.fallback != NULL) { + memory = EGG_SECURE_GLOBALS.fallback (NULL, length); + if (memory) /* Our returned memory is always zeroed */ + memset (memory, 0, length); + } + + if (!memory) + errno = ENOMEM; + + return memory; +} + +void* +egg_secure_realloc_full (const char *tag, + void *memory, + size_t length, + int flags) +{ + Block *block = NULL; + size_t previous = 0; + int donew = 0; + void *alloc = NULL; + + if (tag == NULL) + tag = "?"; + + if (length > 0xFFFFFFFF / 2) { + if (egg_secure_warnings) + fprintf (stderr, "tried to allocate an insane amount of memory: %lu\n", + (unsigned long)length); + return NULL; + } + + if (memory == NULL) + return egg_secure_alloc_full (tag, length, flags); + if (!length) { + egg_secure_free_full (memory, flags); + return NULL; + } + + DO_LOCK (); + + /* Find out where it belongs to */ + for (block = all_blocks; block; block = block->next) { + if (sec_is_valid_word (block, memory)) { + previous = sec_allocated (block, memory); + +#ifdef WITH_VALGRIND + /* Let valgrind think we are unallocating so that it'll validate */ + VALGRIND_FREELIKE_BLOCK (memory, sizeof (word_t)); +#endif + + alloc = sec_realloc (block, tag, memory, length); + +#ifdef WITH_VALGRIND + /* Now tell valgrind about either the new block or old one */ + VALGRIND_MALLOCLIKE_BLOCK (alloc ? alloc : memory, + alloc ? length : previous, + sizeof (word_t), 1); +#endif + break; + } + } + + /* If it didn't work we may need to allocate a new block */ + if (block && !alloc) + donew = 1; + + if (block && block->n_used == 0) + sec_block_destroy (block); + + DO_UNLOCK (); + + if (!block) { + if ((flags & EGG_SECURE_USE_FALLBACK) && EGG_SECURE_GLOBALS.fallback) { + /* + * In this case we can't zero the returned memory, + * because we don't know what the block size was. + */ + return EGG_SECURE_GLOBALS.fallback (memory, length); + } else { + if (egg_secure_warnings) + fprintf (stderr, "memory does not belong to secure memory pool: 0x%08lx\n", + (unsigned long)memory); + ASSERT (0 && "memory does does not belong to secure memory pool"); + return NULL; + } + } + + if (donew) { + alloc = egg_secure_alloc_full (tag, length, flags); + if (alloc) { + memcpy_with_vbits (alloc, memory, previous); + egg_secure_free_full (memory, flags); + } + } + + if (!alloc) + errno = ENOMEM; + + return alloc; +} + +void +egg_secure_free (void *memory) +{ + egg_secure_free_full (memory, EGG_SECURE_USE_FALLBACK); +} + +void +egg_secure_free_full (void *memory, int flags) +{ + Block *block = NULL; + + if (memory == NULL) + return; + + DO_LOCK (); + + /* Find out where it belongs to */ + for (block = all_blocks; block; block = block->next) { + if (sec_is_valid_word (block, memory)) + break; + } + +#ifdef WITH_VALGRIND + /* We like valgrind's warnings, so give it a first whack at checking for errors */ + if (block != NULL || !(flags & EGG_SECURE_USE_FALLBACK)) + VALGRIND_FREELIKE_BLOCK (memory, sizeof (word_t)); +#endif + + if (block != NULL) { + sec_free (block, memory); + if (block->n_used == 0) + sec_block_destroy (block); + } + + DO_UNLOCK (); + + if (!block) { + if ((flags & EGG_SECURE_USE_FALLBACK) && EGG_SECURE_GLOBALS.fallback) { + EGG_SECURE_GLOBALS.fallback (memory, 0); + } else { + if (egg_secure_warnings) + fprintf (stderr, "memory does not belong to secure memory pool: 0x%08lx\n", + (unsigned long)memory); + ASSERT (0 && "memory does does not belong to secure memory pool"); + } + } +} + +int +egg_secure_check (const void *memory) +{ + Block *block = NULL; + + DO_LOCK (); + + /* Find out where it belongs to */ + for (block = all_blocks; block; block = block->next) { + if (sec_is_valid_word (block, (word_t*)memory)) + break; + } + + DO_UNLOCK (); + + return block == NULL ? 0 : 1; +} + +void +egg_secure_validate (void) +{ + Block *block = NULL; + + DO_LOCK (); + + for (block = all_blocks; block; block = block->next) + sec_validate (block); + + DO_UNLOCK (); +} + + +static egg_secure_rec * +records_for_ring (Cell *cell_ring, + egg_secure_rec *records, + unsigned int *count, + unsigned int *total) +{ + egg_secure_rec *new_rec; + unsigned int allocated = *count; + Cell *cell; + + cell = cell_ring; + do { + if (*count >= allocated) { + new_rec = realloc (records, sizeof (egg_secure_rec) * (allocated + 32)); + if (new_rec == NULL) { + *count = 0; + free (records); + return NULL; + } else { + records = new_rec; + allocated += 32; + } + } + + if (cell != NULL) { + records[*count].request_length = cell->requested; + records[*count].block_length = cell->n_words * sizeof (word_t); + records[*count].tag = cell->tag; + (*count)++; + (*total) += cell->n_words; + cell = cell->next; + } + } while (cell != NULL && cell != cell_ring); + + return records; +} + +egg_secure_rec * +egg_secure_records (unsigned int *count) +{ + egg_secure_rec *records = NULL; + Block *block = NULL; + unsigned int total; + + *count = 0; + + DO_LOCK (); + + for (block = all_blocks; block != NULL; block = block->next) { + total = 0; + + records = records_for_ring (block->unused_cells, records, count, &total); + if (records == NULL) + break; + records = records_for_ring (block->used_cells, records, count, &total); + if (records == NULL) + break; + + /* Make sure this actualy accounts for all memory */ + ASSERT (total == block->n_words); + } + + DO_UNLOCK (); + + return records; +} + +char* +egg_secure_strdup_full (const char *tag, + const char *str, + int options) +{ + size_t len; + char *res; + + if (!str) + return NULL; + + len = strlen (str) + 1; + res = (char *)egg_secure_alloc_full (tag, len, options); + strcpy (res, str); + return res; +} + +char * +egg_secure_strndup_full (const char *tag, + const char *str, + size_t length, + int options) +{ + size_t len; + char *res; + const char *end; + + if (!str) + return NULL; + + end = memchr (str, '\0', length); + if (end != NULL) + length = (end - str); + len = length + 1; + res = (char *)egg_secure_alloc_full (tag, len, options); + memcpy (res, str, len); + return res; +} + +void +egg_secure_clear (void *p, size_t length) +{ + volatile char *vp; + + if (p == NULL) + return; + + vp = (volatile char*)p; + while (length) { + *vp = 0xAA; + vp++; + length--; + } +} + +void +egg_secure_strclear (char *str) +{ + if (!str) + return; + egg_secure_clear ((unsigned char*)str, strlen (str)); +} + +void +egg_secure_strfree (char *str) +{ + /* + * If we're using unpageable 'secure' memory, then the free call + * should zero out the memory, but because on certain platforms + * we may be using normal memory, zero it out here just in case. + */ + + egg_secure_strclear (str); + egg_secure_free_full (str, EGG_SECURE_USE_FALLBACK); +} diff --git a/egg/egg-secure-memory.h b/egg/egg-secure-memory.h new file mode 100644 index 0000000..4554aef --- /dev/null +++ b/egg/egg-secure-memory.h @@ -0,0 +1,120 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* egg-secure-memory.h - library for allocating memory that is non-pageable + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef EGG_SECURE_MEMORY_H +#define EGG_SECURE_MEMORY_H + +#include + +/* ------------------------------------------------------------------- + * Low Level Secure Memory + * + * IMPORTANT: This is pure vanila standard C, no glib. We need this + * because certain consumers of this protocol need to be built + * without linking in any special libraries. ie: the PKCS#11 module. + * + * Thread locking + * + * In order to use these functions in a module the following functions + * must be defined somewhere, and provide appropriate locking for + * secure memory between threads: + */ + +typedef struct { + void (* lock) (void); + void (* unlock) (void); + void * (* fallback) (void *pointer, + size_t length); + void * pool_data; + const char * pool_version; +} egg_secure_glob; + +#define EGG_SECURE_POOL_VER_STR "1.0" +#define EGG_SECURE_GLOBALS SECMEM_pool_data_v1_0 + +#define EGG_SECURE_DEFINE_GLOBALS(lock, unlock, fallback) \ + egg_secure_glob EGG_SECURE_GLOBALS = { \ + lock, unlock, fallback, NULL, EGG_SECURE_POOL_VER_STR }; + +#define EGG_SECURE_DEFINE_GLIB_GLOBALS() \ + static GMutex memory_mutex = { 0, }; \ + static void egg_memory_lock (void) \ + { g_mutex_lock (&memory_mutex); } \ + static void egg_memory_unlock (void) \ + { g_mutex_unlock (&memory_mutex); } \ + EGG_SECURE_DEFINE_GLOBALS (egg_memory_lock, egg_memory_unlock, g_realloc); + +extern egg_secure_glob EGG_SECURE_GLOBALS; + +/* + * Main functionality + * + * Allocations return NULL on failure. + */ + +#define EGG_SECURE_USE_FALLBACK 0x0001 + +#define EGG_SECURE_DECLARE(tag) \ + static inline void* egg_secure_alloc (size_t length) { \ + return egg_secure_alloc_full (G_STRINGIFY (tag), length, EGG_SECURE_USE_FALLBACK); \ + } \ + static inline void* egg_secure_realloc (void *p, size_t length) { \ + return egg_secure_realloc_full (G_STRINGIFY (tag), p, length, EGG_SECURE_USE_FALLBACK); \ + } \ + static inline void* egg_secure_strdup (const char *str) { \ + return egg_secure_strdup_full (G_STRINGIFY (tag), str, EGG_SECURE_USE_FALLBACK); \ + } \ + static inline void* egg_secure_strndup (const char *str, size_t length) { \ + return egg_secure_strndup_full (G_STRINGIFY (tag), str, length, EGG_SECURE_USE_FALLBACK); \ + } + +void* egg_secure_alloc_full (const char *tag, size_t length, int options); + +void* egg_secure_realloc_full (const char *tag, void *p, size_t length, int options); + +void egg_secure_free (void* p); + +void egg_secure_free_full (void* p, int fallback); + +void egg_secure_clear (void *p, size_t length); + +int egg_secure_check (const void* p); + +void egg_secure_validate (void); + +char* egg_secure_strdup_full (const char *tag, const char *str, int options); + +char* egg_secure_strndup_full (const char *tag, const char *str, size_t length, int options); + +void egg_secure_strclear (char *str); + +void egg_secure_strfree (char *str); + +typedef struct { + const char *tag; + size_t request_length; + size_t block_length; +} egg_secure_rec; + +egg_secure_rec * egg_secure_records (unsigned int *count); + +#endif /* EGG_SECURE_MEMORY_H */ diff --git a/egg/egg-symkey.c b/egg/egg-symkey.c new file mode 100644 index 0000000..a0b08a3 --- /dev/null +++ b/egg/egg-symkey.c @@ -0,0 +1,1196 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "egg-asn1-defs.h" +#include "egg-asn1x.h" +#include "egg-secure-memory.h" +#include "egg-symkey.h" + +EGG_SECURE_DECLARE (symkey); + +/* ----------------------------------------------------------------------------- + * QUARKS + */ + +static GQuark OID_PBE_MD2_DES_CBC; +static GQuark OID_PBE_MD5_DES_CBC; +static GQuark OID_PBE_MD2_RC2_CBC; +static GQuark OID_PBE_MD5_RC2_CBC; +static GQuark OID_PBE_SHA1_DES_CBC; +static GQuark OID_PBE_SHA1_RC2_CBC; +static GQuark OID_PBES2; +static GQuark OID_PBKDF2; + +static GQuark OID_DES_CBC; +static GQuark OID_DES_RC2_CBC; +static GQuark OID_DES_EDE3_CBC; +static GQuark OID_DES_RC5_CBC; + +static GQuark OID_PKCS12_PBE_ARCFOUR_SHA1; +static GQuark OID_PKCS12_PBE_RC4_40_SHA1; +static GQuark OID_PKCS12_PBE_3DES_SHA1; +static GQuark OID_PKCS12_PBE_2DES_SHA1; +static GQuark OID_PKCS12_PBE_RC2_128_SHA1; +static GQuark OID_PKCS12_PBE_RC2_40_SHA1; + +static GQuark OID_SHA1; + +static void +init_quarks (void) +{ + static volatile gsize quarks_inited = 0; + + if (g_once_init_enter (&quarks_inited)) { + + #define QUARK(name, value) \ + name = g_quark_from_static_string(value) + + QUARK (OID_PBE_MD2_DES_CBC, "1.2.840.113549.1.5.1"); + QUARK (OID_PBE_MD5_DES_CBC, "1.2.840.113549.1.5.3"); + QUARK (OID_PBE_MD2_RC2_CBC, "1.2.840.113549.1.5.4"); + QUARK (OID_PBE_MD5_RC2_CBC, "1.2.840.113549.1.5.6"); + QUARK (OID_PBE_SHA1_DES_CBC, "1.2.840.113549.1.5.10"); + QUARK (OID_PBE_SHA1_RC2_CBC, "1.2.840.113549.1.5.11"); + + QUARK (OID_PBES2, "1.2.840.113549.1.5.13"); + + QUARK (OID_PBKDF2, "1.2.840.113549.1.5.12"); + + QUARK (OID_DES_CBC, "1.3.14.3.2.7"); + QUARK (OID_DES_RC2_CBC, "1.2.840.113549.3.2"); + QUARK (OID_DES_EDE3_CBC, "1.2.840.113549.3.7"); + QUARK (OID_DES_RC5_CBC, "1.2.840.113549.3.9"); + + QUARK (OID_PKCS12_PBE_ARCFOUR_SHA1, "1.2.840.113549.1.12.1.1"); + QUARK (OID_PKCS12_PBE_RC4_40_SHA1, "1.2.840.113549.1.12.1.2"); + QUARK (OID_PKCS12_PBE_3DES_SHA1, "1.2.840.113549.1.12.1.3"); + QUARK (OID_PKCS12_PBE_2DES_SHA1, "1.2.840.113549.1.12.1.4"); + QUARK (OID_PKCS12_PBE_RC2_128_SHA1, "1.2.840.113549.1.12.1.5"); + QUARK (OID_PKCS12_PBE_RC2_40_SHA1, "1.2.840.113549.1.12.1.6"); + + QUARK (OID_SHA1, "1.3.14.3.2.26"); + + #undef QUARK + + g_once_init_leave (&quarks_inited, 1); + } +} + +/* ----------------------------------------------------------------------------- + * PASSWORD TO KEY/IV + */ + +gboolean +egg_symkey_generate_simple (int cipher_algo, int hash_algo, + const gchar *password, gssize n_password, + const guchar *salt, gsize n_salt, int iterations, + guchar **key, guchar **iv) +{ + gcry_md_hd_t mdh; + gcry_error_t gcry; + guchar *digest; + guchar *digested; + guint n_digest; + gint pass, i; + gint needed_iv, needed_key; + guchar *at_iv, *at_key; + + g_assert (cipher_algo); + g_assert (hash_algo); + + g_return_val_if_fail (iterations >= 1, FALSE); + + if (!password) + n_password = 0; + if (n_password == -1) + n_password = strlen (password); + + /* + * If cipher algo needs more bytes than hash algo has available + * then the entire hashing process is done again (with the previous + * hash bytes as extra input), and so on until satisfied. + */ + + needed_key = gcry_cipher_get_algo_keylen (cipher_algo); + needed_iv = gcry_cipher_get_algo_blklen (cipher_algo); + + gcry = gcry_md_open (&mdh, hash_algo, 0); + if (gcry) { + g_warning ("couldn't create '%s' hash context: %s", + gcry_md_algo_name (hash_algo), gcry_strerror (gcry)); + return FALSE; + } + + n_digest = gcry_md_get_algo_dlen (hash_algo); + g_return_val_if_fail (n_digest > 0, FALSE); + + digest = egg_secure_alloc (n_digest); + g_return_val_if_fail (digest, FALSE); + if (key) { + *key = egg_secure_alloc (needed_key); + g_return_val_if_fail (*key, FALSE); + } + if (iv) + *iv = g_new0 (guchar, needed_iv); + + at_key = key ? *key : NULL; + at_iv = iv ? *iv : NULL; + + for (pass = 0; TRUE; ++pass) { + gcry_md_reset (mdh); + + /* Hash in the previous buffer on later passes */ + if (pass > 0) + gcry_md_write (mdh, digest, n_digest); + + if (password) + gcry_md_write (mdh, password, n_password); + if (salt && n_salt) + gcry_md_write (mdh, salt, n_salt); + gcry_md_final (mdh); + digested = gcry_md_read (mdh, 0); + g_return_val_if_fail (digested, FALSE); + memcpy (digest, digested, n_digest); + + for (i = 1; i < iterations; ++i) { + gcry_md_reset (mdh); + gcry_md_write (mdh, digest, n_digest); + gcry_md_final (mdh); + digested = gcry_md_read (mdh, 0); + g_return_val_if_fail (digested, FALSE); + memcpy (digest, digested, n_digest); + } + + /* Copy as much as possible into the destinations */ + i = 0; + while (needed_key && i < n_digest) { + if (at_key) + *(at_key++) = digest[i]; + needed_key--; + i++; + } + while (needed_iv && i < n_digest) { + if (at_iv) + *(at_iv++) = digest[i]; + needed_iv--; + i++; + } + + if (needed_key == 0 && needed_iv == 0) + break; + } + + egg_secure_free (digest); + gcry_md_close (mdh); + + return TRUE; +} + +gboolean +egg_symkey_generate_pbe (int cipher_algo, int hash_algo, const gchar *password, + gssize n_password, const guchar *salt, gsize n_salt, int iterations, + guchar **key, guchar **iv) +{ + gcry_md_hd_t mdh; + gcry_error_t gcry; + guchar *digest; + guchar *digested; + guint i, n_digest; + gint needed_iv, needed_key; + + g_assert (cipher_algo); + g_assert (hash_algo); + + g_return_val_if_fail (iterations >= 1, FALSE); + + if (!password) + n_password = 0; + if (n_password == -1) + n_password = strlen (password); + + /* + * We only do one pass here. + * + * The key ends up as the first needed_key bytes of the hash buffer. + * The iv ends up as the last needed_iv bytes of the hash buffer. + * + * The IV may overlap the key (which is stupid) if the wrong pair of + * hash/cipher algorithms are chosen. + */ + + n_digest = gcry_md_get_algo_dlen (hash_algo); + g_return_val_if_fail (n_digest > 0, FALSE); + + needed_key = gcry_cipher_get_algo_keylen (cipher_algo); + needed_iv = gcry_cipher_get_algo_blklen (cipher_algo); + if (needed_iv + needed_key > 16 || needed_iv + needed_key > n_digest) { + g_warning ("using PBE symkey generation with %s using an algorithm that needs " + "too many bytes of key and/or IV: %s", + gcry_cipher_algo_name (hash_algo), + gcry_cipher_algo_name (cipher_algo)); + return FALSE; + } + + gcry = gcry_md_open (&mdh, hash_algo, 0); + if (gcry) { + g_warning ("couldn't create '%s' hash context: %s", + gcry_md_algo_name (hash_algo), gcry_strerror (gcry)); + return FALSE; + } + + digest = egg_secure_alloc (n_digest); + g_return_val_if_fail (digest, FALSE); + if (key) { + *key = egg_secure_alloc (needed_key); + g_return_val_if_fail (*key, FALSE); + } + if (iv) + *iv = g_new0 (guchar, needed_iv); + + if (password) + gcry_md_write (mdh, password, n_password); + if (salt && n_salt) + gcry_md_write (mdh, salt, n_salt); + gcry_md_final (mdh); + digested = gcry_md_read (mdh, 0); + g_return_val_if_fail (digested, FALSE); + memcpy (digest, digested, n_digest); + + for (i = 1; i < iterations; ++i) + gcry_md_hash_buffer (hash_algo, digest, digest, n_digest); + + /* The first x bytes are the key */ + if (key) { + g_assert (needed_key <= n_digest); + memcpy (*key, digest, needed_key); + } + + /* The last 16 - x bytes are the iv */ + if (iv) { + g_assert (needed_iv <= n_digest && n_digest >= 16); + memcpy (*iv, digest + (16 - needed_iv), needed_iv); + } + + egg_secure_free (digest); + gcry_md_close (mdh); + + return TRUE; +} + +static gboolean +generate_pkcs12 (int hash_algo, int type, const gchar *utf8_password, + gssize n_password, const guchar *salt, gsize n_salt, + int iterations, guchar *output, gsize n_output) +{ + gcry_mpi_t num_b1, num_ij; + guchar *hash, *buf_i, *buf_b; + const gchar *end_password; + gcry_md_hd_t mdh; + const gchar *p2; + guchar *p; + gsize n_hash, i; + gunichar unich; + gcry_error_t gcry; + gsize length; + + num_b1 = num_ij = NULL; + + n_hash = gcry_md_get_algo_dlen (hash_algo); + g_return_val_if_fail (n_hash > 0, FALSE); + + if (!utf8_password) + n_password = 0; + if (n_password == -1) + end_password = utf8_password + strlen (utf8_password); + else + end_password = utf8_password + n_password; + + gcry = gcry_md_open (&mdh, hash_algo, 0); + if (gcry) { + g_warning ("couldn't create '%s' hash context: %s", + gcry_md_algo_name (hash_algo), gcry_strerror (gcry)); + return FALSE; + } + + /* Reqisition me a buffer */ + hash = egg_secure_alloc (n_hash); + buf_i = egg_secure_alloc (128); + buf_b = egg_secure_alloc (64); + g_return_val_if_fail (hash && buf_i && buf_b, FALSE); + + /* Bring in the salt */ + p = buf_i; + if (salt) { + for (i = 0; i < 64; ++i) + *(p++) = salt[i % n_salt]; + } else { + memset (p, 0, 64); + p += 64; + } + + /* Bring in the password, as 16bits per character BMP string, ie: UCS2 */ + if (utf8_password) { + p2 = utf8_password; + for (i = 0; i < 64; i += 2) { + + /* Get a character from the string */ + if (p2 < end_password) { + unich = g_utf8_get_char (p2); + p2 = g_utf8_next_char (p2); + + /* Get zero null terminator, and loop back to beginning */ + } else { + unich = 0; + p2 = utf8_password; + } + + /* Encode the bytes received */ + *(p++) = (unich & 0xFF00) >> 8; + *(p++) = (unich & 0xFF); + } + } else { + memset (p, 0, 64); + } + + /* Hash and bash */ + for (;;) { + gcry_md_reset (mdh); + + /* Put in the PKCS#12 type of key */ + for (i = 0; i < 64; ++i) + gcry_md_putc (mdh, type); + + /* Bring in the password */ + gcry_md_write (mdh, buf_i, utf8_password ? 128 : 64); + + /* First iteration done */ + memcpy (hash, gcry_md_read (mdh, hash_algo), n_hash); + + /* All the other iterations */ + for (i = 1; i < iterations; i++) + gcry_md_hash_buffer (hash_algo, hash, hash, n_hash); + + /* Take out as much as we need */ + for (i = 0; i < n_hash && n_output; ++i) { + *(output++) = hash[i]; + --n_output; + } + + /* Is that enough generated keying material? */ + if (!n_output) + break; + + /* Need more bytes, do some voodoo */ + for (i = 0; i < 64; ++i) + buf_b[i] = hash[i % n_hash]; + gcry = gcry_mpi_scan (&num_b1, GCRYMPI_FMT_USG, buf_b, 64, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + gcry_mpi_add_ui (num_b1, num_b1, 1); + for (i = 0; i < 128; i += 64) { + gcry = gcry_mpi_scan (&num_ij, GCRYMPI_FMT_USG, buf_i + i, 64, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + gcry_mpi_add (num_ij, num_ij, num_b1); + gcry_mpi_clear_highbit (num_ij, 64 * 8); + /* We take special care to right align the number in the buffer */ + gcry = gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &length, num_ij); + g_return_val_if_fail (gcry == 0 && length <= 64, FALSE); + memset (buf_i + i, 0, 64 - length); + gcry = gcry_mpi_print (GCRYMPI_FMT_USG, buf_i + i + (64 - length), 64, NULL, num_ij); + g_return_val_if_fail (gcry == 0, FALSE); + gcry_mpi_release (num_ij); + } + } + + egg_secure_free (buf_i); + egg_secure_free (buf_b); + egg_secure_free (hash); + gcry_mpi_release (num_b1); + gcry_md_close (mdh); + + return TRUE; +} + +gboolean +egg_symkey_generate_pkcs12 (int cipher_algo, int hash_algo, const gchar *password, + gssize n_password, const guchar *salt, gsize n_salt, + int iterations, guchar **key, guchar **iv) +{ + gsize n_block, n_key; + gboolean ret = TRUE; + + g_return_val_if_fail (cipher_algo, FALSE); + g_return_val_if_fail (hash_algo, FALSE); + g_return_val_if_fail (iterations > 0, FALSE); + + n_key = gcry_cipher_get_algo_keylen (cipher_algo); + n_block = gcry_cipher_get_algo_blklen (cipher_algo); + + if (password && !g_utf8_validate (password, n_password, NULL)) { + g_warning ("invalid non-UTF8 password"); + g_return_val_if_reached (FALSE); + } + + if (key) + *key = NULL; + if (iv) + *iv = NULL; + + /* Generate us an key */ + if (key) { + *key = egg_secure_alloc (n_key); + g_return_val_if_fail (*key != NULL, FALSE); + ret = generate_pkcs12 (hash_algo, 1, password, n_password, salt, n_salt, + iterations, *key, n_key); + } + + /* Generate us an iv */ + if (ret && iv) { + if (n_block > 1) { + *iv = g_malloc (n_block); + ret = generate_pkcs12 (hash_algo, 2, password, n_password, salt, n_salt, + iterations, *iv, n_block); + } else { + *iv = NULL; + } + } + + /* Cleanup in case of failure */ + if (!ret) { + g_free (iv ? *iv : NULL); + egg_secure_free (key ? *key : NULL); + } + + return ret; +} + +gboolean +egg_symkey_generate_pkcs12_mac (int hash_algo, + const gchar *password, + gssize n_password, + const guchar *salt, + gsize n_salt, + int iterations, + guchar **key) +{ + gsize n_key; + gboolean ret = TRUE; + + g_return_val_if_fail (hash_algo, FALSE); + g_return_val_if_fail (iterations > 0, FALSE); + + n_key = gcry_md_get_algo_dlen (hash_algo); + + if (password && !g_utf8_validate (password, n_password, NULL)) { + g_warning ("invalid non-UTF8 password"); + g_return_val_if_reached (FALSE); + } + + /* Generate us an key */ + if (key) { + *key = egg_secure_alloc (n_key); + g_return_val_if_fail (*key != NULL, FALSE); + ret = generate_pkcs12 (hash_algo, 3, password, n_password, salt, n_salt, + iterations, *key, n_key); + } + + /* Cleanup in case of failure */ + if (!key) + egg_secure_free (key ? *key : NULL); + + return ret; +} + +static gboolean +generate_pbkdf2 (int hash_algo, const gchar *password, gsize n_password, + const guchar *salt, gsize n_salt, guint iterations, + guchar *output, gsize n_output) +{ + gcry_md_hd_t mdh; + guint u, l, r, i, k; + gcry_error_t gcry; + guchar *U, *T, *buf; + gsize n_buf, n_hash; + + g_return_val_if_fail (hash_algo > 0, FALSE); + g_return_val_if_fail (iterations > 0, FALSE); + g_return_val_if_fail (n_output > 0, FALSE); + g_return_val_if_fail (n_output < G_MAXUINT32, FALSE); + + n_hash = gcry_md_get_algo_dlen (hash_algo); + g_return_val_if_fail (n_hash > 0, FALSE); + + gcry = gcry_md_open (&mdh, hash_algo, GCRY_MD_FLAG_HMAC); + if (gcry != 0) { + g_warning ("couldn't create '%s' hash context: %s", + gcry_md_algo_name (hash_algo), gcry_strerror (gcry)); + return FALSE; + } + + /* Get us a temporary buffers */ + T = egg_secure_alloc (n_hash); + U = egg_secure_alloc (n_hash); + n_buf = n_salt + 4; + buf = egg_secure_alloc (n_buf); + g_return_val_if_fail (buf && T && U, FALSE); + + /* n_hash blocks in output, rounding up */ + l = ((n_output - 1) / n_hash) + 1; + + /* number of bytes in last, rounded up, n_hash block */ + r = n_output - (l - 1) * n_hash; + + memcpy (buf, salt, n_salt); + for (i = 1; i <= l; i++) { + memset (T, 0, n_hash); + for (u = 1; u <= iterations; u++) { + gcry_md_reset (mdh); + + gcry = gcry_md_setkey (mdh, password, n_password); + g_return_val_if_fail (gcry == 0, FALSE); + + /* For first iteration on each block add 4 extra bytes */ + if (u == 1) { + buf[n_salt + 0] = (i & 0xff000000) >> 24; + buf[n_salt + 1] = (i & 0x00ff0000) >> 16; + buf[n_salt + 2] = (i & 0x0000ff00) >> 8; + buf[n_salt + 3] = (i & 0x000000ff) >> 0; + + gcry_md_write (mdh, buf, n_buf); + + /* Other iterations, any block */ + } else { + gcry_md_write (mdh, U, n_hash); + } + + memcpy (U, gcry_md_read (mdh, hash_algo), n_hash); + + for (k = 0; k < n_hash; k++) + T[k] ^= U[k]; + } + + memcpy (output + (i - 1) * n_hash, T, i == l ? r : n_hash); + } + + egg_secure_free (T); + egg_secure_free (U); + egg_secure_free (buf); + gcry_md_close (mdh); + return TRUE; +} + +gboolean +egg_symkey_generate_pbkdf2 (int cipher_algo, int hash_algo, + const gchar *password, gssize n_password, + const guchar *salt, gsize n_salt, int iterations, + guchar **key, guchar **iv) +{ + gsize n_key, n_block; + gboolean ret = TRUE; + + g_return_val_if_fail (hash_algo, FALSE); + g_return_val_if_fail (cipher_algo, FALSE); + g_return_val_if_fail (iterations > 0, FALSE); + + n_key = gcry_cipher_get_algo_keylen (cipher_algo); + n_block = gcry_cipher_get_algo_blklen (cipher_algo); + + if (key) + *key = NULL; + if (iv) + *iv = NULL; + + if (!password) + n_password = 0; + if (n_password == -1) + n_password = strlen (password); + + /* Generate us an key */ + if (key) { + *key = egg_secure_alloc (n_key); + g_return_val_if_fail (*key != NULL, FALSE); + ret = generate_pbkdf2 (hash_algo, password, n_password, salt, n_salt, + iterations, *key, n_key); + } + + /* Generate us an iv */ + if (ret && iv) { + if (n_block > 1) { + *iv = g_malloc (n_block); + gcry_create_nonce (*iv, n_block); + } else { + *iv = NULL; + } + } + + /* Cleanup in case of failure */ + if (!ret) { + g_free (iv ? *iv : NULL); + egg_secure_free (key ? *key : NULL); + } + + return ret; +} + +/* ---------------------------------------------------------------------------- + * DER encoded cipher params + */ + + +static gboolean +read_cipher_pkcs5_pbe (int cipher_algo, + int cipher_mode, + int hash_algo, + const gchar *password, + gsize n_password, + GNode *data, + gcry_cipher_hd_t *cih) +{ + GNode *asn = NULL; + gcry_error_t gcry; + GBytes *salt = NULL; + gsize n_block, n_key; + gulong iterations; + guchar *key = NULL; + guchar *iv = NULL; + gboolean ret; + + g_return_val_if_fail (cipher_algo != 0 && cipher_mode != 0, FALSE); + g_return_val_if_fail (cih != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + *cih = NULL; + ret = FALSE; + + /* Check if we can use this algorithm */ + if (gcry_cipher_algo_info (cipher_algo, GCRYCTL_TEST_ALGO, NULL, 0) != 0 || + gcry_md_test_algo (hash_algo) != 0) + goto done; + + asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-5-PBE-params"); + g_return_val_if_fail (asn, FALSE); + + if (!egg_asn1x_get_any_into (data, asn)) + goto done; + + salt = egg_asn1x_get_string_as_bytes (egg_asn1x_node (asn, "salt", NULL)); + g_return_val_if_fail (salt != NULL, FALSE); + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "iterationCount", NULL), &iterations)) + g_return_val_if_reached (FALSE); + + n_key = gcry_cipher_get_algo_keylen (cipher_algo); + g_return_val_if_fail (n_key > 0, FALSE); + n_block = gcry_cipher_get_algo_blklen (cipher_algo); + + if (!egg_symkey_generate_pbe (cipher_algo, hash_algo, password, n_password, + g_bytes_get_data (salt, NULL), g_bytes_get_size (salt), + iterations, &key, n_block > 1 ? &iv : NULL)) + goto done; + + gcry = gcry_cipher_open (cih, cipher_algo, cipher_mode, 0); + if (gcry != 0) { + g_warning ("couldn't create cipher: %s", gcry_strerror (gcry)); + goto done; + } + + if (iv) + gcry_cipher_setiv (*cih, iv, n_block); + gcry_cipher_setkey (*cih, key, n_key); + + ret = TRUE; + +done: + g_free (iv); + if (salt != NULL) + g_bytes_unref (salt); + egg_secure_free (key); + egg_asn1x_destroy (asn); + + return ret; +} + +#if NOT_SUPPORTED +static gboolean +setup_pkcs5_rc2_params (GNode *any, + gcry_cipher_hd_t cih) +{ + GNode *asn = NULL; + gcry_error_t gcry; + GBytes *iv = NULL; + gulong version; + gboolean ret = FALSE; + + g_assert (any != NULL); + + asn = egg_asn1x_get_any_as (any, pkix_asn1_tab, "pkcs-5-rc2-CBC-params"); + if (asn == NULL) + goto done; + + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "rc2ParameterVersion", NULL), &version)) + goto done; + + iv = egg_asn1x_get_string_as_bytes (egg_asn1x_node (asn, "iv", NULL)); + if (!iv) + goto done; + + gcry = gcry_cipher_setiv (cih, g_bytes_get_data (iv, NULL), g_bytes_get_size (iv)); + if (gcry != 0) { + g_message ("couldn't set %lu byte iv on cipher", (gulong)g_bytes_get_size (iv)); + goto done; + } + + ret = TRUE; + +done: + if (iv != NULL) + g_bytes_unref (iv); + egg_asn1x_destroy (asn); + return ret; +} +#endif + +static gboolean +setup_pkcs5_des_params (GNode *any, + gcry_cipher_hd_t cih) +{ + GNode *asn = NULL; + gcry_error_t gcry; + GBytes *iv; + gboolean ret; + + g_assert (any != NULL); + + asn = egg_asn1x_get_any_as (any, pkix_asn1_tab, "pkcs-5-des-EDE3-CBC-params"); + if (!asn) + asn = egg_asn1x_get_any_as (any, pkix_asn1_tab, "pkcs-5-des-CBC-params"); + if (!asn) + return FALSE; + + iv = egg_asn1x_get_string_as_bytes (asn); + egg_asn1x_destroy (asn); + + if (!iv) + return FALSE; + + gcry = gcry_cipher_setiv (cih, g_bytes_get_data (iv, NULL), g_bytes_get_size (iv)); + if (gcry != 0) { + g_message ("couldn't set %lu byte iv on cipher", (gulong)g_bytes_get_size (iv)); + ret = FALSE; + } else { + ret = TRUE; + } + + g_bytes_unref (iv); + return ret; +} + +static gboolean +setup_pkcs5_pbkdf2_params (const gchar *password, + gsize n_password, + GNode *any, + int cipher_algo, + gcry_cipher_hd_t cih) +{ + GNode *asn = NULL; + gboolean ret; + gcry_error_t gcry; + guchar *key = NULL; + GBytes *salt = NULL; + gsize n_key; + gulong iterations; + + g_assert (cipher_algo); + g_assert (any != NULL); + + ret = FALSE; + + asn = egg_asn1x_get_any_as (any, pkix_asn1_tab, "pkcs-5-PBKDF2-params"); + if (!asn) + goto done; + + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "iterationCount", NULL), &iterations)) + g_return_val_if_reached (FALSE); + salt = egg_asn1x_get_string_as_bytes (egg_asn1x_node (asn, "salt", "specified", NULL)); + if (!salt) + goto done; + + if (!egg_symkey_generate_pbkdf2 (cipher_algo, GCRY_MD_SHA1, password, n_password, + g_bytes_get_data (salt, NULL), g_bytes_get_size (salt), + iterations, &key, NULL)) + goto done; + + n_key = gcry_cipher_get_algo_keylen (cipher_algo); + g_return_val_if_fail (n_key > 0, FALSE); + + gcry = gcry_cipher_setkey (cih, key, n_key); + if (gcry != 0) { + g_message ("couldn't set %lu byte key on cipher", (gulong)n_key); + goto done; + } + + ret = TRUE; + +done: + if (salt != NULL) + g_bytes_unref (salt); + egg_secure_free (key); + egg_asn1x_destroy (asn); + return ret; +} + +static gboolean +read_cipher_pkcs5_pbes2 (const gchar *password, + gsize n_password, + GNode *data, + gcry_cipher_hd_t *cih) +{ + GNode *asn = NULL; + gboolean r, ret; + GQuark key_deriv_algo, enc_oid; + GNode *params = NULL; + gcry_error_t gcry; + int algo, mode; + + g_return_val_if_fail (cih != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + init_quarks (); + + *cih = NULL; + ret = FALSE; + + asn = egg_asn1x_get_any_as (data, pkix_asn1_tab, "pkcs-5-PBES2-params"); + if (!asn) + goto done; + + algo = mode = 0; + + /* Read in all the encryption type */ + enc_oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "encryptionScheme", "algorithm", NULL)); + if (!enc_oid) + goto done; + if (enc_oid == OID_DES_EDE3_CBC) + algo = GCRY_CIPHER_3DES; + else if (enc_oid == OID_DES_CBC) + algo = GCRY_CIPHER_DES; + else if (enc_oid == OID_DES_RC2_CBC) + /* GCRY_CIPHER_RFC2268_128 isn't actually implemented in libgcrypt (yet?) */; + else if (enc_oid == OID_DES_RC5_CBC) + /* RC5 doesn't exist in libgcrypt */; + + /* Unsupported? */ + if (algo == 0 || gcry_cipher_algo_info (algo, GCRYCTL_TEST_ALGO, NULL, 0) != 0) + goto done; + + /* Instantiate our cipher */ + gcry = gcry_cipher_open (cih, algo, GCRY_CIPHER_MODE_CBC, 0); + if (gcry != 0) { + g_warning ("couldn't create cipher: %s", gcry_cipher_algo_name (algo)); /* UNREACHABLE: */ + goto done; /* UNREACHABLE: with normal libgcrypt behavior */ + } + + /* Read out the parameters. OPTIONAL, but will always find node */ + params = egg_asn1x_node (asn, "encryptionScheme", "parameters", NULL); + g_return_val_if_fail (params != NULL, FALSE); + + switch (algo) { + case GCRY_CIPHER_3DES: + case GCRY_CIPHER_DES: + r = setup_pkcs5_des_params (params, *cih); + break; +#if 0 + case GCRY_CIPHER_RFC2268_128: + r = setup_pkcs5_rc2_params (params, *cih); + break; +#endif + default: + /* Should have been caught on the oid check above */ + g_assert_not_reached (); + r = FALSE; + break; + }; + + if (r != TRUE) + goto done; + + /* Read out the key creation paramaters */ + key_deriv_algo = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "keyDerivationFunc", "algorithm", NULL)); + if (!key_deriv_algo) + goto done; + if (key_deriv_algo != OID_PBKDF2) { + g_message ("unsupported key derivation algorithm: %s", g_quark_to_string (key_deriv_algo)); + goto done; + } + + /* parameters is OPTIONAL, but will always find node */ + params = egg_asn1x_node (asn, "keyDerivationFunc", "parameters", NULL); + g_return_val_if_fail (params != NULL, FALSE); + + ret = setup_pkcs5_pbkdf2_params (password, n_password, params, algo, *cih); + +done: + if (ret != TRUE && *cih) { + gcry_cipher_close (*cih); + *cih = NULL; + } + + egg_asn1x_destroy (asn); + return ret; +} + +static gboolean +read_cipher_pkcs12_pbe (int cipher_algo, + int cipher_mode, + const gchar *password, + gsize n_password, + GNode *data, + gcry_cipher_hd_t *cih) +{ + GNode *asn = NULL; + gcry_error_t gcry; + gboolean ret; + GBytes *salt = NULL; + gsize n_block, n_key; + gulong iterations; + guchar *key = NULL; + guchar *iv = NULL; + + g_return_val_if_fail (cipher_algo != 0 && cipher_mode != 0, FALSE); + g_return_val_if_fail (cih != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + *cih = NULL; + ret = FALSE; + + /* Check if we can use this algorithm */ + if (gcry_cipher_algo_info (cipher_algo, GCRYCTL_TEST_ALGO, NULL, 0) != 0) + goto done; + + asn = egg_asn1x_get_any_as (data, pkix_asn1_tab, "pkcs-12-PbeParams"); + if (!asn) + goto done; + + salt = egg_asn1x_get_string_as_bytes (egg_asn1x_node (asn, "salt", NULL)); + g_return_val_if_fail (salt != NULL, FALSE); + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "iterations", NULL), &iterations)) + g_return_val_if_reached (FALSE); + + n_block = gcry_cipher_get_algo_blklen (cipher_algo); + n_key = gcry_cipher_get_algo_keylen (cipher_algo); + + /* Generate IV and key using salt read above */ + if (!egg_symkey_generate_pkcs12 (cipher_algo, GCRY_MD_SHA1, password, n_password, + g_bytes_get_data (salt, NULL), g_bytes_get_size (salt), + iterations, &key, n_block > 1 ? &iv : NULL)) + goto done; + + gcry = gcry_cipher_open (cih, cipher_algo, cipher_mode, 0); + if (gcry != 0) { + g_warning ("couldn't create encryption cipher: %s", gcry_strerror (gcry)); + goto done; + } + + if (iv) + gcry_cipher_setiv (*cih, iv, n_block); + gcry_cipher_setkey (*cih, key, n_key); + + ret = TRUE; + +done: + if (ret != TRUE && *cih) { + gcry_cipher_close (*cih); + *cih = NULL; + } + + if (salt != NULL) + g_bytes_unref (salt); + g_free (iv); + egg_secure_free (key); + egg_asn1x_destroy (asn); + return ret; +} + +static gboolean +read_mac_pkcs12_pbe (int hash_algo, + const gchar *password, + gsize n_password, + GNode *data, + gcry_md_hd_t *mdh, + gsize *digest_len) +{ + GNode *asn = NULL; + gcry_error_t gcry; + gboolean ret; + gsize n_key; + GBytes *salt = NULL; + gulong iterations; + guchar *key = NULL; + + g_return_val_if_fail (hash_algo != 0, FALSE); + g_return_val_if_fail (mdh != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + *mdh = NULL; + ret = FALSE; + + /* Check if we can use this algorithm */ + if (gcry_md_algo_info (hash_algo, GCRYCTL_TEST_ALGO, NULL, 0) != 0) + goto done; /* UNREACHABLE: unless libgcrypt changes behavior */ + + if (egg_asn1x_type (data) == EGG_ASN1X_ANY) { + asn = egg_asn1x_get_any_as (data, pkix_asn1_tab, "pkcs-12-MacData"); + if (!asn) + goto done; + data = asn; + } + + salt = egg_asn1x_get_string_as_bytes (egg_asn1x_node (data, "macSalt", NULL)); + if (!salt) + g_return_val_if_reached (FALSE); + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (data, "iterations", NULL), &iterations)) + g_return_val_if_reached (FALSE); + + n_key = gcry_md_get_algo_dlen (hash_algo); + + /* Generate IV and key using salt read above */ + if (!egg_symkey_generate_pkcs12_mac (hash_algo, password, n_password, + g_bytes_get_data (salt, NULL), g_bytes_get_size (salt), + iterations, &key)) + goto done; + + gcry = gcry_md_open (mdh, hash_algo, GCRY_MD_FLAG_HMAC); + if (gcry != 0) { + g_warning ("couldn't create mac digest: %s", gcry_strerror (gcry)); + goto done; + } + + if (digest_len) + *digest_len = n_key; + gcry_md_setkey (*mdh, key, n_key); + + ret = TRUE; + +done: + if (ret != TRUE && *mdh) { + gcry_md_close (*mdh); + *mdh = NULL; + } + + if (salt != NULL) + g_bytes_unref (salt); + egg_secure_free (key); + egg_asn1x_destroy (asn); + return ret; +} + +gboolean +egg_symkey_read_cipher (GQuark oid_scheme, + const gchar *password, + gsize n_password, + GNode *data, + gcry_cipher_hd_t *cih) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (oid_scheme != 0, FALSE); + g_return_val_if_fail (cih != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + init_quarks (); + + /* PKCS#5 PBE */ + if (oid_scheme == OID_PBE_MD2_DES_CBC) + ret = read_cipher_pkcs5_pbe (GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CBC, + GCRY_MD_MD2, password, n_password, data, cih); + + else if (oid_scheme == OID_PBE_MD2_RC2_CBC) + /* RC2-64 has no implementation in libgcrypt */; + + else if (oid_scheme == OID_PBE_MD5_DES_CBC) + ret = read_cipher_pkcs5_pbe (GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CBC, + GCRY_MD_MD5, password, n_password, data, cih); + else if (oid_scheme == OID_PBE_MD5_RC2_CBC) + /* RC2-64 has no implementation in libgcrypt */; + + else if (oid_scheme == OID_PBE_SHA1_DES_CBC) + ret = read_cipher_pkcs5_pbe (GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CBC, + GCRY_MD_SHA1, password, n_password, data, cih); + else if (oid_scheme == OID_PBE_SHA1_RC2_CBC) + /* RC2-64 has no implementation in libgcrypt */; + + + /* PKCS#5 PBES2 */ + else if (oid_scheme == OID_PBES2) + ret = read_cipher_pkcs5_pbes2 (password, n_password, data, cih); + + + /* PKCS#12 PBE */ + else if (oid_scheme == OID_PKCS12_PBE_ARCFOUR_SHA1) + ret = read_cipher_pkcs12_pbe (GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM, + password, n_password, data, cih); + else if (oid_scheme == OID_PKCS12_PBE_RC4_40_SHA1) + /* RC4-40 has no implementation in libgcrypt */; + + else if (oid_scheme == OID_PKCS12_PBE_3DES_SHA1) + ret = read_cipher_pkcs12_pbe (GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC, + password, n_password, data, cih); + else if (oid_scheme == OID_PKCS12_PBE_2DES_SHA1) + /* 2DES has no implementation in libgcrypt */; + + else if (oid_scheme == OID_PKCS12_PBE_RC2_128_SHA1) + ret = read_cipher_pkcs12_pbe (GCRY_CIPHER_RFC2268_128, GCRY_CIPHER_MODE_CBC, + password, n_password, data, cih); + + else if (oid_scheme == OID_PKCS12_PBE_RC2_40_SHA1) + ret = read_cipher_pkcs12_pbe (GCRY_CIPHER_RFC2268_40, GCRY_CIPHER_MODE_CBC, + password, n_password, data, cih); + + if (ret == FALSE) + g_message ("unsupported or invalid cipher: %s", g_quark_to_string (oid_scheme)); + + return ret; +} + +gboolean +egg_symkey_read_mac (GQuark oid_scheme, + const gchar *password, + gsize n_password, + GNode *data, + gcry_md_hd_t *mdh, + gsize *digest_len) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (oid_scheme != 0, FALSE); + g_return_val_if_fail (mdh != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + init_quarks (); + + /* PKCS#12 MAC with SHA-1 */ + if (oid_scheme == OID_SHA1) + ret = read_mac_pkcs12_pbe (GCRY_MD_SHA1, password, n_password, + data, mdh, digest_len); + + if (ret == FALSE) + g_message ("unsupported or invalid mac: %s", g_quark_to_string (oid_scheme)); + + return ret; +} diff --git a/egg/egg-symkey.h b/egg/egg-symkey.h new file mode 100644 index 0000000..d565cf1 --- /dev/null +++ b/egg/egg-symkey.h @@ -0,0 +1,88 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef EGG_SYMKEY_H_ +#define EGG_SYMKEY_H_ + +#include + +#include + +gboolean egg_symkey_generate_simple (int cipher_algo, + int hash_algo, + const gchar *password, + gssize n_password, + const guchar *salt, + gsize n_salt, + int iterations, + guchar **key, + guchar **iv); + +gboolean egg_symkey_generate_pbe (int cipher_algo, + int hash_algo, + const gchar *password, + gssize n_password, + const guchar *salt, + gsize n_salt, + int iterations, + guchar **key, + guchar **iv); + +gboolean egg_symkey_generate_pkcs12 (int cipher_algo, + int hash_algo, + const gchar *password, + gssize n_password, + const guchar *salt, + gsize n_salt, + int iterations, + guchar **key, + guchar **iv); + +gboolean egg_symkey_generate_pkcs12_mac (int hash_algo, + const gchar *password, + gssize n_password, + const guchar *salt, + gsize n_salt, + int iterations, + guchar **key); + +gboolean egg_symkey_generate_pbkdf2 (int cipher_algo, + int hash_algo, + const gchar *password, + gssize n_password, + const guchar *salt, + gsize n_salt, + int iterations, + guchar **key, + guchar **iv); + +gboolean egg_symkey_read_cipher (GQuark oid_scheme, + const gchar *password, + gsize n_password, + GNode *params, + gcry_cipher_hd_t *cih); + +gboolean egg_symkey_read_mac (GQuark oid_scheme, + const gchar *password, + gsize n_password, + GNode *params, + gcry_md_hd_t *mdh, + gsize *digest_len); + +#endif /* EGG_SYMKEY_H_ */ diff --git a/egg/egg-testing.c b/egg/egg-testing.c new file mode 100644 index 0000000..6ca46a8 --- /dev/null +++ b/egg/egg-testing.c @@ -0,0 +1,334 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Stef Walter + */ + +#include "config.h" + +#include "egg-testing.h" + +#include + +#include +#include +#include + +#ifdef WITH_VALGRIND +#include +#endif + +#if 0 +static GCond *wait_condition = NULL; +static GCond *wait_start = NULL; +static GMutex *wait_mutex = NULL; +static gboolean wait_waiting = FALSE; +#endif + +gboolean +egg_testing_on_valgrind (void) +{ +#ifdef WITH_VALGRIND + return RUNNING_ON_VALGRIND; +#else + return FALSE; +#endif +} + + +static const char HEXC[] = "0123456789ABCDEF"; + +gchar * +egg_test_escape_data (const guchar *data, + gsize n_data) +{ + GString *result; + gchar c; + gsize i; + guchar j; + + g_assert (data != NULL); + + result = g_string_sized_new (n_data * 2 + 1); + for (i = 0; i < n_data; ++i) { + c = data[i]; + if (g_ascii_isprint (c) && !strchr ("\n\r\v", c)) { + g_string_append_c (result, c); + } else { + g_string_append (result, "\\x"); + j = c >> 4 & 0xf; + g_string_append_c (result, HEXC[j]); + j = c & 0xf; + g_string_append_c (result, HEXC[j]); + } + } + + return g_string_free (result, FALSE); +} + +void +egg_assertion_message_cmpmem (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + gconstpointer arg1, + gsize n_arg1, + const char *cmp, + gconstpointer arg2, + gsize n_arg2) +{ + char *a1, *a2, *s; + a1 = arg1 ? egg_test_escape_data (arg1, n_arg1) : g_strdup ("NULL"); + a2 = arg2 ? egg_test_escape_data (arg2, n_arg2) : g_strdup ("NULL"); + s = g_strdup_printf ("assertion failed (%s): (%s %s %s)", expr, a1, cmp, a2); + g_free (a1); + g_free (a2); + g_assertion_message (domain, file, line, func, s); + g_free (s); +} + +static void (*wait_stop_impl) (void); +static gboolean (*wait_until_impl) (int timeout); + +#if 0 +void +egg_test_wait_stop (void) +{ + g_assert (wait_stop_impl != NULL); + (wait_stop_impl) (); +} + +gboolean +egg_test_wait_until (int timeout) +{ + g_assert (wait_until_impl != NULL); + return (wait_until_impl) (timeout); +} + +static void +thread_wait_stop (void) +{ + GTimeVal tv; + + g_get_current_time (&tv); + g_time_val_add (&tv, 1000); + + g_assert (wait_mutex); + g_assert (wait_condition); + g_mutex_lock (wait_mutex); + if (!wait_waiting) + g_cond_timed_wait (wait_start, wait_mutex, &tv); + g_assert (wait_waiting); + g_cond_broadcast (wait_condition); + g_mutex_unlock (wait_mutex); +} + +static gboolean +thread_wait_until (int timeout) +{ + GTimeVal tv; + gboolean ret; + + g_get_current_time (&tv); + g_time_val_add (&tv, timeout * 1000); + + g_assert (wait_mutex); + g_assert (wait_condition); + g_mutex_lock (wait_mutex); + g_assert (!wait_waiting); + wait_waiting = TRUE; + g_cond_broadcast (wait_start); + ret = g_cond_timed_wait (wait_condition, wait_mutex, &tv); + g_assert (wait_waiting); + wait_waiting = FALSE; + g_mutex_unlock (wait_mutex); + + return ret; +} + +static GMainLoop *wait_loop = NULL; + +static void +loop_wait_stop (void) +{ + g_assert (wait_loop != NULL); + g_main_loop_quit (wait_loop); +} + +static gboolean +on_loop_wait_timeout (gpointer data) +{ + gboolean *timed_out = data; + *timed_out = TRUE; + + g_assert (wait_loop != NULL); + g_main_loop_quit (wait_loop); + + return TRUE; /* we remove this source later */ +} + +static gboolean +loop_wait_until (int timeout) +{ + gboolean ret = FALSE; + gboolean timed_out = FALSE; + guint source; + + g_assert (wait_loop == NULL); + wait_loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); + + source = g_timeout_add (timeout, on_loop_wait_timeout, &timed_out); + + g_main_loop_run (wait_loop); + + if (timed_out) { + g_source_remove (source); + ret = FALSE; + } else { + ret = TRUE; + } + + g_main_loop_unref (wait_loop); + wait_loop = NULL; + return ret; + + g_assert (wait_loop != NULL); + g_main_loop_quit (wait_loop); +} + +static gpointer +testing_thread (gpointer loop) +{ + gint ret; + + wait_stop_impl = thread_wait_stop; + wait_until_impl = thread_wait_until; + + ret = g_test_run (); + + wait_stop_impl = NULL; + wait_until_impl = NULL; + + /* Quit the main loop now that tests are done */ + g_main_loop_quit (loop); + return GINT_TO_POINTER (ret); +} + +gint +egg_tests_run_with_loop (void) +{ + GThread *thread; + GMainLoop *loop; + gpointer ret; + + loop = g_main_loop_new (NULL, FALSE); + wait_condition = g_cond_new (); + wait_start = g_cond_new (); + wait_mutex = g_mutex_new (); + + thread = g_thread_create (testing_thread, loop, TRUE, NULL); + g_assert (thread); + + g_main_loop_run (loop); + ret = g_thread_join (thread); + g_main_loop_unref (loop); + + g_cond_free (wait_condition); + g_cond_free (wait_start); + g_mutex_free (wait_mutex); + + return GPOINTER_TO_INT (ret); +} +#endif + + +static void (*wait_stop_impl) (void); +static gboolean (*wait_until_impl) (int timeout); + +void +egg_test_wait_stop (void) +{ + g_assert (wait_stop_impl != NULL); + (wait_stop_impl) (); +} + +gboolean +egg_test_wait_until (int timeout) +{ + g_assert (wait_until_impl != NULL); + return (wait_until_impl) (timeout); +} + +static GMainLoop *wait_loop = NULL; + +static void +loop_wait_stop (void) +{ + g_assert (wait_loop != NULL); + g_main_loop_quit (wait_loop); +} + +static gboolean +on_loop_wait_timeout (gpointer data) +{ + gboolean *timed_out = data; + *timed_out = TRUE; + + g_assert (wait_loop != NULL); + g_main_loop_quit (wait_loop); + + return TRUE; /* we remove this source later */ +} + +static gboolean +loop_wait_until (int timeout) +{ + gboolean timed_out = FALSE; + guint source; + + g_assert (wait_loop == NULL); + wait_loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); + + source = g_timeout_add (timeout, on_loop_wait_timeout, &timed_out); + + g_main_loop_run (wait_loop); + + g_source_remove (source); + g_main_loop_unref (wait_loop); + wait_loop = NULL; + return !timed_out; +} + +gint +egg_tests_run_with_loop (void) +{ + gint ret; + + wait_stop_impl = loop_wait_stop; + wait_until_impl = loop_wait_until; + + ret = g_test_run (); + + wait_stop_impl = NULL; + wait_until_impl = NULL; + + while (g_main_context_iteration (NULL, FALSE)); + + return ret; +} diff --git a/egg/egg-testing.h b/egg/egg-testing.h new file mode 100644 index 0000000..73939b3 --- /dev/null +++ b/egg/egg-testing.h @@ -0,0 +1,64 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef EGG_TESTING_H_ +#define EGG_TESTING_H_ + +#include +#include + +#define egg_assert_cmpsize(a, o, b) \ + g_assert_cmpuint ((guint)(a), o, (guint)(b)) + +#define egg_assert_cmpmem(a, na, cmp, b, nb) \ + do { gconstpointer __p1 = (a), __p2 = (b); gsize __n1 = (na), __n2 = (nb); \ + if (__n1 cmp __n2 && memcmp (__p1, __p2, __n1) cmp 0) ; else \ + egg_assertion_message_cmpmem (G_LOG_DOMAIN, __FILE__, __LINE__, \ + G_STRFUNC, #a "[" #na"] " #cmp " " #b "[" #nb "]", \ + __p1, __n1, #cmp, __p2, __n2); } while (0) + +#define egg_assert_cmpbytes(a, cmp, b, nb) \ + do { gpointer __p1 = (gpointer)(a); gconstpointer __p2 = (b); gsize __n2 = (nb); \ + if (g_bytes_get_size (__p1) cmp __n2 && memcmp (g_bytes_get_data (__p1, NULL), __p2, __n2) cmp 0) ; else \ + egg_assertion_message_cmpmem (G_LOG_DOMAIN, __FILE__, __LINE__, \ + G_STRFUNC, #a " " #cmp " " #b, \ + g_bytes_get_data (__p1, NULL), g_bytes_get_size(__p1), #cmp, __p2, __n2); } while (0) + +void egg_assertion_message_cmpmem (const char *domain, const char *file, + int line, const char *func, + const char *expr, gconstpointer arg1, + gsize n_arg1, const char *cmp, + gconstpointer arg2, gsize n_arg2); + +gboolean egg_testing_on_valgrind (void); + +gchar * egg_test_escape_data (const guchar *data, + gsize size); + +void egg_test_wait_stop (void); + +#define egg_test_wait() g_assert (egg_test_wait_until (20000) != FALSE) + +gboolean egg_test_wait_until (int timeout); + +gint egg_tests_run_with_loop (void); + +#endif /* EGG_DH_H_ */ diff --git a/egg/egg-timegm.c b/egg/egg-timegm.c new file mode 100644 index 0000000..24faa4c --- /dev/null +++ b/egg/egg-timegm.c @@ -0,0 +1,55 @@ +/* Copyright (C) 1999, 2001-2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + see . */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "egg-timegm.h" + +#ifndef HAVE_TIMEGM + +time_t +timegm(struct tm *t) +{ + time_t tl, tb; + struct tm *tg; + + tl = mktime (t); + if (tl == -1) + { + t->tm_hour--; + tl = mktime (t); + if (tl == -1) + return -1; + tl += 3600; + } + tg = gmtime (&tl); + tg->tm_isdst = 0; + tb = mktime (tg); + if (tb == -1) + { + tg->tm_hour--; + tb = mktime (tg); + if (tb == -1) + return -1; + tb += 3600; + } + return (tl - (tb - tl)); +} + +#endif diff --git a/egg/egg-timegm.h b/egg/egg-timegm.h new file mode 100644 index 0000000..02bec8f --- /dev/null +++ b/egg/egg-timegm.h @@ -0,0 +1,30 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 1999, 2001-2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + see . */ + +#ifndef EGG_TIMEGM_H_ +#define EGG_TIMEGM_H_ + +#include + +#ifndef HAVE_TIMEGM + +time_t timegm (struct tm *t); + +#endif + +#endif /* EGG_TIMEGM_H_ */ diff --git a/egg/fixtures/dh-params.pem b/egg/fixtures/dh-params.pem new file mode 100644 index 0000000..cc0afd8 --- /dev/null +++ b/egg/fixtures/dh-params.pem @@ -0,0 +1,5 @@ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAOmZHLx3BXvrPoFlAl6DOHIr2wApepEOpEESnqhO0JGvnaVWgaGS5+fC +g/9vqexageA6jAmZ9msZ34C+hn0KebHbPkKufsH8oFeInz7WZuhsPCSKpHyOaZmX +GDx6gJMkLA10HOXU4bqZy1rOiVxTuS2bn+aw2CA7WoKGVnuOnCozAgEC +-----END DH PARAMETERS----- diff --git a/egg/fixtures/echo-script.sh b/egg/fixtures/echo-script.sh new file mode 100644 index 0000000..aa0f7a9 --- /dev/null +++ b/egg/fixtures/echo-script.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +count=0 +output="" +while read line; do + output="$output $line" + count=`expr $count + 1` + echo "$count" >&2 +done +echo $output +sleep 1 +exit 3 diff --git a/egg/fixtures/pem-rsa-enc.key b/egg/fixtures/pem-rsa-enc.key new file mode 100644 index 0000000..65439fe --- /dev/null +++ b/egg/fixtures/pem-rsa-enc.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,24522D4CE5F5CD7B + +2H/8j0HYUya7LWEUxpgjp/LVcCX7yZB7SoREdoJdcqJEBUMWVxU/2OfVB8EZupmy +7YHcnn5v1JwwtmAXAtqM9JGlvNWaRr1m4zDrhJn1fY3tu8YGtMR49IOZmOUBK+X+ +IxWAwaFDqLntuGZZnAmRJtgFVYVABEs5yM9zgoCGDaU4WMK3caD7Jnw8jH5m0nqQ +XiQ1y1dHxFJmAgG0b5h2z7zjQTmmXd3IhXqSqsE/9ryruCCYa0Z7aAN5oAmO89I9 +gOyy3J4h76mTNFfF5btV4Jllwd4LkgGOmm69UxAyUTGzwYJ5gxgB3xFzGBwpVlcu +72PrQCrjZqZ6rj6cTPGUYzcyMtEw3Xd6mFhApqJpVRZwNWUAMMJwHl2oWwKcIxfV +y+OftRX6kc+cunrxCkl9aKuHDoJPEq+/Uh+AEXqir+942Vull0WPyuWUjaPKR1xJ +poYsNfHRWq+klKCggQQL6jwuVbDLhbaXfgaNBQO1XMracgfmnO1PQPw8JSQ5iOkm +Ybt2oHAEnrEWxZGn1PfRq6Z8HAbBlQpfmG7SMJZdQjlndKA6GR+tN5krKfpj6uak +0eklm0Nb0YcDzJ3qqHXxIimK3Kh/WRZ1hVTnX4mS9u3HNQMo5Ov6z8OQN+Q45ffi +ZDFkVwUTEJ+iwmCG7XnxX0v8Bv5LZmAnPu95KQTp4Ds0AZ6Sp+RqxvhnCO25cgWj ++N5jHGzsDk9/Jw7rAHz8pnl3sziNBWdAk5ASPA28HCQQo5peWnWajM3Pk98+/wHY +blTh7gw77gTake6hpiegnhNUXwGm6BXEqmyu7mPW0z5XFRb9W7bpog== +-----END RSA PRIVATE KEY----- diff --git a/egg/fixtures/test-certificate-1.der b/egg/fixtures/test-certificate-1.der new file mode 100644 index 0000000..1c08437 Binary files /dev/null and b/egg/fixtures/test-certificate-1.der differ diff --git a/egg/fixtures/test-personalname-1.der b/egg/fixtures/test-personalname-1.der new file mode 100644 index 0000000..13ba718 --- /dev/null +++ b/egg/fixtures/test-personalname-1.der @@ -0,0 +1 @@ +1�Turanga�Leela�II \ No newline at end of file diff --git a/egg/fixtures/test-personalname-invalid.der b/egg/fixtures/test-personalname-invalid.der new file mode 100644 index 0000000..60d5d8c --- /dev/null +++ b/egg/fixtures/test-personalname-invalid.der @@ -0,0 +1 @@ +1�Turanga�Leela�Alien \ No newline at end of file diff --git a/egg/fixtures/test-pkcs12-1.der b/egg/fixtures/test-pkcs12-1.der new file mode 100644 index 0000000..285d8dd Binary files /dev/null and b/egg/fixtures/test-pkcs12-1.der differ diff --git a/egg/fixtures/test-pkcs12-2.der b/egg/fixtures/test-pkcs12-2.der new file mode 100644 index 0000000..eff8c1e Binary files /dev/null and b/egg/fixtures/test-pkcs12-2.der differ diff --git a/egg/fixtures/test-pkcs7-1.der b/egg/fixtures/test-pkcs7-1.der new file mode 100755 index 0000000..d45b9e0 Binary files /dev/null and b/egg/fixtures/test-pkcs7-1.der differ diff --git a/egg/fixtures/test-pkcs7-2.der b/egg/fixtures/test-pkcs7-2.der new file mode 100755 index 0000000..d45b9e0 Binary files /dev/null and b/egg/fixtures/test-pkcs7-2.der differ diff --git a/egg/fixtures/test-pkcs8-1.der b/egg/fixtures/test-pkcs8-1.der new file mode 100644 index 0000000..8b61684 Binary files /dev/null and b/egg/fixtures/test-pkcs8-1.der differ diff --git a/egg/fixtures/test-rsakey-1.der b/egg/fixtures/test-rsakey-1.der new file mode 100644 index 0000000..878fda5 Binary files /dev/null and b/egg/fixtures/test-rsakey-1.der differ diff --git a/egg/mock-interaction.c b/egg/mock-interaction.c new file mode 100644 index 0000000..c431454 --- /dev/null +++ b/egg/mock-interaction.c @@ -0,0 +1,96 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* mock-interaction.c + + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "mock-interaction.h" + +#define MOCK_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOCK_TYPE_INTERACTION, MockInteraction)) +#define MOCK_IS_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOCK_TYPE_INTERACTION)) +#define MOCK_INTERACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOCK_TYPE_INTERACTION, MockInteractionClass)) + +typedef struct _MockInteractionClass MockInteractionClass; + +struct _MockInteraction { + GTlsInteraction interaction; + gchar *password; +}; + +struct _MockInteractionClass { + GTlsInteractionClass parent; +}; + +G_DEFINE_TYPE (MockInteraction, mock_interaction, G_TYPE_TLS_INTERACTION); + +static void +mock_interaction_init (MockInteraction *self) +{ + +} + +static void +mock_interaction_finalize (GObject *obj) +{ + MockInteraction *self = MOCK_INTERACTION (obj); + + g_free (self->password); + + G_OBJECT_CLASS (mock_interaction_parent_class)->dispose (obj); +} + +static GTlsInteractionResult +mock_interaction_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + MockInteraction *self = MOCK_INTERACTION (interaction); + + if (self->password) { + g_tls_password_set_value (password, (const guchar *)self->password, -1); + return G_TLS_INTERACTION_HANDLED; + } else { + return G_TLS_INTERACTION_UNHANDLED; + } +} + +static void +mock_interaction_class_init (MockInteractionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass); + + object_class->finalize = mock_interaction_finalize; + + interaction_class->ask_password = mock_interaction_ask_password; +} + +GTlsInteraction * +mock_interaction_new (const gchar *password) +{ + MockInteraction *result; + + result = g_object_new (MOCK_TYPE_INTERACTION, NULL); + result->password = g_strdup (password); + + return G_TLS_INTERACTION (result); +} diff --git a/egg/mock-interaction.h b/egg/mock-interaction.h new file mode 100644 index 0000000..5053cd2 --- /dev/null +++ b/egg/mock-interaction.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* mock-interaction.h + + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef MOCK_INTERACTION_H +#define MOCK_INTERACTION_H + +#include + +G_BEGIN_DECLS + +#define MOCK_TYPE_INTERACTION (mock_interaction_get_type ()) +#define MOCK_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MOCK_TYPE_INTERACTION, MockInteraction)) +#define MOCK_IS_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MOCK_TYPE_INTERACTION)) + +typedef struct _MockInteraction MockInteraction; + +GType mock_interaction_get_type (void) G_GNUC_CONST; + +GTlsInteraction * mock_interaction_new (const gchar *password); + +G_END_DECLS + +#endif /* MOCK_INTERACTION_H */ diff --git a/egg/pk.asn b/egg/pk.asn new file mode 100644 index 0000000..de0a74a --- /dev/null +++ b/egg/pk.asn @@ -0,0 +1,128 @@ +PK { } + +DEFINITIONS EXPLICIT TAGS ::= + +BEGIN + +-- This file contains parts of PKCS-1 structures and some stuff +-- required for DSA keys. + +RSAPublicKey ::= SEQUENCE { + modulus INTEGER, -- n + publicExponent INTEGER -- e +} + +-- +-- Representation of RSA private key with information for the +-- CRT algorithm. +-- +RSAPrivateKey ::= SEQUENCE { + version Version, + modulus INTEGER, -- (Usually large) n + publicExponent INTEGER, -- (Usually small) e + privateExponent INTEGER, -- (Usually large) d + prime1 INTEGER, -- (Usually large) p + prime2 INTEGER, -- (Usually large) q + exponent1 INTEGER, -- (Usually large) d mod (p-1) + exponent2 INTEGER, -- (Usually large) d mod (q-1) + coefficient INTEGER, -- (Usually large) (inverse of q) mod p + otherPrimeInfos OtherPrimeInfos OPTIONAL +} + +Version ::= INTEGER { two-prime(0), multi(1) } +-- version must be multi if otherPrimeInfos present -- + +RSAParameters ::= NULL + +OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo + +OtherPrimeInfo ::= SEQUENCE { + prime INTEGER, -- ri + exponent INTEGER, -- di + coefficient INTEGER -- ti +} + +-- for signature calculation +-- added by nmav + +AlgorithmIdentifier ::= SEQUENCE { + algorithm OBJECT IDENTIFIER, + parameters ANY DEFINED BY algorithm OPTIONAL +} + -- contains a value of the type + -- registered for use with the + -- algorithm object identifier value + +DigestInfo ::= SEQUENCE { + digestAlgorithm DigestAlgorithmIdentifier, + digest Digest +} + +DigestAlgorithmIdentifier ::= AlgorithmIdentifier + +Digest ::= OCTET STRING + +DSAPublicPart ::= INTEGER + +DSAPublicKey ::= SEQUENCE { + version INTEGER, -- should be zero + p INTEGER, + q INTEGER, + g INTEGER, + Y INTEGER -- public +} + +DSAParameters ::= SEQUENCE { + p INTEGER, + q INTEGER, + g INTEGER +} + +DSASignatureValue ::= SEQUENCE { + r INTEGER, + s INTEGER +} + +DSAPrivatePart ::= INTEGER + +DSAPrivateKey ::= SEQUENCE { + version INTEGER, -- should be zero + p INTEGER, + q INTEGER, + g INTEGER, + Y INTEGER, -- public + priv INTEGER +} + +-- from PKCS#3 +DHParameter ::= SEQUENCE { + prime INTEGER, -- p + base INTEGER, -- g + privateValueLength INTEGER OPTIONAL +} + +ECPoint ::= OCTET STRING + +-- The EC parameters structure was amended by RFC 5480 + +ECParameters ::= CHOICE { + namedCurve OBJECT IDENTIFIER + -- implicitCurve NULL + -- specifiedCurve SpecifiedECDomain +} + -- implicitCurve and specifiedCurve MUST NOT be used in PKIX. + -- Details for SpecifiedECDomain can be found in [X9.62]. + -- Any future additions to this CHOICE should be coordinated + -- with ANSI X9. + + +-- rfc5915 (EC private key structure) + +ECPrivateKey ::= SEQUENCE { + version INTEGER { ecPrivkeyVer1(1) }, + privateKey OCTET STRING, + parameters [0] ECParameters OPTIONAL, + publicKey [1] BIT STRING OPTIONAL +} + +END diff --git a/egg/pk.asn.h b/egg/pk.asn.h new file mode 100644 index 0000000..e0f8125 --- /dev/null +++ b/egg/pk.asn.h @@ -0,0 +1,82 @@ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +/* #include */ + +const asn1_static_node pk_asn1_tab[] = { + { "PK", 536872976, NULL }, + { NULL, 1073741836, NULL }, + { "RSAPublicKey", 1610612741, NULL }, + { "modulus", 1073741827, NULL }, + { "publicExponent", 3, NULL }, + { "RSAPrivateKey", 1610612741, NULL }, + { "version", 1073741826, "Version"}, + { "modulus", 1073741827, NULL }, + { "publicExponent", 1073741827, NULL }, + { "privateExponent", 1073741827, NULL }, + { "prime1", 1073741827, NULL }, + { "prime2", 1073741827, NULL }, + { "exponent1", 1073741827, NULL }, + { "exponent2", 1073741827, NULL }, + { "coefficient", 1073741827, NULL }, + { "otherPrimeInfos", 16386, "OtherPrimeInfos"}, + { "Version", 1610874883, NULL }, + { "two-prime", 1073741825, "0"}, + { "multi", 1, "1"}, + { "RSAParameters", 1073741844, NULL }, + { "OtherPrimeInfos", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "OtherPrimeInfo"}, + { "OtherPrimeInfo", 1610612741, NULL }, + { "prime", 1073741827, NULL }, + { "exponent", 1073741827, NULL }, + { "coefficient", 3, NULL }, + { "AlgorithmIdentifier", 1610612741, NULL }, + { "algorithm", 1073741836, NULL }, + { "parameters", 541081613, NULL }, + { "algorithm", 1, NULL }, + { "DigestInfo", 1610612741, NULL }, + { "digestAlgorithm", 1073741826, "DigestAlgorithmIdentifier"}, + { "digest", 2, "Digest"}, + { "DigestAlgorithmIdentifier", 1073741826, "AlgorithmIdentifier"}, + { "Digest", 1073741831, NULL }, + { "DSAPublicPart", 1073741827, NULL }, + { "DSAPublicKey", 1610612741, NULL }, + { "version", 1073741827, NULL }, + { "p", 1073741827, NULL }, + { "q", 1073741827, NULL }, + { "g", 1073741827, NULL }, + { "Y", 3, NULL }, + { "DSAParameters", 1610612741, NULL }, + { "p", 1073741827, NULL }, + { "q", 1073741827, NULL }, + { "g", 3, NULL }, + { "DSASignatureValue", 1610612741, NULL }, + { "r", 1073741827, NULL }, + { "s", 3, NULL }, + { "DSAPrivatePart", 1073741827, NULL }, + { "DSAPrivateKey", 1610612741, NULL }, + { "version", 1073741827, NULL }, + { "p", 1073741827, NULL }, + { "q", 1073741827, NULL }, + { "g", 1073741827, NULL }, + { "Y", 1073741827, NULL }, + { "priv", 3, NULL }, + { "DHParameter", 1610612741, NULL }, + { "prime", 1073741827, NULL }, + { "base", 1073741827, NULL }, + { "privateValueLength", 16387, NULL }, + { "ECPoint", 1073741831, NULL }, + { "ECParameters", 1610612754, NULL }, + { "namedCurve", 12, NULL }, + { "ECPrivateKey", 536870917, NULL }, + { "version", 1610874883, NULL }, + { "ecPrivkeyVer1", 1, "1"}, + { "privateKey", 1073741831, NULL }, + { "parameters", 1610637314, "ECParameters"}, + { NULL, 2056, "0"}, + { "publicKey", 536895494, NULL }, + { NULL, 2056, "1"}, + { NULL, 0, NULL } +}; diff --git a/egg/pkix.asn b/egg/pkix.asn new file mode 100644 index 0000000..00ec3b3 --- /dev/null +++ b/egg/pkix.asn @@ -0,0 +1,1365 @@ + +PKIX1 { } + +DEFINITIONS IMPLICIT TAGS ::= + +BEGIN + +-- This contains both PKIX1Implicit88 and RFC2630 ASN.1 modules. +-- It also includes updates from RFC 5480 and RFC 5758 + +-- ISO arc for standard certificate and CRL extensions + +id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} + + +-- authority key identifier OID and syntax + +id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } + +AuthorityKeyIdentifier ::= SEQUENCE { + keyIdentifier [0] KeyIdentifier OPTIONAL, + authorityCertIssuer [1] GeneralNames OPTIONAL, + authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL } + -- authorityCertIssuer and authorityCertSerialNumber shall both + -- be present or both be absgent + +KeyIdentifier ::= OCTET STRING + +-- subject key identifier OID and syntax + +id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } + +SubjectKeyIdentifier ::= KeyIdentifier + +-- key usage extension OID and syntax + +id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } + +KeyUsage ::= BIT STRING { + digitalSignature (0), + nonRepudiation (1), + keyEncipherment (2), + dataEncipherment (3), + keyAgreement (4), + keyCertSign (5), + cRLSign (6), + encipherOnly (7), + decipherOnly (8) } + +-- private key usage period extension OID and syntax + +id-ce-privateKeyUsagePeriod OBJECT IDENTIFIER ::= { id-ce 16 } + +PrivateKeyUsagePeriod ::= SEQUENCE { + notBefore [0] GeneralizedTime OPTIONAL, + notAfter [1] GeneralizedTime OPTIONAL } + -- either notBefore or notAfter shall be present + +-- certificate policies extension OID and syntax + +id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } + +CertificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation + +PolicyInformation ::= SEQUENCE { + policyIdentifier CertPolicyId, + policyQualifiers SEQUENCE SIZE (1..MAX) OF + PolicyQualifierInfo OPTIONAL } + +CertPolicyId ::= OBJECT IDENTIFIER + +PolicyQualifierInfo ::= SEQUENCE { + policyQualifierId PolicyQualifierId, + qualifier ANY DEFINED BY policyQualifierId } + +-- Implementations that recognize additional policy qualifiers shall +-- augment the following definition for PolicyQualifierId + +PolicyQualifierId ::= + OBJECT IDENTIFIER -- ( id-qt-cps | id-qt-unotice ) + +-- CPS pointer qualifier + +CPSuri ::= IA5String + +-- user notice qualifier + +UserNotice ::= SEQUENCE { + noticeRef NoticeReference OPTIONAL, + explicitText DisplayText OPTIONAL} + +NoticeReference ::= SEQUENCE { + organization DisplayText, + noticeNumbers SEQUENCE OF INTEGER } + +DisplayText ::= CHOICE { + visibleString VisibleString (SIZE (1..200)), + bmpString BMPString (SIZE (1..200)), + utf8String UTF8String (SIZE (1..200)) } + +-- policy mapping extension OID and syntax + +id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } + +PolicyMappings ::= SEQUENCE SIZE (1..MAX) OF SEQUENCE { + issuerDomainPolicy CertPolicyId, + subjectDomainPolicy CertPolicyId } + +-- subject alternative name extension OID and syntax + +-- Directory string type -- + +DirectoryString ::= CHOICE { + teletexString TeletexString (SIZE (1..MAX)), + printableString PrintableString (SIZE (1..MAX)), + universalString UniversalString (SIZE (1..MAX)), + utf8String UTF8String (SIZE (1..MAX)), + bmpString BMPString (SIZE(1..MAX)), + -- IA5String is added here to handle old UID encoded as ia5String -- + -- See tests/userid/ for more information. It shouldn't be here, -- + -- so if it causes problems, considering dropping it. -- + ia5String IA5String (SIZE(1..MAX)) } + +id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } + +SubjectAltName ::= GeneralNames + +GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName + +GeneralName ::= CHOICE { + otherName [0] AnotherName, + rfc822Name [1] IA5String, + dNSName [2] IA5String, + x400Address [3] ORAddress, +-- Changed to work with the libtasn1 parser. + directoryName [4] EXPLICIT RDNSequence, --Name, + ediPartyName [5] EDIPartyName, + uniformResourceIdentifier [6] IA5String, + iPAddress [7] OCTET STRING, + registeredID [8] OBJECT IDENTIFIER } + +-- AnotherName replaces OTHER-NAME ::= TYPE-IDENTIFIER, as +-- TYPE-IDENTIFIER is not supported in the '88 ASN.1 syntax + +AnotherName ::= SEQUENCE { + type-id OBJECT IDENTIFIER, + value [0] EXPLICIT ANY DEFINED BY type-id } + +EDIPartyName ::= SEQUENCE { + nameAssigner [0] DirectoryString OPTIONAL, + partyName [1] DirectoryString } + +-- issuer alternative name extension OID and syntax + +id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } + +IssuerAltName ::= GeneralNames + +id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } + +SubjectDirectoryAttributes ::= SEQUENCE SIZE (1..MAX) OF Attribute + +-- basic constraints extension OID and syntax + +id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } + +BasicConstraints ::= SEQUENCE { + cA BOOLEAN DEFAULT FALSE, + pathLenConstraint INTEGER (0..MAX) OPTIONAL } + +-- name constraints extension OID and syntax + +id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } + +NameConstraints ::= SEQUENCE { + permittedSubtrees [0] GeneralSubtrees OPTIONAL, + excludedSubtrees [1] GeneralSubtrees OPTIONAL } + +GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree + +GeneralSubtree ::= SEQUENCE { + base GeneralName, + minimum [0] BaseDistance DEFAULT 0, + maximum [1] BaseDistance OPTIONAL } + +BaseDistance ::= INTEGER (0..MAX) + +-- policy constraints extension OID and syntax + +id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } + +PolicyConstraints ::= SEQUENCE { + requireExplicitPolicy [0] SkipCerts OPTIONAL, + inhibitPolicyMapping [1] SkipCerts OPTIONAL } + +SkipCerts ::= INTEGER (0..MAX) + +-- CRL distribution points extension OID and syntax + +id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= {id-ce 31} + +CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint + +DistributionPoint ::= SEQUENCE { + distributionPoint [0] EXPLICIT DistributionPointName OPTIONAL, + reasons [1] ReasonFlags OPTIONAL, + cRLIssuer [2] GeneralNames OPTIONAL +} + +DistributionPointName ::= CHOICE { + fullName [0] GeneralNames, + nameRelativeToCRLIssuer [1] RelativeDistinguishedName +} + +ReasonFlags ::= BIT STRING { + unused (0), + keyCompromise (1), + cACompromise (2), + affiliationChanged (3), + superseded (4), + cessationOfOperation (5), + certificateHold (6), + privilegeWithdrawn (7), + aACompromise (8) } + +-- extended key usage extension OID and syntax + +id-ce-extKeyUsage OBJECT IDENTIFIER ::= {id-ce 37} + +ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId + +KeyPurposeId ::= OBJECT IDENTIFIER + +-- extended key purpose OIDs +id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } +id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } +id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } +id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } +id-kp-ipsecEndSystem OBJECT IDENTIFIER ::= { id-kp 5 } +id-kp-ipsecTunnel OBJECT IDENTIFIER ::= { id-kp 6 } +id-kp-ipsecUser OBJECT IDENTIFIER ::= { id-kp 7 } +id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } + +-- authority info access + +id-pe-authorityInfoAccess OBJECT IDENTIFIER ::= { id-pe 1 } + +AuthorityInfoAccessSyntax ::= + SEQUENCE SIZE (1..MAX) OF AccessDescription + +AccessDescription ::= SEQUENCE { + accessMethod OBJECT IDENTIFIER, + accessLocation GeneralName } + +-- CRL number extension OID and syntax + +id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } + +CRLNumber ::= INTEGER (0..MAX) + +-- issuing distribution point extension OID and syntax + +id-ce-issuingDistributionPoint OBJECT IDENTIFIER ::= { id-ce 28 } + +IssuingDistributionPoint ::= SEQUENCE { + distributionPoint [0] DistributionPointName OPTIONAL, + onlyContainsUserCerts [1] BOOLEAN DEFAULT FALSE, + onlyContainsCACerts [2] BOOLEAN DEFAULT FALSE, + onlySomeReasons [3] ReasonFlags OPTIONAL, + indirectCRL [4] BOOLEAN DEFAULT FALSE } + + +id-ce-deltaCRLIndicator OBJECT IDENTIFIER ::= { id-ce 27 } + +-- deltaCRLIndicator ::= BaseCRLNumber + +BaseCRLNumber ::= CRLNumber + +-- CRL reasons extension OID and syntax + +id-ce-cRLReasons OBJECT IDENTIFIER ::= { id-ce 21 } + +CRLReason ::= ENUMERATED { + unspecified (0), + keyCompromise (1), + cACompromise (2), + affiliationChanged (3), + superseded (4), + cessationOfOperation (5), + certificateHold (6), + removeFromCRL (8) } + +-- certificate issuer CRL entry extension OID and syntax + +id-ce-certificateIssuer OBJECT IDENTIFIER ::= { id-ce 29 } + +CertificateIssuer ::= GeneralNames + +-- hold instruction extension OID and syntax + +id-ce-holdInstructionCode OBJECT IDENTIFIER ::= { id-ce 23 } + +HoldInstructionCode ::= OBJECT IDENTIFIER + +-- ANSI x9 holdinstructions + +-- ANSI x9 arc holdinstruction arc +holdInstruction OBJECT IDENTIFIER ::= + {joint-iso-itu-t(2) member-body(2) us(840) x9cm(10040) 2} + +-- ANSI X9 holdinstructions referenced by this standard +id-holdinstruction-none OBJECT IDENTIFIER ::= + {holdInstruction 1} -- deprecated +id-holdinstruction-callissuer OBJECT IDENTIFIER ::= + {holdInstruction 2} +id-holdinstruction-reject OBJECT IDENTIFIER ::= + {holdInstruction 3} + +-- invalidity date CRL entry extension OID and syntax + +id-ce-invalidityDate OBJECT IDENTIFIER ::= { id-ce 24 } + +InvalidityDate ::= GeneralizedTime + + +-- -------------------------------------- +-- EXPLICIT +-- -------------------------------------- + +-- UNIVERSAL Types defined in '93 and '98 ASN.1 +-- but required by this specification + +VisibleString ::= [UNIVERSAL 26] IMPLICIT OCTET STRING + +NumericString ::= [UNIVERSAL 18] IMPLICIT OCTET STRING + +IA5String ::= [UNIVERSAL 22] IMPLICIT OCTET STRING + +TeletexString ::= [UNIVERSAL 20] IMPLICIT OCTET STRING + +PrintableString ::= [UNIVERSAL 19] IMPLICIT OCTET STRING + +UniversalString ::= [UNIVERSAL 28] IMPLICIT OCTET STRING + -- UniversalString is defined in ASN.1:1993 + +BMPString ::= [UNIVERSAL 30] IMPLICIT OCTET STRING + -- BMPString is the subtype of UniversalString and models + -- the Basic Multilingual Plane of ISO/IEC/ITU 10646-1 + +UTF8String ::= [UNIVERSAL 12] IMPLICIT OCTET STRING + -- The content of this type conforms to RFC 2279. + + +-- PKIX specific OIDs + +id-pkix OBJECT IDENTIFIER ::= + { iso(1) identified-organization(3) dod(6) internet(1) + security(5) mechanisms(5) pkix(7) } + +-- PKIX arcs + +id-pe OBJECT IDENTIFIER ::= { id-pkix 1 } + -- arc for private certificate extensions +id-qt OBJECT IDENTIFIER ::= { id-pkix 2 } + -- arc for policy qualifier types +id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } + -- arc for extended key purpose OIDS +id-ad OBJECT IDENTIFIER ::= { id-pkix 48 } + -- arc for access descriptors + +-- policyQualifierIds for Internet policy qualifiers + +id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 } + -- OID for CPS qualifier +id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 } + -- OID for user notice qualifier + +-- access descriptor definitions + +id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 } +id-ad-caIssuers OBJECT IDENTIFIER ::= { id-ad 2 } + +-- attribute data types -- + +Attribute ::= SEQUENCE { + type AttributeType, + values SET OF AttributeValue + -- at least one value is required -- +} + +AttributeType ::= OBJECT IDENTIFIER + +AttributeValue ::= ANY DEFINED BY type + +AttributeTypeAndValue ::= SEQUENCE { + type AttributeType, + value AttributeValue } + +-- suggested naming attributes: Definition of the following +-- information object set may be augmented to meet local +-- requirements. Note that deleting members of the set may +-- prevent interoperability with conforming implementations. +-- presented in pairs: the AttributeType followed by the +-- type definition for the corresponding AttributeValue + +-- Arc for standard naming attributes +id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} + +-- Attributes of type NameDirectoryString +id-at-initials AttributeType ::= { id-at 43 } +X520initials ::= DirectoryString + +id-at-generationQualifier AttributeType ::= { id-at 44 } +X520generationQualifier ::= DirectoryString + +id-at-surname AttributeType ::= { id-at 4 } +X520surName ::= DirectoryString + +id-at-givenName AttributeType ::= { id-at 42 } +X520givenName ::= DirectoryString + +id-at-name AttributeType ::= { id-at 41 } +X520name ::= DirectoryString + +id-at-commonName AttributeType ::= {id-at 3} +X520CommonName ::= DirectoryString + +id-at-localityName AttributeType ::= {id-at 7} +X520LocalityName ::= DirectoryString + +id-at-stateOrProvinceName AttributeType ::= {id-at 8} +X520StateOrProvinceName ::= DirectoryString + +id-at-organizationName AttributeType ::= {id-at 10} +X520OrganizationName ::= DirectoryString + +id-at-organizationalUnitName AttributeType ::= {id-at 11} +X520OrganizationalUnitName ::= DirectoryString + +id-at-title AttributeType ::= {id-at 12} +X520Title ::= DirectoryString + +id-at-description AttributeType ::= {id-at 13} +X520Description ::= DirectoryString + +id-at-dnQualifier AttributeType ::= {id-at 46} +X520dnQualifier ::= PrintableString + +id-at-countryName AttributeType ::= {id-at 6} +X520countryName ::= PrintableString (SIZE (2)) -- IS 3166 codes + +id-at-serialNumber AttributeType ::= {id-at 5} +X520serialNumber ::= PrintableString + +id-at-telephoneNumber AttributeType ::= {id-at 20} +X520telephoneNumber ::= PrintableString + +id-at-facsimileTelephoneNumber AttributeType ::= {id-at 23} +X520facsimileTelephoneNumber ::= PrintableString + +id-at-pseudonym AttributeType ::= {id-at 65} +X520pseudonym ::= DirectoryString + +id-at-name AttributeType ::= {id-at 41} +X520name ::= DirectoryString + +id-at-streetAddress AttributeType ::= {id-at 9} +X520streetAddress ::= DirectoryString + +id-at-postalAddress AttributeType ::= {id-at 16} +X520postalAddress ::= PostalAddress + +PostalAddress ::= SEQUENCE OF DirectoryString + + + -- Legacy attributes + +pkcs OBJECT IDENTIFIER ::= + { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) } + +pkcs-9 OBJECT IDENTIFIER ::= + { pkcs 9 } + + +emailAddress AttributeType ::= { pkcs-9 1 } + +Pkcs9email ::= IA5String (SIZE (1..ub-emailaddress-length)) + +-- naming data types -- + +Name ::= CHOICE { -- only one possibility for now -- + rdnSequence RDNSequence } + +RDNSequence ::= SEQUENCE OF RelativeDistinguishedName + +DistinguishedName ::= RDNSequence + +RelativeDistinguishedName ::= + SET SIZE (1 .. MAX) OF AttributeTypeAndValue + + + +-- -------------------------------------------------------- +-- certificate and CRL specific structures begin here +-- -------------------------------------------------------- + +Certificate ::= SEQUENCE { + tbsCertificate TBSCertificate, + signatureAlgorithm AlgorithmIdentifier, + signature BIT STRING } + +TBSCertificate ::= SEQUENCE { + version [0] EXPLICIT Version DEFAULT v1, + serialNumber CertificateSerialNumber, + signature AlgorithmIdentifier, + issuer Name, + validity Validity, + subject Name, + subjectPublicKeyInfo SubjectPublicKeyInfo, + issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, + -- If present, version shall be v2 or v3 + subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, + -- If present, version shall be v2 or v3 + extensions [3] EXPLICIT Extensions OPTIONAL + -- If present, version shall be v3 -- +} + +Version ::= INTEGER { v1(0), v2(1), v3(2) } + +CertificateSerialNumber ::= INTEGER + +Validity ::= SEQUENCE { + notBefore Time, + notAfter Time } + +Time ::= CHOICE { + utcTime UTCTime, + generalTime GeneralizedTime } + +UniqueIdentifier ::= BIT STRING + +SubjectPublicKeyInfo ::= SEQUENCE { + algorithm AlgorithmIdentifier, + subjectPublicKey BIT STRING } + +Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension + +Extension ::= SEQUENCE { + extnID OBJECT IDENTIFIER, + critical BOOLEAN DEFAULT FALSE, + extnValue OCTET STRING } + + +-- ------------------------------------------ +-- CRL structures +-- ------------------------------------------ + +CertificateList ::= SEQUENCE { + tbsCertList TBSCertList, + signatureAlgorithm AlgorithmIdentifier, + signature BIT STRING } + +TBSCertList ::= SEQUENCE { + version Version OPTIONAL, + -- if present, shall be v2 + signature AlgorithmIdentifier, + issuer Name, + thisUpdate Time, + nextUpdate Time OPTIONAL, + revokedCertificates SEQUENCE OF SEQUENCE { + userCertificate CertificateSerialNumber, + revocationDate Time, + crlEntryExtensions Extensions OPTIONAL + -- if present, shall be v2 + } OPTIONAL, + crlExtensions [0] EXPLICIT Extensions OPTIONAL + -- if present, shall be v2 -- +} + +-- Version, Time, CertificateSerialNumber, and Extensions were +-- defined earlier for use in the certificate structure + +AlgorithmIdentifier ::= SEQUENCE { + algorithm OBJECT IDENTIFIER, + parameters ANY DEFINED BY algorithm OPTIONAL } + -- contains a value of the type + -- registered for use with the + -- algorithm object identifier value + +-- Algorithm OIDs and parameter structures + +pkcs-1 OBJECT IDENTIFIER ::= { + pkcs 1 } + +rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } + +md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } + +md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } + +sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } + +id-dsa-with-sha1 OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } + +Dss-Sig-Value ::= SEQUENCE { + r INTEGER, + s INTEGER +} + +dhpublicnumber OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) ansi-x942(10046) number-type(2) 1 } + +DomainParameters ::= SEQUENCE { + p INTEGER, -- odd prime, p=jq +1 + g INTEGER, -- generator, g + q INTEGER, -- factor of p-1 + j INTEGER OPTIONAL, -- subgroup factor, j>= 2 + validationParms ValidationParms OPTIONAL } + +ValidationParms ::= SEQUENCE { + seed BIT STRING, + pgenCounter INTEGER } + +id-dsa OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } + +Dss-Parms ::= SEQUENCE { + p INTEGER, + q INTEGER, + g INTEGER } + +-- EC algorithm OIDs and parameter structures from RFC 3279 +ansi-X9-62 OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) 10045 } + +id-ecSigType OBJECT IDENTIFIER ::= { + ansi-X9-62 signatures(4) } + +ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { + id-ecSigType 1 } + +Ecdsa-Sig-Value ::= SEQUENCE { + r INTEGER, + s INTEGER } + +id-public-key-type OBJECT IDENTIFIER ::= { ansi-X9-62 2 } + +id-ecPublicKey OBJECT IDENTIFIER ::= { id-public-key-type 1 } + +ECPoint ::= OCTET STRING + +-- The EC parameters structure was amended by RFC 5480 + +ECParameters ::= CHOICE { + namedCurve OBJECT IDENTIFIER + -- implicitCurve NULL + -- specifiedCurve SpecifiedECDomain +} + -- implicitCurve and specifiedCurve MUST NOT be used in PKIX. + -- Details for SpecifiedECDomain can be found in [X9.62]. + -- Any future additions to this CHOICE should be coordinated + -- with ANSI X9. + +-- +-- Named Elliptic Curves (from RFC 5480) +-- + +-- Note that in X9.62 the curves are referred to as 'ansiX9' as +-- opposed to 'sec'. For example secp192r1 is the same curve as +-- ansix9p192r1. + +-- Note that in RFC 3279 the secp192r1 curve was referred to as +-- prime192v1 and the secp256r1 curve was referred to as prime256v1. + +-- Note that FIPS186-3 refers to secp192r1 as P-192, secp224r1 as +-- P-224, secp256r1 as P-256, secp384r1 as P-384, and secp521r1 as +-- P-521. + +secp192r1 OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) + prime(1) 1 } + +sect163k1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 1 } + +sect163r2 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 15 } + +secp224r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 33 } + +sect233k1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 26 } + +sect233r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 27 } + +secp256r1 OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) + prime(1) 7 } + +sect283k1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 16 } + +sect283r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 17 } + +secp384r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 34 } + +sect409k1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 36 } + +sect409r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 37 } + +secp521r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 35 } + +sect571k1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 38 } + +sect571r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) curve(0) 39 } + +-- Algorithm OIDs added by RFC 5758 + +id-dsa-with-sha224 OBJECT IDENTIFIER ::= { joint-iso-ccitt(2) + country(16) us(840) organization(1) gov(101) csor(3) + algorithms(4) id-dsa-with-sha2(3) 1 } + +id-dsa-with-sha256 OBJECT IDENTIFIER ::= { joint-iso-ccitt(2) + country(16) us(840) organization(1) gov(101) csor(3) + algorithms(4) id-dsa-with-sha2(3) 2 } + +ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } + +ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } + +ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } + +ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } + +-- x400 address syntax starts here +-- OR Names + +ORAddress ::= SEQUENCE { + built-in-standard-attributes BuiltInStandardAttributes, + built-in-domain-defined-attributes + BuiltInDomainDefinedAttributes OPTIONAL, + -- see also teletex-domain-defined-attributes + extension-attributes ExtensionAttributes OPTIONAL } +-- The OR-address is semantically absent from the OR-name if the +-- built-in-standard-attribute sequence is empty and the +-- built-in-domain-defined-attributes and extension-attributes are +-- both omitted. + +-- Built-in Standard Attributes + +BuiltInStandardAttributes ::= SEQUENCE { + country-name CountryName OPTIONAL, + administration-domain-name AdministrationDomainName OPTIONAL, + network-address [0] EXPLICIT NetworkAddress OPTIONAL, + -- see also extended-network-address + terminal-identifier [1] EXPLICIT TerminalIdentifier OPTIONAL, + private-domain-name [2] EXPLICIT PrivateDomainName OPTIONAL, + organization-name [3] EXPLICIT OrganizationName OPTIONAL, + -- see also teletex-organization-name + numeric-user-identifier [4] EXPLICIT NumericUserIdentifier OPTIONAL, + personal-name [5] EXPLICIT PersonalName OPTIONAL, + -- see also teletex-personal-name + organizational-unit-names [6] EXPLICIT OrganizationalUnitNames OPTIONAL + -- see also teletex-organizational-unit-names -- +} + +CountryName ::= [APPLICATION 1] CHOICE { + x121-dcc-code NumericString + (SIZE (ub-country-name-numeric-length)), + iso-3166-alpha2-code PrintableString + (SIZE (ub-country-name-alpha-length)) } + +AdministrationDomainName ::= [APPLICATION 2] EXPLICIT CHOICE { + numeric NumericString (SIZE (0..ub-domain-name-length)), + printable PrintableString (SIZE (0..ub-domain-name-length)) } + +NetworkAddress ::= X121Address -- see also extended-network-address + +X121Address ::= NumericString (SIZE (1..ub-x121-address-length)) + +TerminalIdentifier ::= PrintableString (SIZE (1..ub-terminal-id-length)) + +PrivateDomainName ::= CHOICE { + numeric NumericString (SIZE (1..ub-domain-name-length)), + printable PrintableString (SIZE (1..ub-domain-name-length)) } + +OrganizationName ::= PrintableString + (SIZE (1..ub-organization-name-length)) +-- see also teletex-organization-name + +NumericUserIdentifier ::= NumericString + (SIZE (1..ub-numeric-user-id-length)) + +PersonalName ::= SET { + surname [0] PrintableString (SIZE (1..ub-surname-length)), + given-name [1] PrintableString + (SIZE (1..ub-given-name-length)) OPTIONAL, + initials [2] PrintableString (SIZE (1..ub-initials-length)) OPTIONAL, + generation-qualifier [3] PrintableString + (SIZE (1..ub-generation-qualifier-length)) OPTIONAL } +-- see also teletex-personal-name + +OrganizationalUnitNames ::= SEQUENCE SIZE (1..ub-organizational-units) + OF OrganizationalUnitName +-- see also teletex-organizational-unit-names + +OrganizationalUnitName ::= PrintableString (SIZE + (1..ub-organizational-unit-name-length)) + +-- Built-in Domain-defined Attributes + +BuiltInDomainDefinedAttributes ::= SEQUENCE SIZE + (1..ub-domain-defined-attributes) OF + BuiltInDomainDefinedAttribute + +BuiltInDomainDefinedAttribute ::= SEQUENCE { + type PrintableString (SIZE + (1..ub-domain-defined-attribute-type-length)), + value PrintableString (SIZE + (1..ub-domain-defined-attribute-value-length))} + +-- Extension Attributes + +ExtensionAttributes ::= SET SIZE (1..ub-extension-attributes) OF + ExtensionAttribute + +ExtensionAttribute ::= SEQUENCE { + extension-attribute-type [0] EXPLICIT INTEGER (0..ub-extension-attributes), + extension-attribute-value [1] EXPLICIT + ANY DEFINED BY extension-attribute-type } + +-- Extension types and attribute values +-- + +common-name INTEGER ::= 1 + +CommonName ::= PrintableString (SIZE (1..ub-common-name-length)) + +teletex-common-name INTEGER ::= 2 + +TeletexCommonName ::= TeletexString (SIZE (1..ub-common-name-length)) + +teletex-organization-name INTEGER ::= 3 + +TeletexOrganizationName ::= + TeletexString (SIZE (1..ub-organization-name-length)) + +teletex-personal-name INTEGER ::= 4 + +TeletexPersonalName ::= SET { + surname [0] EXPLICIT TeletexString (SIZE (1..ub-surname-length)), + given-name [1] EXPLICIT TeletexString + (SIZE (1..ub-given-name-length)) OPTIONAL, + initials [2] EXPLICIT TeletexString (SIZE (1..ub-initials-length)) OPTIONAL, + generation-qualifier [3] EXPLICIT TeletexString (SIZE + (1..ub-generation-qualifier-length)) OPTIONAL } + +teletex-organizational-unit-names INTEGER ::= 5 + +TeletexOrganizationalUnitNames ::= SEQUENCE SIZE + (1..ub-organizational-units) OF TeletexOrganizationalUnitName + +TeletexOrganizationalUnitName ::= TeletexString + (SIZE (1..ub-organizational-unit-name-length)) + +pds-name INTEGER ::= 7 + +PDSName ::= PrintableString (SIZE (1..ub-pds-name-length)) + +physical-delivery-country-name INTEGER ::= 8 + +PhysicalDeliveryCountryName ::= CHOICE { + x121-dcc-code NumericString (SIZE (ub-country-name-numeric-length)), + iso-3166-alpha2-code PrintableString + (SIZE (ub-country-name-alpha-length)) } + +postal-code INTEGER ::= 9 + +PostalCode ::= CHOICE { + numeric-code NumericString (SIZE (1..ub-postal-code-length)), + printable-code PrintableString (SIZE (1..ub-postal-code-length)) } + +physical-delivery-office-name INTEGER ::= 10 + +PhysicalDeliveryOfficeName ::= PDSParameter + +physical-delivery-office-number INTEGER ::= 11 + +PhysicalDeliveryOfficeNumber ::= PDSParameter + +extension-OR-address-components INTEGER ::= 12 + +ExtensionORAddressComponents ::= PDSParameter + +physical-delivery-personal-name INTEGER ::= 13 + +PhysicalDeliveryPersonalName ::= PDSParameter + +physical-delivery-organization-name INTEGER ::= 14 + +PhysicalDeliveryOrganizationName ::= PDSParameter + +extension-physical-delivery-address-components INTEGER ::= 15 + +ExtensionPhysicalDeliveryAddressComponents ::= PDSParameter + +unformatted-postal-address INTEGER ::= 16 + +UnformattedPostalAddress ::= SET { + printable-address SEQUENCE SIZE (1..ub-pds-physical-address-lines) OF + PrintableString (SIZE (1..ub-pds-parameter-length)) OPTIONAL, + teletex-string TeletexString + (SIZE (1..ub-unformatted-address-length)) OPTIONAL } + +street-address INTEGER ::= 17 + +StreetAddress ::= PDSParameter + +post-office-box-address INTEGER ::= 18 + +PostOfficeBoxAddress ::= PDSParameter + +poste-restante-address INTEGER ::= 19 + +PosteRestanteAddress ::= PDSParameter + +unique-postal-name INTEGER ::= 20 + +UniquePostalName ::= PDSParameter + +local-postal-attributes INTEGER ::= 21 + +LocalPostalAttributes ::= PDSParameter + +PDSParameter ::= SET { + printable-string PrintableString + (SIZE(1..ub-pds-parameter-length)) OPTIONAL, + teletex-string TeletexString + (SIZE(1..ub-pds-parameter-length)) OPTIONAL } + +extended-network-address INTEGER ::= 22 + +ExtendedNetworkAddress ::= CHOICE { + e163-4-address SEQUENCE { + number [0] EXPLICIT NumericString (SIZE (1..ub-e163-4-number-length)), + sub-address [1] EXPLICIT NumericString + (SIZE (1..ub-e163-4-sub-address-length)) OPTIONAL }, + psap-address [0] EXPLICIT PresentationAddress } + +PresentationAddress ::= SEQUENCE { + pSelector [0] EXPLICIT OCTET STRING OPTIONAL, + sSelector [1] EXPLICIT OCTET STRING OPTIONAL, + tSelector [2] EXPLICIT OCTET STRING OPTIONAL, + nAddresses [3] EXPLICIT SET SIZE (1..MAX) OF OCTET STRING } + +terminal-type INTEGER ::= 23 + +TerminalType ::= INTEGER { + telex (3), + teletex (4), + g3-facsimile (5), + g4-facsimile (6), + ia5-terminal (7), + videotex (8) } -- (0..ub-integer-options) + +-- Extension Domain-defined Attributes + +teletex-domain-defined-attributes INTEGER ::= 6 + +TeletexDomainDefinedAttributes ::= SEQUENCE SIZE + (1..ub-domain-defined-attributes) OF TeletexDomainDefinedAttribute + +TeletexDomainDefinedAttribute ::= SEQUENCE { + type TeletexString + (SIZE (1..ub-domain-defined-attribute-type-length)), + value TeletexString + (SIZE (1..ub-domain-defined-attribute-value-length)) } + +-- specifications of Upper Bounds shall be regarded as mandatory +-- from Annex B of ITU-T X.411 Reference Definition of MTS Parameter +-- Upper Bounds + +-- Upper Bounds +ub-name INTEGER ::= 32768 +ub-common-name INTEGER ::= 64 +ub-locality-name INTEGER ::= 128 +ub-state-name INTEGER ::= 128 +ub-organization-name INTEGER ::= 64 +ub-organizational-unit-name INTEGER ::= 64 +ub-title INTEGER ::= 64 +ub-match INTEGER ::= 128 + +ub-emailaddress-length INTEGER ::= 128 + +ub-common-name-length INTEGER ::= 64 +ub-country-name-alpha-length INTEGER ::= 2 +ub-country-name-numeric-length INTEGER ::= 3 +ub-domain-defined-attributes INTEGER ::= 4 +ub-domain-defined-attribute-type-length INTEGER ::= 8 +ub-domain-defined-attribute-value-length INTEGER ::= 128 +ub-domain-name-length INTEGER ::= 16 +ub-extension-attributes INTEGER ::= 256 +ub-e163-4-number-length INTEGER ::= 15 +ub-e163-4-sub-address-length INTEGER ::= 40 +ub-generation-qualifier-length INTEGER ::= 3 +ub-given-name-length INTEGER ::= 16 +ub-initials-length INTEGER ::= 5 +ub-integer-options INTEGER ::= 256 +ub-numeric-user-id-length INTEGER ::= 32 +ub-organization-name-length INTEGER ::= 64 +ub-organizational-unit-name-length INTEGER ::= 32 +ub-organizational-units INTEGER ::= 4 +ub-pds-name-length INTEGER ::= 16 +ub-pds-parameter-length INTEGER ::= 30 +ub-pds-physical-address-lines INTEGER ::= 6 +ub-postal-code-length INTEGER ::= 16 +ub-surname-length INTEGER ::= 40 +ub-terminal-id-length INTEGER ::= 24 +ub-unformatted-address-length INTEGER ::= 180 +ub-x121-address-length INTEGER ::= 16 + +-- Note - upper bounds on string types, such as TeletexString, are +-- measured in characters. Excepting PrintableString or IA5String, a +-- significantly greater number of octets will be required to hold +-- such a value. As a minimum, 16 octets, or twice the specified upper +-- bound, whichever is the larger, should be allowed for TeletexString. +-- For UTF8String or UniversalString at least four times the upper +-- bound should be allowed. + + + +-- END of PKIX1Implicit88 + + +-- BEGIN of RFC2630 + +-- Cryptographic Message Syntax + +pkcs-7-ContentInfo ::= SEQUENCE { + contentType pkcs-7-ContentType, + content [0] EXPLICIT ANY DEFINED BY contentType } + +pkcs-7-DigestInfo ::= SEQUENCE { + digestAlgorithm pkcs-7-DigestAlgorithmIdentifier, + digest pkcs-7-Digest +} + +pkcs-7-Digest ::= OCTET STRING + +pkcs-7-ContentType ::= OBJECT IDENTIFIER + +pkcs-7-SignedData ::= SEQUENCE { + version pkcs-7-CMSVersion, + digestAlgorithms pkcs-7-DigestAlgorithmIdentifiers, + encapContentInfo pkcs-7-EncapsulatedContentInfo, + certificates [0] IMPLICIT pkcs-7-CertificateSet OPTIONAL, + crls [1] IMPLICIT pkcs-7-CertificateRevocationLists OPTIONAL, + signerInfos pkcs-7-SignerInfos +} + +pkcs-7-CMSVersion ::= INTEGER { v0(0), v1(1), v2(2), v3(3), v4(4) } + +pkcs-7-DigestAlgorithmIdentifiers ::= SET OF pkcs-7-DigestAlgorithmIdentifier + +pkcs-7-DigestAlgorithmIdentifier ::= AlgorithmIdentifier + +pkcs-7-EncapsulatedContentInfo ::= SEQUENCE { + eContentType pkcs-7-ContentType, + eContent [0] EXPLICIT OCTET STRING OPTIONAL } + +-- We don't use CertificateList here since we only want +-- to read the raw data. +pkcs-7-CertificateRevocationLists ::= SET OF ANY + +pkcs-7-CertificateChoices ::= CHOICE { +-- Although the paper uses Certificate type, we +-- don't use it since, we don't need to parse it. +-- We only need to read and store it. + certificate ANY +} + +pkcs-7-CertificateSet ::= SET OF pkcs-7-CertificateChoices + +pkcs-7-SignerInfos ::= SET OF ANY -- this is not correct but we don't use it + -- anyway + + +-- BEGIN of RFC2986 + +-- Certificate requests +pkcs-10-CertificationRequestInfo ::= SEQUENCE { + version INTEGER { v1(0) }, + subject Name, + subjectPKInfo SubjectPublicKeyInfo, + attributes [0] Attributes +} + +Attributes ::= SET OF Attribute + +pkcs-10-CertificationRequest ::= SEQUENCE { + certificationRequestInfo pkcs-10-CertificationRequestInfo, + signatureAlgorithm AlgorithmIdentifier, + signature BIT STRING +} + +-- stuff from PKCS#9 + +pkcs-9-ub-challengePassword INTEGER ::= 255 + +pkcs-9-certTypes OBJECT IDENTIFIER ::= {pkcs-9 22} +pkcs-9-crlTypes OBJECT IDENTIFIER ::= {pkcs-9 23} + +pkcs-9-at-challengePassword OBJECT IDENTIFIER ::= {pkcs-9 7} + +pkcs-9-challengePassword ::= CHOICE { + printableString PrintableString (SIZE (1..pkcs-9-ub-challengePassword)), + utf8String UTF8String (SIZE (1..pkcs-9-ub-challengePassword)) } + +pkcs-9-at-localKeyId OBJECT IDENTIFIER ::= {pkcs-9 21} + +pkcs-9-localKeyId ::= OCTET STRING + +pkcs-9-at-friendlyName OBJECT IDENTIFIER ::= {pkcs-9 20} + +pkcs-9-friendlyName ::= BMPString (SIZE (1..255)) + +-- PKCS #8 stuff + +-- Private-key information syntax + +pkcs-8-PrivateKeyInfo ::= SEQUENCE { + version pkcs-8-Version, + privateKeyAlgorithm AlgorithmIdentifier, + privateKey pkcs-8-PrivateKey, + attributes [0] Attributes OPTIONAL } + +pkcs-8-Version ::= INTEGER {v1(0)} + +pkcs-8-PrivateKey ::= OCTET STRING + +pkcs-8-Attributes ::= SET OF Attribute + +-- Encrypted private-key information syntax + +pkcs-8-EncryptedPrivateKeyInfo ::= SEQUENCE { + encryptionAlgorithm AlgorithmIdentifier, + encryptedData pkcs-8-EncryptedData +} + +pkcs-8-EncryptedData ::= OCTET STRING + +-- PKCS #5 stuff + +pkcs-5 OBJECT IDENTIFIER ::= + { pkcs 5 } + +pkcs-5-encryptionAlgorithm OBJECT IDENTIFIER ::= + { iso(1) member-body(2) us(840) rsadsi(113549) 3 } + +pkcs-5-des-EDE3-CBC OBJECT IDENTIFIER ::= {pkcs-5-encryptionAlgorithm 7} + +pkcs-5-des-EDE3-CBC-params ::= OCTET STRING (SIZE(8)) + +pkcs-5-des-CBC-params ::= OCTET STRING (SIZE(8)) + +pkcs-5-rc2-CBC-params ::= SEQUENCE { + rc2ParameterVersion INTEGER OPTIONAL, + iv OCTET STRING (SIZE(8)) +} + +pkcs-5-PBE-params ::= SEQUENCE { + salt OCTET STRING (SIZE(8)), + iterationCount INTEGER +} + +pkcs-5-id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} + +pkcs-5-PBES2-params ::= SEQUENCE { + keyDerivationFunc AlgorithmIdentifier, + encryptionScheme AlgorithmIdentifier } + +-- PBKDF2 + +pkcs-5-id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} + +-- pkcs-5-id-hmacWithSHA1 OBJECT IDENTIFIER ::= {iso(1) member-body(2) us(840) rsadsi(113549) 2 7} + +-- pkcs-5-algid-hmacWithSHA1 AlgorithmIdentifier ::= +-- {algorithm pkcs-5-id-hmacWithSHA1, parameters NULL : NULL} + +pkcs-5-PBKDF2-params ::= SEQUENCE { + salt CHOICE { + specified OCTET STRING, + otherSource AlgorithmIdentifier + }, + iterationCount INTEGER (1..MAX), + keyLength INTEGER (1..MAX) OPTIONAL, + prf AlgorithmIdentifier OPTIONAL -- DEFAULT pkcs-5-id-hmacWithSHA1 +} + +-- PKCS #12 stuff + +pkcs-12 OBJECT IDENTIFIER ::= {pkcs 12} + +pkcs-12-PFX ::= SEQUENCE { + version INTEGER {v3(3)}, + authSafe pkcs-7-ContentInfo, + macData pkcs-12-MacData OPTIONAL +} + +pkcs-12-PbeParams ::= SEQUENCE { + salt OCTET STRING, + iterations INTEGER +} + +pkcs-12-MacData ::= SEQUENCE { + mac pkcs-7-DigestInfo, + macSalt OCTET STRING, + iterations INTEGER DEFAULT 1 +-- Note: The default is for historical reasons and its use is +-- deprecated. A higher value, like 1024 is recommended. +} + +pkcs-12-AuthenticatedSafe ::= SEQUENCE OF pkcs-7-ContentInfo + -- Data if unencrypted + -- EncryptedData if password-encrypted + -- EnvelopedData if public key-encrypted + +pkcs-12-SafeContents ::= SEQUENCE OF pkcs-12-SafeBag + +pkcs-12-SafeBag ::= SEQUENCE { + bagId OBJECT IDENTIFIER, + bagValue [0] EXPLICIT ANY DEFINED BY badId, + bagAttributes SET OF pkcs-12-PKCS12Attribute OPTIONAL +} + +-- Bag types + + +pkcs-12-bagtypes OBJECT IDENTIFIER ::= {pkcs-12 10 1} + +pkcs-12-keyBag OBJECT IDENTIFIER ::= {pkcs-12-bagtypes 1} +pkcs-12-pkcs8ShroudedKeyBag OBJECT IDENTIFIER ::= {pkcs-12-bagtypes 2} +pkcs-12-certBag OBJECT IDENTIFIER ::= {pkcs-12-bagtypes 3} +pkcs-12-crlBag OBJECT IDENTIFIER ::= {pkcs-12-bagtypes 4} + +pkcs-12-KeyBag ::= pkcs-8-PrivateKeyInfo + +-- Shrouded KeyBag + +pkcs-12-PKCS8ShroudedKeyBag ::= pkcs-8-EncryptedPrivateKeyInfo + +-- CertBag + +pkcs-12-CertBag ::= SEQUENCE { + certId OBJECT IDENTIFIER, + certValue [0] EXPLICIT ANY DEFINED BY certId +} + +-- x509Certificate BAG-TYPE ::= {OCTET STRING IDENTIFIED BY {pkcs-9-certTypes 1}} +-- DER-encoded X.509 certificate stored in OCTET STRING + +pkcs-12-CRLBag ::= SEQUENCE { + crlId OBJECT IDENTIFIER, + crlValue [0] EXPLICIT ANY DEFINED BY crlId +} + +-- x509CRL BAG-TYPE ::= +-- {OCTET STRING IDENTIFIED BY {pkcs-9-crlTypes 1}} +-- DER-encoded X.509 CRL stored in OCTET STRING + +pkcs-12-PKCS12Attribute ::= Attribute + +-- PKCS #7 stuff (needed in PKCS 12) + +pkcs-7-data OBJECT IDENTIFIER ::= { iso(1) member-body(2) + us(840) rsadsi(113549) pkcs(1) pkcs7(7) 1 } + +pkcs-7-encryptedData OBJECT IDENTIFIER ::= { iso(1) member-body(2) + us(840) rsadsi(113549) pkcs(1) pkcs7(7) 6 } + +pkcs-7-Data ::= OCTET STRING + +pkcs-7-EncryptedData ::= SEQUENCE { + version pkcs-7-CMSVersion, + encryptedContentInfo pkcs-7-EncryptedContentInfo, + unprotectedAttrs [1] IMPLICIT pkcs-7-UnprotectedAttributes OPTIONAL } + +pkcs-7-EncryptedContentInfo ::= SEQUENCE { + contentType pkcs-7-ContentType, + contentEncryptionAlgorithm pkcs-7-ContentEncryptionAlgorithmIdentifier, + encryptedContent [0] IMPLICIT pkcs-7-EncryptedContent OPTIONAL } + +pkcs-7-ContentEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier + +pkcs-7-EncryptedContent ::= OCTET STRING + +pkcs-7-UnprotectedAttributes ::= SET SIZE (1..MAX) OF Attribute + +-- LDAP stuff + +id-at-domainComponent AttributeType ::= { 0 9 2342 19200300 100 1 25 } + +domainComponent ::= IA5String + +id-at-userId AttributeType ::= { 0 9 2342 19200300 100 1 1 } + +userId ::= DirectoryString + +-- rfc3039 + +id-pda OBJECT IDENTIFIER ::= { id-pkix 9 } + +id-pda-dateOfBirth AttributeType ::= { id-pda 1 } +DateOfBirth ::= GeneralizedTime + +id-pda-placeOfBirth AttributeType ::= { id-pda 2 } +PlaceOfBirth ::= DirectoryString + +id-pda-gender AttributeType ::= { id-pda 3 } +Gender ::= PrintableString (SIZE(1)) + -- "M", "F", "m" or "f" + +id-pda-countryOfCitizenship AttributeType ::= { id-pda 4 } +CountryOfCitizenship ::= PrintableString (SIZE (2)) + -- ISO 3166 Country Code + +id-pda-countryOfResidence AttributeType ::= { id-pda 5 } +CountryOfResidence ::= PrintableString (SIZE (2)) + -- ISO 3166 Country Code + +-- spkac: added by gnome-keyring +-- http://dev.w3.org/html5/spec/Overview.html + +PublicKeyAndChallenge ::= SEQUENCE { + spki SubjectPublicKeyInfo, + challenge IA5String +} + +SignedPublicKeyAndChallenge ::= SEQUENCE { + publicKeyAndChallenge PublicKeyAndChallenge, + signatureAlgorithm AlgorithmIdentifier, + signature BIT STRING +} + +-- pkcs-9 extension requests: added by gnome-keyring +-- http://mirror.switch.ch/ftp/doc/standard/pkcs/pkcs-9/pkcs-9.txt + +ExtensionRequest ::= SEQUENCE OF Extension + +END diff --git a/egg/pkix.asn.h b/egg/pkix.asn.h new file mode 100644 index 0000000..b90e203 --- /dev/null +++ b/egg/pkix.asn.h @@ -0,0 +1,1288 @@ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +/* #include */ + +const asn1_static_node pkix_asn1_tab[] = { + { "PKIX1", 536875024, NULL }, + { NULL, 1073741836, NULL }, + { "id-ce", 1879048204, NULL }, + { "joint-iso-ccitt", 1073741825, "2"}, + { "ds", 1073741825, "5"}, + { NULL, 1, "29"}, + { "id-ce-authorityKeyIdentifier", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "35"}, + { "AuthorityKeyIdentifier", 1610612741, NULL }, + { "keyIdentifier", 1610637314, "KeyIdentifier"}, + { NULL, 4104, "0"}, + { "authorityCertIssuer", 1610637314, "GeneralNames"}, + { NULL, 4104, "1"}, + { "authorityCertSerialNumber", 536895490, "CertificateSerialNumber"}, + { NULL, 4104, "2"}, + { "KeyIdentifier", 1073741831, NULL }, + { "id-ce-subjectKeyIdentifier", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "14"}, + { "SubjectKeyIdentifier", 1073741826, "KeyIdentifier"}, + { "id-ce-keyUsage", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "15"}, + { "KeyUsage", 1610874886, NULL }, + { "digitalSignature", 1073741825, "0"}, + { "nonRepudiation", 1073741825, "1"}, + { "keyEncipherment", 1073741825, "2"}, + { "dataEncipherment", 1073741825, "3"}, + { "keyAgreement", 1073741825, "4"}, + { "keyCertSign", 1073741825, "5"}, + { "cRLSign", 1073741825, "6"}, + { "encipherOnly", 1073741825, "7"}, + { "decipherOnly", 1, "8"}, + { "id-ce-privateKeyUsagePeriod", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "16"}, + { "PrivateKeyUsagePeriod", 1610612741, NULL }, + { "notBefore", 1610637349, NULL }, + { NULL, 4104, "0"}, + { "notAfter", 536895525, NULL }, + { NULL, 4104, "1"}, + { "id-ce-certificatePolicies", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "32"}, + { "CertificatePolicies", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "PolicyInformation"}, + { "PolicyInformation", 1610612741, NULL }, + { "policyIdentifier", 1073741826, "CertPolicyId"}, + { "policyQualifiers", 538984459, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "PolicyQualifierInfo"}, + { "CertPolicyId", 1073741836, NULL }, + { "PolicyQualifierInfo", 1610612741, NULL }, + { "policyQualifierId", 1073741826, "PolicyQualifierId"}, + { "qualifier", 541065229, NULL }, + { "policyQualifierId", 1, NULL }, + { "PolicyQualifierId", 1073741836, NULL }, + { "CPSuri", 1073741853, NULL }, + { "UserNotice", 1610612741, NULL }, + { "noticeRef", 1073758210, "NoticeReference"}, + { "explicitText", 16386, "DisplayText"}, + { "NoticeReference", 1610612741, NULL }, + { "organization", 1073741826, "DisplayText"}, + { "noticeNumbers", 536870923, NULL }, + { NULL, 3, NULL }, + { "DisplayText", 1610612754, NULL }, + { "visibleString", 1612709923, NULL }, + { "200", 524298, "1"}, + { "bmpString", 1612709921, NULL }, + { "200", 524298, "1"}, + { "utf8String", 538968098, NULL }, + { "200", 524298, "1"}, + { "id-ce-policyMappings", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "33"}, + { "PolicyMappings", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 536870917, NULL }, + { "issuerDomainPolicy", 1073741826, "CertPolicyId"}, + { "subjectDomainPolicy", 2, "CertPolicyId"}, + { "DirectoryString", 1610612754, NULL }, + { "teletexString", 1612709918, NULL }, + { "MAX", 524298, "1"}, + { "printableString", 1612709919, NULL }, + { "MAX", 524298, "1"}, + { "universalString", 1612709920, NULL }, + { "MAX", 524298, "1"}, + { "utf8String", 1612709922, NULL }, + { "MAX", 524298, "1"}, + { "bmpString", 1612709921, NULL }, + { "MAX", 524298, "1"}, + { "ia5String", 538968093, NULL }, + { "MAX", 524298, "1"}, + { "id-ce-subjectAltName", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "17"}, + { "SubjectAltName", 1073741826, "GeneralNames"}, + { "GeneralNames", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "GeneralName"}, + { "GeneralName", 1610612754, NULL }, + { "otherName", 1610620930, "AnotherName"}, + { NULL, 4104, "0"}, + { "rfc822Name", 1610620957, NULL }, + { NULL, 4104, "1"}, + { "dNSName", 1610620957, NULL }, + { NULL, 4104, "2"}, + { "x400Address", 1610620930, "ORAddress"}, + { NULL, 4104, "3"}, + { "directoryName", 1610620930, "RDNSequence"}, + { NULL, 2056, "4"}, + { "ediPartyName", 1610620930, "EDIPartyName"}, + { NULL, 4104, "5"}, + { "uniformResourceIdentifier", 1610620957, NULL }, + { NULL, 4104, "6"}, + { "iPAddress", 1610620935, NULL }, + { NULL, 4104, "7"}, + { "registeredID", 536879116, NULL }, + { NULL, 4104, "8"}, + { "AnotherName", 1610612741, NULL }, + { "type-id", 1073741836, NULL }, + { "value", 541073421, NULL }, + { NULL, 1073743880, "0"}, + { "type-id", 1, NULL }, + { "EDIPartyName", 1610612741, NULL }, + { "nameAssigner", 1610637314, "DirectoryString"}, + { NULL, 4104, "0"}, + { "partyName", 536879106, "DirectoryString"}, + { NULL, 4104, "1"}, + { "id-ce-issuerAltName", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "18"}, + { "IssuerAltName", 1073741826, "GeneralNames"}, + { "id-ce-subjectDirectoryAttributes", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "9"}, + { "SubjectDirectoryAttributes", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "Attribute"}, + { "id-ce-basicConstraints", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "19"}, + { "BasicConstraints", 1610612741, NULL }, + { "cA", 1610645508, NULL }, + { NULL, 131081, NULL }, + { "pathLenConstraint", 537411587, NULL }, + { "0", 10, "MAX"}, + { "id-ce-nameConstraints", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "30"}, + { "NameConstraints", 1610612741, NULL }, + { "permittedSubtrees", 1610637314, "GeneralSubtrees"}, + { NULL, 4104, "0"}, + { "excludedSubtrees", 536895490, "GeneralSubtrees"}, + { NULL, 4104, "1"}, + { "GeneralSubtrees", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "GeneralSubtree"}, + { "GeneralSubtree", 1610612741, NULL }, + { "base", 1073741826, "GeneralName"}, + { "minimum", 1610653698, "BaseDistance"}, + { NULL, 1073741833, "0"}, + { NULL, 4104, "0"}, + { "maximum", 536895490, "BaseDistance"}, + { NULL, 4104, "1"}, + { "BaseDistance", 1611137027, NULL }, + { "0", 10, "MAX"}, + { "id-ce-policyConstraints", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "36"}, + { "PolicyConstraints", 1610612741, NULL }, + { "requireExplicitPolicy", 1610637314, "SkipCerts"}, + { NULL, 4104, "0"}, + { "inhibitPolicyMapping", 536895490, "SkipCerts"}, + { NULL, 4104, "1"}, + { "SkipCerts", 1611137027, NULL }, + { "0", 10, "MAX"}, + { "id-ce-cRLDistributionPoints", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "31"}, + { "CRLDistributionPoints", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "DistributionPoint"}, + { "DistributionPoint", 1610612741, NULL }, + { "distributionPoint", 1610637314, "DistributionPointName"}, + { NULL, 2056, "0"}, + { "reasons", 1610637314, "ReasonFlags"}, + { NULL, 4104, "1"}, + { "cRLIssuer", 536895490, "GeneralNames"}, + { NULL, 4104, "2"}, + { "DistributionPointName", 1610612754, NULL }, + { "fullName", 1610620930, "GeneralNames"}, + { NULL, 4104, "0"}, + { "nameRelativeToCRLIssuer", 536879106, "RelativeDistinguishedName"}, + { NULL, 4104, "1"}, + { "ReasonFlags", 1610874886, NULL }, + { "unused", 1073741825, "0"}, + { "keyCompromise", 1073741825, "1"}, + { "cACompromise", 1073741825, "2"}, + { "affiliationChanged", 1073741825, "3"}, + { "superseded", 1073741825, "4"}, + { "cessationOfOperation", 1073741825, "5"}, + { "certificateHold", 1073741825, "6"}, + { "privilegeWithdrawn", 1073741825, "7"}, + { "aACompromise", 1, "8"}, + { "id-ce-extKeyUsage", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "37"}, + { "ExtKeyUsageSyntax", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "KeyPurposeId"}, + { "KeyPurposeId", 1073741836, NULL }, + { "id-kp-serverAuth", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "1"}, + { "id-kp-clientAuth", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "2"}, + { "id-kp-codeSigning", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "3"}, + { "id-kp-emailProtection", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "4"}, + { "id-kp-ipsecEndSystem", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "5"}, + { "id-kp-ipsecTunnel", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "6"}, + { "id-kp-ipsecUser", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "7"}, + { "id-kp-timeStamping", 1879048204, NULL }, + { NULL, 1073741825, "id-kp"}, + { NULL, 1, "8"}, + { "id-pe-authorityInfoAccess", 1879048204, NULL }, + { NULL, 1073741825, "id-pe"}, + { NULL, 1, "1"}, + { "AuthorityInfoAccessSyntax", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "AccessDescription"}, + { "AccessDescription", 1610612741, NULL }, + { "accessMethod", 1073741836, NULL }, + { "accessLocation", 2, "GeneralName"}, + { "id-ce-cRLNumber", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "20"}, + { "CRLNumber", 1611137027, NULL }, + { "0", 10, "MAX"}, + { "id-ce-issuingDistributionPoint", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "28"}, + { "IssuingDistributionPoint", 1610612741, NULL }, + { "distributionPoint", 1610637314, "DistributionPointName"}, + { NULL, 4104, "0"}, + { "onlyContainsUserCerts", 1610653700, NULL }, + { NULL, 1073872905, NULL }, + { NULL, 4104, "1"}, + { "onlyContainsCACerts", 1610653700, NULL }, + { NULL, 1073872905, NULL }, + { NULL, 4104, "2"}, + { "onlySomeReasons", 1610637314, "ReasonFlags"}, + { NULL, 4104, "3"}, + { "indirectCRL", 536911876, NULL }, + { NULL, 1073872905, NULL }, + { NULL, 4104, "4"}, + { "id-ce-deltaCRLIndicator", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "27"}, + { "BaseCRLNumber", 1073741826, "CRLNumber"}, + { "id-ce-cRLReasons", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "21"}, + { "CRLReason", 1610874901, NULL }, + { "unspecified", 1073741825, "0"}, + { "keyCompromise", 1073741825, "1"}, + { "cACompromise", 1073741825, "2"}, + { "affiliationChanged", 1073741825, "3"}, + { "superseded", 1073741825, "4"}, + { "cessationOfOperation", 1073741825, "5"}, + { "certificateHold", 1073741825, "6"}, + { "removeFromCRL", 1, "8"}, + { "id-ce-certificateIssuer", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "29"}, + { "CertificateIssuer", 1073741826, "GeneralNames"}, + { "id-ce-holdInstructionCode", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "23"}, + { "HoldInstructionCode", 1073741836, NULL }, + { "holdInstruction", 1879048204, NULL }, + { "joint-iso-itu-t", 1073741825, "2"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "x9cm", 1073741825, "10040"}, + { NULL, 1, "2"}, + { "id-holdinstruction-none", 1879048204, NULL }, + { NULL, 1073741825, "holdInstruction"}, + { NULL, 1, "1"}, + { "id-holdinstruction-callissuer", 1879048204, NULL }, + { NULL, 1073741825, "holdInstruction"}, + { NULL, 1, "2"}, + { "id-holdinstruction-reject", 1879048204, NULL }, + { NULL, 1073741825, "holdInstruction"}, + { NULL, 1, "3"}, + { "id-ce-invalidityDate", 1879048204, NULL }, + { NULL, 1073741825, "id-ce"}, + { NULL, 1, "24"}, + { "InvalidityDate", 1073741861, NULL }, + { "VisibleString", 1610620935, NULL }, + { NULL, 4360, "26"}, + { "NumericString", 1610620935, NULL }, + { NULL, 4360, "18"}, + { "IA5String", 1610620935, NULL }, + { NULL, 4360, "22"}, + { "TeletexString", 1610620935, NULL }, + { NULL, 4360, "20"}, + { "PrintableString", 1610620935, NULL }, + { NULL, 4360, "19"}, + { "UniversalString", 1610620935, NULL }, + { NULL, 4360, "28"}, + { "BMPString", 1610620935, NULL }, + { NULL, 4360, "30"}, + { "UTF8String", 1610620935, NULL }, + { NULL, 4360, "12"}, + { "id-pkix", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "dod", 1073741825, "6"}, + { "internet", 1073741825, "1"}, + { "security", 1073741825, "5"}, + { "mechanisms", 1073741825, "5"}, + { "pkix", 1, "7"}, + { "id-pe", 1879048204, NULL }, + { NULL, 1073741825, "id-pkix"}, + { NULL, 1, "1"}, + { "id-qt", 1879048204, NULL }, + { NULL, 1073741825, "id-pkix"}, + { NULL, 1, "2"}, + { "id-kp", 1879048204, NULL }, + { NULL, 1073741825, "id-pkix"}, + { NULL, 1, "3"}, + { "id-ad", 1879048204, NULL }, + { NULL, 1073741825, "id-pkix"}, + { NULL, 1, "48"}, + { "id-qt-cps", 1879048204, NULL }, + { NULL, 1073741825, "id-qt"}, + { NULL, 1, "1"}, + { "id-qt-unotice", 1879048204, NULL }, + { NULL, 1073741825, "id-qt"}, + { NULL, 1, "2"}, + { "id-ad-ocsp", 1879048204, NULL }, + { NULL, 1073741825, "id-ad"}, + { NULL, 1, "1"}, + { "id-ad-caIssuers", 1879048204, NULL }, + { NULL, 1073741825, "id-ad"}, + { NULL, 1, "2"}, + { "Attribute", 1610612741, NULL }, + { "type", 1073741826, "AttributeType"}, + { "values", 536870927, NULL }, + { NULL, 2, "AttributeValue"}, + { "AttributeType", 1073741836, NULL }, + { "AttributeValue", 1614807053, NULL }, + { "type", 1, NULL }, + { "AttributeTypeAndValue", 1610612741, NULL }, + { "type", 1073741826, "AttributeType"}, + { "value", 2, "AttributeValue"}, + { "id-at", 1879048204, NULL }, + { "joint-iso-ccitt", 1073741825, "2"}, + { "ds", 1073741825, "5"}, + { NULL, 1, "4"}, + { "id-at-initials", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "43"}, + { "X520initials", 1073741826, "DirectoryString"}, + { "id-at-generationQualifier", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "44"}, + { "X520generationQualifier", 1073741826, "DirectoryString"}, + { "id-at-surname", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "4"}, + { "X520surName", 1073741826, "DirectoryString"}, + { "id-at-givenName", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "42"}, + { "X520givenName", 1073741826, "DirectoryString"}, + { "id-at-name", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "41"}, + { "X520name", 1073741826, "DirectoryString"}, + { "id-at-commonName", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "3"}, + { "X520CommonName", 1073741826, "DirectoryString"}, + { "id-at-localityName", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "7"}, + { "X520LocalityName", 1073741826, "DirectoryString"}, + { "id-at-stateOrProvinceName", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "8"}, + { "X520StateOrProvinceName", 1073741826, "DirectoryString"}, + { "id-at-organizationName", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "10"}, + { "X520OrganizationName", 1073741826, "DirectoryString"}, + { "id-at-organizationalUnitName", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "11"}, + { "X520OrganizationalUnitName", 1073741826, "DirectoryString"}, + { "id-at-title", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "12"}, + { "X520Title", 1073741826, "DirectoryString"}, + { "id-at-description", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "13"}, + { "X520Description", 1073741826, "DirectoryString"}, + { "id-at-dnQualifier", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "46"}, + { "X520dnQualifier", 1073741855, NULL }, + { "id-at-countryName", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "6"}, + { "X520countryName", 1612709919, NULL }, + { NULL, 1048586, "2"}, + { "id-at-serialNumber", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "5"}, + { "X520serialNumber", 1073741855, NULL }, + { "id-at-telephoneNumber", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "20"}, + { "X520telephoneNumber", 1073741855, NULL }, + { "id-at-facsimileTelephoneNumber", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "23"}, + { "X520facsimileTelephoneNumber", 1073741855, NULL }, + { "id-at-pseudonym", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "65"}, + { "X520pseudonym", 1073741826, "DirectoryString"}, + { "id-at-name", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "41"}, + { "X520name", 1073741826, "DirectoryString"}, + { "id-at-streetAddress", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "9"}, + { "X520streetAddress", 1073741826, "DirectoryString"}, + { "id-at-postalAddress", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-at"}, + { NULL, 1, "16"}, + { "X520postalAddress", 1073741826, "PostalAddress"}, + { "PostalAddress", 1610612747, NULL }, + { NULL, 2, "DirectoryString"}, + { "pkcs", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "rsadsi", 1073741825, "113549"}, + { "pkcs", 1, "1"}, + { "pkcs-9", 1879048204, NULL }, + { NULL, 1073741825, "pkcs"}, + { NULL, 1, "9"}, + { "emailAddress", 1880096780, "AttributeType"}, + { NULL, 1073741825, "pkcs-9"}, + { NULL, 1, "1"}, + { "Pkcs9email", 1612709917, NULL }, + { "ub-emailaddress-length", 524298, "1"}, + { "Name", 1610612754, NULL }, + { "rdnSequence", 2, "RDNSequence"}, + { "RDNSequence", 1610612747, NULL }, + { NULL, 2, "RelativeDistinguishedName"}, + { "DistinguishedName", 1073741826, "RDNSequence"}, + { "RelativeDistinguishedName", 1612709903, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "AttributeTypeAndValue"}, + { "Certificate", 1610612741, NULL }, + { "tbsCertificate", 1073741826, "TBSCertificate"}, + { "signatureAlgorithm", 1073741826, "AlgorithmIdentifier"}, + { "signature", 6, NULL }, + { "TBSCertificate", 1610612741, NULL }, + { "version", 1610653698, "Version"}, + { NULL, 1073741833, "v1"}, + { NULL, 2056, "0"}, + { "serialNumber", 1073741826, "CertificateSerialNumber"}, + { "signature", 1073741826, "AlgorithmIdentifier"}, + { "issuer", 1073741826, "Name"}, + { "validity", 1073741826, "Validity"}, + { "subject", 1073741826, "Name"}, + { "subjectPublicKeyInfo", 1073741826, "SubjectPublicKeyInfo"}, + { "issuerUniqueID", 1610637314, "UniqueIdentifier"}, + { NULL, 4104, "1"}, + { "subjectUniqueID", 1610637314, "UniqueIdentifier"}, + { NULL, 4104, "2"}, + { "extensions", 536895490, "Extensions"}, + { NULL, 2056, "3"}, + { "Version", 1610874883, NULL }, + { "v1", 1073741825, "0"}, + { "v2", 1073741825, "1"}, + { "v3", 1, "2"}, + { "CertificateSerialNumber", 1073741827, NULL }, + { "Validity", 1610612741, NULL }, + { "notBefore", 1073741826, "Time"}, + { "notAfter", 2, "Time"}, + { "Time", 1610612754, NULL }, + { "utcTime", 1073741860, NULL }, + { "generalTime", 37, NULL }, + { "UniqueIdentifier", 1073741830, NULL }, + { "SubjectPublicKeyInfo", 1610612741, NULL }, + { "algorithm", 1073741826, "AlgorithmIdentifier"}, + { "subjectPublicKey", 6, NULL }, + { "Extensions", 1612709899, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "Extension"}, + { "Extension", 1610612741, NULL }, + { "extnID", 1073741836, NULL }, + { "critical", 1610645508, NULL }, + { NULL, 131081, NULL }, + { "extnValue", 7, NULL }, + { "CertificateList", 1610612741, NULL }, + { "tbsCertList", 1073741826, "TBSCertList"}, + { "signatureAlgorithm", 1073741826, "AlgorithmIdentifier"}, + { "signature", 6, NULL }, + { "TBSCertList", 1610612741, NULL }, + { "version", 1073758210, "Version"}, + { "signature", 1073741826, "AlgorithmIdentifier"}, + { "issuer", 1073741826, "Name"}, + { "thisUpdate", 1073741826, "Time"}, + { "nextUpdate", 1073758210, "Time"}, + { "revokedCertificates", 1610629131, NULL }, + { NULL, 536870917, NULL }, + { "userCertificate", 1073741826, "CertificateSerialNumber"}, + { "revocationDate", 1073741826, "Time"}, + { "crlEntryExtensions", 16386, "Extensions"}, + { "crlExtensions", 536895490, "Extensions"}, + { NULL, 2056, "0"}, + { "AlgorithmIdentifier", 1610612741, NULL }, + { "algorithm", 1073741836, NULL }, + { "parameters", 541081613, NULL }, + { "algorithm", 1, NULL }, + { "pkcs-1", 1879048204, NULL }, + { NULL, 1073741825, "pkcs"}, + { NULL, 1, "1"}, + { "rsaEncryption", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-1"}, + { NULL, 1, "1"}, + { "md2WithRSAEncryption", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-1"}, + { NULL, 1, "2"}, + { "md5WithRSAEncryption", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-1"}, + { NULL, 1, "4"}, + { "sha1WithRSAEncryption", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-1"}, + { NULL, 1, "5"}, + { "id-dsa-with-sha1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "x9-57", 1073741825, "10040"}, + { "x9algorithm", 1073741825, "4"}, + { NULL, 1, "3"}, + { "Dss-Sig-Value", 1610612741, NULL }, + { "r", 1073741827, NULL }, + { "s", 3, NULL }, + { "dhpublicnumber", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "ansi-x942", 1073741825, "10046"}, + { "number-type", 1073741825, "2"}, + { NULL, 1, "1"}, + { "DomainParameters", 1610612741, NULL }, + { "p", 1073741827, NULL }, + { "g", 1073741827, NULL }, + { "q", 1073741827, NULL }, + { "j", 1073758211, NULL }, + { "validationParms", 16386, "ValidationParms"}, + { "ValidationParms", 1610612741, NULL }, + { "seed", 1073741830, NULL }, + { "pgenCounter", 3, NULL }, + { "id-dsa", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "x9-57", 1073741825, "10040"}, + { "x9algorithm", 1073741825, "4"}, + { NULL, 1, "1"}, + { "Dss-Parms", 1610612741, NULL }, + { "p", 1073741827, NULL }, + { "q", 1073741827, NULL }, + { "g", 3, NULL }, + { "ansi-X9-62", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { NULL, 1, "10045"}, + { "id-ecSigType", 1879048204, NULL }, + { NULL, 1073741825, "ansi-X9-62"}, + { "signatures", 1, "4"}, + { "ecdsa-with-SHA1", 1879048204, NULL }, + { NULL, 1073741825, "id-ecSigType"}, + { NULL, 1, "1"}, + { "Ecdsa-Sig-Value", 1610612741, NULL }, + { "r", 1073741827, NULL }, + { "s", 3, NULL }, + { "id-public-key-type", 1879048204, NULL }, + { NULL, 1073741825, "ansi-X9-62"}, + { NULL, 1, "2"}, + { "id-ecPublicKey", 1879048204, NULL }, + { NULL, 1073741825, "id-public-key-type"}, + { NULL, 1, "1"}, + { "ECPoint", 1073741831, NULL }, + { "ECParameters", 1610612754, NULL }, + { "namedCurve", 12, NULL }, + { "secp192r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "ansi-X9-62", 1073741825, "10045"}, + { "curves", 1073741825, "3"}, + { "prime", 1073741825, "1"}, + { NULL, 1, "1"}, + { "sect163k1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "1"}, + { "sect163r2", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "15"}, + { "secp224r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "33"}, + { "sect233k1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "26"}, + { "sect233r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "27"}, + { "secp256r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "ansi-X9-62", 1073741825, "10045"}, + { "curves", 1073741825, "3"}, + { "prime", 1073741825, "1"}, + { NULL, 1, "7"}, + { "sect283k1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "16"}, + { "sect283r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "17"}, + { "secp384r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "34"}, + { "sect409k1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "36"}, + { "sect409r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "37"}, + { "secp521r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "35"}, + { "sect571k1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "38"}, + { "sect571r1", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "identified-organization", 1073741825, "3"}, + { "certicom", 1073741825, "132"}, + { "curve", 1073741825, "0"}, + { NULL, 1, "39"}, + { "id-dsa-with-sha224", 1879048204, NULL }, + { "joint-iso-ccitt", 1073741825, "2"}, + { "country", 1073741825, "16"}, + { "us", 1073741825, "840"}, + { "organization", 1073741825, "1"}, + { "gov", 1073741825, "101"}, + { "csor", 1073741825, "3"}, + { "algorithms", 1073741825, "4"}, + { "id-dsa-with-sha2", 1073741825, "3"}, + { NULL, 1, "1"}, + { "id-dsa-with-sha256", 1879048204, NULL }, + { "joint-iso-ccitt", 1073741825, "2"}, + { "country", 1073741825, "16"}, + { "us", 1073741825, "840"}, + { "organization", 1073741825, "1"}, + { "gov", 1073741825, "101"}, + { "csor", 1073741825, "3"}, + { "algorithms", 1073741825, "4"}, + { "id-dsa-with-sha2", 1073741825, "3"}, + { NULL, 1, "2"}, + { "ecdsa-with-SHA224", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "ansi-X9-62", 1073741825, "10045"}, + { "signatures", 1073741825, "4"}, + { "ecdsa-with-SHA2", 1073741825, "3"}, + { NULL, 1, "1"}, + { "ecdsa-with-SHA256", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "ansi-X9-62", 1073741825, "10045"}, + { "signatures", 1073741825, "4"}, + { "ecdsa-with-SHA2", 1073741825, "3"}, + { NULL, 1, "2"}, + { "ecdsa-with-SHA384", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "ansi-X9-62", 1073741825, "10045"}, + { "signatures", 1073741825, "4"}, + { "ecdsa-with-SHA2", 1073741825, "3"}, + { NULL, 1, "3"}, + { "ecdsa-with-SHA512", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "ansi-X9-62", 1073741825, "10045"}, + { "signatures", 1073741825, "4"}, + { "ecdsa-with-SHA2", 1073741825, "3"}, + { NULL, 1, "4"}, + { "ORAddress", 1610612741, NULL }, + { "built-in-standard-attributes", 1073741826, "BuiltInStandardAttributes"}, + { "built-in-domain-defined-attributes", 1073758210, "BuiltInDomainDefinedAttributes"}, + { "extension-attributes", 16386, "ExtensionAttributes"}, + { "BuiltInStandardAttributes", 1610612741, NULL }, + { "country-name", 1073758210, "CountryName"}, + { "administration-domain-name", 1073758210, "AdministrationDomainName"}, + { "network-address", 1610637314, "NetworkAddress"}, + { NULL, 2056, "0"}, + { "terminal-identifier", 1610637314, "TerminalIdentifier"}, + { NULL, 2056, "1"}, + { "private-domain-name", 1610637314, "PrivateDomainName"}, + { NULL, 2056, "2"}, + { "organization-name", 1610637314, "OrganizationName"}, + { NULL, 2056, "3"}, + { "numeric-user-identifier", 1610637314, "NumericUserIdentifier"}, + { NULL, 2056, "4"}, + { "personal-name", 1610637314, "PersonalName"}, + { NULL, 2056, "5"}, + { "organizational-unit-names", 536895490, "OrganizationalUnitNames"}, + { NULL, 2056, "6"}, + { "CountryName", 1610620946, NULL }, + { NULL, 1073746952, "1"}, + { "x121-dcc-code", 1612709916, NULL }, + { NULL, 1048586, "ub-country-name-numeric-length"}, + { "iso-3166-alpha2-code", 538968095, NULL }, + { NULL, 1048586, "ub-country-name-alpha-length"}, + { "AdministrationDomainName", 1610620946, NULL }, + { NULL, 1073744904, "2"}, + { "numeric", 1612709916, NULL }, + { "ub-domain-name-length", 524298, "0"}, + { "printable", 538968095, NULL }, + { "ub-domain-name-length", 524298, "0"}, + { "NetworkAddress", 1073741826, "X121Address"}, + { "X121Address", 1612709916, NULL }, + { "ub-x121-address-length", 524298, "1"}, + { "TerminalIdentifier", 1612709919, NULL }, + { "ub-terminal-id-length", 524298, "1"}, + { "PrivateDomainName", 1610612754, NULL }, + { "numeric", 1612709916, NULL }, + { "ub-domain-name-length", 524298, "1"}, + { "printable", 538968095, NULL }, + { "ub-domain-name-length", 524298, "1"}, + { "OrganizationName", 1612709919, NULL }, + { "ub-organization-name-length", 524298, "1"}, + { "NumericUserIdentifier", 1612709916, NULL }, + { "ub-numeric-user-id-length", 524298, "1"}, + { "PersonalName", 1610612750, NULL }, + { "surname", 1814044703, NULL }, + { NULL, 1073745928, "0"}, + { "ub-surname-length", 524298, "1"}, + { "given-name", 1814061087, NULL }, + { NULL, 1073745928, "1"}, + { "ub-given-name-length", 524298, "1"}, + { "initials", 1814061087, NULL }, + { NULL, 1073745928, "2"}, + { "ub-initials-length", 524298, "1"}, + { "generation-qualifier", 740319263, NULL }, + { NULL, 1073745928, "3"}, + { "ub-generation-qualifier-length", 524298, "1"}, + { "OrganizationalUnitNames", 1612709899, NULL }, + { "ub-organizational-units", 1074266122, "1"}, + { NULL, 2, "OrganizationalUnitName"}, + { "OrganizationalUnitName", 1612709919, NULL }, + { "ub-organizational-unit-name-length", 524298, "1"}, + { "BuiltInDomainDefinedAttributes", 1612709899, NULL }, + { "ub-domain-defined-attributes", 1074266122, "1"}, + { NULL, 2, "BuiltInDomainDefinedAttribute"}, + { "BuiltInDomainDefinedAttribute", 1610612741, NULL }, + { "type", 1612709919, NULL }, + { "ub-domain-defined-attribute-type-length", 524298, "1"}, + { "value", 538968095, NULL }, + { "ub-domain-defined-attribute-value-length", 524298, "1"}, + { "ExtensionAttributes", 1612709903, NULL }, + { "ub-extension-attributes", 1074266122, "1"}, + { NULL, 2, "ExtensionAttribute"}, + { "ExtensionAttribute", 1610612741, NULL }, + { "extension-attribute-type", 1611145219, NULL }, + { NULL, 1073743880, "0"}, + { "0", 10, "ub-extension-attributes"}, + { "extension-attribute-value", 541073421, NULL }, + { NULL, 1073743880, "1"}, + { "extension-attribute-type", 1, NULL }, + { "common-name", 1342177283, "1"}, + { "CommonName", 1612709919, NULL }, + { "ub-common-name-length", 524298, "1"}, + { "teletex-common-name", 1342177283, "2"}, + { "TeletexCommonName", 1612709918, NULL }, + { "ub-common-name-length", 524298, "1"}, + { "teletex-organization-name", 1342177283, "3"}, + { "TeletexOrganizationName", 1612709918, NULL }, + { "ub-organization-name-length", 524298, "1"}, + { "teletex-personal-name", 1342177283, "4"}, + { "TeletexPersonalName", 1610612750, NULL }, + { "surname", 1814044702, NULL }, + { NULL, 1073743880, "0"}, + { "ub-surname-length", 524298, "1"}, + { "given-name", 1814061086, NULL }, + { NULL, 1073743880, "1"}, + { "ub-given-name-length", 524298, "1"}, + { "initials", 1814061086, NULL }, + { NULL, 1073743880, "2"}, + { "ub-initials-length", 524298, "1"}, + { "generation-qualifier", 740319262, NULL }, + { NULL, 1073743880, "3"}, + { "ub-generation-qualifier-length", 524298, "1"}, + { "teletex-organizational-unit-names", 1342177283, "5"}, + { "TeletexOrganizationalUnitNames", 1612709899, NULL }, + { "ub-organizational-units", 1074266122, "1"}, + { NULL, 2, "TeletexOrganizationalUnitName"}, + { "TeletexOrganizationalUnitName", 1612709918, NULL }, + { "ub-organizational-unit-name-length", 524298, "1"}, + { "pds-name", 1342177283, "7"}, + { "PDSName", 1612709919, NULL }, + { "ub-pds-name-length", 524298, "1"}, + { "physical-delivery-country-name", 1342177283, "8"}, + { "PhysicalDeliveryCountryName", 1610612754, NULL }, + { "x121-dcc-code", 1612709916, NULL }, + { NULL, 1048586, "ub-country-name-numeric-length"}, + { "iso-3166-alpha2-code", 538968095, NULL }, + { NULL, 1048586, "ub-country-name-alpha-length"}, + { "postal-code", 1342177283, "9"}, + { "PostalCode", 1610612754, NULL }, + { "numeric-code", 1612709916, NULL }, + { "ub-postal-code-length", 524298, "1"}, + { "printable-code", 538968095, NULL }, + { "ub-postal-code-length", 524298, "1"}, + { "physical-delivery-office-name", 1342177283, "10"}, + { "PhysicalDeliveryOfficeName", 1073741826, "PDSParameter"}, + { "physical-delivery-office-number", 1342177283, "11"}, + { "PhysicalDeliveryOfficeNumber", 1073741826, "PDSParameter"}, + { "extension-OR-address-components", 1342177283, "12"}, + { "ExtensionORAddressComponents", 1073741826, "PDSParameter"}, + { "physical-delivery-personal-name", 1342177283, "13"}, + { "PhysicalDeliveryPersonalName", 1073741826, "PDSParameter"}, + { "physical-delivery-organization-name", 1342177283, "14"}, + { "PhysicalDeliveryOrganizationName", 1073741826, "PDSParameter"}, + { "extension-physical-delivery-address-components", 1342177283, "15"}, + { "ExtensionPhysicalDeliveryAddressComponents", 1073741826, "PDSParameter"}, + { "unformatted-postal-address", 1342177283, "16"}, + { "UnformattedPostalAddress", 1610612750, NULL }, + { "printable-address", 1814052875, NULL }, + { "ub-pds-physical-address-lines", 1074266122, "1"}, + { NULL, 538968095, NULL }, + { "ub-pds-parameter-length", 524298, "1"}, + { "teletex-string", 740311070, NULL }, + { "ub-unformatted-address-length", 524298, "1"}, + { "street-address", 1342177283, "17"}, + { "StreetAddress", 1073741826, "PDSParameter"}, + { "post-office-box-address", 1342177283, "18"}, + { "PostOfficeBoxAddress", 1073741826, "PDSParameter"}, + { "poste-restante-address", 1342177283, "19"}, + { "PosteRestanteAddress", 1073741826, "PDSParameter"}, + { "unique-postal-name", 1342177283, "20"}, + { "UniquePostalName", 1073741826, "PDSParameter"}, + { "local-postal-attributes", 1342177283, "21"}, + { "LocalPostalAttributes", 1073741826, "PDSParameter"}, + { "PDSParameter", 1610612750, NULL }, + { "printable-string", 1814052895, NULL }, + { "ub-pds-parameter-length", 524298, "1"}, + { "teletex-string", 740311070, NULL }, + { "ub-pds-parameter-length", 524298, "1"}, + { "extended-network-address", 1342177283, "22"}, + { "ExtendedNetworkAddress", 1610612754, NULL }, + { "e163-4-address", 1610612741, NULL }, + { "number", 1612718108, NULL }, + { NULL, 1073743880, "0"}, + { "ub-e163-4-number-length", 524298, "1"}, + { "sub-address", 538992668, NULL }, + { NULL, 1073743880, "1"}, + { "ub-e163-4-sub-address-length", 524298, "1"}, + { "psap-address", 536879106, "PresentationAddress"}, + { NULL, 2056, "0"}, + { "PresentationAddress", 1610612741, NULL }, + { "pSelector", 1610637319, NULL }, + { NULL, 2056, "0"}, + { "sSelector", 1610637319, NULL }, + { NULL, 2056, "1"}, + { "tSelector", 1610637319, NULL }, + { NULL, 2056, "2"}, + { "nAddresses", 538976271, NULL }, + { NULL, 1073743880, "3"}, + { "MAX", 1074266122, "1"}, + { NULL, 7, NULL }, + { "terminal-type", 1342177283, "23"}, + { "TerminalType", 1610874883, NULL }, + { "telex", 1073741825, "3"}, + { "teletex", 1073741825, "4"}, + { "g3-facsimile", 1073741825, "5"}, + { "g4-facsimile", 1073741825, "6"}, + { "ia5-terminal", 1073741825, "7"}, + { "videotex", 1, "8"}, + { "teletex-domain-defined-attributes", 1342177283, "6"}, + { "TeletexDomainDefinedAttributes", 1612709899, NULL }, + { "ub-domain-defined-attributes", 1074266122, "1"}, + { NULL, 2, "TeletexDomainDefinedAttribute"}, + { "TeletexDomainDefinedAttribute", 1610612741, NULL }, + { "type", 1612709918, NULL }, + { "ub-domain-defined-attribute-type-length", 524298, "1"}, + { "value", 538968094, NULL }, + { "ub-domain-defined-attribute-value-length", 524298, "1"}, + { "ub-name", 1342177283, "32768"}, + { "ub-common-name", 1342177283, "64"}, + { "ub-locality-name", 1342177283, "128"}, + { "ub-state-name", 1342177283, "128"}, + { "ub-organization-name", 1342177283, "64"}, + { "ub-organizational-unit-name", 1342177283, "64"}, + { "ub-title", 1342177283, "64"}, + { "ub-match", 1342177283, "128"}, + { "ub-emailaddress-length", 1342177283, "128"}, + { "ub-common-name-length", 1342177283, "64"}, + { "ub-country-name-alpha-length", 1342177283, "2"}, + { "ub-country-name-numeric-length", 1342177283, "3"}, + { "ub-domain-defined-attributes", 1342177283, "4"}, + { "ub-domain-defined-attribute-type-length", 1342177283, "8"}, + { "ub-domain-defined-attribute-value-length", 1342177283, "128"}, + { "ub-domain-name-length", 1342177283, "16"}, + { "ub-extension-attributes", 1342177283, "256"}, + { "ub-e163-4-number-length", 1342177283, "15"}, + { "ub-e163-4-sub-address-length", 1342177283, "40"}, + { "ub-generation-qualifier-length", 1342177283, "3"}, + { "ub-given-name-length", 1342177283, "16"}, + { "ub-initials-length", 1342177283, "5"}, + { "ub-integer-options", 1342177283, "256"}, + { "ub-numeric-user-id-length", 1342177283, "32"}, + { "ub-organization-name-length", 1342177283, "64"}, + { "ub-organizational-unit-name-length", 1342177283, "32"}, + { "ub-organizational-units", 1342177283, "4"}, + { "ub-pds-name-length", 1342177283, "16"}, + { "ub-pds-parameter-length", 1342177283, "30"}, + { "ub-pds-physical-address-lines", 1342177283, "6"}, + { "ub-postal-code-length", 1342177283, "16"}, + { "ub-surname-length", 1342177283, "40"}, + { "ub-terminal-id-length", 1342177283, "24"}, + { "ub-unformatted-address-length", 1342177283, "180"}, + { "ub-x121-address-length", 1342177283, "16"}, + { "pkcs-7-ContentInfo", 1610612741, NULL }, + { "contentType", 1073741826, "pkcs-7-ContentType"}, + { "content", 541073421, NULL }, + { NULL, 1073743880, "0"}, + { "contentType", 1, NULL }, + { "pkcs-7-DigestInfo", 1610612741, NULL }, + { "digestAlgorithm", 1073741826, "pkcs-7-DigestAlgorithmIdentifier"}, + { "digest", 2, "pkcs-7-Digest"}, + { "pkcs-7-Digest", 1073741831, NULL }, + { "pkcs-7-ContentType", 1073741836, NULL }, + { "pkcs-7-SignedData", 1610612741, NULL }, + { "version", 1073741826, "pkcs-7-CMSVersion"}, + { "digestAlgorithms", 1073741826, "pkcs-7-DigestAlgorithmIdentifiers"}, + { "encapContentInfo", 1073741826, "pkcs-7-EncapsulatedContentInfo"}, + { "certificates", 1610637314, "pkcs-7-CertificateSet"}, + { NULL, 4104, "0"}, + { "crls", 1610637314, "pkcs-7-CertificateRevocationLists"}, + { NULL, 4104, "1"}, + { "signerInfos", 2, "pkcs-7-SignerInfos"}, + { "pkcs-7-CMSVersion", 1610874883, NULL }, + { "v0", 1073741825, "0"}, + { "v1", 1073741825, "1"}, + { "v2", 1073741825, "2"}, + { "v3", 1073741825, "3"}, + { "v4", 1, "4"}, + { "pkcs-7-DigestAlgorithmIdentifiers", 1610612751, NULL }, + { NULL, 2, "pkcs-7-DigestAlgorithmIdentifier"}, + { "pkcs-7-DigestAlgorithmIdentifier", 1073741826, "AlgorithmIdentifier"}, + { "pkcs-7-EncapsulatedContentInfo", 1610612741, NULL }, + { "eContentType", 1073741826, "pkcs-7-ContentType"}, + { "eContent", 536895495, NULL }, + { NULL, 2056, "0"}, + { "pkcs-7-CertificateRevocationLists", 1610612751, NULL }, + { NULL, 13, NULL }, + { "pkcs-7-CertificateChoices", 1610612754, NULL }, + { "certificate", 13, NULL }, + { "pkcs-7-CertificateSet", 1610612751, NULL }, + { NULL, 2, "pkcs-7-CertificateChoices"}, + { "pkcs-7-SignerInfos", 1610612751, NULL }, + { NULL, 13, NULL }, + { "pkcs-10-CertificationRequestInfo", 1610612741, NULL }, + { "version", 1610874883, NULL }, + { "v1", 1, "0"}, + { "subject", 1073741826, "Name"}, + { "subjectPKInfo", 1073741826, "SubjectPublicKeyInfo"}, + { "attributes", 536879106, "Attributes"}, + { NULL, 4104, "0"}, + { "Attributes", 1610612751, NULL }, + { NULL, 2, "Attribute"}, + { "pkcs-10-CertificationRequest", 1610612741, NULL }, + { "certificationRequestInfo", 1073741826, "pkcs-10-CertificationRequestInfo"}, + { "signatureAlgorithm", 1073741826, "AlgorithmIdentifier"}, + { "signature", 6, NULL }, + { "pkcs-9-ub-challengePassword", 1342177283, "255"}, + { "pkcs-9-certTypes", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-9"}, + { NULL, 1, "22"}, + { "pkcs-9-crlTypes", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-9"}, + { NULL, 1, "23"}, + { "pkcs-9-at-challengePassword", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-9"}, + { NULL, 1, "7"}, + { "pkcs-9-challengePassword", 1610612754, NULL }, + { "printableString", 1612709919, NULL }, + { "pkcs-9-ub-challengePassword", 524298, "1"}, + { "utf8String", 538968098, NULL }, + { "pkcs-9-ub-challengePassword", 524298, "1"}, + { "pkcs-9-at-localKeyId", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-9"}, + { NULL, 1, "21"}, + { "pkcs-9-localKeyId", 1073741831, NULL }, + { "pkcs-9-at-friendlyName", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-9"}, + { NULL, 1, "20"}, + { "pkcs-9-friendlyName", 1612709921, NULL }, + { "255", 524298, "1"}, + { "pkcs-8-PrivateKeyInfo", 1610612741, NULL }, + { "version", 1073741826, "pkcs-8-Version"}, + { "privateKeyAlgorithm", 1073741826, "AlgorithmIdentifier"}, + { "privateKey", 1073741826, "pkcs-8-PrivateKey"}, + { "attributes", 536895490, "Attributes"}, + { NULL, 4104, "0"}, + { "pkcs-8-Version", 1610874883, NULL }, + { "v1", 1, "0"}, + { "pkcs-8-PrivateKey", 1073741831, NULL }, + { "pkcs-8-Attributes", 1610612751, NULL }, + { NULL, 2, "Attribute"}, + { "pkcs-8-EncryptedPrivateKeyInfo", 1610612741, NULL }, + { "encryptionAlgorithm", 1073741826, "AlgorithmIdentifier"}, + { "encryptedData", 2, "pkcs-8-EncryptedData"}, + { "pkcs-8-EncryptedData", 1073741831, NULL }, + { "pkcs-5", 1879048204, NULL }, + { NULL, 1073741825, "pkcs"}, + { NULL, 1, "5"}, + { "pkcs-5-encryptionAlgorithm", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "rsadsi", 1073741825, "113549"}, + { NULL, 1, "3"}, + { "pkcs-5-des-EDE3-CBC", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-5-encryptionAlgorithm"}, + { NULL, 1, "7"}, + { "pkcs-5-des-EDE3-CBC-params", 1612709895, NULL }, + { NULL, 1048586, "8"}, + { "pkcs-5-des-CBC-params", 1612709895, NULL }, + { NULL, 1048586, "8"}, + { "pkcs-5-rc2-CBC-params", 1610612741, NULL }, + { "rc2ParameterVersion", 1073758211, NULL }, + { "iv", 538968071, NULL }, + { NULL, 1048586, "8"}, + { "pkcs-5-PBE-params", 1610612741, NULL }, + { "salt", 1612709895, NULL }, + { NULL, 1048586, "8"}, + { "iterationCount", 3, NULL }, + { "pkcs-5-id-PBES2", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-5"}, + { NULL, 1, "13"}, + { "pkcs-5-PBES2-params", 1610612741, NULL }, + { "keyDerivationFunc", 1073741826, "AlgorithmIdentifier"}, + { "encryptionScheme", 2, "AlgorithmIdentifier"}, + { "pkcs-5-id-PBKDF2", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-5"}, + { NULL, 1, "12"}, + { "pkcs-5-PBKDF2-params", 1610612741, NULL }, + { "salt", 1610612754, NULL }, + { "specified", 1073741831, NULL }, + { "otherSource", 2, "AlgorithmIdentifier"}, + { "iterationCount", 1611137027, NULL }, + { "1", 10, "MAX"}, + { "keyLength", 1611153411, NULL }, + { "1", 10, "MAX"}, + { "prf", 16386, "AlgorithmIdentifier"}, + { "pkcs-12", 1879048204, NULL }, + { NULL, 1073741825, "pkcs"}, + { NULL, 1, "12"}, + { "pkcs-12-PFX", 1610612741, NULL }, + { "version", 1610874883, NULL }, + { "v3", 1, "3"}, + { "authSafe", 1073741826, "pkcs-7-ContentInfo"}, + { "macData", 16386, "pkcs-12-MacData"}, + { "pkcs-12-PbeParams", 1610612741, NULL }, + { "salt", 1073741831, NULL }, + { "iterations", 3, NULL }, + { "pkcs-12-MacData", 1610612741, NULL }, + { "mac", 1073741826, "pkcs-7-DigestInfo"}, + { "macSalt", 1073741831, NULL }, + { "iterations", 536903683, NULL }, + { NULL, 9, "1"}, + { "pkcs-12-AuthenticatedSafe", 1610612747, NULL }, + { NULL, 2, "pkcs-7-ContentInfo"}, + { "pkcs-12-SafeContents", 1610612747, NULL }, + { NULL, 2, "pkcs-12-SafeBag"}, + { "pkcs-12-SafeBag", 1610612741, NULL }, + { "bagId", 1073741836, NULL }, + { "bagValue", 1614815245, NULL }, + { NULL, 1073743880, "0"}, + { "badId", 1, NULL }, + { "bagAttributes", 536887311, NULL }, + { NULL, 2, "pkcs-12-PKCS12Attribute"}, + { "pkcs-12-bagtypes", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-12"}, + { NULL, 1073741825, "10"}, + { NULL, 1, "1"}, + { "pkcs-12-keyBag", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-12-bagtypes"}, + { NULL, 1, "1"}, + { "pkcs-12-pkcs8ShroudedKeyBag", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-12-bagtypes"}, + { NULL, 1, "2"}, + { "pkcs-12-certBag", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-12-bagtypes"}, + { NULL, 1, "3"}, + { "pkcs-12-crlBag", 1879048204, NULL }, + { NULL, 1073741825, "pkcs-12-bagtypes"}, + { NULL, 1, "4"}, + { "pkcs-12-KeyBag", 1073741826, "pkcs-8-PrivateKeyInfo"}, + { "pkcs-12-PKCS8ShroudedKeyBag", 1073741826, "pkcs-8-EncryptedPrivateKeyInfo"}, + { "pkcs-12-CertBag", 1610612741, NULL }, + { "certId", 1073741836, NULL }, + { "certValue", 541073421, NULL }, + { NULL, 1073743880, "0"}, + { "certId", 1, NULL }, + { "pkcs-12-CRLBag", 1610612741, NULL }, + { "crlId", 1073741836, NULL }, + { "crlValue", 541073421, NULL }, + { NULL, 1073743880, "0"}, + { "crlId", 1, NULL }, + { "pkcs-12-PKCS12Attribute", 1073741826, "Attribute"}, + { "pkcs-7-data", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "rsadsi", 1073741825, "113549"}, + { "pkcs", 1073741825, "1"}, + { "pkcs7", 1073741825, "7"}, + { NULL, 1, "1"}, + { "pkcs-7-encryptedData", 1879048204, NULL }, + { "iso", 1073741825, "1"}, + { "member-body", 1073741825, "2"}, + { "us", 1073741825, "840"}, + { "rsadsi", 1073741825, "113549"}, + { "pkcs", 1073741825, "1"}, + { "pkcs7", 1073741825, "7"}, + { NULL, 1, "6"}, + { "pkcs-7-Data", 1073741831, NULL }, + { "pkcs-7-EncryptedData", 1610612741, NULL }, + { "version", 1073741826, "pkcs-7-CMSVersion"}, + { "encryptedContentInfo", 1073741826, "pkcs-7-EncryptedContentInfo"}, + { "unprotectedAttrs", 536895490, "pkcs-7-UnprotectedAttributes"}, + { NULL, 4104, "1"}, + { "pkcs-7-EncryptedContentInfo", 1610612741, NULL }, + { "contentType", 1073741826, "pkcs-7-ContentType"}, + { "contentEncryptionAlgorithm", 1073741826, "pkcs-7-ContentEncryptionAlgorithmIdentifier"}, + { "encryptedContent", 536895490, "pkcs-7-EncryptedContent"}, + { NULL, 4104, "0"}, + { "pkcs-7-ContentEncryptionAlgorithmIdentifier", 1073741826, "AlgorithmIdentifier"}, + { "pkcs-7-EncryptedContent", 1073741831, NULL }, + { "pkcs-7-UnprotectedAttributes", 1612709903, NULL }, + { "MAX", 1074266122, "1"}, + { NULL, 2, "Attribute"}, + { "id-at-domainComponent", 1880096780, "AttributeType"}, + { NULL, 1073741825, "0"}, + { NULL, 1073741825, "9"}, + { NULL, 1073741825, "2342"}, + { NULL, 1073741825, "19200300"}, + { NULL, 1073741825, "100"}, + { NULL, 1073741825, "1"}, + { NULL, 1, "25"}, + { "domainComponent", 1073741853, NULL }, + { "id-at-userId", 1880096780, "AttributeType"}, + { NULL, 1073741825, "0"}, + { NULL, 1073741825, "9"}, + { NULL, 1073741825, "2342"}, + { NULL, 1073741825, "19200300"}, + { NULL, 1073741825, "100"}, + { NULL, 1073741825, "1"}, + { NULL, 1, "1"}, + { "userId", 1073741826, "DirectoryString"}, + { "id-pda", 1879048204, NULL }, + { NULL, 1073741825, "id-pkix"}, + { NULL, 1, "9"}, + { "id-pda-dateOfBirth", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-pda"}, + { NULL, 1, "1"}, + { "DateOfBirth", 1073741861, NULL }, + { "id-pda-placeOfBirth", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-pda"}, + { NULL, 1, "2"}, + { "PlaceOfBirth", 1073741826, "DirectoryString"}, + { "id-pda-gender", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-pda"}, + { NULL, 1, "3"}, + { "Gender", 1612709919, NULL }, + { NULL, 1048586, "1"}, + { "id-pda-countryOfCitizenship", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-pda"}, + { NULL, 1, "4"}, + { "CountryOfCitizenship", 1612709919, NULL }, + { NULL, 1048586, "2"}, + { "id-pda-countryOfResidence", 1880096780, "AttributeType"}, + { NULL, 1073741825, "id-pda"}, + { NULL, 1, "5"}, + { "CountryOfResidence", 1612709919, NULL }, + { NULL, 1048586, "2"}, + { "PublicKeyAndChallenge", 1610612741, NULL }, + { "spki", 1073741826, "SubjectPublicKeyInfo"}, + { "challenge", 29, NULL }, + { "SignedPublicKeyAndChallenge", 1610612741, NULL }, + { "publicKeyAndChallenge", 1073741826, "PublicKeyAndChallenge"}, + { "signatureAlgorithm", 1073741826, "AlgorithmIdentifier"}, + { "signature", 6, NULL }, + { "ExtensionRequest", 536870923, NULL }, + { NULL, 2, "Extension"}, + { NULL, 0, NULL } +}; diff --git a/egg/test-armor.c b/egg/test-armor.c new file mode 100644 index 0000000..eecb285 --- /dev/null +++ b/egg/test-armor.c @@ -0,0 +1,159 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-armor.c: Test PEM and Armor parsing + + Copyright (C) 2012 Red Hat Inc. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-armor.h" +#include "egg/egg-symkey.h" +#include "egg/egg-openssl.h" +#include "egg/egg-secure-memory.h" +#include "egg/egg-testing.h" + +#include + +#include +#include +#include +#include + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); + +static void +on_pem_get_contents (GQuark type, + GBytes *data, + GBytes *outer, + GHashTable *headers, + gpointer user_data) +{ + GBytes **contents = user_data; + + g_assert_cmpstr (g_quark_to_string (type), ==, "TEST"); + g_assert (*contents == NULL); + *contents = g_bytes_ref (data); +} + + +static void +test_armor_parse (void) +{ + const char *pem_data = "-----BEGIN TEST-----\n" + "Z29vZCBtb3JuaW5nIGV2ZXJ5b25lCg==\n" + "-----END TEST-----\n"; + + GBytes *contents = NULL; + GBytes *check; + GBytes *bytes; + guint num; + + bytes = g_bytes_new_static (pem_data, strlen (pem_data)); + + num = egg_armor_parse (bytes, on_pem_get_contents, &contents); + g_assert_cmpint (num, ==, 1); + g_assert (contents != NULL); + + check = g_bytes_new ("good morning everyone\n", 22); + g_assert (g_bytes_equal (check, contents)); + + g_bytes_unref (check); + g_bytes_unref (contents); + g_bytes_unref (bytes); +} + +static void +test_armor_skip_checksum (void) +{ + const char *pem_data = "-----BEGIN TEST-----\n" + "Z29vZCBtb3JuaW5nIGV2ZXJ5b25lCg==\n" + "=checksum" + "-----END TEST-----\n"; + + GBytes *contents = NULL; + GBytes *check; + GBytes *bytes; + guint num; + + /* Check that the (above invalid) OpenPGP checksum is skipped */ + + bytes = g_bytes_new_static (pem_data, strlen (pem_data)); + + num = egg_armor_parse (bytes, on_pem_get_contents, &contents); + g_assert_cmpint (num, ==, 1); + g_assert (contents != NULL); + + check = g_bytes_new ("good morning everyone\n", 22); + g_assert (g_bytes_equal (check, contents)); + + g_bytes_unref (check); + g_bytes_unref (contents); + g_bytes_unref (bytes); +} + +static void +test_invalid (gconstpointer data) +{ + GBytes *bytes; + guint num; + + /* Invalid opening line above */ + + bytes = g_bytes_new_static (data, strlen (data)); + + num = egg_armor_parse (bytes, NULL, NULL); + g_assert_cmpint (num, ==, 0); + + g_bytes_unref (bytes); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/armor/parse", test_armor_parse); + g_test_add_func ("/armor/skip-checksum", test_armor_skip_checksum); + + g_test_add_data_func ("/armor/invalid-start", + "-----BEGIN TEST--", + test_invalid); + g_test_add_data_func ("/armor/invalid-end", + "-----BEGIN TEST-----\n" + "Z29vZCBtb3JuaW5nIGV2ZXJ5b25lCg==\n" + "--END TEST-----\n", + test_invalid); + g_test_add_data_func ("/armor/invalid-mismatch", + "-----BEGIN TEST-----\n" + "Z29vZCBtb3JuaW5nIGV2ZXJ5b25lCg==\n" + "-----END CERTIFICATE-----\n", + test_invalid); + g_test_add_data_func ("/armor/invalid-suffix", + "-----BEGIN TEST-----\n" + "Z29vZCBtb3JuaW5nIGV2ZXJ5b25lCg==\n" + "-----END TEST--xxxxxxxx\n", + test_invalid); + g_test_add_data_func ("/armor/invalid-truncated", + "-----BEGIN TEST-----\n" + "Z29vZCBtb3JuaW5nIGV2ZXJ5b25lCg==\n" + "-----END TEST--\n", + test_invalid); + + return g_test_run (); +} diff --git a/egg/test-asn1.c b/egg/test-asn1.c new file mode 100644 index 0000000..c4750b1 --- /dev/null +++ b/egg/test-asn1.c @@ -0,0 +1,2558 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-asn1.c: Test ASN1 stuf + + Copyright (C) 2009 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-testing.h" + +#include + +#include +#include +#include + +typedef struct _EggAsn1xDef ASN1_ARRAY_TYPE; +typedef struct _EggAsn1xDef asn1_static_node; +#include "test.asn.h" + +const gchar I33[] = "\x02\x01\x2A"; +const gchar I253[] = "\x02\x02\x00\xFD"; +const gchar BFALSE[] = "\x01\x01\x00"; +const gchar BTRUE[] = "\x01\x01\xFF"; +const gchar SFARNSWORTH[] = "\x04\x0A""farnsworth"; +const gchar SIMPLICIT[] = "\x85\x08""implicit"; +const gchar SEXPLICIT[] = "\xA5\x0A\x04\x08""explicit"; +const gchar SUNIVERSAL[] = "\x05\x09""universal"; +const gchar TGENERALIZED[] = "\x18\x0F""20070725130528Z"; +const gchar BITS_TEST[] = "\x03\x04\x06\x6e\x5d\xc0"; +const gchar BITS_BAD[] = "\x03\x04\x06\x6e\x5d\xc1"; +const gchar BITS_ZERO[] = "\x03\x01\x00"; +const gchar NULL_TEST[] = "\x05\x00"; + +/* ENUM with value = 2 */ +const gchar ENUM_TWO[] = "\x0A\x01\x02"; + +/* ENUM with value = 3 */ +const gchar ENUM_THREE[] = "\x0A\x01\x03"; + +#define XL(x) G_N_ELEMENTS (x) - 1 + +static void +test_boolean (void) +{ + GBytes *bytes; + GNode *asn; + gboolean value; + + asn = egg_asn1x_create (test_asn1_tab, "TestBoolean"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_BOOLEAN, ==, egg_asn1x_type (asn)); + + /* Shouldn't succeed */ + if (egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + + /* Decode a false */ + bytes = g_bytes_new_static (BFALSE, XL (BFALSE)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + value = TRUE; + if (!egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + g_assert (value == FALSE); + g_bytes_unref (bytes); + + /* Decode a true */ + bytes = g_bytes_new_static (BTRUE, XL (BTRUE)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + value = FALSE; + if (!egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + g_assert (value == TRUE); + g_bytes_unref (bytes); + + egg_asn1x_clear (asn); + + /* Shouldn't suceed after clear */ + if (egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +static void +test_boolean_decode_bad (void) +{ + const gchar BOOLEAN_INVALID_LENGTH[] = "\x01\x02\x00\x00"; + const gchar BOOLEAN_BAD_VALUE[] = "\x01\x01\x05"; + + GBytes *bytes; + GNode *asn; + gboolean ret; + + asn = egg_asn1x_create (test_asn1_tab, "TestBoolean"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (BOOLEAN_INVALID_LENGTH, XL (BOOLEAN_INVALID_LENGTH)); + ret = egg_asn1x_decode (asn, bytes); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "invalid length boolean") != NULL); + g_bytes_unref (bytes); + + bytes = g_bytes_new_static (BOOLEAN_BAD_VALUE, XL (BOOLEAN_BAD_VALUE)); + ret = egg_asn1x_decode (asn, bytes); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "boolean must be true or false") != NULL); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_boolean_default (void) +{ + GNode *asn; + GBytes *bytes; + + const gchar BOOLEAN[] = "\x30\x00"; + + asn = egg_asn1x_create (test_asn1_tab, "TestBooleanDefault"); + /* This is equal to the default value, and shouldn't be included */ + egg_asn1x_set_boolean (egg_asn1x_node (asn, "boolean", NULL), TRUE); + + bytes = egg_asn1x_encode (asn, NULL); + egg_asn1x_assert (bytes != NULL, asn); + egg_assert_cmpbytes (bytes, ==, BOOLEAN, XL (BOOLEAN)); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_null (void) +{ + GNode *asn; + GBytes *data; + + asn = egg_asn1x_create (test_asn1_tab, "TestNull"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_NULL, ==, egg_asn1x_type (asn)); + + egg_asn1x_set_null (asn); + + data = egg_asn1x_encode (asn, g_realloc); + egg_assert_cmpmem (NULL_TEST, XL (NULL_TEST), ==, g_bytes_get_data (data, NULL), g_bytes_get_size (data)); + + if (!egg_asn1x_decode (asn, data)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); + g_bytes_unref (data); +} + +static void +test_integer (void) +{ + GNode *asn; + gulong value; + GBytes *bytes; + + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_INTEGER, ==, egg_asn1x_type (asn)); + + /* Shouldn't succeed */ + if (egg_asn1x_get_integer_as_ulong (asn, &value)) + g_assert_not_reached (); + + /* Should suceed now */ + bytes = g_bytes_new_static (I33, XL (I33)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + if (!egg_asn1x_get_integer_as_ulong (asn, &value)) + g_assert_not_reached (); + g_assert (value == 42); + g_bytes_unref (bytes); + + egg_asn1x_clear (asn); + + /* Shouldn't suceed after clear */ + if (egg_asn1x_get_integer_as_ulong (asn, &value)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +static void +test_integer_zero_length (void) +{ + const gchar INTEGER_EMPTY[] = "\x02\x00"; + + GBytes *bytes; + GNode *asn; + gboolean ret; + + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (INTEGER_EMPTY, XL (INTEGER_EMPTY)); + ret = egg_asn1x_decode (asn, bytes); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "zero length integer") != NULL); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_unsigned (void) +{ + GNode *asn; + gulong value; + GBytes *check; + guchar val; + GBytes *bytes; + GBytes *usg; + + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_INTEGER, ==, egg_asn1x_type (asn)); + + /* Check with ulong */ + bytes = g_bytes_new_static (I253, XL (I253)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + if (!egg_asn1x_get_integer_as_ulong (asn, &value)) + g_assert_not_reached (); + g_assert (value == 253); + g_bytes_unref (bytes); + + egg_asn1x_clear (asn); + + egg_asn1x_set_integer_as_ulong (asn, 253); + + check = egg_asn1x_encode (asn, NULL); + egg_assert_cmpmem (I253, XL (I253), ==, g_bytes_get_data (check, NULL), g_bytes_get_size (check)); + g_bytes_unref (check); + + /* Now check with usg */ + bytes = g_bytes_new_static (I253, XL (I253)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + val = 0xFD; /* == 253 */ + usg = egg_asn1x_get_integer_as_usg (asn); + egg_assert_cmpmem (&val, 1, ==, g_bytes_get_data (usg, NULL), g_bytes_get_size (usg)); + g_bytes_unref (usg); + + egg_asn1x_clear (asn); + + egg_asn1x_take_integer_as_usg (asn, g_bytes_new_static (&val, 1)); + + check = egg_asn1x_encode (asn, NULL); + egg_assert_cmpsize (g_bytes_get_size (check), ==, XL (I253)); + egg_assert_cmpmem (I253, XL (I253), ==, g_bytes_get_data (check, NULL), g_bytes_get_size (check)); + g_bytes_unref (check); + + egg_asn1x_destroy (asn); +} + +static void +test_unsigned_not_set (void) +{ + GNode *asn; + GBytes *bytes; + + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn); + + bytes = egg_asn1x_get_integer_as_usg (asn); + g_assert (bytes == NULL); + + egg_asn1x_destroy (asn); +} + +static void +test_unsigned_default (void) +{ + GNode *asn; + GBytes *bytes; + + const gchar INTEGERS[] = "\x30\x06\x02\x01\x01\x02\x01\x02"; + + asn = egg_asn1x_create (test_asn1_tab, "TestIntegers"); + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (asn, "uint1", NULL), 1); + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (asn, "uint2", NULL), 2); + /* This is equal to the default value, and shouldn't be included */ + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (asn, "uint3", NULL), 8888); + + bytes = egg_asn1x_encode (asn, NULL); + egg_assert_cmpbytes (bytes, ==, INTEGERS, XL (INTEGERS)); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_unsigned_constant (void) +{ + gulong value; + GNode *asn; + + /* const gchar SEQ[] = "\x30\x00"; */ + + asn = egg_asn1x_create (test_asn1_tab, "TestConstant"); + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "version", NULL), &value)) + g_assert_not_reached (); + g_assert_cmpint (value, ==, 3); + + egg_asn1x_destroy (asn); +} + +static void +test_unsigned_zero (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\x02\x01\x00"; + + /* No bits set in 0 but should still be 1 byte */ + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + egg_asn1x_set_integer_as_ulong (asn, 0); + + bytes = egg_asn1x_encode (asn, NULL); + egg_asn1x_assert (bytes != NULL, asn); + egg_assert_cmpbytes (bytes, ==, DER, XL (DER)); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_integer_raw (void) +{ + GNode *asn; + GBytes *bytes; + + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static ("\x01\x02\x03", 3); + egg_asn1x_set_integer_as_raw (asn, bytes); + g_bytes_unref (bytes); + + bytes = egg_asn1x_encode (asn, NULL); + egg_assert_cmpbytes (bytes, ==, "\x02\x03\x01\x02\x03", 5); + g_bytes_unref (bytes); + + bytes = egg_asn1x_get_integer_as_raw (asn); + egg_assert_cmpbytes (bytes, ==, "\x01\x02\x03", 3); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_integer_raw_not_twos_complement (void) +{ + GNode *asn; + GBytes *bytes; + + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static ("\x81\x02\x03", 3); + + if (g_test_subprocess ()) { + egg_asn1x_set_integer_as_raw (asn, bytes); /* UNREACHABLE: */ + return; + } + + g_test_trap_subprocess ("/asn1/integer/raw-not-twos-complement", 0, G_TEST_SUBPROCESS_INHERIT_STDOUT); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*not two's complement*"); + + g_bytes_unref (bytes); + egg_asn1x_destroy (asn); +} + +static void +test_octet_string (void) +{ + GNode *asn; + gchar *value; + GBytes *bytes; + + asn = egg_asn1x_create (test_asn1_tab, "TestOctetString"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_OCTET_STRING, ==, egg_asn1x_type (asn)); + + /* Shouldn't succeed */ + if (egg_asn1x_get_string_as_utf8 (asn, NULL)) + g_assert_not_reached (); + + /* Should work */ + bytes = g_bytes_new_static (SFARNSWORTH, XL (SFARNSWORTH)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + value = egg_asn1x_get_string_as_utf8 (asn, NULL); + g_assert_cmpstr (value, ==, "farnsworth"); + g_free (value); + + egg_asn1x_clear (asn); + + /* Shouldn't succeed */ + if (egg_asn1x_get_string_as_utf8 (asn, NULL)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +static void +test_octet_string_set_bad_utf8 (void) +{ + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestOctetString"); + g_assert (asn); + + if (egg_asn1x_set_string_as_utf8 (asn, "\xFF\xFA", NULL)) + g_assert_not_reached (); + + /* Shouldn't succeed */ + if (egg_asn1x_get_string_as_utf8 (asn, NULL)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +static void +test_octet_string_bmp_as_utf8 (void) +{ + GBytes *bytes; + GNode *asn; + gchar *data; + + const gchar SFUER[] = "\x04\x06""\x00\x46\x00\xfc\x00\x72"; + + bytes = g_bytes_new_static (SFUER, XL (SFUER)); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestOctetString", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + data = egg_asn1x_get_bmpstring_as_utf8 (asn); + g_assert_cmpstr (data, ==, "F\303\274r"); + + g_free (data); + egg_asn1x_destroy (asn); +} + +static void +test_octet_string_get_as_bytes (void) +{ + GBytes *bytes; + GNode *asn; + + bytes = g_bytes_new_static (SFARNSWORTH, XL (SFARNSWORTH)); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestOctetString", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + bytes = egg_asn1x_get_string_as_bytes (asn); + g_assert (bytes != NULL); + egg_assert_cmpbytes (bytes, ==, "farnsworth", 10); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_octet_string_set_as_bytes (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestOctetString"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static ("farnsworth", 10); + egg_asn1x_set_string_as_bytes (asn, bytes); + g_bytes_unref (bytes); + + bytes = egg_asn1x_encode (asn, NULL); + g_assert (bytes != NULL); + egg_assert_cmpbytes (bytes, ==, SFARNSWORTH, XL (SFARNSWORTH)); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_octet_string_structured (void) +{ + GBytes *bytes; + GNode *asn; + guchar *string; + gsize n_string = 0; + + const gchar STRUCTURED[] = "\x24\x0c" + "\x04\x04""blah" + "\x04\x04""blah"; + + bytes = g_bytes_new_static (STRUCTURED, XL (STRUCTURED)); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestOctetString", bytes); + g_bytes_unref (bytes); + + string = egg_asn1x_get_string_as_raw (asn, NULL, &n_string); + g_assert_cmpstr ((gchar *)string, ==, "blahblah"); + g_assert_cmpint (n_string, ==, 8); + g_free (string); + + egg_asn1x_destroy (asn); +} + +static void +test_octet_string_structured_bad (void) +{ + GBytes *bytes; + GNode *asn; + guchar *string; + gsize n_string = 0; + + const gchar STRUCTURED[] = "\x24\x0c" + "\x24\x04\x04\02""bl" + "\x04\x04""blah"; + + bytes = g_bytes_new_static (STRUCTURED, XL (STRUCTURED)); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestOctetString", bytes); + g_bytes_unref (bytes); + + string = egg_asn1x_get_string_as_raw (asn, NULL, &n_string); + g_assert (string == NULL); + + egg_asn1x_destroy (asn); +} + +static void +test_generalized_time (void) +{ + GBytes *bytes; + GNode *asn; + glong value; + + asn = egg_asn1x_create (test_asn1_tab, "TestGeneralized"); + g_assert (asn); + + if (EGG_ASN1X_TIME != egg_asn1x_type (asn)) + g_assert_cmpint (EGG_ASN1X_GENERALIZED_TIME, ==, egg_asn1x_type (asn)); + + /* Shouldn't succeed */ + value = egg_asn1x_get_time_as_long (asn); + g_assert (value == -1); + + /* Should work */ + bytes = g_bytes_new_static (TGENERALIZED, XL (TGENERALIZED)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + value = egg_asn1x_get_time_as_long (asn); + g_assert (value == 1185368728); + + egg_asn1x_clear (asn); + + /* Shouldn't succeed */ + value = egg_asn1x_get_time_as_long (asn); + g_assert (value == -1); + + egg_asn1x_destroy (asn); +} + +static void +test_time_get_missing (void) +{ + GDate date; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestGeneralized"); + if (egg_asn1x_get_time_as_date (asn, &date)) + g_assert_not_reached (); + g_assert (egg_asn1x_get_time_as_long (asn) == -1); + egg_asn1x_destroy (asn); +} + +static void +test_implicit_encode (void) +{ + GBytes *bytes; + GNode *asn; + gchar *value; + + asn = egg_asn1x_create (test_asn1_tab, "TestImplicit"); + g_assert (asn); + + /* Should work */ + bytes = g_bytes_new_static (SIMPLICIT, XL (SIMPLICIT)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + value = egg_asn1x_get_string_as_utf8 (asn, NULL); + g_assert_cmpstr (value, ==, "implicit"); + g_free (value); + + egg_asn1x_destroy (asn); +} + +static void +test_implicit_decode (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestImplicit"); + g_assert (asn); + + if (!egg_asn1x_set_string_as_utf8 (asn, g_strdup ("implicit"), g_free)) + g_assert_not_reached (); + + bytes = egg_asn1x_encode (asn, NULL); + egg_assert_cmpbytes (bytes, ==, SIMPLICIT, XL (SIMPLICIT)); + + egg_asn1x_destroy (asn); + g_bytes_unref (bytes); +} + +static void +test_explicit_decode (void) +{ + GBytes *bytes; + GNode *asn; + gchar *value; + + asn = egg_asn1x_create (test_asn1_tab, "TestExplicit"); + g_assert (asn); + + /* Should work */ + bytes = g_bytes_new_static (SEXPLICIT, XL (SEXPLICIT)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + value = egg_asn1x_get_string_as_utf8 (asn, NULL); + g_assert_cmpstr (value, ==, "explicit"); + g_free (value); + + egg_asn1x_destroy (asn); +} + +static void +test_explicit_no_context_specific (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\x45\x0A\x04\x08""explicit"; + + asn = egg_asn1x_create (test_asn1_tab, "TestExplicit"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "missing context specific tag")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_explicit_no_context_child (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\xA5\x00"; + + asn = egg_asn1x_create (test_asn1_tab, "TestExplicit"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "missing context specific child")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_explicit_extra_context_child (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\xA5\x14" + "\x04\x08""explicit" + "\x04\x08""explicit"; + + asn = egg_asn1x_create (test_asn1_tab, "TestExplicit"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "multiple context specific children")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_explicit_encode (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestExplicit"); + g_assert (asn); + + if (!egg_asn1x_set_string_as_utf8 (asn, g_strdup ("explicit"), g_free)) + g_assert_not_reached (); + + bytes = egg_asn1x_encode (asn, NULL); + egg_assert_cmpbytes (bytes, ==, SEXPLICIT, XL (SEXPLICIT)); + + egg_asn1x_destroy (asn); + g_bytes_unref (bytes); +} + +static void +test_universal_decode (void) +{ + GBytes *bytes; + GNode *asn; + gchar *value; + + asn = egg_asn1x_create (test_asn1_tab, "TestUniversal"); + g_assert (asn); + + /* Should work */ + bytes = g_bytes_new_static (SUNIVERSAL, XL (SUNIVERSAL)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + value = egg_asn1x_get_string_as_utf8 (asn, NULL); + g_assert_cmpstr (value, ==, "universal"); + g_free (value); + + egg_asn1x_destroy (asn); +} + +static void +test_universal_encode (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestUniversal"); + g_assert (asn); + + if (!egg_asn1x_set_string_as_utf8 (asn, g_strdup ("universal"), g_free)) + g_assert_not_reached (); + + bytes = egg_asn1x_encode (asn, NULL); + egg_assert_cmpbytes (bytes, ==, SUNIVERSAL, XL (SUNIVERSAL)); + + egg_asn1x_destroy (asn); + g_bytes_unref (bytes); +} + +static void +test_bit_string_decode (void) +{ + GBytes *bytes; + GNode *asn; + GBytes *bits; + guint n_bits; + const guchar *data; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_BIT_STRING, ==, egg_asn1x_type (asn)); + + /* Should work */ + bytes = g_bytes_new_static (BITS_TEST, XL (BITS_TEST)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + bits = egg_asn1x_get_bits_as_raw (asn, &n_bits); + g_assert (bits != NULL); + g_assert_cmpuint (n_bits, ==, 18); + data = g_bytes_get_data (bits, NULL); + g_assert_cmpint (data[0], ==, 0x6e); + g_assert_cmpint (data[1], ==, 0x5d); + g_assert_cmpint (data[2], ==, 0xc0); + + g_bytes_unref (bits); + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_decode_bad (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + /* Should not work */ + bytes = g_bytes_new_static (BITS_BAD, XL (BITS_BAD)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_decode_ulong (void) +{ + GBytes *bytes; + GNode *asn; + gulong bits; + guint n_bits; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + /* Should work */ + bytes = g_bytes_new_static (BITS_TEST, XL (BITS_TEST)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + if (!egg_asn1x_get_bits_as_ulong (asn, &bits, &n_bits)) + g_assert_not_reached (); + + g_assert_cmpuint (n_bits, ==, 18); + g_assert_cmphex (bits, ==, 0x1b977); + + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_ulong_too_long (void) +{ + GBytes *bytes; + GNode *asn; + gulong bits; + guint n_bits; + + const gchar BITS_TEST[] = "\x03\x20\x00\x01\x02\x03\x04\x05\x06\x07" + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x00\x01\x02\x03\x04\x05\x06\x07" + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + /* Should work */ + + bytes = g_bytes_new_static (BITS_TEST, XL (BITS_TEST)); + if (!egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + if (egg_asn1x_get_bits_as_ulong (asn, &bits, &n_bits)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_get_not_set (void) +{ + GNode *asn; + gulong bits; + guint n_bits; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + + if (egg_asn1x_get_bits_as_ulong (asn, &bits, &n_bits)) + g_assert_not_reached (); + g_assert (egg_asn1x_get_bits_as_raw (asn, &n_bits) == NULL); + + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_invalid_length (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\x03\x00"; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + /* Should work */ + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "invalid length bit string")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_invalid_empty (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\x03\x01\x09"; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + /* Should work */ + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "invalid number of empty bits")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_encode_decode (void) +{ + GBytes *data; + GNode *asn; + guchar bits[] = { 0x5d, 0x6e, 0x83 }; + GBytes *check; + GBytes *bytes; + const guchar *ch; + guint n_bits = 17; + guint n_check; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + bytes = g_bytes_new (bits, 3); + egg_asn1x_set_bits_as_raw (asn, bytes, n_bits); + g_bytes_unref (bytes); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data); + + if (!egg_asn1x_decode (asn, data)) + g_assert_not_reached (); + + g_bytes_unref (data); + + check = egg_asn1x_get_bits_as_raw (asn, &n_check); + g_assert (check != NULL); + g_assert_cmpuint (n_check, ==, 17); + ch = g_bytes_get_data (check, NULL); + g_assert_cmpint (ch[0], ==, 0x5d); + g_assert_cmpint (ch[1], ==, 0x6e); + g_assert_cmpint (ch[2], ==, 0x80); + + g_bytes_unref (check); + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_encode_decode_ulong (void) +{ + GBytes *data; + GNode *asn; + gulong check, bits = 0x0101b977; + guint n_check, n_bits = 18; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + egg_asn1x_set_bits_as_ulong (asn, bits, n_bits); + data = egg_asn1x_encode (asn, NULL); + g_assert (data); + + if (!egg_asn1x_decode (asn, data)) + g_assert_not_reached (); + + g_bytes_unref (data); + + if (!egg_asn1x_get_bits_as_ulong (asn, &check, &n_check)) + g_assert_not_reached (); + + g_assert_cmpuint (n_check, ==, 18); + g_assert_cmphex (check, ==, 0x1b977); + + egg_asn1x_destroy (asn); +} + +static void +test_bit_string_encode_decode_zero (void) +{ + GBytes *data; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestBitString"); + g_assert (asn); + + egg_asn1x_take_bits_as_raw (asn, g_bytes_new_static ("", 0), 0); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data); + + egg_assert_cmpmem (g_bytes_get_data (data, NULL), g_bytes_get_size (data), ==, BITS_ZERO, XL (BITS_ZERO)); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); +} + +static void +test_have (void) +{ + GBytes *data; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestBoolean"); + g_assert (asn); + + g_assert (!egg_asn1x_have (asn)); + + egg_asn1x_set_boolean (asn, TRUE); + + g_assert (egg_asn1x_have (asn)); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data); + + g_assert (egg_asn1x_have (asn)); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); +} + +static gboolean is_freed = FALSE; + +static void +test_is_freed (gpointer unused) +{ + g_assert (!is_freed); + is_freed = TRUE; +} + +static void +test_any_raw (void) +{ + GBytes *bytes; + GNode *asn, *node; + GBytes *data; + GBytes *check; + + /* ENCODED SEQUENCE ANY with OCTET STRING */ + const gchar SEQ_ENCODING[] = "\x30\x0C\x04\x0A""farnsworth"; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnySeq"); + g_assert (asn); + + is_freed = FALSE; + node = egg_asn1x_node (asn, "contents", NULL); + g_assert (node); + + bytes = g_bytes_new_with_free_func (SFARNSWORTH, XL (SFARNSWORTH), + test_is_freed, NULL); + if (!egg_asn1x_set_any_raw (node, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + + egg_assert_cmpbytes (data, ==, SEQ_ENCODING, XL (SEQ_ENCODING)); + + check = egg_asn1x_get_element_raw (node); + g_assert (check != NULL); + egg_assert_cmpbytes (check, ==, SFARNSWORTH, XL (SFARNSWORTH)); + g_bytes_unref (check); + + check = egg_asn1x_get_any_raw (node, NULL); + g_assert (check != NULL); + egg_assert_cmpbytes (check, ==, SFARNSWORTH, XL (SFARNSWORTH)); + g_bytes_unref (check); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); + g_assert (is_freed); +} + +static void +test_any_raw_explicit (void) +{ + GBytes *bytes; + GNode *asn, *node; + GBytes *data; + + /* ENCODED SEQUENCE [89] ANY with OCTET STRING */ + const gchar SEQ_ENCODING[] = "\x30\x0F\xBF\x59\x0C\x04\x0A""farnsworth"; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnyExp"); + g_assert (asn); + + is_freed = FALSE; + node = egg_asn1x_node (asn, "contents", NULL); + g_assert (node); + + bytes = g_bytes_new_with_free_func (SFARNSWORTH, XL (SFARNSWORTH), test_is_freed, NULL); + if (!egg_asn1x_set_any_raw (node, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + + egg_assert_cmpbytes (data, ==, SEQ_ENCODING, XL (SEQ_ENCODING)); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); + g_assert (is_freed); +} + +static void +test_any_raw_invalid (void) +{ + GBytes *bytes; + GNode *asn, *node; + + const gchar TRUNCATED[] = "\x04\x0A""farns"; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnySeq"); + g_assert (asn != NULL); + + node = egg_asn1x_node (asn, "contents", NULL); + g_assert (node != NULL); + + bytes = g_bytes_new_static (TRUNCATED, XL (TRUNCATED)); + if (egg_asn1x_set_any_raw (node, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (node), "content is not encoded properly") != NULL); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_any_raw_not_set (void) +{ + GBytes *check; + GNode *asn, *node; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnySeq"); + g_assert (asn != NULL); + + node = egg_asn1x_node (asn, "contents", NULL); + g_assert (node != NULL); + + check = egg_asn1x_get_any_raw (node, NULL); + g_assert (check == NULL); + + egg_asn1x_destroy (asn); +} + +static void +test_any_into (void) +{ + GBytes *bytes; + GNode *asn, *node; + GNode *part; + GBytes *data; + GBytes *check; + + /* ENCODED SEQUENCE ANY with OCTET STRING */ + const gchar SEQ_ENCODING[] = "\x30\x0C\x04\x0A""farnsworth"; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnySeq"); + g_assert (asn != NULL); + + is_freed = FALSE; + node = egg_asn1x_node (asn, "contents", NULL); + g_assert (node); + + bytes = g_bytes_new_with_free_func (SFARNSWORTH, XL (SFARNSWORTH), + test_is_freed, NULL); + part = egg_asn1x_create_and_decode (test_asn1_tab, "TestOctetString", bytes); + g_assert (part != NULL); + g_bytes_unref (bytes); + + egg_asn1x_set_any_from (node, part); + egg_asn1x_destroy (part); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + egg_assert_cmpbytes (data, ==, SEQ_ENCODING, XL (SEQ_ENCODING)); + + part = egg_asn1x_create (test_asn1_tab, "TestOctetString"); + if (!egg_asn1x_get_any_into (node, part)) + g_assert_not_reached (); + + check = egg_asn1x_encode (part, NULL); + egg_asn1x_destroy (part); + g_assert (check != NULL); + egg_assert_cmpbytes (check, ==, SFARNSWORTH, XL (SFARNSWORTH)); + g_bytes_unref (check); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); + g_assert (is_freed); +} + +static void +test_any_into_explicit (void) +{ + GBytes *bytes; + GNode *asn, *node; + GNode *part; + GBytes *data; + GBytes *check; + + /* ENCODED SEQUENCE [89] ANY with OCTET STRING */ + const gchar SEQ_ENCODING[] = "\x30\x0F\xBF\x59\x0C\x04\x0A""farnsworth"; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnyExp"); + g_assert (asn != NULL); + + is_freed = FALSE; + node = egg_asn1x_node (asn, "contents", NULL); + g_assert (node); + + bytes = g_bytes_new_with_free_func (SFARNSWORTH, XL (SFARNSWORTH), + test_is_freed, NULL); + part = egg_asn1x_create_and_decode (test_asn1_tab, "TestOctetString", bytes); + g_assert (part != NULL); + g_bytes_unref (bytes); + + egg_asn1x_set_any_from (node, part); + egg_asn1x_destroy (part); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + egg_assert_cmpbytes (data, ==, SEQ_ENCODING, XL (SEQ_ENCODING)); + + part = egg_asn1x_create (test_asn1_tab, "TestOctetString"); + if (!egg_asn1x_get_any_into (node, part)) + g_assert_not_reached (); + + check = egg_asn1x_encode (part, NULL); + egg_asn1x_destroy (part); + g_assert (check != NULL); + egg_assert_cmpbytes (check, ==, SFARNSWORTH, XL (SFARNSWORTH)); + g_bytes_unref (check); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); + g_assert (is_freed); +} + +static void +test_any_into_explicit_not_set (void) +{ + GNode *asn, *node; + GNode *part; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnyExp"); + g_assert (asn != NULL); + + node = egg_asn1x_node (asn, "contents", NULL); + g_assert (node); + + part = egg_asn1x_create (test_asn1_tab, "TestOctetString"); + if (egg_asn1x_get_any_into (node, part)) + g_assert_not_reached (); + + egg_asn1x_destroy (part); + egg_asn1x_destroy (asn); +} + +static void +test_choice_not_chosen (void) +{ + GBytes *bytes; + GNode *asn, *node; + GBytes *data; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnyChoice"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_CHOICE, ==, egg_asn1x_type (asn)); + + node = egg_asn1x_node (asn, "choiceShortTag", NULL); + g_assert (node); + + bytes = g_bytes_new_static (SFARNSWORTH, XL (SFARNSWORTH)); + if (!egg_asn1x_set_any_raw (node, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + /* egg_asn1x_set_choice() was not called */ + data = egg_asn1x_encode (asn, NULL); + g_assert (data == NULL); + g_assert (egg_asn1x_message (asn)); + g_assert (strstr (egg_asn1x_message (asn), "TestAnyChoice") != NULL); + + egg_asn1x_destroy (asn); +} + +static void +perform_asn1_any_choice_set_raw (const gchar *choice, const gchar *encoding, gsize n_encoding) +{ + GBytes *bytes; + GNode *asn, *node; + GBytes *data; + GBytes *check; + + asn = egg_asn1x_create (test_asn1_tab, "TestAnyChoice"); + g_assert (asn); + + g_assert_cmpint (EGG_ASN1X_CHOICE, ==, egg_asn1x_type (asn)); + + is_freed = FALSE; + node = egg_asn1x_node (asn, choice, NULL); + g_assert (node); + + if (!egg_asn1x_set_choice (asn, node)) + g_assert_not_reached (); + + bytes = g_bytes_new_with_free_func (SFARNSWORTH, XL (SFARNSWORTH), test_is_freed, NULL); + if (!egg_asn1x_set_any_raw (node, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + data = egg_asn1x_encode (asn, NULL); + if (data == NULL) { + g_printerr ("%s\n", egg_asn1x_message (asn)); + g_assert_not_reached (); + } + g_assert (data != NULL); + + egg_assert_cmpbytes (data, ==, encoding, n_encoding); + + check = egg_asn1x_get_element_raw (node); + g_assert (check != NULL); + + egg_assert_cmpbytes (check, ==, SFARNSWORTH, XL (SFARNSWORTH)); + + g_bytes_unref (data); + g_bytes_unref (check); + egg_asn1x_destroy (asn); + g_assert (is_freed); +} + +static void +test_any_choice_set_raw_short_tag (void) +{ + const gchar ENCODING[] = "\xBE\x0C\x04\x0A""farnsworth"; + perform_asn1_any_choice_set_raw ("choiceShortTag", ENCODING, XL (ENCODING)); +} + +static void +test_any_choice_set_raw_long_tag (void) +{ + const gchar ENCODING[] = "\xBF\x1F\x0C\x04\x0A""farnsworth"; + perform_asn1_any_choice_set_raw ("choiceLongTag", ENCODING, XL (ENCODING)); +} + +static void +test_seq_of_any (void) +{ + GNode *asn; + GNode *integer; + GBytes *bytes; + gboolean ret; + gulong value; + + const gchar DER[] = "\x30\x06" + "\x02\x01\x88" + "\x02\x01\x33"; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOfAny"); + g_assert (asn != NULL); + + egg_asn1x_append (asn); + egg_asn1x_append (asn); + + bytes = g_bytes_new_static (DER, XL (DER)); + ret = egg_asn1x_decode (asn, bytes); + egg_asn1x_assert (ret == TRUE, asn); + g_bytes_unref (bytes); + + integer = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (integer != NULL); + + ret = egg_asn1x_get_any_into (egg_asn1x_node (asn, 1, NULL), integer); + egg_asn1x_assert (ret == TRUE, integer); + if (!egg_asn1x_get_integer_as_ulong (integer, &value)) + g_assert_not_reached (); + g_assert_cmpint (value, ==, 0x88); + + ret = egg_asn1x_get_any_into (egg_asn1x_node (asn, 2, NULL), integer); + egg_asn1x_assert (ret == TRUE, integer); + if (!egg_asn1x_get_integer_as_ulong (integer, &value)) + g_assert_not_reached (); + g_assert_cmpint (value, ==, 0x33); + + egg_asn1x_destroy (integer); + egg_asn1x_destroy (asn); +} + +static void +test_seq_of_invalid (void) +{ + GNode *asn; + GBytes *bytes; + + const gchar DER[] = "\x30\x05" + "\x04\x00" + "\x02\x01\x88"; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOf"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_seq_of_different (void) +{ + GNode *asn; + GBytes *bytes; + + const gchar DER[] = "\x30\x05" + "\x02\x01\x88" + "\x04\x00"; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOf"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_set_order (void) +{ + GNode *asn; + GBytes *bytes; + + const gchar DER[] = "\x31\x0f" + "\xA2\x03\x02\x01\x99" + "\xA1\x03\x02\x01\x88" + "\xA3\x03\x02\x01\x88"; + + asn = egg_asn1x_create (test_asn1_tab, "TestSet"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "content must be in ascending order")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_append (void) +{ + GBytes *bytes; + GNode *asn; + GNode *child; + GBytes *data; + + /* SEQUENCE OF with one INTEGER = 1 */ + const gchar SEQOF_ONE[] = "\x30\x03\x02\x01\x01"; + + /* SEQUENCE OF with two INTEGER = 1, 2 */ + const gchar SEQOF_TWO[] = "\x30\x06\x02\x01\x01\x02\x01\x02"; + + bytes = g_bytes_new_static (SEQOF_ONE, XL (SEQOF_ONE)); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestSeqOf", bytes); + g_assert (asn); + g_bytes_unref (bytes); + + g_assert_cmpint (EGG_ASN1X_SEQUENCE_OF, ==, egg_asn1x_type (asn)); + + child = egg_asn1x_append (asn); + g_assert (child); + + /* Second integer is 2 */ + egg_asn1x_set_integer_as_ulong (child, 2); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + + egg_assert_cmpbytes (data, ==, SEQOF_TWO, XL (SEQOF_TWO)); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); +} + +static void +test_append_and_clear (void) +{ + GBytes *data; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOf"); + g_assert (asn); + + g_assert_cmpuint (egg_asn1x_count (asn), ==, 0); + + egg_asn1x_set_integer_as_ulong (egg_asn1x_append (asn), 2); + egg_asn1x_set_integer_as_ulong (egg_asn1x_append (asn), 3); + + g_assert_cmpuint (egg_asn1x_count (asn), ==, 2); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + + g_assert_cmpuint (egg_asn1x_count (asn), ==, 2); + + egg_asn1x_clear (asn); + g_assert_cmpuint (egg_asn1x_count (asn), ==, 0); + + egg_asn1x_destroy (asn); + g_bytes_unref (data); +} + +static void +test_setof (void) +{ + GBytes *bytes; + GNode *asn; + GBytes *data; + + /* SEQUENCE OF with one INTEGER = 3 */ + const gchar SETOF_ONE[] = "\x31\x03\x02\x01\x03"; + + /* SET OF with two INTEGER = 1, 3, 8 */ + const gchar SETOF_THREE[] = "\x31\x09\x02\x01\x01\x02\x01\x03\x02\x01\x08"; + + bytes = g_bytes_new_static (SETOF_ONE, XL (SETOF_ONE)); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestSetOf", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + g_assert_cmpint (EGG_ASN1X_SET_OF, ==, egg_asn1x_type (asn)); + + /* Add integer 1, in SET OF DER should sort to front */ + egg_asn1x_set_integer_as_ulong (egg_asn1x_append (asn), 1); + + /* Add integer 8, in SET OF DER should sort to back */ + egg_asn1x_set_integer_as_ulong (egg_asn1x_append (asn), 8); + + data = egg_asn1x_encode (asn, NULL); + if (data == NULL) { + g_printerr ("%s\n", egg_asn1x_message (asn)); + g_assert_not_reached (); + } + + egg_assert_cmpbytes (data, ==, SETOF_THREE, XL (SETOF_THREE)); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); +} + +static void +test_setof_empty (void) +{ + GBytes *data; + GNode *asn; + + /* SEQUENCE OF with nothing */ + const gchar SETOF_NONE[] = "\x31\x00"; + + asn = egg_asn1x_create (test_asn1_tab, "TestSetOf"); + g_assert (asn); + + data = egg_asn1x_encode (asn, NULL); + if (data == NULL) { + g_printerr ("%s\n", egg_asn1x_message (asn)); + g_assert_not_reached (); + } + + egg_assert_cmpbytes (data, ==, SETOF_NONE, XL (SETOF_NONE)); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); +} + +static void +test_enumerated (void) +{ + GBytes *bytes; + GNode *asn; + GBytes *data; + GQuark value; + + bytes = g_bytes_new_static (ENUM_TWO, XL (ENUM_TWO)); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestEnumerated", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + g_assert_cmpint (EGG_ASN1X_ENUMERATED, ==, egg_asn1x_type (asn)); + + value = egg_asn1x_get_enumerated (asn); + g_assert (value); + g_assert_cmpstr (g_quark_to_string (value), ==, "valueTwo"); + + egg_asn1x_set_enumerated (asn, g_quark_from_static_string ("valueThree")); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + + egg_assert_cmpbytes (data, ==, ENUM_THREE, XL (ENUM_THREE)); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); +} + +static void +test_enumerated_decode_bad (void) +{ + const gchar ENUM_NEGATIVE[] = "\x0A\x01\x85"; + + GBytes *bytes; + GNode *asn; + gboolean ret; + + asn = egg_asn1x_create (test_asn1_tab, "TestEnumerated"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (ENUM_NEGATIVE, XL (ENUM_NEGATIVE)); + ret = egg_asn1x_decode (asn, bytes); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "enumerated must be positive") != NULL); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_enumerated_not_in_list (void) +{ + const gchar ENUM_OTHER[] = "\x0A\x01\x08"; + const gchar ENUM_LARGE[] = "\x0A\x20\x00\x01\x02\x03\x04\x05\x06\x07" + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x00\x01\x02\x03\x04\x05\x06\x07" + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"; + + GBytes *bytes; + GNode *asn; + gboolean ret; + + asn = egg_asn1x_create (test_asn1_tab, "TestEnumerated"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (ENUM_OTHER, XL (ENUM_OTHER)); + ret = egg_asn1x_decode (asn, bytes); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "not part of list") != NULL); + g_bytes_unref (bytes); + + bytes = g_bytes_new_static (ENUM_LARGE, XL (ENUM_LARGE)); + ret = egg_asn1x_decode (asn, bytes); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "not part of list") != NULL); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_enumerated_not_set (void) +{ + GNode *asn; + GQuark value; + + asn = egg_asn1x_create (test_asn1_tab, "TestEnumerated"); + g_assert (asn != NULL); + + value = egg_asn1x_get_enumerated (asn); + g_assert (value == 0); + + egg_asn1x_destroy (asn); +} + + +typedef struct { + GNode *asn1; + guchar *data; + gsize n_data; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GBytes *bytes; + + if (!g_file_get_contents (SRCDIR "/egg/fixtures/test-certificate-1.der", + (gchar**)&test->data, &test->n_data, NULL)) + g_assert_not_reached (); + + test->asn1 = egg_asn1x_create (pkix_asn1_tab, "Certificate"); + g_assert (test->asn1 != NULL); + + bytes = g_bytes_new_static (test->data, test->n_data); + if (!egg_asn1x_decode (test->asn1, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + egg_asn1x_destroy (test->asn1); + g_free (test->data); +} + +static void +test_node_name (Test* test, gconstpointer unused) +{ + g_assert_cmpstr (egg_asn1x_name (test->asn1), ==, "Certificate"); +} + +static void +test_asn1_integers (Test* test, gconstpointer unused) +{ + GBytes *data; + GNode *asn; + gboolean ret; + gulong val; + + asn = egg_asn1x_create (test_asn1_tab, "TestIntegers"); + g_assert ("asn test structure is null" && asn != NULL); + + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (asn, "uint1", NULL), 35); + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (asn, "uint2", NULL), 23456); + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (asn, "uint3", NULL), 209384022); + + /* Now encode the whole caboodle */ + data = egg_asn1x_encode (asn, NULL); + g_assert ("encoding asn1 didn't work" && data != NULL); + + egg_asn1x_destroy (asn); + + /* Now decode it all nicely */ + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestIntegers", data); + g_return_if_fail (asn != NULL); + + /* And get out the values */ + ret = egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "uint1", NULL), &val); + g_assert ("couldn't read integer from asn1" && ret); + g_assert_cmpuint (val, ==, 35); + + ret = egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "uint2", NULL), &val); + g_assert ("couldn't read integer from asn1" && ret); + g_assert_cmpuint (val, ==, 23456); + + ret = egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "uint3", NULL), &val); + g_assert ("couldn't read integer from asn1" && ret); + g_assert_cmpuint (val, ==, 209384022); + + egg_asn1x_destroy (asn); + g_bytes_unref (data); +} + +static void +test_boolean_seq (Test* test, gconstpointer unused) +{ + GBytes *data; + GNode *asn = NULL; + gboolean value, ret; + + /* The first boolean has a default of FALSE, so doesn't get encoded if FALSE */ + const gchar SEQ_BOOLEAN_TRUE_FALSE[] = "\x30\x06\x01\x01\xFF\x01\x01\x00"; + const gchar SEQ_BOOLEAN_FALSE_FALSE[] = "\x30\x03\x01\x01\x00"; + + asn = egg_asn1x_create (test_asn1_tab, "TestBooleanSeq"); + g_assert ("asn test structure is null" && asn != NULL); + + /* Get the default value */ + value = TRUE; + ret = egg_asn1x_get_boolean (egg_asn1x_node (asn, "boolean", NULL), &value); + g_assert (ret == TRUE); + g_assert (value == FALSE); + + egg_asn1x_set_boolean (egg_asn1x_node (asn, "boolean", NULL), TRUE); + egg_asn1x_set_boolean (egg_asn1x_node (asn, "boolean2", NULL), FALSE); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + egg_assert_cmpbytes (data, ==, SEQ_BOOLEAN_TRUE_FALSE, XL (SEQ_BOOLEAN_TRUE_FALSE)); + g_bytes_unref (data); + + ret = egg_asn1x_get_boolean (egg_asn1x_node (asn, "boolean", NULL), &value); + g_assert (ret); + g_assert (value == TRUE); + + egg_asn1x_set_boolean (egg_asn1x_node (asn, "boolean", NULL), FALSE); + + data = egg_asn1x_encode (asn, NULL); + g_assert (data != NULL); + egg_assert_cmpbytes (data, ==, SEQ_BOOLEAN_FALSE_FALSE, XL (SEQ_BOOLEAN_FALSE_FALSE)); + + ret = egg_asn1x_get_boolean (egg_asn1x_node (asn, "boolean", NULL), &value); + g_assert (ret); + g_assert (value == FALSE); + + g_bytes_unref (data); + egg_asn1x_destroy (asn); +} + +static void +test_write_value (Test* test, gconstpointer unused) +{ + GBytes *encoded; + GNode *asn = NULL; + guchar *data; + gsize n_data; + + asn = egg_asn1x_create (test_asn1_tab, "TestData"); + g_assert ("asn test structure is null" && asn != NULL); + + egg_asn1x_set_string_as_raw (egg_asn1x_node (asn, "data", NULL), (guchar*)"SOME DATA", 9, NULL); + + encoded = egg_asn1x_encode (asn, NULL); + g_assert (encoded); + + data = egg_asn1x_get_string_as_raw (egg_asn1x_node (asn, "data", NULL), NULL, &n_data); + g_assert (data != NULL); + g_assert_cmpuint (n_data, ==, 9); + g_assert (memcmp (data, "SOME DATA", 9) == 0); + g_free (data); + + g_bytes_unref (encoded); + egg_asn1x_destroy (asn); +} + +static void +test_element_length_content (Test* test, gconstpointer unused) +{ + GBytes *buffer; + GNode *asn = NULL; + const guchar *content; + gsize n_content; + gssize length; + + asn = egg_asn1x_create (test_asn1_tab, "TestData"); + g_assert ("asn test structure is null" && asn != NULL); + + egg_asn1x_set_string_as_raw (egg_asn1x_node (asn, "data", NULL), (guchar*)"SOME DATA", 9, NULL); + + buffer = egg_asn1x_encode (asn, NULL); + g_assert (buffer != NULL); + + /* Now the real test */ + length = egg_asn1x_element_length (g_bytes_get_data (buffer, NULL), + g_bytes_get_size (buffer) + 1024); + g_assert_cmpint (length, ==, 13); + + content = egg_asn1x_element_content (g_bytes_get_data (buffer, NULL), + length, &n_content); + g_assert (content != NULL); + g_assert_cmpuint (n_content, ==, 11); + + content = egg_asn1x_element_content (content, n_content, &n_content); + g_assert (content); + g_assert_cmpuint (n_content, ==, 9); + g_assert (memcmp (content, "SOME DATA", 9) == 0); + + const guchar *BAD_ASN_TAG = (guchar *)"\x00"; + content = egg_asn1x_element_content (BAD_ASN_TAG, 1, &n_content); + g_assert (content == NULL); + + const guchar *BAD_ASN_LENGTH = (guchar *)"\x30\x80"; + content = egg_asn1x_element_content (BAD_ASN_LENGTH, 2, &n_content); + g_assert (content == NULL); + + egg_asn1x_destroy (asn); + g_bytes_unref (buffer); +} + +static void +test_read_element (Test* test, gconstpointer unused) +{ + GBytes *buffer; + GNode *asn = NULL; + GBytes *data; + + asn = egg_asn1x_create (test_asn1_tab, "TestData"); + g_assert ("asn test structure is null" && asn != NULL); + + egg_asn1x_set_string_as_raw (egg_asn1x_node (asn, "data", NULL), (guchar*)"SOME DATA", 9, NULL); + + buffer = egg_asn1x_encode (asn, NULL); + g_assert (buffer != NULL); + + /* Have to decode before we can get raw elements */ + if (!egg_asn1x_decode (asn, buffer)) + g_assert_not_reached (); + + /* Now the real test */ + data = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "data", NULL)); + g_assert (data != NULL); + g_assert_cmpint (g_bytes_get_size (data), ==, 11); + g_bytes_unref (data); + + data = egg_asn1x_get_value_raw (egg_asn1x_node (asn, "data", NULL)); + g_assert (data != NULL); + egg_assert_cmpbytes (data, ==, "SOME DATA", 9); + g_bytes_unref (data); + + egg_asn1x_destroy (asn); + g_bytes_unref (buffer); +} + +static void +test_oid (void) +{ + GBytes *buffer; + GNode *asn = NULL; + GNode *node; + GQuark oid, check; + + asn = egg_asn1x_create (test_asn1_tab, "TestOid"); + g_assert ("asn test structure is null" && asn != NULL); + + node = egg_asn1x_node (asn, "oid", NULL); + g_assert_cmpint (EGG_ASN1X_OBJECT_ID, ==, egg_asn1x_type (node)); + + if (!egg_asn1x_set_oid_as_string (node, "1.2.34567.89")) + g_assert_not_reached (); + + buffer = egg_asn1x_encode (asn, NULL); + g_assert (buffer != NULL); + + /* Now a quark has been defined */ + check = g_quark_from_static_string ("1.2.34567.89"); + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "oid", NULL)); + g_assert (oid); + g_assert (check == oid); + g_assert_cmpstr (g_quark_to_string (oid), ==, "1.2.34567.89"); + + /* Write a different OID */ + if (!egg_asn1x_set_oid_as_quark (egg_asn1x_node (asn, "oid", NULL), g_quark_from_static_string ("5.4.3.2.1678"))) + g_assert_not_reached (); + + g_bytes_unref (buffer); + buffer = egg_asn1x_encode (asn, NULL); + g_assert (buffer != NULL); + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "oid", NULL)); + g_assert (oid); + g_assert_cmpstr (g_quark_to_string (oid), ==, "5.4.3.2.1678"); + + g_bytes_unref (buffer); + egg_asn1x_destroy (asn); +} + +static void +test_oid_set_invalid (void) +{ + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestOid"); + g_assert ("asn test structure is null" && asn != NULL); + + if (egg_asn1x_set_oid_as_string (egg_asn1x_node (asn, "oid", NULL), "abcd")) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +static void +test_oid_decode_bad (void) +{ + GBytes *bytes; + GNode *asn; + gboolean ret; + + /* Has invalid leading integer in oid value */ + const gchar INVALID_OID[] = "\x30\x07\x06\x05\x2b\x80\x83\x82\x1a"; + + asn = egg_asn1x_create (test_asn1_tab, "TestOid"); + g_assert ("asn test structure is null" && asn != NULL); + + bytes = g_bytes_new_static (INVALID_OID, XL (INVALID_OID)); + ret = egg_asn1x_decode (asn, bytes); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "object id encoding is invalid") != NULL); + + g_bytes_unref (bytes); + egg_asn1x_destroy (asn); +} + +static void +test_oid_get_no_value (void) +{ + GNode *asn; + gchar *oid; + + asn = egg_asn1x_create (test_asn1_tab, "TestOid"); + g_assert ("asn test structure is null" && asn != NULL); + + oid = egg_asn1x_get_oid_as_string (egg_asn1x_node (asn, "oid", NULL)); + g_assert (oid == NULL); + + egg_asn1x_destroy (asn); +} + +typedef struct _TimeTestData { + gchar *value; + time_t ref; +} TimeTestData; + +static const TimeTestData generalized_time_test_data[] = { + { "20070725130528Z", 1185368728 }, + { "20070725130528.2134Z", 1185368728 }, + { "20070725140528-0100", 1185368728 }, + { "20070725040528+0900", 1185368728 }, + { "20070725013528+1130", 1185368728 }, + { "20070725Z", 1185321600 }, + { "20070725+0000", 1185321600 }, + + /* Bad ones */ + { "200707", -1 }, + + { NULL, 0 } +}; + +static const TimeTestData utc_time_test_data[] = { + /* Test the Y2K style wrap arounds */ + { "070725130528Z", 1185368728 }, /* The year 2007 */ + { "020725130528Z", 1027602328 }, /* The year 2002 */ + { "970725130528Z", 869835928 }, /* The year 1997 */ + { "370725130528Z", 2132139928 }, /* The year 2037 */ + + /* Test the time zones and other formats */ + { "070725130528.2134Z", 1185368728 }, + { "070725140528-0100", 1185368728 }, + { "070725040528+0900", 1185368728 }, + { "070725013528+1130", 1185368728 }, + { "070725Z", 1185321600 }, + { "070725+0000", 1185321600 }, + + /* Bad ones */ + { "0707", -1 }, + + { NULL, 0 } +}; + +static void +test_general_time (Test* test, gconstpointer unused) +{ + time_t when; + const TimeTestData *data; + + for (data = generalized_time_test_data; data->value; ++data) { + when = egg_asn1x_parse_time_general (data->value, -1); + if (data->ref != when) { + printf ("%s", data->value); + printf ("%s != ", ctime (&when)); + printf ("%s\n", ctime (&data->ref)); + fflush (stdout); + } + + g_assert ("decoded time doesn't match reference" && data->ref == when); + } +} + +static void +test_utc_time (Test* test, gconstpointer unused) +{ + time_t when; + const TimeTestData *data; + + for (data = utc_time_test_data; data->value; ++data) { + when = egg_asn1x_parse_time_utc (data->value, -1); + if (data->ref != when) { + printf ("%s", data->value); + printf ("%s != ", ctime (&when)); + printf ("%s\n", ctime (&data->ref)); + fflush (stdout); + } + + g_assert ("decoded time doesn't match reference" && data->ref == when); + } +} + +static void +test_read_time (Test* test, gconstpointer unused) +{ + glong time; + + time = egg_asn1x_get_time_as_long (egg_asn1x_node (test->asn1, "tbsCertificate", "validity", "notBefore", NULL)); + g_assert_cmpint (time, ==, 820454400); +} + +static void +test_read_date (Test* test, gconstpointer unused) +{ + GDate date; + if (!egg_asn1x_get_time_as_date (egg_asn1x_node (test->asn1, "tbsCertificate", "validity", "notAfter", NULL), &date)) + g_assert_not_reached (); + g_assert_cmpint (date.day, ==, 31); + g_assert_cmpint (date.month, ==, 12); + g_assert_cmpint (date.year, ==, 2020); +} + +static void +test_create_by_oid (Test* test, gconstpointer unused) +{ + /* id-at-initials = X520initials */ + GNode *node = egg_asn1x_create (pkix_asn1_tab, "2.5.4.43"); + g_assert (node != NULL); + g_assert_cmpstr (egg_asn1x_name (node), ==, "X520initials"); + egg_asn1x_destroy (node); +} + +static void +test_create_by_oid_invalid (Test* test, gconstpointer unused) +{ + GNode *node = egg_asn1x_create (pkix_asn1_tab, "23.23.23.23"); + g_assert (node == NULL); +} + +static void +test_create_by_bad_order (Test* test, gconstpointer unused) +{ + /* + * In pkix.asn the definition for parts of this oid + * come in the wrong order. However this should still work. + */ + + /* id-pe-authorityInfoAccess = AuthorityInfoAccessSyntax */ + GNode *node = egg_asn1x_create (pkix_asn1_tab, "1.3.6.1.5.5.7.1.1"); + g_assert (node != NULL); + g_assert_cmpstr (egg_asn1x_name (node), ==, "AuthorityInfoAccessSyntax"); + egg_asn1x_destroy (node); +} + +static void +test_count (Test* test, gconstpointer unused) +{ + GNode *node; + + node = egg_asn1x_node (test->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL); + g_assert (node); + g_assert_cmpuint (egg_asn1x_count (node), ==, 7); +} + +static void +test_nested_fails_with_extra (void) +{ + gboolean ret; + GBytes *bytes; + GNode *asn; + + const gchar SEQ_NESTED[] = "\x30\x0C" + "\x04\x03""one" + "\x04\x05""extra"; + + asn = egg_asn1x_create (test_asn1_tab, "TestData"); + g_assert ("asn test structure is null" && asn != NULL); + + bytes = g_bytes_new_static (SEQ_NESTED, XL (SEQ_NESTED)); + ret = egg_asn1x_decode (asn, bytes); + egg_asn1x_assert (ret == FALSE, asn); + egg_asn1x_assert (strstr (egg_asn1x_message (asn), "encountered extra tag"), asn); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_nested_unexpected (void) +{ + gboolean ret; + GBytes *bytes; + GNode *asn; + + const gchar SEQ_NESTED[] = "\x30\x03" + "\x02\x01\x2A"; + + asn = egg_asn1x_create (test_asn1_tab, "TestData"); + g_assert ("asn test structure is null" && asn != NULL); + + bytes = g_bytes_new_static (SEQ_NESTED, XL (SEQ_NESTED)); + ret = egg_asn1x_decode (asn, bytes); + egg_asn1x_assert (ret == FALSE, asn); + egg_asn1x_assert (strstr (egg_asn1x_message (asn), "decoded tag did not match expected"), asn); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_create_and_decode_invalid (void) +{ + GBytes *bytes; + GNode *asn; + + bytes = g_bytes_new_static ("", 0); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestData", bytes); + g_assert (asn == NULL); + g_bytes_unref (bytes); +} + +static void +test_decode_extra (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOf"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static ("\x30\x00\x11", 3); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "extra unexpected trailing data")); + g_bytes_unref (bytes); + egg_asn1x_destroy (asn); +} + +static void +test_decode_nested_short (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOfAny"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static ("\x30\x02\xA5\x08", 4); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "content is not encoded properly")); + g_bytes_unref (bytes); + + bytes = g_bytes_new_static ("\x30\x04\x30\x02\xA5\x08", 6); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "content is not encoded properly")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_decode_indefinite_primitive (void) +{ + GBytes *bytes; + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static ("\x04\x80\x04\x01\x55\x00\x00", 7); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "indefinite length on non-structured type")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_decode_invalid_long_length (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\x04\xA0" + "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01" + "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"; + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "content is not encoded properly")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_decode_truncated_at_tag (void) +{ + GBytes *bytes; + GNode *asn; + + const gchar DER[] = "\x04"; + asn = egg_asn1x_create (test_asn1_tab, "TestInteger"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + if (egg_asn1x_decode (asn, bytes)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "content is not encoded properly")); + g_bytes_unref (bytes); + + egg_asn1x_destroy (asn); +} + +static void +test_decode_long_tag (void) +{ + GBytes *bytes; + GNode *asn; + gboolean ret; + + const gchar DER[] = "\xbf\x89\x52\x03\x04\x01\x33"; + + asn = egg_asn1x_create (test_asn1_tab, "TestTagLong"); + g_assert (asn != NULL); + + bytes = g_bytes_new_static (DER, XL (DER)); + ret = egg_asn1x_decode (asn, bytes); + egg_asn1x_assert (ret == TRUE, asn); + + g_bytes_unref (bytes); + egg_asn1x_destroy (asn); + +} + +static void +test_create_quark (void) +{ + GNode *asn; + + asn = egg_asn1x_create_quark (test_asn1_tab, g_quark_from_static_string ("1.5.13")); + g_assert (asn != NULL); + g_assert_cmpstr (egg_asn1x_name (asn), ==, "TestIntegers"); + egg_asn1x_destroy (asn); +} + +static void +test_validate_default (void) +{ + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestBooleanSeq"); + /* We leave first boolean field empty */ + egg_asn1x_set_boolean (egg_asn1x_node (asn, "boolean2", NULL), TRUE); + if (!egg_asn1x_validate (asn, TRUE)) + g_assert_not_reached (); + egg_asn1x_destroy (asn); +} + +static void +test_validate_missing (void) +{ + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestBooleanSeq"); + /* No fields set */ + if (egg_asn1x_validate (asn, TRUE)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "missing value") != NULL); + egg_asn1x_destroy (asn); +} + +static void +test_validate_seq_of_child_invalid (void) +{ + GNode *asn; + GNode *child; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOfSeq"); + child = egg_asn1x_append (asn); + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (child, "uint1", NULL), 5); + /* We didn't set uint2 or uint3 so the child is invalid */ + if (egg_asn1x_validate (asn, TRUE)) + g_assert_not_reached (); + g_assert (strstr (egg_asn1x_message (asn), "missing value") != NULL); + egg_asn1x_destroy (asn); + +} + +static void +test_validate_optional_seq (void) +{ + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestSeqOptional"); + if (!egg_asn1x_validate (asn, TRUE)) + g_assert_not_reached (); + egg_asn1x_destroy (asn); +} + +static void +test_element_get_not_set (void) +{ + GNode *asn; + + asn = egg_asn1x_create (test_asn1_tab, "TestBooleanSeq"); + g_assert (egg_asn1x_get_element_raw (asn) == NULL); + egg_asn1x_destroy (asn); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/asn1/decode/extra", test_decode_extra); + g_test_add_func ("/asn1/decode/nested-short", test_decode_nested_short); + g_test_add_func ("/asn1/decode/indefinite-primitive", test_decode_indefinite_primitive); + g_test_add_func ("/asn1/decode/invalid-long-length", test_decode_invalid_long_length); + g_test_add_func ("/asn1/decode/truncated-at-tag", test_decode_truncated_at_tag); + g_test_add_func ("/asn1/decode/decode-long-tag", test_decode_long_tag); + g_test_add_func ("/asn1/boolean", test_boolean); + g_test_add_func ("/asn1/boolean-bad", test_boolean_decode_bad); + g_test_add_func ("/asn1/boolean-default", test_boolean_default); + g_test_add_func ("/asn1/null", test_null); + g_test_add_func ("/asn1/integer", test_integer); + g_test_add_func ("/asn1/integer-zero-length", test_integer_zero_length); + g_test_add_func ("/asn1/integer/raw", test_integer_raw); + g_test_add_func ("/asn1/integer/raw-not-twos-complement", test_integer_raw_not_twos_complement); + g_test_add_func ("/asn1/unsigned", test_unsigned); + g_test_add_func ("/asn1/unsigned/not-set", test_unsigned_not_set); + g_test_add_func ("/asn1/unsigned/default", test_unsigned_default); + g_test_add_func ("/asn1/unsigned/constant", test_unsigned_constant); + g_test_add_func ("/asn1/unsigned/zero", test_unsigned_zero); + g_test_add_func ("/asn1/octet_string", test_octet_string); + g_test_add_func ("/asn1/octet-string/set-bad-utf8", test_octet_string_set_bad_utf8); + g_test_add_func ("/asn1/octet-string/bmp-as-utf8", test_octet_string_bmp_as_utf8); + g_test_add_func ("/asn1/octet-string/get-as-bytes", test_octet_string_get_as_bytes); + g_test_add_func ("/asn1/octet-string/set-as-bytes", test_octet_string_set_as_bytes); + g_test_add_func ("/asn1/octet-string/structured", test_octet_string_structured); + g_test_add_func ("/asn1/octet-string/structured-bad", test_octet_string_structured_bad); + g_test_add_func ("/asn1/generalized_time", test_generalized_time); + g_test_add_func ("/asn1/time-get-missing", test_time_get_missing); + g_test_add_func ("/asn1/implicit/decode", test_implicit_decode); + g_test_add_func ("/asn1/implicit/encode", test_implicit_encode); + g_test_add_func ("/asn1/explicit/decode", test_explicit_decode); + g_test_add_func ("/asn1/explicit/encode", test_explicit_encode); + g_test_add_func ("/asn1/explicit/no-context-specific", test_explicit_no_context_specific); + g_test_add_func ("/asn1/explicit/no-context-child", test_explicit_no_context_child); + g_test_add_func ("/asn1/explicit/extra-context-child", test_explicit_extra_context_child); + g_test_add_func ("/asn1/universal/decode", test_universal_decode); + g_test_add_func ("/asn1/universal/encode", test_universal_encode); + g_test_add_func ("/asn1/bit_string_decode", test_bit_string_decode); + g_test_add_func ("/asn1/bit_string_decode_bad", test_bit_string_decode_bad); + g_test_add_func ("/asn1/bit_string_decode_ulong", test_bit_string_decode_ulong); + g_test_add_func ("/asn1/bit_string_encode_decode", test_bit_string_encode_decode); + g_test_add_func ("/asn1/bit_string_encode_decode_ulong", test_bit_string_encode_decode_ulong); + g_test_add_func ("/asn1/bit_string_encode_decode_zero", test_bit_string_encode_decode_zero); + g_test_add_func ("/asn1/bit-string/ulong-too-long", test_bit_string_ulong_too_long); + g_test_add_func ("/asn1/bit-string/get-not-set", test_bit_string_get_not_set); + g_test_add_func ("/asn1/bit-string/invalid-length", test_bit_string_invalid_length); + g_test_add_func ("/asn1/bit-string/invalid-empty", test_bit_string_invalid_empty); + g_test_add_func ("/asn1/oid", test_oid); + g_test_add_func ("/asn1/oid/set-invalid", test_oid_set_invalid); + g_test_add_func ("/asn1/oid/get-no-value", test_oid_get_no_value); + g_test_add_func ("/asn1/oid/decode-bad", test_oid_decode_bad); + g_test_add_func ("/asn1/have", test_have); + g_test_add_func ("/asn1/any-raw", test_any_raw); + g_test_add_func ("/asn1/any-raw/explicit", test_any_raw_explicit); + g_test_add_func ("/asn1/any-raw/invalid", test_any_raw_invalid); + g_test_add_func ("/asn1/any-raw/not-set", test_any_raw_not_set); + g_test_add_func ("/asn1/any-into", test_any_into); + g_test_add_func ("/asn1/any-into/explicit", test_any_into_explicit); + g_test_add_func ("/asn1/any-into/explicit-not-set", test_any_into_explicit_not_set); + g_test_add_func ("/asn1/choice_not_chosen", test_choice_not_chosen); + g_test_add_func ("/asn1/any_choice_set_raw_short_tag", test_any_choice_set_raw_short_tag); + g_test_add_func ("/asn1/any_choice_set_raw_long_tag", test_any_choice_set_raw_long_tag); + g_test_add_func ("/asn1/seq-of-any", test_seq_of_any);\ + g_test_add_func ("/asn1/seq-of-invalid", test_seq_of_invalid); + g_test_add_func ("/asn1/seq-of-different", test_seq_of_different); + g_test_add_func ("/asn1/set-order", test_set_order); + g_test_add_func ("/asn1/append", test_append); + g_test_add_func ("/asn1/append_and_clear", test_append_and_clear); + g_test_add_func ("/asn1/setof", test_setof); + g_test_add_func ("/asn1/setof_empty", test_setof_empty); + g_test_add_func ("/asn1/enumerated", test_enumerated); + g_test_add_func ("/asn1/enumerated-bad", test_enumerated_decode_bad); + g_test_add_func ("/asn1/enumerated-not-in-list", test_enumerated_not_in_list); + g_test_add_func ("/asn1/enumerated-not-set", test_enumerated_not_set); + g_test_add_func ("/asn1/nested-fails-with-extra", test_nested_fails_with_extra); + g_test_add_func ("/asn1/nested-unexpected", test_nested_unexpected); + g_test_add_func ("/asn1/create-and-decode-invalid", test_create_and_decode_invalid); + g_test_add_func ("/asn1/create-quark", test_create_quark); + g_test_add_func ("/asn1/validate-default", test_validate_default); + g_test_add_func ("/asn1/validate-missing", test_validate_missing); + g_test_add_func ("/asn1/validate-seq-of-child-invalid", test_validate_seq_of_child_invalid); + g_test_add_func ("/asn1/validate-optional-seq", test_validate_optional_seq); + g_test_add_func ("/asn1/get-element/not-set", test_element_get_not_set); + g_test_add ("/asn1/node_name", Test, NULL, setup, test_node_name, teardown); + g_test_add ("/asn1/asn1_integers", Test, NULL, setup, test_asn1_integers, teardown); + g_test_add ("/asn1/boolean_seq", Test, NULL, setup, test_boolean_seq, teardown); + g_test_add ("/asn1/write_value", Test, NULL, setup, test_write_value, teardown); + g_test_add ("/asn1/element_length_content", Test, NULL, setup, test_element_length_content, teardown); + g_test_add ("/asn1/read_element", Test, NULL, setup, test_read_element, teardown); + g_test_add ("/asn1/general_time", Test, NULL, setup, test_general_time, teardown); + g_test_add ("/asn1/utc_time", Test, NULL, setup, test_utc_time, teardown); + g_test_add ("/asn1/read_time", Test, NULL, setup, test_read_time, teardown); + g_test_add ("/asn1/read_date", Test, NULL, setup, test_read_date, teardown); + g_test_add ("/asn1/create_by_oid", Test, NULL, setup, test_create_by_oid, teardown); + g_test_add ("/asn1/create_by_oid_invalid", Test, NULL, setup, test_create_by_oid_invalid, teardown); + g_test_add ("/asn1/create_by_bad_order", Test, NULL, setup, test_create_by_bad_order, teardown); + g_test_add ("/asn1/count", Test, NULL, setup, test_count, teardown); + + return g_test_run (); +} diff --git a/egg/test-asn1x.c b/egg/test-asn1x.c new file mode 100644 index 0000000..8ec176a --- /dev/null +++ b/egg/test-asn1x.c @@ -0,0 +1,200 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-asn1.c: Test ASN1 stuf + + Copyright (C) 2009 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-testing.h" + +#include +#include +#include + +#if 0 +#include +static void +build_personal_name (void) +{ + ASN1_TYPE asn1_pkix = NULL, asn; + guchar buffer[10024]; + int res, len; + + res = asn1_array2tree ((ASN1_ARRAY_TYPE*)pkix_asn1_tab, &asn1_pkix, NULL); + g_assert (res == ASN1_SUCCESS); + + res = asn1_create_element (asn1_pkix, "PKIX1.PersonalName", &asn); + g_assert (res == ASN1_SUCCESS); + + asn1_write_value (asn, "surname", "Turanga", 7); + asn1_write_value (asn, "given-name", "Leela", 5); + asn1_write_value (asn, "initials", NULL, 0); + asn1_write_value (asn, "generation-qualifier", "II", 2); + + len = sizeof (buffer); + res = asn1_der_coding (asn, "", buffer, &len, NULL); + g_assert (res == ASN1_SUCCESS); + + asn1_delete_structure (&asn); + asn1_delete_structure (&asn1_pkix); + + if (!g_file_set_contents ("/tmp/personal-name.der", (gchar*)buffer, len, NULL)) + g_assert (FALSE); + +} +#endif + +typedef struct { + GBytes *data; +} Test; + +typedef struct { + const EggAsn1xDef *defs; + const gchar *filename; + const gchar *identifier; +} Fixture; + +static const Fixture parse_test_fixtures[] = { + { pkix_asn1_tab, SRCDIR "/egg/fixtures/test-certificate-1.der", "Certificate" }, + { pkix_asn1_tab, SRCDIR "/egg/fixtures/test-pkcs8-1.der", "pkcs-8-PrivateKeyInfo" }, + { pk_asn1_tab, SRCDIR "/egg/fixtures/test-rsakey-1.der", "RSAPrivateKey" }, + { pkix_asn1_tab, SRCDIR "/egg/fixtures/test-pkcs7-1.der", "pkcs-7-ContentInfo" }, + { pkix_asn1_tab, SRCDIR "/egg/fixtures/test-pkcs7-2.der", "pkcs-7-ContentInfo" }, +}; + +static void +setup (Test *test, + gconstpointer data) +{ + const gchar *filename = data; + GError *error = NULL; + gchar *contents; + gsize length; + + g_file_get_contents (filename, (gchar**)&contents, &length, &error); + g_assert_no_error (error); + + test->data = g_bytes_new_take (contents, length); +} + +static void +setup_parsing (Test *test, + gconstpointer data) +{ + const Fixture *fixture = data; + setup (test, fixture->filename); +} + +static void +teardown (Test *test, + gconstpointer unused) +{ + g_bytes_unref (test->data); +} + +static void +test_decode_encode (Test *test, + gconstpointer data) +{ + const Fixture *fixture = data; + GNode *asn; + GBytes *encoded; + gboolean ret; + + asn = egg_asn1x_create (fixture->defs, fixture->identifier); + + if (g_test_verbose ()) + egg_asn1x_dump (asn); + + ret = egg_asn1x_decode (asn, test->data); + egg_asn1x_assert (ret == TRUE, asn); + + encoded = egg_asn1x_encode (asn, NULL); + egg_asn1x_assert (encoded != NULL, asn); + + /* Decode the encoding */ + ret = egg_asn1x_decode (asn, encoded); + egg_asn1x_assert (ret == TRUE, asn); + + egg_asn1x_clear (asn); + egg_asn1x_destroy (asn); + g_bytes_unref (encoded); +} + +static void +test_personal_name_invalid (Test *test, + gconstpointer unused) +{ + GNode *asn; + gboolean ret; + + asn = egg_asn1x_create (pkix_asn1_tab, "PersonalName"); + + if (g_test_verbose ()) + egg_asn1x_dump (asn); + + ret = egg_asn1x_decode (asn, test->data); + g_assert (ret == FALSE); + g_assert (strstr (egg_asn1x_message (asn), "content size is out of bounds") != NULL); + + egg_asn1x_destroy (asn); +} + +static void +test_pkcs12_decode (Test *test, + gconstpointer unused) +{ + GNode *asn; + gboolean ret; + + asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-12-PFX"); + + if (g_test_verbose ()) + egg_asn1x_dump (asn); + + ret = egg_asn1x_decode (asn, test->data); + egg_asn1x_assert (ret == TRUE, asn); + + egg_asn1x_destroy (asn); +} + +int +main (int argc, char **argv) +{ + gchar *name; + gint i; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (parse_test_fixtures); i++) { + name = g_strdup_printf ("/asn1x/encode-decode-%d-%s", i, parse_test_fixtures[i].identifier); + g_test_add (name, Test, &parse_test_fixtures[i], setup_parsing, test_decode_encode, teardown); + g_free (name); + } + + g_test_add ("/asn1x/pkcs12-decode/1", Test, SRCDIR "/egg/fixtures/test-pkcs12-1.der", + setup, test_pkcs12_decode, teardown); + g_test_add ("/asn1x/pkcs5-personal-name/invalid", Test, SRCDIR "/egg/fixtures/test-personalname-invalid.der", + setup, test_personal_name_invalid, teardown); + + return g_test_run (); +} diff --git a/egg/test-decimal.c b/egg/test-decimal.c new file mode 100644 index 0000000..051a95e --- /dev/null +++ b/egg/test-decimal.c @@ -0,0 +1,135 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-util.c: Test gck-util.c + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-decimal.h" +#include "egg/egg-testing.h" + +#include +#include +#include + +typedef struct { + const gchar *decimal; + const gchar *result; + gsize length; +} TestDecimal; + +static TestDecimal decimal_fixtures[] = { + { "35", "\x23", 1 }, + { "2048", "\x08\x00", 2 }, + { "209328042309", "\x30\xBC\xEC\x71\x45", 5 }, + { "0002048", "\x08\x00", 2 }, + { "20480000", "\x01\x38\x80\x00", 4 }, + { "2521368004379664277055118629334750468402260732427135194366161280379" + "6661942758264006541602516197962800670706891657576953487072507942596" + "6374424122494538738176144081024494339591946626053519298721214406983" + "3606711407748948613853344896472022957466922483835202523097287025430" + "5078987427716449092979306938082113263545271808186244259338032237756" + "9175402872261192563172038927792670653714043622677577357160052045893" + "9513984477743817388078699536715866468499111753894230211101792648120" + "1128688482121549927434503046858485918719606735307033123916744787670" + "4316000505177621722934283063062034258685067324811300901286708201589" + "59867993533757", + "\xC7\xBB\x16\xF4\xB8\x04\x24\x0F\xFC\xC2\xA7\xAF\x8C\x6E\x67\xE1\x16" + "\x7F\xEB\xFA\x7F\xAA\x9D\xFD\x7C\xF2\x75\xB8\xA5\x1F\x27\x35\xF2\xD4" + "\x9D\x78\xFB\xF6\x5C\xED\x10\xB4\xE4\x32\x58\x2D\xC9\x1E\x86\x54\xF7" + "\x89\x7F\x03\x84\x68\x32\x76\xA9\xA7\x97\xC3\xA3\x6F\x7A\x46\x85\x43" + "\x5E\x14\x4D\x47\x01\x81\x06\xE5\xC0\x61\xD7\xC8\x7C\x9B\xE1\x9D\x84" + "\x87\x75\x77\x80\x0E\xAE\x91\xB1\x05\x12\xDE\x92\xF2\x98\x84\x1F\x43" + "\xD4\xC4\x57\x77\x95\xC5\xE6\x82\xEE\xEA\x0A\xB3\xDD\x8C\x44\x45\x9A" + "\x12\xAC\xF9\xC2\x22\xA1\x3F\x03\x31\xDD\x84\xF7\x75\x51\xE0\xFA\x24" + "\x8E\x6F\xE9\x58\x4C\xA3\x42\x73\xB9\x5E\x2F\x0D\xCC\xDC\x22\x8A\x48" + "\x75\x4A\x76\xA2\x9D\x03\xBA\x5F\xC8\x57\xB5\x1F\x5C\x85\x7E\x8C\x0F" + "\xF2\x73\xDA\x96\x67\x7C\xC6\x4D\x54\x2C\x45\x63\xD1\xA6\x7F\xF1\xA0" + "\x1F\x3F\x9E\xDF\xF3\x7F\x24\x3D\x6E\xB8\xF7\x4C\xC8\xA7\x27\x95\xA1" + "\xDA\x8F\x98\x32\x32\x1B\x7D\xB6\x1B\xFC\x8D\x73\x7C\xD1\x48\x99\xD0" + "\xAC\x7C\xF1\x5B\x95\xA5\xFE\xD8\x12\x57\x5C\x7A\x6B\xC5\x5C\x7D\x92" + "\xB1\x91\x88\x36\x58\x19\x30\x67\x2D\x73\xF3\x5A\xA6\x31\xC4\x5C\x2D" + "\x3D" + , 256 } +}; + +static const gchar *decimal_failures[] = { + "-35", + "abcd", + " 3 33", +}; + +static void +test_decode_success (gconstpointer data) +{ + const TestDecimal *fixture = data; + guchar *decoded; + gsize n_decoded; + + decoded = egg_decimal_decode (fixture->decimal, -1, &n_decoded); + egg_assert_cmpmem (fixture->result, fixture->length, ==, decoded, n_decoded); + g_free (decoded); +} + +static void +test_decode_failure (gconstpointer data) +{ + const gchar *failure = data; + guchar *decoded; + gsize n_decoded; + + decoded = egg_decimal_decode (failure, -1, &n_decoded); + g_assert (decoded == NULL); +} + +int +main (int argc, char **argv) +{ + gchar *name; + gchar *decimal; + const gchar *suffix; + guint i; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (decimal_fixtures); i++) { + /* Ellipsize long numbers in test names */ + decimal = g_strndup (decimal_fixtures[i].decimal, 41); + if (strlen (decimal) == 41) { + decimal[40] = 0; + suffix = "_long"; + } else { + suffix = ""; + } + name = g_strdup_printf ("/decimal/decode-success/%s%s", decimal, suffix); + g_test_add_data_func (name, &decimal_fixtures[i], test_decode_success); + g_free (name); + g_free (decimal); + } + + for (i = 0; i < G_N_ELEMENTS (decimal_failures); i++) { + name = g_strdup_printf ("/decimal/decode-failure/%s", decimal_failures[i]); + g_strcanon (name, "abcdefghijklmnopqrstuvwxyz-_/0123456789", '_'); + g_test_add_data_func (name, decimal_failures[i], test_decode_failure); + g_free (name); + } + + return g_test_run (); +} diff --git a/egg/test-dh.c b/egg/test-dh.c new file mode 100644 index 0000000..c95f479 --- /dev/null +++ b/egg/test-dh.c @@ -0,0 +1,208 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-dh.c: Test egg-dh.c + + Copyright (C) 2009 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-dh.h" +#include "egg/egg-secure-memory.h" +#include "egg/egg-testing.h" + +#include +#include +#include + +#include +#include + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); + +static void +test_perform (void) +{ + gcry_mpi_t p, g; + gcry_mpi_t x1, X1; + gcry_mpi_t x2, X2; + gpointer k1, k2; + gboolean ret; + gsize n1, n2; + + /* Load up the parameters */ + if (!egg_dh_default_params ("ietf-ike-grp-modp-768", &p, &g)) + g_assert_not_reached (); + + /* Generate secrets */ + ret = egg_dh_gen_pair (p, g, 0, &X1, &x1); + g_assert (ret); + ret = egg_dh_gen_pair (p, g, 0, &X2, &x2); + g_assert (ret); + + /* Calculate keys */ + k1 = egg_dh_gen_secret (X2, x1, p, &n1); + g_assert (k1); + k2 = egg_dh_gen_secret (X1, x2, p, &n2); + g_assert (k2); + + /* Keys must be the same */ + egg_assert_cmpsize (n1, ==, n2); + g_assert (memcmp (k1, k2, n1) == 0); + + gcry_mpi_release (p); + gcry_mpi_release (g); + gcry_mpi_release (x1); + gcry_mpi_release (X1); + egg_secure_free (k1); + gcry_mpi_release (x2); + gcry_mpi_release (X2); + egg_secure_free (k2); +} + +static void +test_short_pair (void) +{ + gcry_mpi_t p, g; + gcry_mpi_t x1, X1; + gboolean ret; + + /* Load up the parameters */ + ret = egg_dh_default_params ("ietf-ike-grp-modp-1024", &p, &g); + g_assert (ret); + g_assert_cmpuint (gcry_mpi_get_nbits (p), ==, 1024); + + /* Generate secrets */ + ret = egg_dh_gen_pair (p, g, 512, &X1, &x1); + g_assert (ret); + g_assert_cmpuint (gcry_mpi_get_nbits (x1), <=, 512); + + gcry_mpi_release (p); + gcry_mpi_release (g); + gcry_mpi_release (x1); + gcry_mpi_release (X1); +} + +static void +check_dh_default (const gchar *name, guint bits) +{ + gboolean ret; + gcry_mpi_t p, g, check; + gconstpointer prime, base; + gsize n_prime, n_base; + gcry_error_t gcry; + + ret = egg_dh_default_params (name, &p, &g); + g_assert (ret); + g_assert_cmpint (gcry_mpi_get_nbits (p), ==, bits); + g_assert_cmpint (gcry_mpi_get_nbits (g), <, gcry_mpi_get_nbits (p)); + + ret = egg_dh_default_params_raw (name, &prime, &n_prime, &base, &n_base); + g_assert (ret); + g_assert (prime != NULL); + egg_assert_cmpsize (n_prime, >, 0); + g_assert (base != NULL); + egg_assert_cmpsize (n_base, >, 0); + + gcry = gcry_mpi_scan (&check, GCRYMPI_FMT_USG, prime, n_prime, NULL); + g_assert (gcry == 0); + g_assert (gcry_mpi_cmp (check, p) == 0); + gcry_mpi_release (check); + + gcry = gcry_mpi_scan (&check, GCRYMPI_FMT_USG, base, n_base, NULL); + g_assert (gcry == 0); + g_assert (gcry_mpi_cmp (check, g) == 0); + gcry_mpi_release (check); + + gcry_mpi_release (p); + gcry_mpi_release (g); +} + +static void +test_default_768 (void) +{ + check_dh_default ("ietf-ike-grp-modp-768", 768); +} + +static void +test_default_1024 (void) +{ + check_dh_default ("ietf-ike-grp-modp-1024", 1024); +} + +static void +test_default_1536 (void) +{ + check_dh_default ("ietf-ike-grp-modp-1536", 1536); +} + +static void +test_default_2048 (void) +{ + check_dh_default ("ietf-ike-grp-modp-2048", 2048); +} + +static void +test_default_3072 (void) +{ + check_dh_default ("ietf-ike-grp-modp-3072", 3072); +} + +static void +test_default_4096 (void) +{ + check_dh_default ("ietf-ike-grp-modp-4096", 4096); +} + +static void +test_default_8192 (void) +{ + check_dh_default ("ietf-ike-grp-modp-8192", 8192); +} + +static void +test_default_bad (void) +{ + gboolean ret; + gcry_mpi_t p, g; + + ret = egg_dh_default_params ("bad-name", &p, &g); + g_assert (!ret); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + if (!g_test_quick ()) { + g_test_add_func ("/dh/perform", test_perform); + g_test_add_func ("/dh/short_pair", test_short_pair); + } + + g_test_add_func ("/dh/default_768", test_default_768); + g_test_add_func ("/dh/default_1024", test_default_1024); + g_test_add_func ("/dh/default_1536", test_default_1536); + g_test_add_func ("/dh/default_2048", test_default_2048); + g_test_add_func ("/dh/default_3072", test_default_3072); + g_test_add_func ("/dh/default_4096", test_default_4096); + g_test_add_func ("/dh/default_8192", test_default_8192); + g_test_add_func ("/dh/default_bad", test_default_bad); + + return g_test_run (); +} diff --git a/egg/test-dn.c b/egg/test-dn.c new file mode 100644 index 0000000..4144a70 --- /dev/null +++ b/egg/test-dn.c @@ -0,0 +1,233 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-pkix-parser.c: Test PKIX parser + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-asn1-defs.h" +#include "egg/egg-asn1x.h" +#include "egg/egg-dn.h" +#include "egg/egg-oid.h" +#include "egg/egg-testing.h" + +#include +#include + +#include +#include +#include + +typedef struct { + GNode* asn1; + guchar *data; + gsize n_data; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GBytes *bytes; + + if (!g_file_get_contents (SRCDIR "/egg/fixtures/test-certificate-1.der", + (gchar**)&test->data, &test->n_data, NULL)) + g_assert_not_reached (); + + test->asn1 = egg_asn1x_create (pkix_asn1_tab, "Certificate"); + g_assert (test->asn1 != NULL); + + bytes = g_bytes_new_static (test->data, test->n_data); + if (!egg_asn1x_decode (test->asn1, bytes)) + g_assert_not_reached (); + g_bytes_unref (bytes); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + egg_asn1x_destroy (test->asn1); + g_free (test->data); +} + +static void +test_read_dn (Test* test, gconstpointer unused) +{ + gchar *dn; + + dn = egg_dn_read (egg_asn1x_node (test->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL)); + g_assert (dn != NULL); + g_assert_cmpstr (dn, ==, "C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Premium CA, EMAIL=personal-premium@thawte.com"); + + g_free (dn); +} + +static void +test_dn_value (Test* test, gconstpointer unused) +{ + const guchar value[] = { 0x13, 0x1a, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x43, 0x41 }; + gsize n_value = 28; + GBytes *bytes; + GNode *asn; + GQuark oid; + gchar *text; + + bytes = g_bytes_new_static (value, n_value); + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "AttributeValue", bytes); + g_assert (asn != NULL); + + /* Some printable strings */ + oid = g_quark_from_static_string ("2.5.4.3"); + text = egg_dn_print_value (oid, asn); + g_assert_cmpstr (text, ==, "Thawte Personal Premium CA"); + g_free (text); + g_bytes_unref (bytes); + + /* Unknown oid */ + oid = g_quark_from_static_string ("1.1.1.1.1.1"); + bytes = g_bytes_new_static (value, n_value); + text = egg_dn_print_value (oid, asn); + g_assert_cmpstr (text, ==, "#131A54686177746520506572736F6E616C205072656D69756D204341"); + g_free (text); + + egg_asn1x_destroy (asn); + g_bytes_unref (bytes); +} + +static int last_index = 0; + +static void +concatenate_dn (guint index, + GQuark oid, + GNode *value, + gpointer user_data) +{ + GString *dn = user_data; + gchar *text; + + g_assert (oid); + g_assert (value != NULL); + + g_assert (index == last_index); + ++last_index; + + if (index != 1) { + g_string_append (dn, ", "); + } + + g_string_append (dn, egg_oid_get_name (oid)); + g_string_append_c (dn, '='); + + text = egg_dn_print_value (oid, value); + g_string_append (dn, text); + g_free (text); +} + +static void +test_parse_dn (Test* test, gconstpointer unused) +{ + GString *dn = g_string_new (""); + last_index = 1; + + if (!egg_dn_parse (egg_asn1x_node (test->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL), concatenate_dn, dn)) + g_assert_not_reached (); + + g_assert_cmpstr (dn->str, ==, "C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Premium CA, EMAIL=personal-premium@thawte.com"); + g_string_free (dn, TRUE); +} + +static void +test_read_dn_part (Test* test, gconstpointer unused) +{ + GNode *node; + gchar *value; + + node = egg_asn1x_node (test->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL); + + value = egg_dn_read_part (node, "CN"); + g_assert (value != NULL); + g_assert_cmpstr (value, ==, "Thawte Personal Premium CA"); + g_free (value); + + value = egg_dn_read_part (node, "2.5.4.8"); + g_assert (value != NULL); + g_assert_cmpstr (value, ==, "Western Cape"); + g_free (value); + + value = egg_dn_read_part (node, "DC"); + g_assert (value == NULL); + + value = egg_dn_read_part (node, "0.0.0.0"); + g_assert (value == NULL); + + value = egg_dn_read_part (node, "2.5.4.9"); + g_assert (value == NULL); +} + +static void +test_add_dn_part (Test *test, + gconstpointer unused) +{ + GBytes *check; + GBytes *dn; + GNode *check_dn; + GNode *asn; + GNode *node; + + asn = egg_asn1x_create (pkix_asn1_tab, "Name"); + node = egg_asn1x_node (asn, "rdnSequence", NULL); + egg_asn1x_set_choice (asn, node); + egg_dn_add_string_part (node, g_quark_from_static_string ("2.5.4.6"), "ZA"); + egg_dn_add_string_part (node, g_quark_from_static_string ("2.5.4.8"), "Western Cape"); + egg_dn_add_string_part (node, g_quark_from_static_string ("2.5.4.7"), "Cape Town"); + egg_dn_add_string_part (node, g_quark_from_static_string ("2.5.4.10"), "Thawte Consulting"); + egg_dn_add_string_part (node, g_quark_from_static_string ("2.5.4.11"), "Certification Services Division"); + egg_dn_add_string_part (node, g_quark_from_static_string ("2.5.4.3"), "Thawte Personal Premium CA"); + egg_dn_add_string_part (node, g_quark_from_static_string ("1.2.840.113549.1.9.1"), "personal-premium@thawte.com"); + + dn = egg_asn1x_encode (asn, NULL); + if (dn == NULL) { + g_warning ("couldn't encode dn: %s", egg_asn1x_message (asn)); + g_assert_not_reached (); + } + + check_dn = egg_asn1x_node (test->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL); + check = egg_asn1x_encode (check_dn, NULL); + egg_asn1x_destroy (asn); + + egg_assert_cmpbytes (dn, ==, g_bytes_get_data (check, NULL), g_bytes_get_size (check)); + + g_bytes_unref (dn); + g_bytes_unref (check); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/dn/read_dn", Test, NULL, setup, test_read_dn, teardown); + g_test_add ("/dn/dn_value", Test, NULL, setup, test_dn_value, teardown); + g_test_add ("/dn/parse_dn", Test, NULL, setup, test_parse_dn, teardown); + g_test_add ("/dn/read_dn_part", Test, NULL, setup, test_read_dn_part, teardown); + g_test_add ("/dn/add_dn_part", Test, NULL, setup, test_add_dn_part, teardown); + + return g_test_run (); +} diff --git a/egg/test-hex.c b/egg/test-hex.c new file mode 100644 index 0000000..6bb8c5b --- /dev/null +++ b/egg/test-hex.c @@ -0,0 +1,123 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-util.c: Test gck-util.c + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-hex.h" + +#include +#include +#include + +static const guchar TEST_DATA[] = { 0x05, 0xD6, 0x95, 0x96, 0x10, 0x12, 0xAE, 0x35 }; +static const gchar *TEST_HEX = "05D695961012AE35"; +static const gchar *TEST_HEX_DELIM = "05 D6 95 96 10 12 AE 35"; + +static void +test_encode (void) +{ + gchar *hex; + + hex = egg_hex_encode (TEST_DATA, sizeof (TEST_DATA)); + g_assert (hex); + g_assert_cmpstr (hex, ==, TEST_HEX); + + g_free (hex); +} + +static void +test_encode_spaces (void) +{ + gchar *hex; + + /* Encode without spaces */ + hex = egg_hex_encode_full (TEST_DATA, sizeof (TEST_DATA), TRUE, 0, 0); + g_assert (hex); + g_assert_cmpstr (hex, ==, TEST_HEX); + + g_free (hex); + + /* Encode with spaces */ + hex = egg_hex_encode_full (TEST_DATA, sizeof (TEST_DATA), TRUE, " ", 1); + g_assert (hex); + g_assert_cmpstr (hex, ==, TEST_HEX_DELIM); + + g_free (hex); +} + +static void +test_decode (void) +{ + guchar *data; + gsize n_data; + + data = egg_hex_decode (TEST_HEX, -1, &n_data); + g_assert (data); + g_assert (n_data == sizeof (TEST_DATA)); + g_assert (memcmp (data, TEST_DATA, n_data) == 0); + g_free (data); + + /* Nothing in, empty out */ + data = egg_hex_decode ("AB", 0, &n_data); + g_assert (data); + g_assert (n_data == 0); + g_free (data); + + /* Delimited*/ + data = egg_hex_decode_full (TEST_HEX_DELIM, -1, " ", 1, &n_data); + g_assert (data); + g_assert (n_data == sizeof (TEST_DATA)); + g_assert (memcmp (data, TEST_DATA, n_data) == 0); + g_free (data); +} + +static void +test_decode_fail (void) +{ + guchar *data; + gsize n_data; + + /* Invalid input, null out */ + data = egg_hex_decode ("AB", 1, &n_data); + g_assert (!data); + + /* Bad characters, null out */ + data = egg_hex_decode ("ABXX", -1, &n_data); + g_assert (!data); + + /* Not Delimited, null out*/ + data = egg_hex_decode_full ("ABABAB", -1, ":", 1, &n_data); + g_assert (!data); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/hex/encode", test_encode); + g_test_add_func ("/hex/encode_spaces", test_encode_spaces); + g_test_add_func ("/hex/decode", test_decode); + g_test_add_func ("/hex/decode_fail", test_decode_fail); + + return g_test_run (); +} diff --git a/egg/test-hkdf.c b/egg/test-hkdf.c new file mode 100644 index 0000000..14d7fd2 --- /dev/null +++ b/egg/test-hkdf.c @@ -0,0 +1,354 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-hkdf.c: Test egg-hkdf.c + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include +#include +#include + +#include "egg/egg-hkdf.h" +#include "egg/egg-secure-memory.h" +#include "egg/egg-testing.h" + +#include + +/* + static GStaticMutex memory_mutex = G_STATIC_MUTEX_INIT; + static void egg_memory_lock (void) + { g_static_mutex_lock (&memory_mutex); } + static void egg_memory_unlock (void) + { g_static_mutex_unlock (&memory_mutex); } + EGG_SECURE_DEFINE_GLOBALS (egg_memory_lock, egg_memory_unlock, g_realloc); +*/ + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); + + +static void +test_hkdf_test_case_1 (void) +{ + /* RFC 5869: A.1 Test Case 1 */ + const guchar ikm[] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b }; + const guchar salt[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c }; + const guchar info[] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9 }; + const guchar okm[] = { 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, + 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a, + 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c, + 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, + 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18, + 0x58, 0x65 }; + guchar buffer[sizeof (okm)]; + gboolean ret; + + egg_assert_cmpsize (sizeof (ikm), ==, 22); + egg_assert_cmpsize (sizeof (salt), ==, 13); + egg_assert_cmpsize (sizeof (info), ==, 10); + egg_assert_cmpsize (sizeof (okm), ==, 42); + + memset (buffer, 0, sizeof (buffer)); + ret = egg_hkdf_perform ("sha256", + ikm, sizeof (ikm), + salt, sizeof (salt), + info, sizeof (info), + buffer, sizeof (buffer)); + g_assert (ret); + egg_assert_cmpmem (buffer, sizeof (buffer), ==, okm, sizeof (okm)); +} + +static void +test_hkdf_test_case_2 (void) +{ + /* RFC 5869: A.2 Test Case 2 */ + const guchar ikm[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f }; + const guchar salt[] = { 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf }; + const guchar info[] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; + const guchar okm[] = { 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, + 0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34, + 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8, + 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, + 0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72, + 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09, + 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, + 0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71, + 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87, + 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, + 0x1d, 0x87 }; + guchar buffer[sizeof (okm)]; + gboolean ret; + + egg_assert_cmpsize (sizeof (ikm), ==, 80); + egg_assert_cmpsize (sizeof (salt), ==, 80); + egg_assert_cmpsize (sizeof (info), ==, 80); + egg_assert_cmpsize (sizeof (okm), ==, 82); + + memset (buffer, 0, sizeof (buffer)); + ret = egg_hkdf_perform ("sha256", + ikm, sizeof (ikm), + salt, sizeof (salt), + info, sizeof (info), + buffer, sizeof (buffer)); + g_assert (ret); + egg_assert_cmpmem (buffer, sizeof (buffer), ==, okm, sizeof (okm)); +} + +static void +test_hkdf_test_case_3 (void) +{ + /* RFC 5869: A.3 Test Case 3 */ + const guchar ikm[] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,}; + const guchar salt[] = { }; + const guchar info[] = { }; + const guchar okm[] = { 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, + 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31, + 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e, + 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, + 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, + 0x96, 0xc8 }; + guchar buffer[sizeof (okm)]; + gboolean ret; + + egg_assert_cmpsize (sizeof (ikm), ==, 22); + egg_assert_cmpsize (sizeof (salt), ==, 0); + egg_assert_cmpsize (sizeof (info), ==, 0); + egg_assert_cmpsize (sizeof (okm), ==, 42); + + memset (buffer, 0, sizeof (buffer)); + ret = egg_hkdf_perform ("sha256", + ikm, sizeof (ikm), + salt, sizeof (salt), + info, sizeof (info), + buffer, sizeof (buffer)); + g_assert (ret); + egg_assert_cmpmem (buffer, sizeof (buffer), ==, okm, sizeof (okm)); +} + +static void +test_hkdf_test_case_4 (void) +{ + /* RFC 5869: A.4 Test Case 4 */ + const guchar ikm[] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b }; + const guchar salt[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c }; + const guchar info[] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9 }; + const guchar okm[] = { 0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69, + 0x33, 0x06, 0x8b, 0x56, 0xef, 0xa5, 0xad, 0x81, + 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15, + 0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2, + 0xc2, 0x2e, 0x42, 0x24, 0x78, 0xd3, 0x05, 0xf3, + 0xf8, 0x96 }; + guchar buffer[sizeof (okm)]; + gboolean ret; + + egg_assert_cmpsize (sizeof (ikm), ==, 11); + egg_assert_cmpsize (sizeof (salt), ==, 13); + egg_assert_cmpsize (sizeof (info), ==, 10); + egg_assert_cmpsize (sizeof (okm), ==, 42); + + memset (buffer, 0, sizeof (buffer)); + ret = egg_hkdf_perform ("sha1", + ikm, sizeof (ikm), + salt, sizeof (salt), + info, sizeof (info), + buffer, sizeof (buffer)); + g_assert (ret); + egg_assert_cmpmem (buffer, sizeof (buffer), ==, okm, sizeof (okm)); +} + +static void +test_hkdf_test_case_5 (void) +{ + /* RFC 5869: A.5 Test Case 5 */ + const guchar ikm[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f }; + const guchar salt[] = { 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf }; + const guchar info[] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; + const guchar okm[] = { 0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7, + 0xc9, 0xf1, 0x2c, 0xd5, 0x91, 0x2a, 0x06, 0xeb, + 0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19, + 0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe, + 0x8f, 0xa3, 0xf1, 0xa4, 0xe5, 0xad, 0x79, 0xf3, + 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c, + 0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed, + 0x03, 0x4c, 0x7f, 0x9d, 0xfe, 0xb1, 0x5c, 0x5e, + 0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43, + 0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52, + 0xd3, 0xb4 }; + guchar buffer[sizeof (okm)]; + gboolean ret; + + egg_assert_cmpsize (sizeof (ikm), ==, 80); + egg_assert_cmpsize (sizeof (salt), ==, 80); + egg_assert_cmpsize (sizeof (info), ==, 80); + egg_assert_cmpsize (sizeof (okm), ==, 82); + + memset (buffer, 0, sizeof (buffer)); + ret = egg_hkdf_perform ("sha1", + ikm, sizeof (ikm), + salt, sizeof (salt), + info, sizeof (info), + buffer, sizeof (buffer)); + g_assert (ret); + egg_assert_cmpmem (buffer, sizeof (buffer), ==, okm, sizeof (okm)); +} + +static void +test_hkdf_test_case_6 (void) +{ + /* RFC 5869: A.6 Test Case 6 */ + const guchar ikm[] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b }; + const guchar salt[] = { }; + const guchar info[] = { }; + const guchar okm[] = { 0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61, + 0xd1, 0xe5, 0x52, 0x98, 0xda, 0x9d, 0x05, 0x06, + 0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06, + 0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0, + 0xea, 0x00, 0x03, 0x3d, 0xe0, 0x39, 0x84, 0xd3, + 0x49, 0x18 }; + guchar buffer[sizeof (okm)]; + gboolean ret; + + egg_assert_cmpsize (sizeof (ikm), ==, 22); + egg_assert_cmpsize (sizeof (salt), ==, 0); + egg_assert_cmpsize (sizeof (info), ==, 0); + egg_assert_cmpsize (sizeof (okm), ==, 42); + + memset (buffer, 0, sizeof (buffer)); + ret = egg_hkdf_perform ("sha1", + ikm, sizeof (ikm), + salt, sizeof (salt), + info, sizeof (info), + buffer, sizeof (buffer)); + g_assert (ret); + egg_assert_cmpmem (buffer, sizeof (buffer), ==, okm, sizeof (okm)); +} + +static void +test_hkdf_test_case_7 (void) +{ + /* RFC 5869: A.7 Test Case 7 */ + const guchar ikm[] = { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c }; + const guchar *salt = NULL; + const guchar info[] = { }; + const guchar okm[] = { 0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3, + 0x50, 0x0d, 0x63, 0x6a, 0x62, 0xf6, 0x4f, 0x0a, + 0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23, + 0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5, + 0x67, 0x3a, 0x08, 0x1d, 0x70, 0xcc, 0xe7, 0xac, + 0xfc, 0x48 }; + guchar buffer[sizeof (okm)]; + gboolean ret; + + egg_assert_cmpsize (sizeof (ikm), ==, 22); + egg_assert_cmpsize (sizeof (info), ==, 0); + egg_assert_cmpsize (sizeof (okm), ==, 42); + + memset (buffer, 0, sizeof (buffer)); + ret = egg_hkdf_perform ("sha1", + ikm, sizeof (ikm), + salt, sizeof (salt), + info, sizeof (info), + buffer, sizeof (buffer)); + g_assert (ret); + egg_assert_cmpmem (buffer, sizeof (buffer), ==, okm, sizeof (okm)); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/hkdf/test-case-1", test_hkdf_test_case_1); + g_test_add_func ("/hkdf/test-case-2", test_hkdf_test_case_2); + g_test_add_func ("/hkdf/test-case-3", test_hkdf_test_case_3); + g_test_add_func ("/hkdf/test-case-4", test_hkdf_test_case_4); + g_test_add_func ("/hkdf/test-case-5", test_hkdf_test_case_5); + g_test_add_func ("/hkdf/test-case-6", test_hkdf_test_case_6); + g_test_add_func ("/hkdf/test-case-7", test_hkdf_test_case_7); + + return g_test_run (); +} diff --git a/egg/test-oid.c b/egg/test-oid.c new file mode 100644 index 0000000..21ae128 --- /dev/null +++ b/egg/test-oid.c @@ -0,0 +1,53 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-oid.c: Test OID routines + Copyright (C) 2008 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-oid.h" + +#include + +static void +test_tests (void) +{ + GQuark oid; + + oid = g_quark_from_static_string ("0.9.2342.19200300.100.1.25"); + g_assert_cmpstr (egg_oid_get_name (oid), ==, "DC"); + g_assert_cmpstr (egg_oid_get_description (oid), ==, "Domain Component"); + g_assert_cmpuint (egg_oid_get_flags (oid), ==, EGG_OID_PRINTABLE); + + /* Should return OID for invalid oids */ + oid = g_quark_from_static_string ("1.1.1.1.1"); + g_assert_cmpstr (egg_oid_get_name (oid), ==, "1.1.1.1.1"); + g_assert_cmpstr (egg_oid_get_description (oid), ==, "1.1.1.1.1"); + g_assert_cmpuint (egg_oid_get_flags (oid), ==, 0); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/oid/tests", test_tests); + + return g_test_run (); +} diff --git a/egg/test-openssl.c b/egg/test-openssl.c new file mode 100644 index 0000000..b18565f --- /dev/null +++ b/egg/test-openssl.c @@ -0,0 +1,223 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-openssl.c: Test openssl + + Copyright (C) 2008 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-armor.h" +#include "egg/egg-symkey.h" +#include "egg/egg-openssl.h" +#include "egg/egg-secure-memory.h" +#include "egg/egg-testing.h" + +#include + +#include +#include +#include +#include + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); + +typedef struct { + GBytes *input; + GQuark reftype; + guchar *refenc; + guchar *refdata; + gsize n_refenc; + gsize n_refdata; + GHashTable *refheaders; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + gchar *contents; + gsize length; + + if (!g_file_get_contents (SRCDIR "/egg/fixtures/pem-rsa-enc.key", &contents, &length, NULL)) + g_assert_not_reached (); + + test->input = g_bytes_new_take (contents, length); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_bytes_unref (test->input); + g_free (test->refenc); + egg_secure_free (test->refdata); + g_hash_table_destroy (test->refheaders); +} + +static void +copy_each_key_value (gpointer key, gpointer value, gpointer user_data) +{ + g_hash_table_insert ((GHashTable*)user_data, g_strdup ((gchar*)key), g_strdup ((gchar*)value)); +} + +static void +parse_reference (GQuark type, + GBytes *data, + GBytes *outer, + GHashTable *headers, + gpointer user_data) +{ + Test *test = user_data; + const gchar *dekinfo; + + g_assert (type); + test->reftype = type; + + g_assert ("no data in PEM callback" && data != NULL); + g_assert ("no data in PEM callback" && g_bytes_get_size (data) > 0); + test->refenc = g_memdup (g_bytes_get_data (data, NULL), g_bytes_get_size (data)); + test->n_refenc = g_bytes_get_size (data); + + g_assert ("no headers present in file" && headers != NULL); + g_assert (!test->refheaders); + test->refheaders = egg_armor_headers_new (); + g_hash_table_foreach (headers, copy_each_key_value, test->refheaders); + dekinfo = egg_openssl_get_dekinfo (headers); + g_assert ("no dekinfo in headers" && dekinfo != NULL); + + test->refdata = egg_openssl_decrypt_block (dekinfo, "booo", 4, data, &test->n_refdata); + g_assert ("no data returned from openssl decrypt" && test->refdata != NULL); + g_assert ("invalid amount of data returned from openssl decrypt" && test->n_refdata == g_bytes_get_size (data)); +} + +static void +test_parse_reference (Test *test, gconstpointer unused) +{ + guint num; + + num = egg_armor_parse (test->input, parse_reference, test); + g_assert ("couldn't PEM block in reference data" && num == 1); + + g_assert ("parse_reference() wasn't called" && test->refdata != NULL); +} + +static void +test_write_reference (Test *test, gconstpointer unused) +{ + const gchar *dekinfo; + guchar *encrypted; + gsize n_encrypted; + GBytes *data; + guint num; + + num = egg_armor_parse (test->input, parse_reference, test); + g_assert ("couldn't PEM block in reference data" && num == 1); + + dekinfo = egg_openssl_get_dekinfo (test->refheaders); + g_assert ("no dekinfo in headers" && dekinfo != NULL); + + data = g_bytes_new_static (test->refdata, test->n_refdata); + encrypted = egg_openssl_encrypt_block (dekinfo, "booo", 4, data, &n_encrypted); + g_bytes_unref (data); + + g_assert ("no data returned from openssl encrypt" && encrypted != NULL); + g_assert ("invalid amount of data returned from openssl encrypt" && test->n_refdata <= n_encrypted); + + g_assert ("data length doesn't match input length" && n_encrypted == test->n_refenc); + g_assert ("data doesn't match input" && memcmp (encrypted, test->refenc, n_encrypted) == 0); + + g_free (encrypted); +} + +static void +test_write_exactly_same (Test *test, gconstpointer unused) +{ + guchar *result; + gsize n_result; + guint num; + + num = egg_armor_parse (test->input, parse_reference, test); + g_assert ("couldn't PEM block in reference data" && num == 1); + + result = egg_armor_write (test->refenc, test->n_refenc, test->reftype, + test->refheaders, &n_result); + + /* + * Yes sirrr. Openssl's parser is so fragile, that we have to make it + * character for character identical. This includes line breaks, whitespace + * and line endings. + */ + + egg_assert_cmpbytes (test->input, ==, result, n_result); + g_free (result); +} + +/* 29 bytes (prime number, so block length has bad chance of matching */ +static const guchar *TEST_DATA = (guchar*)"ABCDEFGHIJKLMNOPQRSTUVWXYZ123"; +const gsize TEST_DATA_L = 29; + +static void +test_openssl_roundtrip (Test *test, gconstpointer unused) +{ + const gchar *dekinfo; + guchar *encrypted, *decrypted; + gsize n_encrypted, n_decrypted; + GBytes *data; + int i; + guint num; + + num = egg_armor_parse (test->input, parse_reference, test); + g_assert ("couldn't PEM block in reference data" && num == 1); + + dekinfo = egg_openssl_prep_dekinfo (test->refheaders); + + data = g_bytes_new_static (TEST_DATA, TEST_DATA_L); + encrypted = egg_openssl_encrypt_block (dekinfo, "password", -1, data, &n_encrypted); + g_bytes_unref (data); + + g_assert ("no data returned from openssl encrypt" && encrypted != NULL); + g_assert ("invalid amount of data returned from openssl encrypt" && TEST_DATA_L <= n_encrypted); + + data = g_bytes_new_with_free_func (encrypted, n_encrypted, egg_secure_free, encrypted); + decrypted = egg_openssl_decrypt_block (dekinfo, "password", 8, data, &n_decrypted); + g_bytes_unref (data); + + g_assert ("no data returned from openssl decrypt" && decrypted != NULL); + + /* Check that the data was decrypted properly */ + g_assert ("decrypted data doesn't match length" && n_decrypted >= TEST_DATA_L); + g_assert ("decrypted data doesn't match" && memcmp (TEST_DATA, decrypted, TEST_DATA_L) == 0); + + /* Check that the remainder is all zeros */ + for (i = TEST_DATA_L; i < n_decrypted; ++i) + g_assert ("non null byte in padding" && decrypted[i] == 0); + + egg_secure_free (decrypted); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/openssl/parse_reference", Test, NULL, setup, test_parse_reference, teardown); + g_test_add ("/openssl/write_reference", Test, NULL, setup, test_write_reference, teardown); + g_test_add ("/openssl/write_exactly_same", Test, NULL, setup, test_write_exactly_same, teardown); + g_test_add ("/openssl/openssl_roundtrip", Test, NULL, setup, test_openssl_roundtrip, teardown); + + return g_test_run (); +} diff --git a/egg/test-padding.c b/egg/test-padding.c new file mode 100644 index 0000000..d6c0443 --- /dev/null +++ b/egg/test-padding.c @@ -0,0 +1,223 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-padding.c: Test padding functionality + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-padding.h" +#include "egg/egg-testing.h" + +#include + +#include +#include +#include + +static void +check_padding (EggPadding padding, gsize block, gconstpointer input, + gsize n_input, gconstpointer output, gsize n_output) +{ + gpointer result; + gsize n_result; + + if (!(padding) (NULL, block, input, n_input, &result, &n_result)) { + g_assert (output == NULL); + return; + } + + g_assert (result != NULL); + egg_assert_cmpsize (n_output, ==, n_result); + g_assert (memcmp (output, result, n_output) == 0); + g_free (result); + + /* Now make sure it can tell us the right length */ + if (!(padding) (NULL, block, input, n_input, NULL, &n_result)) + g_assert_not_reached (); + + egg_assert_cmpsize (n_output, ==, n_result); +} + +static void +test_zero_padding (void) +{ + guchar padded[] = { 0x00, 0x00, 0x00, 0x00, 'T', 'E', 'S', 'T' }; + gchar raw[] = "TEST"; + check_padding (egg_padding_zero_pad, 8, raw, 4, padded, 8); +} + +static void +test_zero_padding_no_data (void) +{ + guchar padded[] = { }; + gchar raw[] = ""; + check_padding (egg_padding_zero_pad, 8, raw, 0, padded, 0); +} + +static void +test_pkcs1_one_padding (void) +{ + guchar padded[] = { 0x00, 0x01, 0xFF, 0x00, 'T', 'E', 'S', 'T' }; + gchar raw[] = "TEST"; + check_padding (egg_padding_pkcs1_pad_01, 8, raw, 4, padded, 8); + check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, raw, 4); +} + +static void +test_pkcs1_one_padding_no_data (void) +{ + guchar padded[] = { 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 }; + gchar raw[] = ""; + check_padding (egg_padding_pkcs1_pad_01, 8, raw, 0, padded, 8); + check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, raw, 0); +} + +static void +test_pkcs1_two_padding (void) +{ + guchar padded[] = { 0x00, 0x02, 0x77, 0x66, 0x55, 0x00, 'T', 'E', }; + gchar raw[] = "TE"; + guchar *result; + gpointer vesult; + gsize n_result; + + check_padding (egg_padding_pkcs1_unpad_02, 8, padded, 8, raw, 2); + + /* PKCS#1 02 padding is unpredictable */ + if (!egg_padding_pkcs1_pad_02 (NULL, 8, raw, 2, &vesult, &n_result)) + g_assert_not_reached (); + result = vesult; + g_assert (result != NULL); + egg_assert_cmpsize (n_result, ==, 8); + g_assert (result[0] == 0x00); + g_assert (result[1] == 0x02); + g_assert (result[2] != 0x00); + g_assert (result[3] != 0x00); + g_assert (result[4] != 0x00); + g_assert (result[5] == 0x00); + g_assert (result[6] == 'T'); + g_assert (result[7] == 'E'); + + g_free (vesult); +} + +static void +test_pkcs1_padding_invalid_prefix (void) +{ + guchar padded[] = { 0x01, 0x04, 0x04, 0x04 }; + check_padding (egg_padding_pkcs1_unpad_01, 4, padded, 4, NULL, 0); +} + +static void +test_pkcs1_padding_invalid_type (void) +{ + guchar padded[] = { 0x00, 0x03, 0xFF, 0x00, 'T', 'E', 'S', 'T' }; + check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, NULL, 0); +} + +static void +test_pkcs1_padding_invalid_no_zero (void) +{ + guchar padded[] = { 0x00, 0x01, 0xFF, 0xFF, 'T', 'E', 'S', 'T' }; + check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, NULL, 0); +} + +static void +test_pkcs1_padding_invalid_length (void) +{ + guchar padded[] = { 0x00, 0x01, 0xFF, 0xFF, 'T', 'E', 'S' }; + check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 7, NULL, 0); +} + +static void +test_pkcs7_padding (void) +{ + guchar padded[] = { 'T', 'E', 'S', 'T', 0x04, 0x04, 0x04, 0x04 }; + gchar raw[] = "TEST"; + + check_padding (egg_padding_pkcs7_pad, 8, raw, 4, padded, 8); + check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, raw, 4); +} + +static void +test_pkcs7_padding_equal_block (void) +{ + guchar padded[] = { 'T', 'E', 'S', 'T', 'T', 'E', 'S', 'T', 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }; + gchar raw[] = "TESTTEST"; + + check_padding (egg_padding_pkcs7_pad, 8, raw, 8, padded, 16); + check_padding (egg_padding_pkcs7_unpad, 8, padded, 16, raw, 8); +} + +static void +test_pkcs7_padding_zero (void) +{ + guchar padded[] = { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }; + gchar raw[] = ""; + + check_padding (egg_padding_pkcs7_pad, 8, raw, 0, padded, 8); + check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, raw, 0); +} + +static void +test_pkcs7_padding_invalid_zero (void) +{ + guchar padded[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, NULL, 0); +} + +static void +test_pkcs7_padding_invalid_too_long (void) +{ + guchar padded[] = { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }; + check_padding (egg_padding_pkcs7_unpad, 4, padded, 8, NULL, 0); + check_padding (egg_padding_pkcs7_unpad, 4, padded, 4, NULL, 0); +} + +static void +test_pkcs7_padding_invalid_different (void) +{ + guchar padded[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; + check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, NULL, 0); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/padding/zero_padding", test_zero_padding); + g_test_add_func ("/padding/zero_padding_no_data", test_zero_padding_no_data); + g_test_add_func ("/padding/pkcs1_one_padding", test_pkcs1_one_padding); + g_test_add_func ("/padding/pkcs1_one_padding_no_data", test_pkcs1_one_padding_no_data); + g_test_add_func ("/padding/pkcs1_two_padding", test_pkcs1_two_padding); + g_test_add_func ("/padding/pkcs1_padding_invalid_prefix", test_pkcs1_padding_invalid_prefix); + g_test_add_func ("/padding/pkcs1_padding_invalid_type", test_pkcs1_padding_invalid_type); + g_test_add_func ("/padding/pkcs1_padding_invalid_no_zero", test_pkcs1_padding_invalid_no_zero); + g_test_add_func ("/padding/pkcs1_padding_invalid_length", test_pkcs1_padding_invalid_length); + g_test_add_func ("/padding/pkcs7_padding", test_pkcs7_padding); + g_test_add_func ("/padding/pkcs7_padding_equal_block", test_pkcs7_padding_equal_block); + g_test_add_func ("/padding/pkcs7_padding_zero", test_pkcs7_padding_zero); + g_test_add_func ("/padding/pkcs7_padding_invalid_zero", test_pkcs7_padding_invalid_zero); + g_test_add_func ("/padding/pkcs7_padding_invalid_too_long", test_pkcs7_padding_invalid_too_long); + g_test_add_func ("/padding/pkcs7_padding_invalid_different", test_pkcs7_padding_invalid_different); + + return g_test_run (); +} diff --git a/egg/test-secmem.c b/egg/test-secmem.c new file mode 100644 index 0000000..8a63983 --- /dev/null +++ b/egg/test-secmem.c @@ -0,0 +1,269 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-secmem.c: Test low level secure memory allocation functionality + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-secure-memory.h" + +#include + +#include +#include +#include + + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); + +/* Declared in egg-secure-memory.c */ +extern int egg_secure_warnings; + +EGG_SECURE_DECLARE (tests); + +/* + * Each test looks like (on one line): + * void unit_test_xxxxx (CuTest* cu) + * + * Each setup looks like (on one line): + * void unit_setup_xxxxx (void); + * + * Each teardown looks like (on one line): + * void unit_teardown_xxxxx (void); + * + * Tests be run in the order specified here. + */ + +static gsize +find_non_zero (gpointer mem, gsize len) +{ + guchar *b, *e; + gsize sz = 0; + for (b = (guchar*)mem, e = ((guchar*)mem) + len; b != e; ++b, ++sz) { + if (*b != 0x00) + return sz; + } + + return G_MAXSIZE; +} + +static void +test_alloc_free (void) +{ + gpointer p; + gboolean ret; + + p = egg_secure_alloc_full ("tests", 512, 0); + g_assert (p != NULL); + g_assert_cmpint (G_MAXSIZE, ==, find_non_zero (p, 512)); + + memset (p, 0x67, 512); + + ret = egg_secure_check (p); + g_assert (ret == TRUE); + + egg_secure_free_full (p, 0); +} + +static void +test_realloc_across (void) +{ + gpointer p, p2; + + /* Tiny allocation */ + p = egg_secure_realloc_full ("tests", NULL, 1088, 0); + g_assert (p != NULL); + g_assert_cmpint (G_MAXSIZE, ==, find_non_zero (p, 1088)); + + /* Reallocate to a large one, will have to have changed blocks */ + p2 = egg_secure_realloc_full ("tests", p, 16200, 0); + g_assert (p2 != NULL); + g_assert_cmpint (G_MAXSIZE, ==, find_non_zero (p2, 16200)); + + egg_secure_free (p2); +} + +static void +test_alloc_two (void) +{ + gpointer p, p2; + gboolean ret; + + p2 = egg_secure_alloc_full ("tests", 4, 0); + g_assert (p2 != NULL); + g_assert_cmpint (G_MAXSIZE, ==, find_non_zero (p2, 4)); + + memset (p2, 0x67, 4); + + p = egg_secure_alloc_full ("tests", 16200, 0); + g_assert (p != NULL); + g_assert_cmpint (G_MAXSIZE, ==, find_non_zero (p, 16200)); + + memset (p, 0x67, 16200); + + ret = egg_secure_check (p); + g_assert (ret == TRUE); + + egg_secure_free_full (p2, 0); + egg_secure_free_full (p, 0); +} + +static void +test_realloc (void) +{ + gchar *str = "a test string to see if realloc works properly"; + gpointer p, p2; + gsize len; + + len = strlen (str) + 1; + + p = egg_secure_realloc_full ("tests", NULL, len, 0); + g_assert (p != NULL); + g_assert_cmpint (G_MAXSIZE, ==, find_non_zero (p, len)); + + strcpy ((gchar*)p, str); + + p2 = egg_secure_realloc_full ("tests", p, 512, 0); + g_assert (p2 != NULL); + g_assert_cmpint (G_MAXSIZE, ==, find_non_zero (((gchar*)p2) + len, 512 - len)); + + g_assert (strcmp (p2, str) == 0); + + p = egg_secure_realloc_full ("tests", p2, 0, 0); + g_assert (p == NULL); +} + +static void +test_multialloc (void) +{ + GPtrArray *memory; + gpointer data; + gsize size; + int i, action, index; + + /* A predetermined seed to get a predetermined pattern */ + g_random_set_seed (15); + memory = g_ptr_array_new (); + + /* Don't print "can't allocate" warnings */ + egg_secure_warnings = 0; + + for (i = 0; TRUE; ++i) { + + /* Determine what we want to do */ + if (memory->len > 0) { + if (i > 100000) /* Once we've done 100000 alocations start freeing */ + action = 2; + else + action = g_random_int_range (0, 3); + } else { + action = 0; /* No allocations, so allocate */ + } + + switch (action) { + case 0: /* Allocate some memory */ + size = g_random_int_range (1, 16384); + data = egg_secure_alloc (size); + g_assert (data != NULL); + memset (data, 0xCAFEBABE, size); + g_ptr_array_add (memory, data); + break; + case 1: /* Reallocate some memory */ + index = g_random_int_range (0, memory->len); + data = g_ptr_array_index (memory, index); + g_assert (data != NULL); + size = g_random_int_range (1, 16384); + data = egg_secure_realloc (data, size); + g_assert (data != NULL); + memset (data, 0xCAFEBABE, size); + g_ptr_array_index (memory, index) = data; + break; + case 2: /* Free some memory */ + index = g_random_int_range (0, memory->len); + data = g_ptr_array_remove_index_fast (memory, index); + g_assert (data != NULL); + egg_secure_free (data); + break; + default: + g_assert_not_reached (); + } + + egg_secure_validate (); + + if (i > 100000 && !memory->len) + break; + } + + g_assert (memory->len == 0); + for (i = 0; i < memory->len; i++) + egg_secure_free (memory->pdata[i]); + g_ptr_array_free (memory, TRUE); + + egg_secure_warnings = 1; +} + +static void +test_clear (void) +{ + gpointer p; + + p = egg_secure_alloc_full ("tests", 188, 0); + g_assert (p != NULL); + memset (p, 0x89, 188); + g_assert (memchr (p, 0x89, 188) == p); + + egg_secure_clear (p, 188); + g_assert (memchr (p, 0x89, 188) == NULL); + + egg_secure_free_full (p, 0); +} + +static void +test_strclear (void) +{ + gchar *str; + + str = egg_secure_strdup ("secret"); + g_assert (str != NULL); + g_assert_cmpuint (strlen (str), ==, 6); + g_assert (strchr (str, 't') == str + 5); + + egg_secure_strclear (str); + g_assert_cmpuint (strlen (str), ==, 6); + g_assert (strchr (str, 't') == NULL); + + egg_secure_free_full (str, 0); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/secmem/alloc_free", test_alloc_free); + g_test_add_func ("/secmem/realloc_across", test_realloc_across); + g_test_add_func ("/secmem/alloc_two", test_alloc_two); + g_test_add_func ("/secmem/realloc", test_realloc); + g_test_add_func ("/secmem/multialloc", test_multialloc); + g_test_add_func ("/secmem/clear", test_clear); + g_test_add_func ("/secmem/strclear", test_strclear); + + return g_test_run (); +} diff --git a/egg/test-symkey.c b/egg/test-symkey.c new file mode 100644 index 0000000..f363681 --- /dev/null +++ b/egg/test-symkey.c @@ -0,0 +1,668 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-crypto.c: Test crypto stuff + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-libgcrypt.h" +#include "egg/egg-secure-memory.h" +#include "egg/egg-symkey.h" +#include "egg/egg-testing.h" + +typedef struct _EggAsn1xDef ASN1_ARRAY_TYPE; +typedef struct _EggAsn1xDef asn1_static_node; +#include "test.asn.h" + +#include + +#include +#include +#include + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); + +static const struct { + const gchar *password; + int cipher_algo; + int hash_algo; + int iterations; + const gchar *salt; + + const gchar *result_simple; + const gchar *result_pkcs12; + const gchar *result_pbkdf2; + const gchar *result_pbe; +} all_generation_tests[] = { + + { /* 24 byte output */ + "booo", GCRY_CIPHER_3DES, GCRY_MD_MD5, 1, + "\x70\x4C\xFF\xD6\x2F\xBA\x03\xE9", + "\x84\x12\xBB\x34\x94\x8C\x40\xAD\x97\x57\x96\x74\x5B\x6A\xFB\xF8\xD6\x61\x33\x51\xEA\x8C\xCF\xD8", + NULL, + NULL, + NULL + }, + + { /* 5 byte output */ + "booo", GCRY_CIPHER_RFC2268_40, GCRY_MD_SHA1, 2048, + "\x8A\x58\xC2\xE8\x7C\x1D\x80\x11", + NULL, + "\xD6\xA6\xF0\x76\x66", + NULL, + NULL + }, + + { /* Null Password, 5 byte output */ + NULL, GCRY_CIPHER_RFC2268_40, GCRY_MD_SHA1, 2000, + "\x04\xE0\x1C\x3E\xF8\xF2\xE9\xFD", + NULL, + "\x98\x7F\x20\x97\x1E", + NULL, + NULL + }, + + { /* 24 byte output */ + "booo", GCRY_CIPHER_3DES, GCRY_MD_SHA1, 2048, + "\xBD\xEE\x0B\xC6\xCF\x43\xAC\x25", + NULL, + "\x3F\x38\x1B\x0E\x87\xEB\x19\xBE\xD1\x39\xDC\x5B\xC2\xD2\xB3\x3C\x35\xA8\xB8\xF9\xEE\x66\x48\x94", + "\x20\x25\x90\xD8\xD6\x98\x3E\x71\x10\x17\x1F\x51\x49\x87\x27\xCA\x97\x27\xD1\xC9\x72\xF8\x11\xBB", + NULL + }, + + { /* Empty password, 24 byte output */ + "", GCRY_CIPHER_3DES, GCRY_MD_SHA1, 2048, + "\xF7\xCF\xD9\xCF\x1F\xF3\xAD\xF6", + NULL, + NULL, + "\x53\xE3\x35\x9E\x5D\xC1\x85\x1A\x71\x3A\x67\x4E\x80\x56\x13\xD6\x4E\x3E\x89\x43\xB7\x1D\x5F\x7F", + NULL + }, + + { /* Empty password, 24 byte output */ + "", GCRY_CIPHER_3DES, GCRY_MD_SHA1, 2048, + "\xD9\xB3\x2E\xC7\xBA\x1A\x8E\x15", + NULL, + "\x39\x70\x75\x7C\xF5\xE2\x13\x0B\x5D\xC2\x9D\x96\x8B\x71\xC7\xFC\x5B\x97\x1F\x79\x9F\x06\xFC\xA2", + NULL, + NULL + }, + + { /* 8 byte output */ + "booo", GCRY_CIPHER_DES, GCRY_MD_MD5, 2048, + "\x93\x4C\x3D\x29\xA2\x42\xB0\xF5", + NULL, + NULL, + NULL, + "\x8C\x67\x19\x7F\xB9\x23\xE2\x8D" + } +}; + +#define N_GENERATION_TESTS (sizeof (all_generation_tests) / sizeof (all_generation_tests[0])) + +static void +test_generate_key_simple (void) +{ + int i; + gboolean ret; + guchar *key; + + for (i = 0; i < N_GENERATION_TESTS; ++i) { + + if (!all_generation_tests[i].result_simple) + continue; + + ret = egg_symkey_generate_simple (all_generation_tests[i].cipher_algo, + all_generation_tests[i].hash_algo, + all_generation_tests[i].password, -1, + (guchar*)all_generation_tests[i].salt, 8, + all_generation_tests[i].iterations, + &key, NULL); + g_assert (ret && "key generation failed"); + + ret = (memcmp (key, all_generation_tests[i].result_simple, + gcry_cipher_get_algo_keylen (all_generation_tests[i].cipher_algo)) == 0); + + g_assert (ret && "invalid simple key generated"); + + egg_secure_free (key); + } +} + +static void +test_generate_key_pkcs12 (void) +{ + int i; + gboolean ret; + guchar *key; + + for (i = 0; i < N_GENERATION_TESTS; ++i) { + + if (!all_generation_tests[i].result_pkcs12) + continue; + + ret = egg_symkey_generate_pkcs12 (all_generation_tests[i].cipher_algo, + all_generation_tests[i].hash_algo, + all_generation_tests[i].password, -1, + (guchar*)all_generation_tests[i].salt, 8, + all_generation_tests[i].iterations, + &key, NULL); + g_assert ("failed to generate pkcs12 key" && ret); + + ret = (memcmp (key, all_generation_tests[i].result_pkcs12, + gcry_cipher_get_algo_keylen (all_generation_tests[i].cipher_algo)) == 0); + + g_assert ("invalid pkcs12 key generated" && ret); + + egg_secure_free (key); + } +} + +static void +test_generate_key_pbkdf2 (void) +{ + int i; + gboolean ret; + guchar *key; + + for (i = 0; i < N_GENERATION_TESTS; ++i) { + + if (!all_generation_tests[i].result_pbkdf2) + continue; + + ret = egg_symkey_generate_pbkdf2 (all_generation_tests[i].cipher_algo, + all_generation_tests[i].hash_algo, + all_generation_tests[i].password, -1, + (guchar*)all_generation_tests[i].salt, 8, + all_generation_tests[i].iterations, + &key, NULL); + g_assert ("failed to generate pbkdf2 key" && ret); + + ret = (memcmp (key, all_generation_tests[i].result_pbkdf2, + gcry_cipher_get_algo_keylen (all_generation_tests[i].cipher_algo)) == 0); + + g_assert ("invalid pbkdf2 key generated" && ret); + + egg_secure_free (key); + } +} + +static void +test_generate_key_pbe (void) +{ + int i; + gboolean ret; + guchar *key; + + for (i = 0; i < N_GENERATION_TESTS; ++i) { + + if (!all_generation_tests[i].result_pbe) + continue; + + ret = egg_symkey_generate_pbe (all_generation_tests[i].cipher_algo, + all_generation_tests[i].hash_algo, + all_generation_tests[i].password, -1, + (guchar*)all_generation_tests[i].salt, 8, + all_generation_tests[i].iterations, + &key, NULL); + g_assert ("failed to generate pbe key" && ret); + + ret = (memcmp (key, all_generation_tests[i].result_pbe, + gcry_cipher_get_algo_keylen (all_generation_tests[i].cipher_algo)) == 0); + + g_assert ("invalid pbe key generated" && ret); + + egg_secure_free (key); + } +} + +typedef struct { + const gchar *name; + const gchar *scheme; + + /* Info to use with cipher */ + const gchar *password; + const gchar *salt; + gsize iterations; + + /* DER representation of cipher */ + gsize n_der; + const gchar *der; + + /* Data to encrypt and test with */ + gsize n_text_length; + const gchar *plain_text; + const gchar *cipher_text; +} ReadCipher; + +static const ReadCipher cipher_tests[] = { + { + "pbe-sha1-des-cbc", "1.2.840.113549.1.5.10", + "password", "saltsalt", 33, + 15, "\x30\x0D" + "\x04\x08""saltsalt" + "\x02\x01\x2A", + 8, "plaintex", "\x69\xe2\x88\x4c\x31\xcf\x0e\x2a" + }, + { + "pkcs12-pbe-3des-sha1", "1.2.840.113549.1.12.1.3", + "password", "saltsalt", 33, + 15, "\x30\x0D" + "\x04\x08""saltsalt" + "\x02\x01\x2A", + 8, "plaintex", "\xcf\xfb\x49\x2e\x42\x75\x15\x56" + }, + { + "pkcs5-pbes2", "1.2.840.113549.1.5.13", + "password", "salt", 33, + 48, "\x30\x2e" + "\x30\x16" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x05\x0c" + "\x30\x09" + "\x04\x04\x73\x61\x6c\x74" + "\x02\x01\x21" + "\x30\x14" + "\x06\x08\x2a\x86\x48\x86\xf7\x0d\x03\x07" + "\x04\x08\x73\x61\x6c\x74\x73\x61\x6c\x74", + 8, "plaintex", "\x46\x1A\x3A\x39\xD0\xF5\x21\x5C" + }, + { + "pkcs5-pbes2-des-cbc", "1.2.840.113549.1.5.13", + "password", "salt", 33, + 0x2d, "\x30\x2b" + "\x30\x16" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x05\x0c" + "\x30\x09" + "\x04\x04\x73\x61\x6c\x74" + "\x02\x01\x21" + "\x30\x11" + "\x06\x05\x2b\x0e\x03\x02\x07" + "\x04\x08\x73\x61\x6c\x74\x73\x61\x6c\x74", + 8, "plaintex", "\xB7\x7B\x54\xBF\x29\x4D\x31\x7D" + } +}; + +typedef struct { + const gchar *name; + const gchar *scheme; + + /* Info to use with cipher */ + const gchar *password; + + /* DER representation of cipher */ + gsize n_der; + const gchar *der; +} InvalidCipher; + +#if 0 +#include "egg/egg-hex.h" + +static void +create_pkcs5_pbes2 (void) +{ + GNode *asn; + GNode *param; + GBytes *bytes; + gconstpointer data; + gsize size; + + asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-5-PBES2-params"); + + egg_asn1x_set_oid_as_string (egg_asn1x_node (asn, "keyDerivationFunc", "algorithm", NULL), "1.2.840.113549.1.5.12"); + param = egg_asn1x_create (pkix_asn1_tab, "pkcs-5-PBKDF2-params"); + egg_asn1x_set_integer_as_ulong (egg_asn1x_node (param, "iterationCount", NULL), 33); +#if 1 + egg_asn1x_set_choice (egg_asn1x_node (param, "salt", NULL), egg_asn1x_node (param, "salt", "specified", NULL)); + egg_asn1x_set_string_as_raw (egg_asn1x_node (param, "salt", "specified", NULL), (guchar *)"salt", 4, NULL); +#else + egg_asn1x_set_choice (egg_asn1x_node (param, "salt", NULL), egg_asn1x_node (param, "salt", "otherSource", NULL)); */ + egg_asn1x_set_oid_as_string (egg_asn1x_node (param, "salt", "otherSource", "algorithm", NULL), "1.2.1"); */ +#endif + egg_asn1x_set_any_from (egg_asn1x_node (asn, "keyDerivationFunc", "parameters", NULL), param); + egg_asn1x_destroy (param); + + egg_asn1x_set_oid_as_string (egg_asn1x_node (asn, "encryptionScheme", "algorithm", NULL), "1.3.14.3.2.7"); + param = egg_asn1x_create (pkix_asn1_tab, "pkcs-5-des-EDE3-CBC-params"); + egg_asn1x_set_string_as_raw (param, (guchar *)"saltsalt", 8, NULL); + egg_asn1x_set_any_from (egg_asn1x_node (asn, "encryptionScheme", "parameters", NULL), param); + egg_asn1x_destroy (param); + + bytes = egg_asn1x_encode (asn, NULL); + egg_asn1x_assert (bytes != NULL, asn); + egg_asn1x_destroy (asn); + + data = g_bytes_get_data (bytes, &size); + g_printerr ("%s: \\x%s\n", __FUNCTION__, egg_hex_encode_full (data, size, FALSE, "\\x", 1)); + g_bytes_unref (bytes); +} +#endif + +static void +test_read_cipher (gconstpointer data) +{ + const ReadCipher *test = data; + gcry_cipher_hd_t cih; + gcry_error_t gcry; + GNode *asn; + gboolean ret; + GBytes *bytes; + gpointer block; + + bytes = g_bytes_new_static (test->der, test->n_der); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestAny", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + ret = egg_symkey_read_cipher (g_quark_from_static_string (test->scheme), + test->password, strlen (test->password), + asn, &cih); + + egg_asn1x_destroy (asn); + g_assert (ret == TRUE); + + block = g_memdup (test->plain_text, test->n_text_length); + gcry = gcry_cipher_encrypt (cih, block, test->n_text_length, NULL, 0); + g_assert_cmpint (gcry, ==, 0); + + egg_assert_cmpmem (test->cipher_text, test->n_text_length, ==, + block, test->n_text_length); + + gcry_cipher_close (cih); + g_free (block); +} + +static const InvalidCipher cipher_invalid[] = { + { + "pbe-bad-der", "1.2.840.113549.1.12.1.3", + "password", + /* Valid DER, but not pkcs-12-PbeParams */ + 11, "\x30\x09\x04\x07""invalid" + }, + { + "pkcs5-pbe-bad-der", "1.2.840.113549.1.5.10", + "password", + /* Valid DER, but not pkcs-5-PBE-params */ + 11, "\x30\x09\x04\x07""invalid" + }, + { + "pkcs5-pbes2-bad-der", "1.2.840.113549.1.5.13", + "password", + /* Valid DER, but not pkcs-5-PBES2-params */ + 11, "\x30\x09\x04\x07""invalid" + }, + { + "pkcs5-pbes2-missing-key-parameters", "1.2.840.113549.1.5.13", + "password", + 0x25, "\x30\x23" + "\x30\x0b" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x05\x0c" + /* Missing OPTIONAL parameters here */ + "\x30\x14" + "\x06\x08\x2a\x86\x48\x86\xf7\x0d\x03\x07" + "\x04\x08\x73\x61\x6c\x74\x73\x61\x6c\x74", + }, + { + "pkcs5-pbes2-missing-scheme-parameters", "1.2.840.113549.1.5.13", + "password", + 0x26, "\x30\x24" + "\x30\x16" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x05\x0c" + "\x30\x09" + "\x04\x04\x73\x61\x6c\x74" + "\x02\x01\x21" + "\x30\x0a" + "\x06\x08\x2a\x86\x48\x86\xf7\x0d\x03\x07" + /* Missing OPTIONAL parameters here */ + }, + { + "pkcs5-pbes2-bad-key-derivation-algo", "1.2.840.113549.1.5.13", + "password", + 48, "\x30\x2e" + "\x30\x16" /* An unsupported keyDerivation algorithm oid */ + "\x06\x09\x2a\x86\x48\x86\xf7\x0c\x01\x04\x0b" + "\x30\x09" + "\x04\x04\x73\x61\x6c\x74" + "\x02\x01\x21" + "\x30\x14" + "\x06\x08\x2a\x86\x48\x86\xf7\x0d\x03\x07" + "\x04\x08\x73\x61\x6c\x74\x73\x61\x6c\x74", + }, + { + "pkcs5-pbes2-salt-not-specified", "1.2.840.113549.1.5.13", + "password", + 0x30, "\x30\x2e" + "\x30\x16" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x05\x0c" + "\x30\x09" + "\x30\x04" + "\x06\x02\x2a\x01" + "\x02\x01\x21" + "\x30\x14" + "\x06\x08\x2a\x86\x48\x86\xf7\x0d\x03\x07" + "\x04\x08\x73\x61\x6c\x74\x73\x61\x6c\x74" + }, + { + "pkcs5-pbes2-unsupported-des-rc5-cbc", "1.2.840.113549.1.5.13", + "password", + 0x30, "\x30\x2e" + "\x30\x16" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x05\x0c" + "\x30\x09" + "\x04\x04\x73\x61\x6c\x74" + "\x02\x01\x21" + "\x30\x14" + "\x06\x08\x2a\x86\x48\x86\xf7\x0d\x03\x09" + "\x04\x08\x73\x61\x6c\x74\x73\x61\x6c\x74" + } +}; + +static void +test_read_cipher_invalid (gconstpointer data) +{ + const InvalidCipher *test = data; + gcry_cipher_hd_t cih; + GNode *asn; + gboolean ret; + GBytes *bytes; + + bytes = g_bytes_new_static (test->der, test->n_der); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestAny", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + ret = egg_symkey_read_cipher (g_quark_from_static_string (test->scheme), + test->password, strlen (test->password), + asn, &cih); + + egg_asn1x_destroy (asn); + g_assert (ret == FALSE); +} + +static void +test_read_cipher_unsupported_pbe (void) +{ + gcry_cipher_hd_t cih; + GNode *asn; + gboolean ret; + GBytes *bytes; + + /* + * On many test systems RC2 is no longer supported by libgcrypt, but + * in case these tests are run elsewhere, double check. + */ + if (gcry_cipher_algo_info (GCRY_CIPHER_RFC2268_128, GCRYCTL_TEST_ALGO, NULL, 0) == 0) + return; + + bytes = g_bytes_new_static ("\x30\x09\x04\x07""invalid", 11); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestAny", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + ret = egg_symkey_read_cipher (g_quark_from_static_string ("1.2.840.113549.1.12.1.5"), + "blah", 4, asn, &cih); + + g_assert (ret == FALSE); + + egg_asn1x_destroy (asn); +} + +typedef struct { + const gchar *name; + const gchar *scheme; + gsize digest_len; + + /* Info to use with cipher */ + const gchar *password; + const gchar *salt; + gsize iterations; + + /* DER representation of cipher */ + gsize n_der; + const gchar *der; + + /* Data to encrypt and test with */ + gsize n_plain_length; + const gchar *plain_text; + const gchar *digest; +} ReadMac; + +static const ReadMac mac_tests[] = { + { + "sha1", "1.3.14.3.2.26", 20, + "password", "saltsalt", 33, + 31, "\x30\x1d" + "\x30\x12" + "\x30\x07" + "\x06\x05\x2b\x0e\x03\x02\x1a" + "\x04\x07""invalid" + "\x04\x04""salt" + "\x02\x01\x21", + 8, "plaintex", "\x8b\x96\x7f\xa2\xf4\x4f\x2d\x70\xcb\x59\x7e\x8f\xad\xf3\x92\x18\x70\x08\x5c\x57" + } +}; + +static void +test_read_mac (gconstpointer data) +{ + const ReadMac *test = data; + gcry_md_hd_t mdh; + gpointer digest; + gsize digest_len; + GNode *asn; + gboolean ret; + GBytes *bytes; + + bytes = g_bytes_new_static (test->der, test->n_der); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestAny", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + ret = egg_symkey_read_mac (g_quark_from_static_string (test->scheme), + test->password, strlen (test->password), + asn, &mdh, &digest_len); + + g_assert_cmpint (digest_len, ==, test->digest_len); + + egg_asn1x_destroy (asn); + g_assert (ret == TRUE); + + gcry_md_write (mdh, test->plain_text, test->n_plain_length); + digest = gcry_md_read (mdh, 0); + + egg_assert_cmpmem (test->digest, digest_len, ==, + digest, digest_len); + + gcry_md_close (mdh); +} + +static void +test_read_mac_invalid (void) +{ + gcry_md_hd_t mdh; + gsize digest_len; + GNode *asn; + gboolean ret; + GBytes *bytes; + + bytes = g_bytes_new_static ("\x30\x09\x04\x07""invalid", 11); + asn = egg_asn1x_create_and_decode (test_asn1_tab, "TestAny", bytes); + g_assert (asn != NULL); + g_bytes_unref (bytes); + + ret = egg_symkey_read_mac (g_quark_from_static_string ("1.3.14.3.2.26"), + "blah", 4, asn, &mdh, &digest_len); + + g_assert (ret == FALSE); + + egg_asn1x_destroy (asn); +} + +static void +null_log_handler (const gchar *log_domain, GLogLevelFlags log_level, + const gchar *message, gpointer user_data) +{ + +} + +int +main (int argc, char **argv) +{ + gchar *name; + gint i; + + g_test_init (&argc, &argv, NULL); + egg_libgcrypt_initialize (); + + /* Suppress these messages in tests */ + g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO, + null_log_handler, NULL); + + g_test_add_func ("/symkey/generate_key_simple", test_generate_key_simple); + g_test_add_func ("/symkey/generate_key_pkcs12", test_generate_key_pkcs12); + g_test_add_func ("/symkey/generate_key_pbkdf2", test_generate_key_pbkdf2); + g_test_add_func ("/symkey/generate_key_pbe", test_generate_key_pbe); + + for (i = 0; i < G_N_ELEMENTS (cipher_tests); i++) { + name = g_strdup_printf ("/symkey/read-cipher/%s", cipher_tests[i].name); + g_test_add_data_func (name, cipher_tests + i, test_read_cipher); + g_free (name); + } + + for (i = 0; i < G_N_ELEMENTS (cipher_invalid); i++) { + name = g_strdup_printf ("/symkey/read-cipher-invalid/%s", cipher_invalid[i].name); + g_test_add_data_func (name, cipher_invalid + i, test_read_cipher_invalid); + g_free (name); + } + + g_test_add_func ("/symkey/read-cipher-unsupported/pbe", test_read_cipher_unsupported_pbe); + + for (i = 0; i < G_N_ELEMENTS (mac_tests); i++) { + name = g_strdup_printf ("/symkey/read-mac/%s", mac_tests[i].name); + g_test_add_data_func (name, mac_tests + i, test_read_mac); + g_free (name); + } + + g_test_add_func ("/symkey/read-mac-invalid", test_read_mac_invalid); + + return g_test_run (); +} diff --git a/egg/test.asn b/egg/test.asn new file mode 100644 index 0000000..05676d7 --- /dev/null +++ b/egg/test.asn @@ -0,0 +1,102 @@ +TESTS { } + +DEFINITIONS EXPLICIT TAGS ::= + +BEGIN + +TestInteger ::= INTEGER + +TestBoolean ::= BOOLEAN + +TestNull ::= NULL + +TestAny ::= ANY + +TestOctetString ::= OCTET STRING + +TestGeneralized ::= GeneralizedTime + +TestImplicit ::= [5] IMPLICIT OCTET STRING + +TestExplicit ::= [5] EXPLICIT OCTET STRING + +TestUniversal ::= [UNIVERSAL 5] IMPLICIT OCTET STRING + +TestBitString ::= BIT STRING + +test-integers-id OBJECT IDENTIFIER ::= {1 5 13} + +TestIntegers ::= SEQUENCE { + uint1 INTEGER, + uint2 INTEGER, + uint3 INTEGER DEFAULT 8888 +} + +TestConstant ::= SEQUENCE { + version TestVersion DEFAULT v3 +} + +TestVersion ::= INTEGER { v1(1), v2(2), v3(3) } + +TestData ::= SEQUENCE { + data OCTET STRING +} + +TestBooleanSeq ::= SEQUENCE { + boolean BOOLEAN DEFAULT FALSE, + boolean2 BOOLEAN +} + +TestBooleanDefault ::= SEQUENCE { + boolean BOOLEAN DEFAULT TRUE +} + +TestOid ::= SEQUENCE { + oid OBJECT IDENTIFIER +} + +TestOidOptional ::= SEQUENCE { + oid OBJECT IDENTIFIER OPTIONAL +} + +TestAnySeq ::= SEQUENCE { + contents ANY +} + +TestAnyExp ::= SEQUENCE { + contents [89] ANY +} + +TestAnyChoice ::= CHOICE { + choiceShortTag [30] ANY, + choiceLongTag [31] ANY +} + +TestSet ::= SET { + one [1] INTEGER, + two [2] INTEGER, + three [3] INTEGER +} + +TestTagLong ::= [1234] EXPLICIT INTEGER + +TestSeqOf ::= SEQUENCE OF INTEGER + +TestSetOf ::= SET OF INTEGER + +TestSeqOfSeq ::= SEQUENCE OF TestIntegers + +TestSeqOfAny ::= SEQUENCE OF ANY + +TestSeqOptional ::= SEQUENCE { + integers TestIntegers OPTIONAL +} + +TestEnumerated ::= ENUMERATED { + valueZero (0), + valueOne (1), + valueTwo (2), + valueThree (3) +} + +END diff --git a/egg/test.asn.h b/egg/test.asn.h new file mode 100644 index 0000000..bf3cfe6 --- /dev/null +++ b/egg/test.asn.h @@ -0,0 +1,87 @@ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +/* #include */ + +const asn1_static_node test_asn1_tab[] = { + { "TESTS", 536872976, NULL }, + { NULL, 1073741836, NULL }, + { "TestInteger", 1073741827, NULL }, + { "TestBoolean", 1073741828, NULL }, + { "TestNull", 1073741844, NULL }, + { "TestAny", 1073741837, NULL }, + { "TestOctetString", 1073741831, NULL }, + { "TestGeneralized", 1073741861, NULL }, + { "TestImplicit", 1610620935, NULL }, + { NULL, 4104, "5"}, + { "TestExplicit", 1610620935, NULL }, + { NULL, 2056, "5"}, + { "TestUniversal", 1610620935, NULL }, + { NULL, 4360, "5"}, + { "TestBitString", 1073741830, NULL }, + { "test-integers-id", 1879048204, NULL }, + { NULL, 1073741825, "1"}, + { NULL, 1073741825, "5"}, + { NULL, 1, "13"}, + { "TestIntegers", 1610612741, NULL }, + { "uint1", 1073741827, NULL }, + { "uint2", 1073741827, NULL }, + { "uint3", 536903683, NULL }, + { NULL, 9, "8888"}, + { "TestConstant", 1610612741, NULL }, + { "version", 536903682, "TestVersion"}, + { NULL, 9, "v3"}, + { "TestVersion", 1610874883, NULL }, + { "v1", 1073741825, "1"}, + { "v2", 1073741825, "2"}, + { "v3", 1, "3"}, + { "TestData", 1610612741, NULL }, + { "data", 7, NULL }, + { "TestBooleanSeq", 1610612741, NULL }, + { "boolean", 1610645508, NULL }, + { NULL, 131081, NULL }, + { "boolean2", 4, NULL }, + { "TestBooleanDefault", 1610612741, NULL }, + { "boolean", 536903684, NULL }, + { NULL, 65545, NULL }, + { "TestOid", 1610612741, NULL }, + { "oid", 12, NULL }, + { "TestOidOptional", 1610612741, NULL }, + { "oid", 16396, NULL }, + { "TestAnySeq", 1610612741, NULL }, + { "contents", 13, NULL }, + { "TestAnyExp", 1610612741, NULL }, + { "contents", 536879117, NULL }, + { NULL, 2056, "89"}, + { "TestAnyChoice", 1610612754, NULL }, + { "choiceShortTag", 1610620941, NULL }, + { NULL, 2056, "30"}, + { "choiceLongTag", 536879117, NULL }, + { NULL, 2056, "31"}, + { "TestSet", 1610612750, NULL }, + { "one", 1811947523, NULL }, + { NULL, 2056, "1"}, + { "two", 1811947523, NULL }, + { NULL, 2056, "2"}, + { "three", 738205699, NULL }, + { NULL, 2056, "3"}, + { "TestTagLong", 1610620931, NULL }, + { NULL, 2056, "1234"}, + { "TestSeqOf", 1610612747, NULL }, + { NULL, 3, NULL }, + { "TestSetOf", 1610612751, NULL }, + { NULL, 3, NULL }, + { "TestSeqOfSeq", 1610612747, NULL }, + { NULL, 2, "TestIntegers"}, + { "TestSeqOfAny", 1610612747, NULL }, + { NULL, 13, NULL }, + { "TestSeqOptional", 1610612741, NULL }, + { "integers", 16386, "TestIntegers"}, + { "TestEnumerated", 537133077, NULL }, + { "valueZero", 1073741825, "0"}, + { "valueOne", 1073741825, "1"}, + { "valueTwo", 1073741825, "2"}, + { "valueThree", 1, "3"}, + { NULL, 0, NULL } +}; diff --git a/gck/Gck-1.metadata b/gck/Gck-1.metadata new file mode 100644 index 0000000..213a679 --- /dev/null +++ b/gck/Gck-1.metadata @@ -0,0 +1,31 @@ +// Metadata file for Vala API generation. +// See https://live.gnome.org/Vala/UpstreamGuide for more information + +mechanisms_check skip=false + +// Because vapigen is broken with regards to array fields +Attribute + .length skip=true + .value skip=true + +Enumerator + .set_object_type_full name="set_object_type" + +UriData + .attributes unowned=false + .module_info unowned=false + .token_info unowned=false + +ModuleInfo + .library_description unowned=false + .manufacturer_id unowned=false + +SlotInfo + .manufacturer_id unowned=false + .slot_description unowned=false + +TokenInfo + .label unowned=false + .manufacturer_id unowned=false + .model unowned=false + .serial_number unowned=false diff --git a/gck/Makefile.am b/gck/Makefile.am new file mode 100644 index 0000000..10fb456 --- /dev/null +++ b/gck/Makefile.am @@ -0,0 +1,260 @@ +# included in top-level Makefile.am + +gck_incdir = $(includedir)/gck-@GCK_MAJOR@/gck + +gck_HEADER_FILES = \ + gck/gck.h \ + gck/gck-deprecated.h + +gck_inc_HEADERS = \ + $(gck_HEADER_FILES) \ + gck/gck-enum-types.h \ + gck/gck-version.h \ + gck/pkcs11.h \ + gck/pkcs11n.h \ + gck/pkcs11x.h + +gck_BUILT_SOURCES = \ + gck/gck-marshal.c gck/gck-marshal.h \ + gck/gck-enum-types.c gck/gck-enum-types.h + +BUILT_SOURCES += $(gck_BUILT_SOURCES) + +lib_LTLIBRARIES += libgck-@GCK_MAJOR@.la + +gck_PUBLIC_FILES = \ + gck/gck.h \ + gck/gck-enum-types.h \ + gck/gck-attributes.c \ + gck/gck-dump.c \ + gck/gck-enumerator.c \ + gck/gck-misc.c \ + gck/gck-module.c \ + gck/gck-modules.c \ + gck/gck-object.c \ + gck/gck-object-cache.c \ + gck/gck-password.c \ + gck/gck-session.c \ + gck/gck-slot.c \ + gck/gck-uri.c \ + gck/gck-version.h + +gck_INTERNAL_FILES = \ + gck/gck-call.c \ + gck/gck-deprecated.h \ + gck/gck-interaction.c \ + gck/gck-private.h \ + gck/pkcs11.h + +libgck_@GCK_MAJOR@_la_SOURCES = \ + $(gck_PUBLIC_FILES) \ + $(gck_INTERNAL_FILES) + +nodist_libgck_@GCK_MAJOR@_la_SOURCES = \ + $(gck_BUILT_SOURCES) + +libgck_@GCK_MAJOR@_la_CFLAGS = \ + $(P11_KIT_CFLAGS) \ + -DG_LOG_DOMAIN=\"Gck\" \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DP11_KIT_API_SUBJECT_TO_CHANGE \ + -DPKCS11_REGISTRY_DIR=\"$(libdir)/pkcs11\" + +libgck_@GCK_MAJOR@_la_LDFLAGS = \ + -version-info $(GCK_LT_RELEASE) \ + -no-undefined \ + -export-symbols-regex '^gck_.*|^SECMEM_.*' + +libgck_@GCK_MAJOR@_la_LIBADD = \ + libegg-hex.la \ + libegg-secmem.la \ + $(P11_KIT_LIBS) \ + $(GIO_LIBS) \ + $(GLIB_LIBS) + +noinst_LTLIBRARIES += libgck-testable.la +libgck_testable_la_SOURCES = \ + gck/gck-mock.c gck/gck-mock.h \ + gck/gck-test.c gck/gck-test.h + +libgck_testable_la_CFLAGS = \ + $(libgck_@GCK_MAJOR@_la_CFLAGS) + +libgck_testable_la_LIBADD = \ + $(libgck_@GCK_MAJOR@_la_OBJECTS) \ + libegg-hex.la \ + libegg-secmem.la \ + $(P11_KIT_LIBS) \ + $(GIO_LIBS) \ + $(GLIB_LIBS) +EXTRA_libgck_testable_la_DEPENDENCIES = $(libgck_@GCK_MAJOR@_la_OBJECTS) + +gck/gck-marshal.h: gck/gck-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=_gck_marshal > $@ + +gck/gck-marshal.c: gck/gck-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) echo "#include \"gck/gck-marshal.h\"" > $@ && \ + $(GLIB_GENMARSHAL) $< --body --prefix=_gck_marshal >> $@ + +gck/gck-enum-types.h: $(ENUM_TEMPLATE_H) $(gck_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +gck/gck-enum-types.c: $(ENUM_TEMPLATE_C) $(gck_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +EXTRA_DIST += \ + gck/gck.pc.in \ + gck/gck-marshal.list \ + gck/gck-version.h \ + gck/gck.symbols \ + gck/pkcs11-trust-assertions.h \ + gck/pkcs11i.h + +CLEANFILES += \ + gck-$(GCK_MAJOR).pc \ + $(gir_DATA) \ + $(typelibs_DATA) \ + $(BUILT_SOURCES) \ + gck-actual.abi \ + gck-expected.abi + +# ------------------------------------------------------------------ +# INTROSPECTION + +if HAVE_INTROSPECTION + +INTROSPECTION_GIRS += Gck-@GCK_MAJOR@.gir + +Gck-@GCK_MAJOR@.gir: libgck-@GCK_MAJOR@.la + +Gck_@GCK_MAJOR@_gir_PACKAGES = gobject-2.0 gio-2.0 p11-kit-1 +Gck_@GCK_MAJOR@_gir_EXPORT_PACKAGES = gck-@GCK_MAJOR@ +Gck_@GCK_MAJOR@_gir_INCLUDES = GObject-2.0 Gio-2.0 +Gck_@GCK_MAJOR@_gir_LIBS = libgck-@GCK_MAJOR@.la +Gck_@GCK_MAJOR@_gir_CFLAGS = -I$(srcdir) -I$(builddir) -DGCK_COMPILATION -DGCK_API_SUBJECT_TO_CHANGE +Gck_@GCK_MAJOR@_gir_FILES = $(gck_PUBLIC_FILES) +Gck_@GCK_MAJOR@_gir_SCANNERFLAGS = --add-include-path=$(srcdir)/gck --c-include "gck/gck.h" + +gir_DATA += Gck-@GCK_MAJOR@.gir + +if ENABLE_VAPIGEN + +gck-@GCK_MAJOR@.vapi: Gck-@GCK_MAJOR@.gir gck/Gck-@GCK_MAJOR@.metadata gck-@GCK_MAJOR@.deps + +VAPIGEN_VAPIS += gck-@GCK_MAJOR@.vapi + +gck_@GCK_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 +gck_@GCK_MAJOR@_vapi_METADATADIRS = $(srcdir)/gck +gck_@GCK_MAJOR@_vapi_FILES = Gck-@GCK_MAJOR@.gir + +gck-$(GCK_MAJOR).deps: Makefile.am + $(AM_V_GEN) echo $(gck_@GCK_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ + +vapi_DATA += gck/pkcs11.vapi + +EXTRA_DIST += \ + gck/Gck-@GCK_MAJOR@.metadata \ + gck/pkcs11.vapi + +endif # ENABLE_VAPIGEN + +endif + +# ---------------------------------------------------------------- + +pkgconfig_DATA += gck-$(GCK_MAJOR).pc + +gck-$(GCK_MAJOR).pc: gck/gck.pc + $(AM_V_GEN) cp gck/gck.pc gck-$(GCK_MAJOR).pc + +gck-expected.abi: gck/gck.symbols + $(AM_V_GEN) cpp -P $< | sort > $@ + +gck-actual.abi: $(builddir)/.libs/libgck-@GCK_MAJOR@.so + $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ + cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end)' | sort > $@ + +check-gck-symbols: gck-expected.abi gck-actual.abi + $(AM_V_GEN) diff -U0 --ignore-blank-lines gck-expected.abi gck-actual.abi || \ + (echo "check-symbols: Symbols have CHANGED. Fix gck.symbols"; exit 1) + +gck_CFLAGS = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DG_LOG_DOMAIN=\"Gck\" \ + $(P11_KIT_CFLAGS) \ + $(GLIB_CFLAGS) + +gck_LIBS = \ + libgck-testable.la \ + libegg-test.la \ + libegg-hex.la \ + $(GLIB_LIBS) \ + $(P11_KIT_LIBS) \ + $(GIO_LIBS) + +gck_TESTS = \ + test-gck-attributes \ + test-gck-module \ + test-gck-slot \ + test-gck-session \ + test-gck-object \ + test-gck-crypto \ + test-gck-uri \ + test-gck-enumerator \ + test-gck-modules + +test_gck_attributes_SOURCES = gck/test-gck-attributes.c +test_gck_attributes_CFLAGS = $(gck_CFLAGS) +test_gck_attributes_LDADD = $(gck_LIBS) + +test_gck_crypto_SOURCES = gck/test-gck-crypto.c +test_gck_crypto_CFLAGS = $(gck_CFLAGS) +test_gck_crypto_LDADD = $(gck_LIBS) + +test_gck_enumerator_SOURCES = gck/test-gck-enumerator.c +test_gck_enumerator_CFLAGS = $(gck_CFLAGS) +test_gck_enumerator_LDADD = libegg-test.la $(gck_LIBS) + +test_gck_object_SOURCES = gck/test-gck-object.c +test_gck_object_CFLAGS = $(gck_CFLAGS) +test_gck_object_LDADD = $(gck_LIBS) + +test_gck_module_SOURCES = gck/test-gck-module.c +test_gck_module_CFLAGS = $(gck_CFLAGS) +test_gck_module_LDADD = $(gck_LIBS) + +test_gck_modules_SOURCES = gck/test-gck-modules.c +test_gck_modules_CFLAGS = $(gck_CFLAGS) +test_gck_modules_LDADD = $(gck_LIBS) + +test_gck_session_SOURCES = gck/test-gck-session.c +test_gck_session_CFLAGS = $(gck_CFLAGS) +test_gck_session_LDADD = libegg-test.la $(gck_LIBS) + +test_gck_slot_SOURCES = gck/test-gck-slot.c +test_gck_slot_CFLAGS = $(gck_CFLAGS) +test_gck_slot_LDADD = $(gck_LIBS) + +test_gck_uri_SOURCES = gck/test-gck-uri.c +test_gck_uri_CFLAGS = $(gck_CFLAGS) +test_gck_uri_LDADD = $(gck_LIBS) + +check_PROGRAMS += $(gck_TESTS) +TESTS += $(gck_TESTS) + +check_LTLIBRARIES += libmock-test-module.la + +libmock_test_module_la_LDFLAGS = \ + -module -avoid-version -shared -rpath $(abs_builddir) + +libmock_test_module_la_CFLAGS = \ + -DGCK_API_SUBJECT_TO_CHANGE \ + $(gck_CFLAGS) + +libmock_test_module_la_SOURCES = \ + gck/mock-test-module.c + +libmock_test_module_la_LIBADD = \ + libgck-testable.la diff --git a/gck/gck-attributes.c b/gck/gck-attributes.c new file mode 100644 index 0000000..81716a2 --- /dev/null +++ b/gck/gck-attributes.c @@ -0,0 +1,3197 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-attribute.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" +#include "pkcs11-trust-assertions.h" + +#include "egg/egg-secure-memory.h" + +#include +#include + +/** + * SECTION:gck-attribute + * @title: GckAttribute + * @short_description: A PKCS11 attribute. + * + * This structure represents a PKCS11 CK_ATTRIBUTE. These attributes contain i + * about a PKCS11 object. Use gck_object_get() or gck_object_set() to set and + * attributes on an object. + * + * Although you are free to allocate a #GckAttribute in your own code, no functions in + * this library will operate on such an attribute. + */ + +G_STATIC_ASSERT (sizeof (GckAttribute) == sizeof (CK_ATTRIBUTE)); + +#define STATE_LOCKED 1 +#define STATE_FLOATING 8 + +struct _GckAttributes { + GckAttribute *data; + gulong count; + gint refs; + gint state; +}; + +typedef struct { + GArray *array; + gboolean secure; + gint refs; +} GckRealBuilder; + +G_STATIC_ASSERT (sizeof (GckRealBuilder) <= sizeof (GckBuilder)); + +EGG_SECURE_DECLARE (attributes); + +static guchar * +value_take (gpointer data, + gsize length, + gboolean secure) +{ + gsize len = length + sizeof (gint); + gint *value; + + if (secure) + value = egg_secure_realloc (data, len); + else + value = g_realloc (data, len); + g_assert (value != NULL); + + memmove (value + 1, value, length); + g_atomic_int_set (value, 1); + return (guchar *)(value + 1); +} + +static guchar * +value_blank (gsize length, + gboolean secure) +{ + gsize len = length + sizeof (gint); + gint *value; + + if (secure) + value = egg_secure_alloc (len); + else + value = g_malloc (len); + g_assert (value != NULL); + + g_atomic_int_set (value, 1); + return (guchar *)(value + 1); +} + +static guchar * +value_new (gconstpointer data, + gsize length, + gboolean secure) +{ + guchar *result; + + result = value_blank (length, secure); + memcpy (result, data, length); + return result; +} + +static guchar * +value_ref (guchar *data) +{ + gint *value = ((gint *)data) - 1; + gint previous; + + g_assert (data != NULL); + + previous = g_atomic_int_add (value, 1); + if (G_UNLIKELY (previous <= 0)) { + g_warning ("An owned GckAttribute value has been modified outside of the " + "gck library or an invalid attribute was passed to gck_builder_add_attribute()"); + return NULL; + } + + return data; +} + +static void +value_unref (gpointer data) +{ + gint *value = ((gint *)data) - 1; + + g_assert (data != NULL); + + if (g_atomic_int_dec_and_test (value)) { + if (egg_secure_check (value)) + egg_secure_free (value); + else + g_free (value); + } +} + +GType +gck_builder_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckBuilder", + (GBoxedCopyFunc)gck_builder_ref, + (GBoxedFreeFunc)gck_builder_unref); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * GckBuilder: + * + * A builder for a set of attributes. Add attributes to a builder, and then use + * gck_builder_end() to get the completed #GckAttributes. + * + * The fields of #GckBuilder are private and not to be accessed directly. + */ + +/** + * GckBuilderFlags: + * @GCK_BUILDER_NONE: no special flags + * @GCK_BUILDER_SECURE_MEMORY: use non-pageable memory for the values of the attributes + * + * Flags to be used with a gck_builder_init_full() and gck_builder_new(). + */ + +/** + * GCK_BUILDER_INIT: + * + * Values that can be assigned to a #GckBuilder allocated on the stack. + * + * + * GckBuilder builder = GCK_BUILDER_INIT; + * + */ + +/** + * gck_builder_new: + * @flags: flags for the new builder + * + * Create a new #GckBuilder not allocated on the stack, so it can be shared + * across a single scope, and referenced / unreferenced. + * + * Normally a #GckBuilder is created on the stack, and simply initialized. + * + * If the %GCK_BUILDER_SECURE_MEMORY flag is specified then non-pageable memory + * will be used for the various values of the attributes in the builder + * + * Returns: (transfer full): a new builder, to be freed with gck_builder_unref() + */ +GckBuilder * +gck_builder_new (GckBuilderFlags flags) +{ + GckBuilder *builder; + GckRealBuilder *real; + builder = g_slice_new (GckBuilder); + gck_builder_init_full (builder, flags); + real = (GckRealBuilder *)builder; + real->refs = 1; + return builder; +} + +/** + * gck_builder_ref: + * @builder: the builder + * + * Add a reference to a builder that was created with gck_builder_new(). The + * builder must later be unreferenced again with gck_builder_unref(). + * + * It is an error to use this function on builders that were allocated on the + * stack. + * + * Returns: the builder + */ +GckBuilder * +gck_builder_ref (GckBuilder *builder) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + gboolean stack; + + g_return_val_if_fail (builder != NULL, NULL); + + stack = g_atomic_int_add (&real->refs, 1) == 0; + if G_UNLIKELY (stack) { + g_warning ("Never call gck_builder_ref() on a stack allocated GckBuilder structure"); + return NULL; + } + + return builder; +} + +/** + * gck_builder_unref: + * @builder: the builder + * + * Unreferences a builder. If this was the last reference then the builder + * is freed. + * + * It is an error to use this function on builders that were allocated on the + * stack. + */ +void +gck_builder_unref (gpointer builder) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + + if (builder == NULL) + return; + + if (g_atomic_int_dec_and_test (&real->refs)) { + gck_builder_clear (builder); + g_slice_free (GckBuilder, builder); + } +} + +/** + * gck_builder_init_full: + * @builder: the builder + * @flags: the flags for the new builder + * + * Initialize a stack allocated builder, with the appropriate flags. + * + * If the %GCK_BUILDER_SECURE_MEMORY flag is specified then non-pageable memory + * will be used for the various values of the attributes in the builder + */ +void +gck_builder_init_full (GckBuilder *builder, + GckBuilderFlags flags) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + + g_return_if_fail (builder != NULL); + + memset (builder, 0, sizeof (GckBuilder)); + real->secure = flags & GCK_BUILDER_SECURE_MEMORY; +} + +/** + * gck_builder_init: + * @builder: the builder + * + * Initialize a stack allocated builder, with the default flags. + * + * This is equivalent to initializing a builder variable with the + * %GCK_BUILDER_INIT constant, or setting it to zeroed memory. + * + * + * /* Equivalent ways of initializing a GckBuilder */ + * GckBuilder builder = GCK_BUILDER_INIT; + * GckBuilder builder2; + * GckBuilder builder3; + * + * gck_builder_init (&builder2); + * + * memset (&builder3, 0, sizeof (builder3)); + * + */ +void +gck_builder_init (GckBuilder *builder) +{ + gck_builder_init_full (builder, GCK_BUILDER_NONE); +} + +static GckAttribute * +builder_push (GckBuilder *builder, + gulong attr_type) +{ + GckAttribute attr = { attr_type, NULL, 0 }; + GckRealBuilder *real = (GckRealBuilder *)builder; + if (real->array == NULL) + real->array = g_array_new (FALSE, TRUE, sizeof (GckAttribute)); + g_array_append_val (real->array, attr); + return &g_array_index (real->array, GckAttribute, real->array->len - 1); +} + +static void +builder_clear (GckAttribute *attr) +{ + attr->length = 0; + if (attr->value) + value_unref (attr->value); + attr->value = NULL; +} + +static GckAttribute * +find_attribute (GckAttribute *attrs, + gsize n_attrs, + gulong attr_type) +{ + guint i; + + for (i = 0; i < n_attrs; ++i) { + if (attrs[i].type == attr_type) + return attrs + i; + } + + return NULL; +} + +static GckAttribute * +builder_clear_or_push (GckBuilder *builder, + gulong attr_type) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttribute *attr = NULL; + + if (real->array) + attr = find_attribute ((GckAttribute *)real->array->data, + real->array->len, attr_type); + if (attr == NULL) + attr = builder_push (builder, attr_type); + else + builder_clear (attr); + return attr; +} + +static void +builder_copy (GckBuilder *builder, + const GckAttribute *attr, + gboolean performing_set) +{ + GckAttribute *copy; + + if (performing_set) + copy = builder_clear_or_push (builder, attr->type); + else + copy = builder_push (builder, attr->type); + if (attr->length == G_MAXULONG) { + copy->value = NULL; + copy->length = G_MAXULONG; + } else if (attr->value == NULL) { + copy->value = NULL; + copy->length = 0; + } else { + copy->value = value_ref (attr->value); + copy->length = attr->length; + } +} + +/** + * gck_builder_copy: + * @builder: the builder to copy + * + * Make a copy of the builder and its state. The new builder is allocated + * with gck_builder_new() and should be freed with gck_builder_unref(). + * + * Attribute value memory is automatically shared between the two builders, + * and is only freed when both are gone. + * + * Returns: (transfer full): the builder copy, which should be freed with + * gck_builder_unref(). + */ +GckBuilder * +gck_builder_copy (GckBuilder *builder) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckBuilder *copy; + guint i; + + if (builder == NULL) + return NULL; + + copy = gck_builder_new (real->secure ? GCK_BUILDER_SECURE_MEMORY : GCK_BUILDER_NONE); + for (i = 0; real->array && i < real->array->len; i++) + builder_copy (copy, &g_array_index (real->array, GckAttribute, i), FALSE); + + return copy; +} + +/** + * gck_builder_take_data: + * @builder: the builder + * @attr_type: the new attribute type + * @value: (transfer full): (array length=length): (allow-none): the new + * attribute memory + * @length: the length of the memory + * + * Add a new attribute to the builder with an arbitrary value. Unconditionally + * adds a new attribute, even if one with the same @attr_type already exists. + * + * Ownership of the @value memory is taken by the builder, may be reallocated, + * and is eventually freed with g_free(). The memory must have been allocated + * using the standard GLib memory allocation routines. + * + * %NULL may be specified for the @value argument, in which case an empty + * attribute is created. GCK_INVALID may be specified for the length, in + * which case an invalid attribute is created in the PKCS\#11 style. + */ +void +gck_builder_take_data (GckBuilder *builder, + gulong attr_type, + guchar *value, + gsize length) +{ + GckAttribute *attr; + gboolean secure; + + g_return_if_fail (builder != NULL); + + secure = value && egg_secure_check (value); + + attr = builder_push (builder, attr_type); + if (length == G_MAXULONG) { + if (secure) + egg_secure_free (value); + else + g_free (value); + attr->value = NULL; + attr->length = G_MAXULONG; + } else if (value == NULL) { + attr->value = NULL; + attr->length = 0; + } else { + attr->value = value_take (value, length, secure); + attr->length = length; + } +} + +/** + * gck_builder_add_data: + * @builder: the builder + * @attr_type: the new attribute type + * @value: (array length=length): (allow-none): the new attribute memory + * @length: the length of the memory + * + * Add a new attribute to the builder with an arbitrary value. Unconditionally + * adds a new attribute, even if one with the same @attr_type already exists. + * + * The memory in @value is copied by the builder. + * + * %NULL may be specified for the @value argument, in which case an empty + * attribute is created. GCK_INVALID may be specified for the length, in + * which case an invalid attribute is created in the PKCS\#11 style. + */ +void +gck_builder_add_data (GckBuilder *builder, + gulong attr_type, + const guchar *value, + gsize length) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttribute *attr; + + g_return_if_fail (builder != NULL); + + attr = builder_push (builder, attr_type); + if (length == G_MAXULONG) { + attr->value = NULL; + attr->length = G_MAXULONG; + } else if (value == NULL) { + attr->value = NULL; + attr->length = 0; + } else { + attr->value = value_new (value, length, + real->secure || egg_secure_check (value)); + attr->length = length; + } +} + +/** + * gck_builder_set_data: + * @builder: the builder + * @attr_type: the attribute type + * @value: (array length=length): (allow-none): the new attribute memory + * @length: the length of the memory + * + * Set a new attribute to the builder with an arbitrary value. If an attribute + * with @attr_type already exists in the builder then it is changed to the new + * value, otherwise an attribute is added. + * + * The memory in @value is copied by the builder. + * + * %NULL may be specified for the @value argument, in which case an empty + * attribute is created. GCK_INVALID may be specified for the length, in + * which case an invalid attribute is created in the PKCS\#11 style. + */ +void +gck_builder_set_data (GckBuilder *builder, + gulong attr_type, + const guchar *value, + gsize length) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttribute *attr; + + g_return_if_fail (builder != NULL); + + attr = builder_clear_or_push (builder, attr_type); + if (length == G_MAXULONG) { + attr->value = NULL; + attr->length = G_MAXULONG; + } else if (value == NULL) { + attr->value = NULL; + attr->length = 0; + } else { + attr->value = value_new (value, length, + real->secure || egg_secure_check (value)); + attr->length = length; + } +} + +/** + * gck_builder_add_empty: + * @builder: the builder + * @attr_type: the new attribute type + * + * Add a new attribute to the builder that is empty. Unconditionally + * adds a new attribute, even if one with the same @attr_type already exists. + */ +void +gck_builder_add_empty (GckBuilder *builder, + gulong attr_type) +{ + g_return_if_fail (builder != NULL); + + builder_push (builder, attr_type); +} + +/** + * gck_builder_set_empty: + * @builder: the builder + * @attr_type: the attribute type + * + * Set an attribute on the builder that is empty. If an attribute + * with @attr_type already exists in the builder then it is changed to the new + * value, otherwise an attribute is added. + */ +void +gck_builder_set_empty (GckBuilder *builder, + gulong attr_type) +{ + g_return_if_fail (builder != NULL); + + builder_clear_or_push (builder, attr_type); +} + +/** + * gck_builder_add_invalid: + * @builder: the builder + * @attr_type: the new attribute type + * + * Add a new attribute to the builder that is invalid in the PKCS\#11 sense. + * Unconditionally adds a new attribute, even if one with the same @attr_type + * already exists. + */ +void +gck_builder_add_invalid (GckBuilder *builder, + gulong attr_type) +{ + GckAttribute *attr; + + g_return_if_fail (builder != NULL); + + attr = builder_push (builder, attr_type); + attr->length = (gulong)-1; +} + +/** + * gck_builder_set_invalid: + * @builder: the builder + * @attr_type: the attribute type + * + * Set an attribute on the builder that is invalid in the PKCS\#11 sense. + * If an attribute with @attr_type already exists in the builder then it is + * changed to the new value, otherwise an attribute is added. + */ +void +gck_builder_set_invalid (GckBuilder *builder, + gulong attr_type) +{ + GckAttribute *attr; + + g_return_if_fail (builder != NULL); + + attr = builder_clear_or_push (builder, attr_type); + attr->length = (gulong)-1; +} + +/** + * gck_builder_add_ulong: + * @builder: the builder + * @attr_type: the new attribute type + * @value: the attribute value + * + * Add a new attribute to the builder for the unsigned long @value. + * Unconditionally adds a new attribute, even if one with the same @attr_type + * already exists. + */ +void +gck_builder_add_ulong (GckBuilder *builder, + gulong attr_type, + gulong value) +{ + CK_ULONG uval = value; + gck_builder_add_data (builder, attr_type, + (const guchar *)&uval, sizeof (uval)); +} + +/** + * gck_builder_set_ulong: + * @builder: the builder + * @attr_type: the new attribute type + * @value: the attribute value + * + * Set an attribute on the builder for the unsigned long @value. + * If an attribute with @attr_type already exists in the builder then it is + * changed to the new value, otherwise an attribute is added. + */ +void +gck_builder_set_ulong (GckBuilder *builder, + gulong attr_type, + gulong value) +{ + CK_ULONG uval = value; + gck_builder_set_data (builder, attr_type, + (const guchar *)&uval, sizeof (uval)); +} + +/** + * gck_builder_add_boolean: + * @builder: the builder + * @attr_type: the new attribute type + * @value: the attribute value + * + * Add a new attribute to the builder for the boolean @value. + * Unconditionally adds a new attribute, even if one with the same @attr_type + * already exists. + */ +void +gck_builder_add_boolean (GckBuilder *builder, + gulong attr_type, + gboolean value) +{ + CK_BBOOL bval = value ? CK_TRUE : CK_FALSE; + gck_builder_add_data (builder, attr_type, + (const guchar *)&bval, sizeof (bval)); +} + +/** + * gck_builder_set_boolean: + * @builder: the builder + * @attr_type: the new attribute type + * @value: the attribute value + * + * Set an attribute on the builder for the boolean @value. + * If an attribute with @attr_type already exists in the builder then it is + * changed to the new value, otherwise an attribute is added. + */ +void +gck_builder_set_boolean (GckBuilder *builder, + gulong attr_type, + gboolean value) +{ + CK_BBOOL bval = value ? CK_TRUE : CK_FALSE; + gck_builder_set_data (builder, attr_type, + (const guchar *)&bval, sizeof (bval)); +} + +static void +convert_gdate_to_ckdate (const GDate *value, + CK_DATE *date) +{ + gchar buffer[9]; + g_snprintf (buffer, sizeof (buffer), "%04d%02d%02d", + (int)g_date_get_year (value), + (int)g_date_get_month (value), + (int)g_date_get_day (value)); + memcpy (&date->year, buffer + 0, 4); + memcpy (&date->month, buffer + 4, 2); + memcpy (&date->day, buffer + 6, 2); +} + +/** + * gck_builder_add_date: + * @builder: the builder + * @attr_type: the new attribute type + * @value: the attribute value + * + * Add a new attribute to the builder for the date @value. + * Unconditionally adds a new attribute, even if one with the same @attr_type + * already exists. + */ +void +gck_builder_add_date (GckBuilder *builder, + gulong attr_type, + const GDate *value) +{ + CK_DATE date; + + g_return_if_fail (value != NULL); + + convert_gdate_to_ckdate (value, &date); + gck_builder_add_data (builder, attr_type, + (const guchar *)&date, sizeof (CK_DATE)); +} + +/** + * gck_builder_set_date: + * @builder: the builder + * @attr_type: the new attribute type + * @value: the attribute value + * + * Set an attribute on the builder for the date @value. + * If an attribute with @attr_type already exists in the builder then it is + * changed to the new value, otherwise an attribute is added. + */ +void +gck_builder_set_date (GckBuilder *builder, + gulong attr_type, + const GDate *value) +{ + CK_DATE date; + + g_return_if_fail (value != NULL); + + convert_gdate_to_ckdate (value, &date); + gck_builder_set_data (builder, attr_type, + (const guchar *)&date, sizeof (CK_DATE)); +} + +/** + * gck_builder_add_string: + * @builder: the builder + * @attr_type: the new attribute type + * @value: (allow-none): the attribute value + * + * Add a new attribute to the builder for the string @value or %NULL. + * Unconditionally adds a new attribute, even if one with the same @attr_type + * already exists. + */ +void +gck_builder_add_string (GckBuilder *builder, + gulong attr_type, + const gchar *value) +{ + gck_builder_add_data (builder, attr_type, + (const guchar *)value, value ? strlen (value) : 0); +} + +/** + * gck_builder_set_string: + * @builder: the builder + * @attr_type: the new attribute type + * @value: the attribute value + * + * Set an attribute on the builder for the string @value or %NULL. + * If an attribute with @attr_type already exists in the builder then it is + * changed to the new value, otherwise an attribute is added. + */ +void +gck_builder_set_string (GckBuilder *builder, + gulong attr_type, + const gchar *value) +{ + gck_builder_set_data (builder, attr_type, + (const guchar *)value, value ? strlen (value) : 0); +} + +/** + * gck_builder_add_attribute: + * @builder: the builder + * @attr: the attribute to add + * + * Add an attribute to the builder. The attribute is added unconditionally whether + * or not an attribute with the same type already exists on the builder. + * + * The @attr attribute must have been created or owned by the Gck library. + * If you call this function on an arbitrary #GckAttribute that is allocated on + * the stack or elsewhere, then this will result in undefined behavior. + * + * As an optimization, the attribute memory value is automatically shared + * between the attribute and the builder. + */ +void +gck_builder_add_attribute (GckBuilder *builder, + const GckAttribute *attr) +{ + g_return_if_fail (builder != NULL); + g_return_if_fail (attr != NULL); + + builder_copy (builder, attr, FALSE); +} + +/** + * gck_builder_add_all: + * @builder: the builder + * @attrs: the attributes to add + * + * Add all the @attrs attributes to the builder. The attributes are added + * uncondititionally whether or not attributes with the same types already + * exist in the builder. + * + * As an optimization, the attribute memory values are automatically shared + * between the attributes and the builder. + */ +void +gck_builder_add_all (GckBuilder *builder, + GckAttributes *attrs) +{ + gulong i; + + g_return_if_fail (builder != NULL); + g_return_if_fail (attrs != NULL); + + for (i = 0; i < attrs->count; i++) + builder_copy (builder, &attrs->data[i], FALSE); +} + +/** + * gck_builder_add_only: (skip) + * @builder: the builder + * @attrs: the attributes to add + * @only_type: the first type of attribute to add + * @...: the remaining attribute types to add, ending with %GCK_INVALID + * + * Add the attributes specified in the argument list from @attrs to the + * builder. The attributes are added uncondititionally whether or not + * attributes with the same types already exist in the builder. + * + * The variable arguments must be unsigned longs. + * + * + * /* Add the CKA_ID and CKA_CLASS attributes from attrs to builder */ + * gck_builder_add_only (builder, attrs, CKA_ID, CKA_CLASS, GCK_INVALID); + * + * + * As an optimization, the attribute memory values are automatically shared + * between the attributes and the builder. + */ +void +gck_builder_add_only (GckBuilder *builder, + GckAttributes *attrs, + gulong only_type, + ...) +{ + GArray *types; + va_list va; + + g_return_if_fail (builder != NULL); + g_return_if_fail (attrs != NULL); + + types = g_array_new (FALSE, FALSE, sizeof (gulong)); + + va_start (va, only_type); + while (only_type != GCK_INVALID) { + g_array_append_val (types, only_type); + only_type = va_arg (va, gulong); + } + va_end (va); + + gck_builder_add_onlyv (builder, attrs, (gulong *)types->data, types->len); + g_array_free (types, TRUE); +} + +/** + * gck_builder_add_onlyv: (rename-to gck_builder_add_only) + * @builder: the builder + * @attrs: the attributes to add + * @only_types: (array length=n_only_types): the types of attributes to add + * @n_only_types: the number of attributes + * + * Add the attributes with the types in @only_types from @attrs to the + * builder. The attributes are added uncondititionally whether or not + * attributes with the same types already exist in the builder. + * + * + * /* Add the CKA_ID and CKA_CLASS attributes from attrs to builder */ + * gulong only[] = { CKA_ID, CKA_CLASS }; + * gck_builder_add_onlyv (builder, attrs, only, 2); + * + * + * As an optimization, the attribute memory values are automatically shared + * between the attributes and the builder. + */ +void +gck_builder_add_onlyv (GckBuilder *builder, + GckAttributes *attrs, + const gulong *only_types, + guint n_only_types) +{ + gulong i; + guint j; + + g_return_if_fail (builder != NULL); + g_return_if_fail (attrs != NULL); + + for (i = 0; i < attrs->count; i++) { + for (j = 0; j < n_only_types; j++) { + if (attrs->data[i].type == only_types[j]) + builder_copy (builder, &attrs->data[i], FALSE); + } + } +} + +/** + * gck_builder_add_except: (skip) + * @builder: the builder + * @attrs: the attributes to add + * @except_type: the first type of attribute to to exclude + * @...: the remaining attribute types to exclude, ending with %GCK_INVALID + * + * Add the attributes in @attrs to the builder, with the exception of those + * in the argument list. The attributes are added uncondititionally whether or + * not attributes with the same types already exist in the builder. + * + * The variable arguments must be unsigned longs. + * + * + * /* Add all attributes in attrs except CKA_CLASS to the builder */ + * gck_builder_add_except (builder, attrs, CKA_CLASS, GCK_INVALID); + * + * + * As an optimization, the attribute memory values are automatically shared + * between the attributes and the builder. + */ +void +gck_builder_add_except (GckBuilder *builder, + GckAttributes *attrs, + gulong except_type, + ...) +{ + GArray *types; + va_list va; + + g_return_if_fail (builder != NULL); + g_return_if_fail (attrs != NULL); + + types = g_array_new (FALSE, FALSE, sizeof (gulong)); + + va_start (va, except_type); + while (except_type != GCK_INVALID) { + g_array_append_val (types, except_type); + except_type = va_arg (va, gulong); + } + va_end (va); + + gck_builder_add_exceptv (builder, attrs, (gulong *)types->data, types->len); + g_array_free (types, TRUE); +} + +/** + * gck_builder_add_exceptv: (skip) + * @builder: the builder + * @attrs: the attributes to add + * @except_types: (array length=n_except_types): the except types + * @n_except_types: the number of except types + * + * Add the attributes in @attrs to the builder, with the exception of those + * whose types are specified in @except_types. The attributes are added + * uncondititionally whether or not attributes with the same types already + * exist in the builder. + * + * + * /* Add all attributes in attrs except CKA_CLASS to the builder */ + * gulong except_types[] = { CKA_CLASS }; + * gck_builder_add_exceptv (builder, attrs, except_types, 1); + * + * + * As an optimization, the attribute memory values are automatically shared + * between the attributes and the builder. + */ +void +gck_builder_add_exceptv (GckBuilder *builder, + GckAttributes *attrs, + const gulong *except_types, + guint n_except_types) +{ + gulong i; + guint j; + + g_return_if_fail (builder != NULL); + g_return_if_fail (attrs != NULL); + + for (i = 0; i < attrs->count; i++) { + for (j = 0; j < n_except_types; j++) { + if (attrs->data[i].type == except_types[j]) + break; + } + if (j == n_except_types) + builder_copy (builder, &attrs->data[i], FALSE); + } +} + +/** + * gck_builder_set_all: + * @builder: the builder + * @attrs: the attributes to set + * + * Set all the @attrs attributes to the builder. If any attributes with the + * same types are already present in the builder, then those attributes are + * changed to the new values. + * + * As an optimization, the attribute memory values are automatically shared + * between the attributes and the builder. + */ +void +gck_builder_set_all (GckBuilder *builder, + GckAttributes *attrs) +{ + gulong i; + + g_return_if_fail (builder != NULL); + g_return_if_fail (attrs != NULL); + + for (i = 0; i < attrs->count; i++) + builder_copy (builder, &attrs->data[i], TRUE); +} + +/** + * gck_builder_find: + * @builder: the builder + * @attr_type: the type of attribute to find + * + * Find an attribute in the builder. Both valid and invalid attributes (in + * the PKCS\#11 sense) are returned. If multiple attributes exist for the given + * attribute type, then the first one is returned. + * + * The returned #GckAttribute is owned by the builder and may not be modified + * in any way. It is only valid until another attribute is added to or set on + * the builder, or until the builder is cleared or unreferenced. + * + * Returns: the attribute or %NULL if not found + */ +const GckAttribute * +gck_builder_find (GckBuilder *builder, + gulong attr_type) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + + g_return_val_if_fail (builder != NULL, NULL); + + if (real->array == NULL) + return NULL; + + return find_attribute ((GckAttribute *)real->array->data, + real->array->len, attr_type); +} + +static gboolean +find_attribute_boolean (GckAttribute *attrs, + gsize n_attrs, + gulong attr_type, + gboolean *value) +{ + GckAttribute *attr; + + attr = find_attribute (attrs, n_attrs, attr_type); + if (!attr || gck_attribute_is_invalid (attr)) + return FALSE; + return gck_value_to_boolean (attr->value, attr->length, value); +} + +/** + * gck_builder_find_boolean: + * @builder: the builder + * @attr_type: the type of attribute to find + * @value: (out): the location to place the found value + * + * Find a boolean attribute in the builder that has the type @attr_type, is + * of the correct boolean size, and is not invalid in the PKCS\#11 sense. + * If multiple attributes exist for the given attribute type, then the first\ + * one is returned. + * + * Returns: whether a valid boolean attribute was found + */ +gboolean +gck_builder_find_boolean (GckBuilder *builder, + gulong attr_type, + gboolean *value) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + + g_return_val_if_fail (builder != NULL, FALSE); + g_return_val_if_fail (value != NULL, FALSE); + + if (real->array == NULL) + return FALSE; + + return find_attribute_boolean ((GckAttribute *)real->array->data, + real->array->len, attr_type, value); +} + +static gboolean +find_attribute_ulong (GckAttribute *attrs, + gsize n_attrs, + gulong attr_type, + gulong *value) +{ + GckAttribute *attr; + + attr = find_attribute (attrs, n_attrs, attr_type); + if (!attr || gck_attribute_is_invalid (attr)) + return FALSE; + return gck_value_to_ulong (attr->value, attr->length, value); +} + +/** + * gck_builder_find_ulong: + * @builder: the builder + * @attr_type: the type of attribute to find + * @value: (out): the location to place the found value + * + * Find a unsigned long attribute in the builder that has the type @attr_type, + * is of the correct unsigned long size, and is not invalid in the PKCS\#11 sense. + * If multiple attributes exist for the given attribute type, then the first\ + * one is returned. + * + * Returns: whether a valid unsigned long attribute was found + */ +gboolean +gck_builder_find_ulong (GckBuilder *builder, + gulong attr_type, + gulong *value) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + + g_return_val_if_fail (builder != NULL, FALSE); + g_return_val_if_fail (value != NULL, FALSE); + + if (real->array == NULL) + return FALSE; + + return find_attribute_ulong ((GckAttribute *)real->array->data, + real->array->len, attr_type, value); +} + +static gboolean +find_attribute_string (GckAttribute *attrs, + gsize n_attrs, + gulong attr_type, + gchar **value) +{ + GckAttribute *attr; + gchar *string; + + attr = find_attribute (attrs, n_attrs, attr_type); + if (!attr || gck_attribute_is_invalid (attr)) + return FALSE; + string = gck_attribute_get_string (attr); + if (string == NULL) + return FALSE; + *value = string; + return TRUE; +} + +/** + * gck_builder_find_string: + * @builder: the builder + * @attr_type: the type of attribute to find + * @value: (out): the location to place the found value + * + * Find a string attribute in the builder that has the type @attr_type, has a + * non %NULL value pointer, and is not invalid in the PKCS\#11 sense. + * If multiple attributes exist for the given attribute type, then the first + * one is returned. + * + * Returns: whether a valid string attribute was found + */ +gboolean +gck_builder_find_string (GckBuilder *builder, + gulong attr_type, + gchar **value) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + + g_return_val_if_fail (builder != NULL, FALSE); + g_return_val_if_fail (value != NULL, FALSE); + + if (real->array == NULL) + return FALSE; + + return find_attribute_string ((GckAttribute *)real->array->data, + real->array->len, attr_type, value); +} + +static gboolean +find_attribute_date (GckAttribute *attrs, + gsize n_attrs, + gulong attr_type, + GDate *value) +{ + GckAttribute *attr; + + attr = find_attribute (attrs, n_attrs, attr_type); + if (!attr || gck_attribute_is_invalid (attr)) + return FALSE; + gck_attribute_get_date (attr, value); + return TRUE; +} + +/** + * gck_builder_find_date: + * @builder: the builder + * @attr_type: the type of attribute to find + * @value: (out): the location to place the found value + * + * Find a date attribute in the builder that has the type @attr_type, is of + * the correct date size, and is not invalid in the PKCS\#11 sense. + * If multiple attributes exist for the given attribute type, then the first + * one is returned. + * + * Returns: whether a valid date attribute was found + */ +gboolean +gck_builder_find_date (GckBuilder *builder, + gulong attr_type, + GDate *value) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + + g_return_val_if_fail (builder != NULL, FALSE); + g_return_val_if_fail (value != NULL, FALSE); + + if (real->array == NULL) + return FALSE; + + return find_attribute_date ((GckAttribute *)real->array->data, + real->array->len, attr_type, value); +} + +/** + * gck_builder_steal: + * @builder: the builder + * + * Take the attributes that have been built in the #GckBuilder. The builder + * will no longer contain any attributes after this function call. + * + * The returned set of attributes is a full reference, not floating. + * + * Returns: (transfer full): the stolen attributes, which should be freed with + * gck_attributes_unref() + */ +GckAttributes * +gck_builder_steal (GckBuilder *builder) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttributes *attrs; + gpointer data; + gulong length; + + g_return_val_if_fail (builder != NULL, NULL); + + if (real->array) { + length = real->array->len; + data = g_array_free (real->array, FALSE); + real->array = NULL; + } else { + length = 0; + data = NULL; + } + + attrs = g_slice_new0 (GckAttributes); + attrs->count = length; + attrs->data = data; + attrs->refs = 1; + + return attrs; +} + +/** + * gck_builder_end: + * @builder: the builder + * + * Complete the #GckBuilder, and return the attributes contained in the builder. + * The #GckBuilder will be cleared after this function call, and it is no + * longer necessary to use gck_builder_clear() on it, although it is also + * permitted. The builder may be used again to build another set of attributes + * after this function call. + * + * The returned set of attributes is floating, and should either be passed to + * another gck library function which consumes this floating reference, or if + * you wish to keep these attributes around you should ref them with + * gck_attributes_ref_sink() and unref them later with gck_attributes_unref(). + * + * Returns: (transfer none): a floating reference to the attributes created + * in the builder + */ +GckAttributes * +gck_builder_end (GckBuilder *builder) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttributes *attrs; + + g_return_val_if_fail (builder != NULL, NULL); + + attrs = gck_builder_steal (builder); + attrs->state |= STATE_FLOATING; + + g_assert (real->array == NULL); + return attrs; +} + +/** + * gck_builder_clear: + * @builder: the builder + * + * Clear the builder and release all allocated memory. The builder may be used + * again to build another set of attributes after this function call. + * + * If memory is shared between this builder and other attributes, then that + * memory is only freed when both of them are cleared or unreferenced. + */ +void +gck_builder_clear (GckBuilder *builder) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttribute *attr; + guint i; + + g_return_if_fail (builder != NULL); + + if (real->array == NULL) + return; + + for (i = 0; i < real->array->len; i++) { + attr = &g_array_index (real->array, GckAttribute, i); + builder_clear (attr); + } + + g_array_free (real->array, TRUE); + real->array = NULL; +} + +/** + * GckAttribute: + * @type: The attribute type, such as CKA_LABEL. + * @value: (array length=length): The value of the attribute. May be NULL. + * @length: The length of the attribute. May be GCK_INVALID if the attribute is invalid. + * + * This structure represents a PKCS11 CK_ATTRIBUTE. + */ + +/** + * gck_attribute_is_invalid: + * @attr: The attribute to check. + * + * Check if the PKCS\#11 attribute represents 'invalid' or 'not found' + * according to the PKCS\#11 spec. That is, having length + * of (CK_ULONG)-1. + * + * Return value: Whether the attribute represents invalid or not. + */ +gboolean +gck_attribute_is_invalid (const GckAttribute *attr) +{ + g_return_val_if_fail (attr, TRUE); + return attr->length == (gulong)-1; +} + +/** + * gck_attribute_get_boolean: + * @attr: The attribute to retrieve value from. + * + * Get the CK_BBOOL of a PKCS\#11 attribute. No conversion + * is performed. It is an error to pass an attribute to this + * function unless you're know it's supposed to contain a + * boolean value. + * + * Return value: The boolean value of the attribute. + */ +gboolean +gck_attribute_get_boolean (const GckAttribute *attr) +{ + gboolean value; + + g_return_val_if_fail (attr, FALSE); + if (gck_attribute_is_invalid (attr)) + return FALSE; + if (!gck_value_to_boolean (attr->value, attr->length, &value)) + g_return_val_if_reached (FALSE); + return value; +} + +/** + * gck_attribute_get_ulong: + * @attr: The attribute to retrieve value from. + * + * Get the CK_ULONG value of a PKCS\#11 attribute. No + * conversion is performed. It is an error to pass an attribute + * to this function unless you're know it's supposed to contain + * a value of the right type. + * + * Return value: The ulong value of the attribute. + */ +gulong +gck_attribute_get_ulong (const GckAttribute *attr) +{ + gulong value; + + g_return_val_if_fail (attr, FALSE); + if (gck_attribute_is_invalid (attr)) + return 0; + if (!gck_value_to_ulong (attr->value, attr->length, &value)) + g_return_val_if_reached ((gulong)-1); + return value; +} + +/** + * gck_attribute_get_string: + * @attr: The attribute to retrieve value from. + * + * Get the string value of a PKCS\#11 attribute. No + * conversion is performed. It is an error to pass an attribute + * to this function unless you're know it's supposed to contain + * a value of the right type. + * + * Return value: (allow-none): a null terminated string, to be freed with + * g_free(), or %NULL if the value was invalid + */ +gchar* +gck_attribute_get_string (const GckAttribute *attr) +{ + g_return_val_if_fail (attr, NULL); + + if (gck_attribute_is_invalid (attr)) + return NULL; + if (!attr->value) + return NULL; + + return g_strndup ((gchar*)attr->value, attr->length); +} + +/** + * gck_attribute_get_date: + * @attr: The attribute to retrieve value from. + * @value: The date value to fill in with the parsed date. + * + * Get the CK_DATE of a PKCS\#11 attribute. No + * conversion is performed. It is an error to pass an attribute + * to this function unless you're know it's supposed to contain + * a value of the right type. + */ +void +gck_attribute_get_date (const GckAttribute *attr, + GDate *value) +{ + guint year, month, day; + gchar buffer[5]; + CK_DATE *date; + gchar *end; + + g_return_if_fail (attr); + + if (gck_attribute_is_invalid (attr)) { + g_date_clear (value, 1); + return; + } + + g_return_if_fail (attr->length == sizeof (CK_DATE)); + g_return_if_fail (attr->value); + date = (CK_DATE*)attr->value; + + memset (&buffer, 0, sizeof (buffer)); + memcpy (buffer, date->year, 4); + year = strtol (buffer, &end, 10); + g_return_if_fail (end != buffer && !*end); + + memset (&buffer, 0, sizeof (buffer)); + memcpy (buffer, date->month, 2); + month = strtol (buffer, &end, 10); + g_return_if_fail (end != buffer && !*end); + + memset (&buffer, 0, sizeof (buffer)); + memcpy (buffer, date->day, 2); + day = strtol (buffer, &end, 10); + g_return_if_fail (end != buffer && !*end); + + g_date_set_dmy (value, day, month, year); +} + +/** + * gck_attribute_get_data: + * @attr: an attribute + * @length: the length of the returned data + * + * Get the raw value in the attribute. + * + * This is useful from scripting languages. C callers will generally + * access the #GckAttribute struct directly. + * + * This function will %NULL if the attribute contains empty or invalid + * data. The returned data must not be modified and is only valid + * as long as this @attribute. + * + * Returns: (transfer none) (array length=length): the value data or %NULL + */ +const guchar * +gck_attribute_get_data (const GckAttribute *attr, + gsize *length) +{ + g_return_val_if_fail (attr != NULL, NULL); + + if (attr->length == G_MAXULONG) { + *length = 0; + return NULL; + } + *length = attr->length; + return attr->value; +} + +/** + * gck_attribute_init: (skip) + * @attr: an uninitialized attribute + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: (array length=length): The raw value of the attribute. + * @length: The length of the raw value. + * + * Initialize a PKCS\#11 attribute. This copies the value memory + * into an internal buffer. + * + * When done with the attribute you should use gck_attribute_clear() + * to free the internal memory. + **/ +void +gck_attribute_init (GckAttribute *attr, + gulong attr_type, + const guchar *value, + gsize length) +{ + g_return_if_fail (attr != NULL); + + attr->type = attr_type; + if (length == G_MAXULONG) { + attr->value = NULL; + attr->length = G_MAXULONG; + } else if (value == NULL) { + attr->value = NULL; + attr->length = 0; + } else { + attr->value = value_new (value, length, egg_secure_check (value)); + attr->length = length; + } +} + +/** + * gck_attribute_init_invalid: (skip) + * @attr: an uninitialized attribute + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * + * Initialize a PKCS\#11 attribute to an 'invalid' or 'not found' + * state. Specifically this sets the value length to (CK_ULONG)-1 + * as specified in the PKCS\#11 specification. + * + * When done with the attribute you should use gck_attribute_clear() + * to free the internal memory. + **/ +void +gck_attribute_init_invalid (GckAttribute *attr, + gulong attr_type) +{ + g_return_if_fail (attr != NULL); + attr->type = attr_type; + attr->value = NULL; + attr->length = G_MAXULONG; +} + +/** + * gck_attribute_init_empty: (skip) + * @attr: an uninitialized attribute + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * + * Initialize a PKCS\#11 attribute to an empty state. The attribute + * type will be set, but no data will be set. + * + * When done with the attribute you should use gck_attribute_clear() + * to free the internal memory. + **/ +void +gck_attribute_init_empty (GckAttribute *attr, gulong attr_type) +{ + g_return_if_fail (attr != NULL); + + attr->type = attr_type; + attr->length = 0; + attr->value = 0; +} + +/** + * gck_attribute_init_boolean: (skip) + * @attr: an uninitialized attribute + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the boolean value of the attribute + * + * Initialize a PKCS\#11 attribute to boolean. This will result + * in a CK_BBOOL attribute from the PKCS\#11 specs. + * + * When done with the attribute you should use gck_attribute_clear() + * to free the internal memory. + **/ +void +gck_attribute_init_boolean (GckAttribute *attr, + gulong attr_type, + gboolean value) +{ + CK_BBOOL val = value ? CK_TRUE : CK_FALSE; + g_return_if_fail (attr != NULL); + gck_attribute_init (attr, attr_type, &val, sizeof (val)); +} + +/** + * gck_attribute_init_date: (skip) + * @attr: an uninitialized attribute + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the date value of the attribute + * + * Initialize a PKCS\#11 attribute to a date. This will result + * in a CK_DATE attribute from the PKCS\#11 specs. + * + * When done with the attribute you should use gck_attribute_clear() + * to free the internal memory. + **/ +void +gck_attribute_init_date (GckAttribute *attr, + gulong attr_type, + const GDate *value) +{ + CK_DATE date; + + g_return_if_fail (attr != NULL); + g_return_if_fail (value != NULL); + + convert_gdate_to_ckdate (value, &date); + gck_attribute_init (attr, attr_type, (const guchar *)&date, sizeof (CK_DATE)); +} + +/** + * gck_attribute_init_ulong: (skip) + * @attr: an uninitialized attribute + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the ulong value of the attribute + * + * Initialize a PKCS\#11 attribute to a unsigned long. This will result + * in a CK_ULONG attribute from the PKCS\#11 specs. + * + * When done with the attribute you should use gck_attribute_clear() + * to free the internal memory. + **/ +void +gck_attribute_init_ulong (GckAttribute *attr, + gulong attr_type, + gulong value) +{ + CK_ULONG val = value; + g_return_if_fail (attr != NULL); + gck_attribute_init (attr, attr_type, (const guchar *)&val, sizeof (val)); +} + +/** + * gck_attribute_init_string: (skip) + * @attr: an uninitialized attribute + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the null terminated string value of the attribute + * + * Initialize a PKCS\#11 attribute to a string. This will result + * in an attribute containing the text, but not the null terminator. + * The text in the attribute will be of the same encoding as you pass + * to this function. + * + * When done with the attribute you should use gck_attribute_clear() + * to free the internal memory. + **/ +void +gck_attribute_init_string (GckAttribute *attr, + gulong attr_type, + const gchar *value) +{ + g_return_if_fail (attr != NULL); + gck_attribute_init (attr, attr_type, (const guchar *)value, + value ? strlen (value) : 0); +} + +GType +gck_attribute_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckAttribute", + (GBoxedCopyFunc)gck_attribute_dup, + (GBoxedFreeFunc)gck_attribute_free); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gck_attribute_new: + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the raw value of the attribute + * @length: the length of the attribute + * + * Create a new PKCS\#11 attribute. The value will be copied + * into the new attribute. + * + * Returns: (transfer full): the new attribute; when done with the attribute + * use gck_attribute_free() to free it + **/ +GckAttribute * +gck_attribute_new (gulong attr_type, + const guchar *value, + gsize length) +{ + GckAttribute *attr = g_slice_new0 (GckAttribute); + gck_attribute_init (attr, attr_type, value, length); + return attr; +} + +/** + * gck_attribute_new_invalid: + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * + * Create a new PKCS\#11 attribute as 'invalid' or 'not found' + * state. Specifically this sets the value length to (CK_ULONG)-1 + * as specified in the PKCS\#11 specification. + * + * Returns: (transfer full): the new attribute; when done with the attribute + * use gck_attribute_free() to free it + **/ +GckAttribute * +gck_attribute_new_invalid (gulong attr_type) +{ + GckAttribute *attr = g_slice_new0 (GckAttribute); + gck_attribute_init_invalid (attr, attr_type); + return attr; +} + +/** + * gck_attribute_new_empty: + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * + * Create a new PKCS\#11 attribute with empty data. + * + * Returns: (transfer full): the new attribute; when done with the attribute + * use gck_attribute_free() to free it + */ +GckAttribute * +gck_attribute_new_empty (gulong attr_type) +{ + GckAttribute *attr = g_slice_new0 (GckAttribute); + gck_attribute_init_empty (attr, attr_type); + return attr; +} + +/** + * gck_attribute_new_boolean: + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the boolean value of the attribute + * + * Initialize a PKCS\#11 attribute to boolean. This will result + * in a CK_BBOOL attribute from the PKCS\#11 specs. + * + * Returns: (transfer full): the new attribute; when done with the attribute u + * gck_attribute_free() to free it + **/ +GckAttribute * +gck_attribute_new_boolean (gulong attr_type, + gboolean value) +{ + GckAttribute *attr = g_slice_new0 (GckAttribute); + gck_attribute_init_boolean (attr, attr_type, value); + return attr; +} + +/** + * gck_attribute_new_date: + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the date value of the attribute + * + * Initialize a PKCS\#11 attribute to a date. This will result + * in a CK_DATE attribute from the PKCS\#11 specs. + * + * Returns: (transfer full): the new attribute; when done with the attribute u + * gck_attribute_free() to free it + **/ +GckAttribute * +gck_attribute_new_date (gulong attr_type, + const GDate *value) +{ + GckAttribute *attr = g_slice_new0 (GckAttribute); + gck_attribute_init_date (attr, attr_type, value); + return attr; +} + +/** + * gck_attribute_new_ulong: + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the ulong value of the attribute + * + * Initialize a PKCS\#11 attribute to a unsigned long. This will result + * in a CK_ULONG attribute from the PKCS\#11 specs. + * + * Returns: (transfer full): the new attribute; when done with the attribute u + * gck_attribute_free() to free it + **/ +GckAttribute * +gck_attribute_new_ulong (gulong attr_type, + gulong value) +{ + GckAttribute *attr = g_slice_new0 (GckAttribute); + gck_attribute_init_ulong (attr, attr_type, value); + return attr; +} + +/** + * gck_attribute_new_string: + * @attr_type: the PKCS\#11 attribute type to set on the attribute + * @value: the null-terminated string value of the attribute + * + * Initialize a PKCS\#11 attribute to a string. This will result + * in an attribute containing the text, but not the null terminator. + * The text in the attribute will be of the same encoding as you pass + * to this function. + * + * Returns: (transfer full): the new attribute; when done with the attribute u + * gck_attribute_free() to free it + **/ +GckAttribute * +gck_attribute_new_string (gulong attr_type, + const gchar *value) +{ + GckAttribute *attr = g_slice_new0 (GckAttribute); + gck_attribute_init_string (attr, attr_type, value); + return attr; +} + +/** + * gck_attribute_dup: + * @attr: the attribute to duplicate + * + * Duplicate the PKCS\#11 attribute. All value memory is + * also copied. + * + * The @attr must have been allocated or initialized by a Gck function or + * the results of this function are undefined. + * + * Returns: (transfer full): the duplicated attribute; use gck_attribute_free() + * to free it + */ +GckAttribute * +gck_attribute_dup (const GckAttribute *attr) +{ + GckAttribute *copy; + + if (!attr) + return NULL; + + copy = g_slice_new0 (GckAttribute); + gck_attribute_init_copy (copy, attr); + return copy; +} + +/** + * gck_attribute_init_copy: + * @dest: An uninitialized attribute. + * @src: An attribute to copy. + * + * Initialize a PKCS\#11 attribute as a copy of another attribute. + * This copies the value memory as well. + * + * When done with the copied attribute you should use + * gck_attribute_clear() to free the internal memory. + **/ +void +gck_attribute_init_copy (GckAttribute *dest, + const GckAttribute *src) +{ + g_return_if_fail (dest != NULL); + g_return_if_fail (src != NULL); + + dest->type = src->type; + if (src->length == G_MAXULONG) { + dest->value = NULL; + dest->length = G_MAXULONG; + } else if (src->value == NULL) { + dest->value = NULL; + dest->length = 0; + } else { + dest->value = value_ref (src->value); + dest->length = src->length; + } +} + +/** + * gck_attribute_clear: + * @attr: Attribute to clear. + * + * Clear allocated memory held by a #GckAttribute. + * + * This attribute must have been allocated by a Gck library function, or + * the results of this method are undefined. + * + * The type of the attribute will remain set. + **/ +void +gck_attribute_clear (GckAttribute *attr) +{ + g_return_if_fail (attr != NULL); + + if (attr->value != NULL) + value_unref (attr->value); + attr->value = NULL; + attr->length = 0; +} + +/** + * gck_attribute_free: + * @attr: (type Gck.Attribute): attribute to free + * + * Free an attribute and its allocated memory. These is usually + * used with attributes that are allocated by gck_attribute_new() + * or a similar function. + **/ +void +gck_attribute_free (gpointer attr) +{ + GckAttribute *a = attr; + if (attr) { + gck_attribute_clear (a); + g_slice_free (GckAttribute, a); + } +} + +/** + * gck_attribute_equal: + * @attr1: (type Gck.Attribute): first attribute to compare + * @attr2: (type Gck.Attribute): second attribute to compare + * + * Compare two attributes. Useful with GHashTable. + * + * Returns: %TRUE if the attributes are equal. + */ +gboolean +gck_attribute_equal (gconstpointer attr1, + gconstpointer attr2) +{ + const GckAttribute *aa = attr1; + const GckAttribute *ab = attr2; + + if (!aa && !ab) + return TRUE; + if (!aa || !ab) + return FALSE; + + if (aa->type != ab->type) + return FALSE; + if (aa->length != ab->length) + return FALSE; + if (!aa->value && !ab->value) + return TRUE; + if (!aa->value || !ab->value) + return FALSE; + return memcmp (aa->value, ab->value, aa->length) == 0; +} + +/** + * gck_attribute_hash: + * @attr: (type Gck.Attribute): attribute to hash + * + * Hash an attribute for use in GHashTable keys. + * + * Returns: the hash code + */ +guint +gck_attribute_hash (gconstpointer attr) +{ + const GckAttribute *a = attr; + const signed char *p, *e; + guint32 h = 5381; + + h ^= _gck_ulong_hash (&a->type); + + if (a->value) { + for (p = (signed char *)a->value, e = p + a->length; p != e; p++) + h = (h << 5) + h + *p; + } + + return h; +} + +/** + * SECTION:gck-attributes + * @title: GckAttributes + * @short_description: A set of PKCS11 attributes. + * + * A set of GckAttribute structures. These attributes contain information + * about a PKCS11 object. Use gck_object_get() or gck_object_set() to set and retrieve + * attributes on an object. + */ + +/** + * GckAttributes: + * + * A set of GckAttribute structures. + */ + +/** + * GckAllocator: + * @data: Memory to allocate or deallocate. + * @length: New length of memory. + * + * An allocator used to allocate data for the attributes in this GckAttributes set. + * + * This is a function that acts like g_realloc. Specifically it frees when length is + * set to zero, it allocates when data is set to NULL, and it reallocates when both + * are valid. + * + * Returns: The allocated memory, or NULL when freeing. + **/ + +GType +gck_attributes_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckAttributes", + (GBoxedCopyFunc)gck_attributes_ref, + (GBoxedFreeFunc)gck_attributes_unref); + g_once_init_leave (&initialized, 1); + } + return type; +} + +GType +gck_attributes_get_boxed_type (void) +{ + /* Deprecated version */ + return gck_attributes_get_type (); +} + +/** + * gck_attributes_new_empty: + * @first_type: the first empty attribute type + * @...: the other empty attribute types + * + * Creates an GckAttributes array with empty attributes + * + * Terminate the argument list with %GCK_INVALID. + * + * The returned set of attributes is floating, and should either be passed to + * another gck library function which consumes this floating reference, or if + * you wish to keep these attributes around you should ref them with + * gck_attributes_ref_sink() and unref them later with gck_attributes_unref(). + * + * Returns: (transfer none): a floating reference to an empty set of attributes + **/ +GckAttributes * +gck_attributes_new_empty (gulong first_type, + ...) +{ + GckBuilder builder = GCK_BUILDER_INIT; + va_list va; + + va_start (va, first_type); + + while (first_type != GCK_INVALID) { + gck_builder_add_empty (&builder, first_type); + first_type = va_arg (va, gulong); + } + + va_end (va); + return gck_builder_end (&builder); +} + +/** + * gck_attributes_at: + * @attrs: The attributes array. + * @index: The attribute index to retrieve. + * + * Get attribute at the specified index in the attribute array. + * + * Use gck_attributes_count() to determine how many attributes are + * in the array. + * + * Returns: (transfer none): the specified attribute + **/ +const GckAttribute * +gck_attributes_at (GckAttributes *attrs, + guint index) +{ + g_return_val_if_fail (attrs != NULL, NULL); + g_return_val_if_fail (index < attrs->count, NULL); + return attrs->data + index; +} + +/** + * gck_attributes_count: + * @attrs: The attributes array to count. + * + * Get the number of attributes in this attribute array. + * + * Return value: The number of contained attributes. + **/ +gulong +gck_attributes_count (GckAttributes *attrs) +{ + g_return_val_if_fail (attrs != NULL, 0); + return attrs->count; +} + +/** + * gck_attributes_find: + * @attrs: The attributes array to search. + * @attr_type: The type of attribute to find. + * + * Find an attribute with the specified type in the array. + * + * Returns: (transfer none): the first attribute found with the specified type, + * or %NULL + **/ +const GckAttribute * +gck_attributes_find (GckAttributes *attrs, + gulong attr_type) +{ + g_return_val_if_fail (attrs != NULL, NULL); + + return find_attribute (attrs->data, attrs->count, attr_type); +} + +/** + * gck_attributes_find_boolean: + * @attrs: The attributes array to search. + * @attr_type: The type of attribute to find. + * @value: (out): The resulting gboolean value. + * + * Find an attribute with the specified type in the array. + * + * The attribute (if found) must be of the right size to store + * a boolean value (ie: CK_BBOOL). If the attribute is marked invalid + * then it will be treated as not found. + * + * Return value: Whether a value was found or not. + **/ +gboolean +gck_attributes_find_boolean (GckAttributes *attrs, gulong attr_type, gboolean *value) +{ + g_return_val_if_fail (attrs != NULL, FALSE); + g_return_val_if_fail (value, FALSE); + + return find_attribute_boolean (attrs->data, attrs->count, attr_type, value); +} + +/** + * gck_attributes_find_ulong: + * @attrs: The attributes array to search. + * @attr_type: The type of attribute to find. + * @value: (out): The resulting gulong value. + * + * Find an attribute with the specified type in the array. + * + * The attribute (if found) must be of the right size to store + * a unsigned long value (ie: CK_ULONG). If the attribute is marked invalid + * then it will be treated as not found. + * + * Return value: Whether a value was found or not. + **/ +gboolean +gck_attributes_find_ulong (GckAttributes *attrs, gulong attr_type, gulong *value) +{ + g_return_val_if_fail (attrs != NULL, FALSE); + g_return_val_if_fail (value, FALSE); + + return find_attribute_ulong (attrs->data, attrs->count, attr_type, value); +} + +/** + * gck_attributes_find_string: + * @attrs: The attributes array to search. + * @attr_type: The type of attribute to find. + * @value: (out): The resulting string value. + * + * Find an attribute with the specified type in the array. + * + * If the attribute is marked invalid then it will be treated as not found. + * The resulting string will be null-terminated, and must be freed by the caller + * using g_free(). + * + * Return value: Whether a value was found or not. + **/ +gboolean +gck_attributes_find_string (GckAttributes *attrs, gulong attr_type, gchar **value) +{ + g_return_val_if_fail (attrs != NULL, FALSE); + g_return_val_if_fail (value, FALSE); + + return find_attribute_string (attrs->data, attrs->count, attr_type, value); +} + +/** + * gck_attributes_find_date: + * @attrs: The attributes array to search. + * @attr_type: The type of attribute to find. + * @value: (out): The resulting GDate value. + * + * Find an attribute with the specified type in the array. + * + * The attribute (if found) must be of the right size to store + * a date value (ie: CK_DATE). If the attribute is marked invalid + * then it will be treated as not found. + * + * Return value: Whether a value was found or not. + **/ +gboolean +gck_attributes_find_date (GckAttributes *attrs, gulong attr_type, GDate *value) +{ + g_return_val_if_fail (attrs != NULL, FALSE); + g_return_val_if_fail (value, FALSE); + + return find_attribute_date (attrs->data, attrs->count, attr_type, value); +} + +/** + * gck_attributes_ref: + * @attrs: An attribute array + * + * Reference this attributes array. + * + * Returns: the attributes + **/ +GckAttributes * +gck_attributes_ref (GckAttributes *attrs) +{ + g_return_val_if_fail (attrs, NULL); + g_atomic_int_inc (&attrs->refs); + return attrs; +} + +/** + * gck_attributes_ref_sink: + * @attrs: an attribute array + * + * #GckAttributes uses a floating reference count system. gck_builder_end() + * and gck_attributes_new_empty() both return floating references. + * + * Calling gck_attributes_ref_sink() on a #GckAttributes with a floating + * reference will convert the floating reference into a full reference. + * Calling gck_attributes_ref_sink() on a non-floating #GckAttributes results + * in an additional normal reference being added. + * + * In other words, if the @attrs is floating, then this call "assumes + * ownership" of the floating reference, converting it to a normal + * reference. If the @attrs is not floating, then this call adds a + * new normal reference increasing the reference count by one. + * + * All Gck library functions that assume ownership of floating references + * are documented as such. Essentially any Gck function that performs + * an operation using a #GckAttributes argument rather than operating on the + * atributes themselves, will accept a floating reference. + * + * Returns: the referenced attributes + */ +GckAttributes * +gck_attributes_ref_sink (GckAttributes *attrs) +{ + g_return_val_if_fail (attrs, NULL); + g_bit_lock (&attrs->state, STATE_LOCKED); + + if (~attrs->state & STATE_FLOATING) + gck_attributes_ref (attrs); + else + attrs->state &= ~STATE_FLOATING; + + g_bit_unlock (&attrs->state, STATE_LOCKED); + return attrs; +} + +/** + * gck_attributes_unref: + * @attrs: (allow-none): (type Gck.Attributes): An attribute array + * + * Unreference this attribute array. + * + * When all outstanding references are gone, the array will be freed. + */ +void +gck_attributes_unref (gpointer attrs) +{ + GckAttributes *attrs_ = attrs; + const GckAttribute *attr; + guint i; + + if (!attrs_) + return; + + if (g_atomic_int_dec_and_test (&attrs_->refs)) { + for (i = 0; i < attrs_->count; ++i) { + attr = gck_attributes_at (attrs_, i); + if (attr->value) + value_unref (attr->value); + } + g_free (attrs_->data); + g_slice_free (GckAttributes, attrs_); + } +} + +/** + * gck_attributes_contains: + * @attrs: The attributes to check + * @match: The attribute to find + * + * Check whether the attributes contain a certain attribute. + * + * Returns: %TRUE if the attributes contain the attribute. + */ +gboolean +gck_attributes_contains (GckAttributes *attrs, + const GckAttribute *match) +{ + const GckAttribute *attr; + guint i; + + g_return_val_if_fail (attrs != NULL, FALSE); + + for (i = 0; i < attrs->count; ++i) { + attr = gck_attributes_at (attrs, i); + if (gck_attribute_equal (attr, match)) + return TRUE; + } + + return FALSE; +} + +CK_ATTRIBUTE_PTR +_gck_builder_prepare_in (GckBuilder *builder, + CK_ULONG_PTR n_attrs) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttribute *attr; + guint i; + + g_return_val_if_fail (builder != NULL, NULL); + g_return_val_if_fail (n_attrs != NULL, NULL); + + if (real->array == NULL) { + *n_attrs = 0; + return NULL; + } + + /* Prepare the attributes to receive their length */ + + for (i = 0; i < real->array->len; ++i) { + attr = &g_array_index (real->array, GckAttribute, i); + if (attr->value != NULL) { + value_unref (attr->value); + attr->value = NULL; + } + attr->length = 0; + } + + *n_attrs = real->array->len; + return (CK_ATTRIBUTE_PTR)real->array->data; +} + +CK_ATTRIBUTE_PTR +_gck_builder_commit_in (GckBuilder *builder, + CK_ULONG_PTR n_attrs) +{ + GckRealBuilder *real = (GckRealBuilder *)builder; + GckAttribute *attr; + guint i; + + g_return_val_if_fail (builder != NULL, NULL); + g_return_val_if_fail (n_attrs != NULL, NULL); + + if (real->array == NULL) { + *n_attrs = 0; + return NULL; + } + + /* Allocate each attribute with the length that was set */ + + for (i = 0; i < real->array->len; ++i) { + attr = &g_array_index (real->array, GckAttribute, i); + if (attr->length != 0 && attr->length != (gulong)-1) + attr->value = value_blank (attr->length, real->secure); + else + attr->value = NULL; + } + + *n_attrs = real->array->len; + return (CK_ATTRIBUTE_PTR)real->array->data; +} + +CK_ATTRIBUTE_PTR +_gck_attributes_commit_out (GckAttributes *attrs, + CK_ULONG_PTR n_attrs) +{ + g_return_val_if_fail (attrs != NULL, NULL); + g_return_val_if_fail (n_attrs != NULL, NULL); + + *n_attrs = attrs->count; + return (CK_ATTRIBUTE_PTR)attrs->data; +} + +static gboolean +_gck_attribute_is_ulong_of_type (GckAttribute *attr, + gulong attr_type) +{ + if (attr->type != attr_type) + return FALSE; + if (attr->length != sizeof (gulong)) + return FALSE; + if (!attr->value) + return FALSE; + return TRUE; +} + +static gboolean +_gck_attribute_is_sensitive (GckAttribute *attr) +{ + /* + * Don't print any just attribute, since they may contain + * sensitive data + */ + + switch (attr->type) { + #define X(x) case x: return FALSE; + X (CKA_CLASS) + X (CKA_TOKEN) + X (CKA_PRIVATE) + X (CKA_LABEL) + X (CKA_APPLICATION) + X (CKA_OBJECT_ID) + X (CKA_CERTIFICATE_TYPE) + X (CKA_ISSUER) + X (CKA_SERIAL_NUMBER) + X (CKA_AC_ISSUER) + X (CKA_OWNER) + X (CKA_ATTR_TYPES) + X (CKA_TRUSTED) + X (CKA_CERTIFICATE_CATEGORY) + X (CKA_JAVA_MIDP_SECURITY_DOMAIN) + X (CKA_URL) + X (CKA_HASH_OF_SUBJECT_PUBLIC_KEY) + X (CKA_HASH_OF_ISSUER_PUBLIC_KEY) + X (CKA_CHECK_VALUE) + X (CKA_KEY_TYPE) + X (CKA_SUBJECT) + X (CKA_ID) + X (CKA_SENSITIVE) + X (CKA_ENCRYPT) + X (CKA_DECRYPT) + X (CKA_WRAP) + X (CKA_UNWRAP) + X (CKA_SIGN) + X (CKA_SIGN_RECOVER) + X (CKA_VERIFY) + X (CKA_VERIFY_RECOVER) + X (CKA_DERIVE) + X (CKA_START_DATE) + X (CKA_END_DATE) + X (CKA_MODULUS_BITS) + X (CKA_PRIME_BITS) + /* X (CKA_SUBPRIME_BITS) */ + /* X (CKA_SUB_PRIME_BITS) */ + X (CKA_VALUE_BITS) + X (CKA_VALUE_LEN) + X (CKA_EXTRACTABLE) + X (CKA_LOCAL) + X (CKA_NEVER_EXTRACTABLE) + X (CKA_ALWAYS_SENSITIVE) + X (CKA_KEY_GEN_MECHANISM) + X (CKA_MODIFIABLE) + X (CKA_SECONDARY_AUTH) + X (CKA_AUTH_PIN_FLAGS) + X (CKA_ALWAYS_AUTHENTICATE) + X (CKA_WRAP_WITH_TRUSTED) + X (CKA_WRAP_TEMPLATE) + X (CKA_UNWRAP_TEMPLATE) + X (CKA_HW_FEATURE_TYPE) + X (CKA_RESET_ON_INIT) + X (CKA_HAS_RESET) + X (CKA_PIXEL_X) + X (CKA_PIXEL_Y) + X (CKA_RESOLUTION) + X (CKA_CHAR_ROWS) + X (CKA_CHAR_COLUMNS) + X (CKA_COLOR) + X (CKA_BITS_PER_PIXEL) + X (CKA_CHAR_SETS) + X (CKA_ENCODING_METHODS) + X (CKA_MIME_TYPES) + X (CKA_MECHANISM_TYPE) + X (CKA_REQUIRED_CMS_ATTRIBUTES) + X (CKA_DEFAULT_CMS_ATTRIBUTES) + X (CKA_SUPPORTED_CMS_ATTRIBUTES) + X (CKA_ALLOWED_MECHANISMS) + X (CKA_X_ASSERTION_TYPE) + X (CKA_X_CERTIFICATE_VALUE) + X (CKA_X_PURPOSE) + X (CKA_X_PEER) + #undef X + } + + return TRUE; +} + +static void +_gck_format_class (GString *output, + CK_OBJECT_CLASS klass) +{ + const gchar *string = NULL; + + switch (klass) { + #define X(x) case x: string = #x; break; + X (CKO_DATA) + X (CKO_CERTIFICATE) + X (CKO_PUBLIC_KEY) + X (CKO_PRIVATE_KEY) + X (CKO_SECRET_KEY) + X (CKO_HW_FEATURE) + X (CKO_DOMAIN_PARAMETERS) + X (CKO_MECHANISM) + X (CKO_X_TRUST_ASSERTION) + } + + if (string != NULL) + g_string_append (output, string); + else + g_string_append_printf (output, "0x%08lX", klass); +} + +static void +_gck_format_assertion_type (GString *output, + CK_X_ASSERTION_TYPE type) +{ + const gchar *string = NULL; + + switch (type) { + #define X(x) case x: string = #x; break; + X (CKT_X_UNTRUSTED_CERTIFICATE) + X (CKT_X_PINNED_CERTIFICATE) + X (CKT_X_ANCHORED_CERTIFICATE) + #undef X + } + + if (string != NULL) + g_string_append (output, string); + else + g_string_append_printf (output, "0x%08lX", type); +} + +static void +_gck_format_key_type (GString *output, + CK_KEY_TYPE type) +{ + const gchar *string = NULL; + + switch (type) { + #define X(x) case x: string = #x; break; + X (CKK_RSA) + X (CKK_DSA) + X (CKK_DH) + /* X (CKK_ECDSA) */ + X (CKK_EC) + X (CKK_X9_42_DH) + X (CKK_KEA) + X (CKK_GENERIC_SECRET) + X (CKK_RC2) + X (CKK_RC4) + X (CKK_DES) + X (CKK_DES2) + X (CKK_DES3) + X (CKK_CAST) + X (CKK_CAST3) + X (CKK_CAST128) + X (CKK_RC5) + X (CKK_IDEA) + X (CKK_SKIPJACK) + X (CKK_BATON) + X (CKK_JUNIPER) + X (CKK_CDMF) + X (CKK_AES) + X (CKK_BLOWFISH) + X (CKK_TWOFISH) + #undef X + } + + if (string != NULL) + g_string_append (output, string); + else + g_string_append_printf (output, "0x%08lX", type); +} + +static void +_gck_format_certificate_type (GString *output, + CK_CERTIFICATE_TYPE type) +{ + const gchar *string = NULL; + + switch (type) { + #define X(x) case x: string = #x; break; + X (CKC_X_509) + X (CKC_X_509_ATTR_CERT) + X (CKC_WTLS) + } + + if (string != NULL) + g_string_append (output, string); + else + g_string_append_printf (output, "0x%08lX", type); +} + +static void +_gck_format_attribute_type (GString *output, + gulong type) +{ + const gchar *string = NULL; + + switch (type) { + #define X(x) case x: string = #x; break; + X (CKA_CLASS) + X (CKA_TOKEN) + X (CKA_PRIVATE) + X (CKA_LABEL) + X (CKA_APPLICATION) + X (CKA_VALUE) + X (CKA_OBJECT_ID) + X (CKA_CERTIFICATE_TYPE) + X (CKA_ISSUER) + X (CKA_SERIAL_NUMBER) + X (CKA_AC_ISSUER) + X (CKA_OWNER) + X (CKA_ATTR_TYPES) + X (CKA_TRUSTED) + X (CKA_CERTIFICATE_CATEGORY) + X (CKA_JAVA_MIDP_SECURITY_DOMAIN) + X (CKA_URL) + X (CKA_HASH_OF_SUBJECT_PUBLIC_KEY) + X (CKA_HASH_OF_ISSUER_PUBLIC_KEY) + X (CKA_CHECK_VALUE) + X (CKA_KEY_TYPE) + X (CKA_SUBJECT) + X (CKA_ID) + X (CKA_SENSITIVE) + X (CKA_ENCRYPT) + X (CKA_DECRYPT) + X (CKA_WRAP) + X (CKA_UNWRAP) + X (CKA_SIGN) + X (CKA_SIGN_RECOVER) + X (CKA_VERIFY) + X (CKA_VERIFY_RECOVER) + X (CKA_DERIVE) + X (CKA_START_DATE) + X (CKA_END_DATE) + X (CKA_MODULUS) + X (CKA_MODULUS_BITS) + X (CKA_PUBLIC_EXPONENT) + X (CKA_PRIVATE_EXPONENT) + X (CKA_PRIME_1) + X (CKA_PRIME_2) + X (CKA_EXPONENT_1) + X (CKA_EXPONENT_2) + X (CKA_COEFFICIENT) + X (CKA_PRIME) + X (CKA_SUBPRIME) + X (CKA_BASE) + X (CKA_PRIME_BITS) + /* X (CKA_SUBPRIME_BITS) */ + /* X (CKA_SUB_PRIME_BITS) */ + X (CKA_VALUE_BITS) + X (CKA_VALUE_LEN) + X (CKA_EXTRACTABLE) + X (CKA_LOCAL) + X (CKA_NEVER_EXTRACTABLE) + X (CKA_ALWAYS_SENSITIVE) + X (CKA_KEY_GEN_MECHANISM) + X (CKA_MODIFIABLE) + X (CKA_ECDSA_PARAMS) + /* X (CKA_EC_PARAMS) */ + X (CKA_EC_POINT) + X (CKA_SECONDARY_AUTH) + X (CKA_AUTH_PIN_FLAGS) + X (CKA_ALWAYS_AUTHENTICATE) + X (CKA_WRAP_WITH_TRUSTED) + X (CKA_WRAP_TEMPLATE) + X (CKA_UNWRAP_TEMPLATE) + X (CKA_HW_FEATURE_TYPE) + X (CKA_RESET_ON_INIT) + X (CKA_HAS_RESET) + X (CKA_PIXEL_X) + X (CKA_PIXEL_Y) + X (CKA_RESOLUTION) + X (CKA_CHAR_ROWS) + X (CKA_CHAR_COLUMNS) + X (CKA_COLOR) + X (CKA_BITS_PER_PIXEL) + X (CKA_CHAR_SETS) + X (CKA_ENCODING_METHODS) + X (CKA_MIME_TYPES) + X (CKA_MECHANISM_TYPE) + X (CKA_REQUIRED_CMS_ATTRIBUTES) + X (CKA_DEFAULT_CMS_ATTRIBUTES) + X (CKA_SUPPORTED_CMS_ATTRIBUTES) + X (CKA_ALLOWED_MECHANISMS) + X (CKA_X_ASSERTION_TYPE) + X (CKA_X_CERTIFICATE_VALUE) + X (CKA_X_PURPOSE) + X (CKA_X_PEER) + #undef X + } + + if (string != NULL) + g_string_append (output, string); + else + g_string_append_printf (output, "CKA_0x%08lX", type); +} + +static void +_gck_format_some_bytes (GString *output, + gconstpointer bytes, + gulong length) +{ + guchar ch; + const guchar *data = bytes; + gulong i; + + if (bytes == NULL) { + g_string_append (output, "NULL"); + return; + } + + g_string_append_c (output, '\"'); + for (i = 0; i < length && i < 128; i++) { + ch = data[i]; + if (ch == '\t') + g_string_append (output, "\\t"); + else if (ch == '\n') + g_string_append (output, "\\n"); + else if (ch == '\r') + g_string_append (output, "\\r"); + else if (ch >= 32 && ch < 127) + g_string_append_c (output, ch); + else + g_string_append_printf (output, "\\x%02x", ch); + } + + if (i < length) + g_string_append_printf (output, "..."); + g_string_append_c (output, '\"'); +} + +static void +_gck_format_attributes (GString *output, + GckAttributes *attrs) +{ + GckAttribute *attr; + guint count, i; + + count = attrs->count; + g_string_append_printf (output, "(%d) [", count); + for (i = 0; i < count; i++) { + attr = attrs->data + i; + if (i > 0) + g_string_append_c (output, ','); + g_string_append (output, " { "); + _gck_format_attribute_type (output, attr->type); + g_string_append (output, " = "); + if (attr->length == GCK_INVALID) { + g_string_append_printf (output, " (-1) INVALID"); + } else if (_gck_attribute_is_ulong_of_type (attr, CKA_CLASS)) { + _gck_format_class (output, *((CK_OBJECT_CLASS_PTR)attr->value)); + } else if (_gck_attribute_is_ulong_of_type (attr, CKA_X_ASSERTION_TYPE)) { + _gck_format_assertion_type (output, *((CK_X_ASSERTION_TYPE *)attr->value)); + } else if (_gck_attribute_is_ulong_of_type (attr, CKA_CERTIFICATE_TYPE)) { + _gck_format_certificate_type (output, *((CK_CERTIFICATE_TYPE *)attr->value)); + } else if (_gck_attribute_is_ulong_of_type (attr, CKA_KEY_TYPE)) { + _gck_format_key_type (output, *((CK_KEY_TYPE *)attr->value)); + } else if (_gck_attribute_is_sensitive (attr)) { + g_string_append_printf (output, " (%lu) NOT-PRINTED", attr->length); + } else { + g_string_append_printf (output, " (%lu) ", attr->length); + _gck_format_some_bytes (output, attr->value, attr->length); + } + g_string_append (output, " }"); + } + g_string_append (output, " ]"); +} + +/** + * gck_attributes_to_string: + * @attrs: the attributes + * + * Print out attributes to a string in aform that's useful for debugging + * or logging. + * + * The format of the string returned may change in the future. + * + * Returns: a newly allocated string + */ +gchar * +gck_attributes_to_string (GckAttributes *attrs) +{ + GString *output = g_string_sized_new (128); + _gck_format_attributes (output, attrs); + return g_string_free (output, FALSE); +} + +/** + * gck_attributes_new: + * @reserved: Should be set to always be GCK_INVALID + * + * Create a new empty GckAttributes array. + * + * The returned set of attributes is floating, and should either be passed to + * another gck library function which consumes this floating reference, or if + * you wish to keep these attributes around you should ref them with + * gck_attributes_ref_sink() and unref them later with gck_attributes_unref(). + * + * Returns: (transfer none): a floating reference to the new attributes array; + * when done with the array release it with gck_attributes_unref(). + **/ +GckAttributes * +gck_attributes_new (gulong reserved) +{ + GckBuilder builder = GCK_BUILDER_INIT; + return gck_builder_end (&builder); +} + +/** + * gck_attributes_new_full: (skip) + * @allocator: memory allocator for attribute data, or %NULL for default + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_all() instead. + * + * Returns: returns %NULL + **/ +GckAttributes * +gck_attributes_new_full (GckAllocator allocator) +{ + g_warning ("gck_attributes_new_full() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_add: + * @attrs: the attributes array to add to + * @attr: the attribute to add + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_all() instead. + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add (GckAttributes *attrs, + GckAttribute *attr) +{ + g_warning ("gck_attributes_add() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_set: + * @attrs: attributes array to add to + * @attr: attribute to set + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_data() instead. + **/ +void +gck_attributes_set (GckAttributes *attrs, + GckAttribute *attr) +{ + g_warning ("gck_attributes_set() is no no longer supported"); +} + +/** + * gck_attributes_add_data: + * @attrs: The attributes array to add to. + * @attr_type: The type of attribute to add. + * @value: (array length=length): the raw memory of the attribute value + * @length: The length of the attribute value. + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_data() instead. + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add_data (GckAttributes *attrs, + gulong attr_type, + const guchar *value, + gsize length) +{ + g_warning ("gck_attributes_add_data() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_add_invalid: + * @attrs: The attributes array to add to. + * @attr_type: The type of attribute to add. + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_invalid() instead + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add_invalid (GckAttributes *attrs, + gulong attr_type) +{ + g_warning ("gck_attributes_add_invalid() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_add_empty: + * @attrs: The attributes array to add. + * @attr_type: The type of attribute to add. + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_empty() instead. + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add_empty (GckAttributes *attrs, + gulong attr_type) +{ + g_warning ("gck_attributes_add_empty() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_add_boolean: + * @attrs: the attributes array to add to + * @attr_type: the type of attribute to add + * @value: the boolean value to add + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_boolean() instead. + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add_boolean (GckAttributes *attrs, + gulong attr_type, + gboolean value) +{ + g_warning ("gck_attributes_add_boolean() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_set_boolean: + * @attrs: the attributes + * @attr_type: the type of attribute to set + * @value: boolean value to set + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_boolean() instead. + */ +void +gck_attributes_set_boolean (GckAttributes *attrs, + gulong attr_type, + gboolean value) +{ + g_warning ("gck_attributes_set_boolean() is no no longer supported"); + +} + +/** + * gck_attributes_add_string: + * @attrs: the attributes array to add to + * @attr_type: the type of attribute to add + * @value: the null terminated string value to add + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_string() instead. + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add_string (GckAttributes *attrs, + gulong attr_type, + const gchar *value) +{ + g_warning ("gck_attributes_add_string() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_set_string: + * @attrs: the attributes + * @attr_type: the type of attribute to set + * @value: null terminated string value to set + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_string() instead. + */ +void +gck_attributes_set_string (GckAttributes *attrs, + gulong attr_type, + const gchar *value) +{ + g_warning ("gck_attributes_set_string() is no no longer supported"); +} + +/** + * gck_attributes_add_date: + * @attrs: the attributes array to add to + * @attr_type: the type of attribute to add + * @value: the GDate value to add + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_date() instead. + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add_date (GckAttributes *attrs, + gulong attr_type, + const GDate *value) +{ + g_warning ("gck_attributes_add_date() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_set_date: + * @attrs: the attributes + * @attr_type: the type of attribute to set + * @value: date value to set + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_date() instead. + */ +void +gck_attributes_set_date (GckAttributes *attrs, + gulong attr_type, + const GDate *value) +{ + g_warning ("gck_attributes_set_date() is no no longer supported"); +} + +/** + * gck_attributes_add_ulong: + * @attrs: the attributes array to add to + * @attr_type: the type of attribute to add + * @value: the gulong value to add + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_ulong() instead. + * + * Returns: (transfer none): returns %NULL + **/ +GckAttribute * +gck_attributes_add_ulong (GckAttributes *attrs, + gulong attr_type, + gulong value) +{ + g_warning ("gck_attributes_add_ulong() is no no longer supported"); + return NULL; +} + +/** + * gck_attributes_set_ulong: + * @attrs: the attributes + * @attr_type: the type of attribute to set + * @value: gulong value to set + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_ulong() instead. + */ +void +gck_attributes_set_ulong (GckAttributes *attrs, + gulong attr_type, + gulong value) +{ + g_warning ("gck_attributes_set_ulong() is no no longer supported"); +} + +/** + * gck_attributes_add_all: + * @attrs: a set of attributes + * @from: attributes to add + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_add_all() instead. + */ +void +gck_attributes_add_all (GckAttributes *attrs, + GckAttributes *from) +{ + g_warning ("gck_attributes_add_all() is no no longer supported"); +} + +/** + * gck_attributes_set_all: + * @attrs: set of attributes + * @from: attributes to add + * + * #GckAttributes are now immutable. This method no longer does anything. + * + * Deprecated: 3.4: Use gck_builder_set_all() instead. + */ +void +gck_attributes_set_all (GckAttributes *attrs, + GckAttributes *from) +{ + g_warning ("gck_attributes_set_all() is no no longer supported"); +} + +/** + * gck_attributes_dup: + * @attrs: set of attributes to copy + * + * #GckAttributes are now immutable, and can be used in mulitple places. + * + * Deprecated: 3.4: Use gck_attributes_ref() or gck_builder_add_all() instead. + * + * Returns: (transfer none): a new floating #GckAttributes + */ +GckAttributes * +gck_attributes_dup (GckAttributes *attrs) +{ + GckBuilder builder = GCK_BUILDER_INIT; + + if (attrs == NULL) + return NULL; + + gck_builder_add_all (&builder, attrs); + return gck_builder_end (&builder); +} diff --git a/gck/gck-call.c b/gck/gck-call.c new file mode 100644 index 0000000..8e1a276 --- /dev/null +++ b/gck/gck-call.c @@ -0,0 +1,545 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-call.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck-private.h" + +#include + +typedef struct _GckCallSource GckCallSource; + +static gpointer _gck_call_parent_class = NULL; + +struct _GckCall { + GObject parent; + GckModule *module; + + /* For making the call */ + GckPerformFunc perform; + GckCompleteFunc complete; + GckArguments *args; + GCancellable *cancellable; + GDestroyNotify destroy; + CK_RV rv; + + /* For result callback only */ + gpointer object; + GAsyncReadyCallback callback; + gpointer user_data; +}; + +struct _GckCallClass { + GObjectClass parent; + GThreadPool *thread_pool; + GAsyncQueue *completed_queue; + guint completed_id; +}; + +struct _GckCallSource { + GSource source; + GckCallClass *klass; +}; + +/* ---------------------------------------------------------------------------- + * HELPER FUNCTIONS + */ + +static CK_RV +perform_call (GckPerformFunc func, GCancellable *cancellable, GckArguments *args) +{ + CK_RV rv; + + /* Double check a few things */ + g_assert (func); + g_assert (args); + + if (cancellable) { + if (g_cancellable_is_cancelled (cancellable)) { + return CKR_FUNCTION_CANCELED; + } + + /* Push for the notify callback */ + g_object_ref (cancellable); + g_cancellable_push_current (cancellable); + } + + rv = (func) (args); + + if (cancellable) { + g_cancellable_pop_current (cancellable); + g_object_unref (cancellable); + } + + return rv; +} + +static gboolean +complete_call (GckCompleteFunc func, GckArguments *args, CK_RV result) +{ + /* Double check a few things */ + g_assert (args); + + /* If no complete function, then just ignore */ + if (!func) + return TRUE; + + return (func) (args, result); +} + + +static void +process_async_call (gpointer data, GckCallClass *klass) +{ + GckCall *call = GCK_CALL (data); + + g_assert (GCK_IS_CALL (call)); + + call->rv = perform_call (call->perform, call->cancellable, call->args); + + g_async_queue_push (klass->completed_queue, call); + + /* Wakeup main thread if on a separate thread */ + g_main_context_wakeup (NULL); +} + +static void +process_result (GckCall *call, gpointer unused) +{ + gboolean stop = FALSE; + + /* Double check a few things */ + g_assert (GCK_IS_CALL (call)); + + if (call->cancellable) { + /* Don't call the callback when cancelled */ + if (g_cancellable_is_cancelled (call->cancellable)) { + call->rv = CKR_FUNCTION_CANCELED; + stop = TRUE; + } + } + + /* + * Hmmm, does the function want to actually be done? + * If not, then queue this call again. + */ + if (!stop && !complete_call (call->complete, call->args, call->rv)) { + g_object_ref (call); + g_thread_pool_push (GCK_CALL_GET_CLASS (call)->thread_pool, call, NULL); + + /* All done, finish processing */ + } else if (call->callback) { + (call->callback) (call->object, G_ASYNC_RESULT (call), + call->user_data); + } +} + +static gboolean +process_completed (GckCallClass *klass) +{ + gpointer call; + + g_assert (klass->completed_queue); + + call = g_async_queue_try_pop (klass->completed_queue); + if (call) { + process_result (call, NULL); + g_object_unref (call); + return TRUE; + } + + return FALSE; +} + +static gboolean +completed_prepare(GSource* base, gint *timeout) +{ + GckCallSource *source = (GckCallSource*)base; + gboolean have; + + g_assert (source->klass->completed_queue); + have = g_async_queue_length (source->klass->completed_queue) > 0; + *timeout = have ? 0 : -1; + return have; +} + +static gboolean +completed_check(GSource* base) +{ + GckCallSource *source = (GckCallSource*)base; + g_assert (source->klass->completed_queue); + return g_async_queue_length (source->klass->completed_queue) > 0; +} + +static gboolean +completed_dispatch(GSource* base, GSourceFunc callback, gpointer user_data) +{ + GckCallSource *source = (GckCallSource*)base; + process_completed (source->klass); + return TRUE; +} + +static void +completed_finalize(GSource* base) +{ + +} + +static GSourceFuncs completed_functions = { + completed_prepare, + completed_check, + completed_dispatch, + completed_finalize +}; + +/* ---------------------------------------------------------------------------- + * OBJECT + */ + +static void +_gck_call_init (GckCall *call) +{ + call->rv = CKR_OK; +} + +static void +_gck_call_finalize (GObject *obj) +{ + GckCall *call = GCK_CALL (obj); + + if (call->module) + g_object_unref (call->module); + call->module = NULL; + + if (call->object) + g_object_unref (call->object); + call->object = NULL; + + if (call->cancellable) + g_object_unref (call->cancellable); + call->cancellable = NULL; + + if (call->destroy) + (call->destroy) (call->args); + call->destroy = NULL; + call->args = NULL; + + G_OBJECT_CLASS (_gck_call_parent_class)->finalize (obj); +} + +static gpointer +_gck_call_get_user_data (GAsyncResult *async_result) +{ + g_return_val_if_fail (GCK_IS_CALL (async_result), NULL); + return GCK_CALL (async_result)->user_data; +} + +static GObject* +_gck_call_get_source_object (GAsyncResult *async_result) +{ + GObject *source; + + g_return_val_if_fail (GCK_IS_CALL (async_result), NULL); + + source = GCK_CALL (async_result)->object; + return source ? g_object_ref (source): NULL; +} + +static void +_gck_call_implement_async_result (GAsyncResultIface *iface) +{ + iface->get_user_data = _gck_call_get_user_data; + iface->get_source_object = _gck_call_get_source_object; +} + +static void +_gck_call_class_init (GckCallClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*)klass; + + _gck_call_parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = _gck_call_finalize; +} + +static void +_gck_call_base_init (GckCallClass *klass) +{ + GckCallSource *source; + GMainContext *context; + GError *err = NULL; + + klass->thread_pool = g_thread_pool_new ((GFunc)process_async_call, klass, 16, FALSE, &err); + if (!klass->thread_pool) { + g_critical ("couldn't create thread pool: %s", + err && err->message ? err->message : ""); + return; + } + + klass->completed_queue = g_async_queue_new_full (g_object_unref); + g_assert (klass->completed_queue); + + context = g_main_context_default (); + g_assert (context); + + /* Add our idle handler which processes other tasks */ + source = (GckCallSource*)g_source_new (&completed_functions, sizeof (GckCallSource)); + source->klass = klass; + klass->completed_id = g_source_attach ((GSource*)source, context); + g_source_set_callback ((GSource*)source, NULL, NULL, NULL); + g_source_unref ((GSource*)source); +} + +static void +_gck_call_base_finalize (GckCallClass *klass) +{ + GMainContext *context; + GSource *src; + + if (klass->thread_pool) { + g_assert (g_thread_pool_unprocessed (klass->thread_pool) == 0); + g_thread_pool_free (klass->thread_pool, FALSE, TRUE); + klass->thread_pool = NULL; + } + + if (klass->completed_id) { + context = g_main_context_default (); + g_return_if_fail (context); + + src = g_main_context_find_source_by_id (context, klass->completed_id); + g_assert (src); + g_source_destroy (src); + klass->completed_id = 0; + } + + if (klass->completed_queue) { + g_assert (g_async_queue_length (klass->completed_queue)); + g_async_queue_unref (klass->completed_queue); + klass->completed_queue = NULL; + } +} + +GType +_gck_call_get_type (void) +{ + static volatile gsize type_id__volatile = 0; + + if (g_once_init_enter (&type_id__volatile)) { + + static const GTypeInfo type_info = { + sizeof (GckCallClass), + (GBaseInitFunc)_gck_call_base_init, + (GBaseFinalizeFunc)_gck_call_base_finalize, + (GClassInitFunc)_gck_call_class_init, + (GClassFinalizeFunc)NULL, + NULL, // class_data + sizeof (GckCall), + 0, // n_preallocs + (GInstanceInitFunc)_gck_call_init, + }; + + static const GInterfaceInfo interface_info = { + (GInterfaceInitFunc)_gck_call_implement_async_result + }; + + GType type_id = g_type_register_static (G_TYPE_OBJECT, "_GckCall", &type_info, 0); + g_type_add_interface_static (type_id, G_TYPE_ASYNC_RESULT, &interface_info); + + g_once_init_leave (&type_id__volatile, type_id); + } + + return type_id__volatile; +} + +/* ---------------------------------------------------------------------------- + * PUBLIC + */ + +void +_gck_call_uninitialize (void) +{ + +} + +gboolean +_gck_call_sync (gpointer object, gpointer perform, gpointer complete, + gpointer data, GCancellable *cancellable, GError **err) +{ + GckArguments *args = (GckArguments*)data; + GckModule *module = NULL; + CK_RV rv; + + g_assert (!object || G_IS_OBJECT (object)); + g_assert (perform); + g_assert (args); + + if (object) { + g_object_get (object, "module", &module, "handle", &args->handle, NULL); + g_assert (GCK_IS_MODULE (module)); + + /* We now hold a reference to module until below */ + args->pkcs11 = gck_module_get_functions (module); + g_assert (args->pkcs11); + } + + do { + rv = perform_call (perform, cancellable, args); + if (rv == CKR_FUNCTION_CANCELED) + break; + + } while (!complete_call (complete, args, rv)); + + if (module) + g_object_unref (module); + + if (rv == CKR_OK) + return TRUE; + + g_set_error (err, GCK_ERROR, rv, "%s", gck_message_from_rv (rv)); + return FALSE; +} + +gpointer +_gck_call_async_prep (gpointer object, gpointer cb_object, gpointer perform, + gpointer complete, gsize args_size, gpointer destroy) +{ + GckArguments *args; + GckCall *call; + + g_assert (!object || G_IS_OBJECT (object)); + g_assert (!cb_object || G_IS_OBJECT (cb_object)); + g_assert (perform); + + if (!destroy) + destroy = g_free; + + if (args_size == 0) + args_size = sizeof (GckArguments); + g_assert (args_size >= sizeof (GckArguments)); + + args = g_malloc0 (args_size); + call = g_object_new (GCK_TYPE_CALL, NULL); + call->destroy = (GDestroyNotify)destroy; + call->perform = (GckPerformFunc)perform; + call->complete = (GckCompleteFunc)complete; + call->object = cb_object ? g_object_ref (cb_object) : NULL; + + /* Hook the two together */ + call->args = args; + call->args->call = call; + + /* Setup call object if available */ + if (object != NULL) + _gck_call_async_object (call, object); + + return args; +} + +void +_gck_call_async_object (GckCall *call, gpointer object) +{ + g_assert (GCK_IS_CALL (call)); + g_assert (call->args); + + if (call->module) + g_object_unref (call->module); + call->module = NULL; + + g_object_get (object, "module", &call->module, "handle", &call->args->handle, NULL); + g_assert (GCK_IS_MODULE (call->module)); + call->args->pkcs11 = gck_module_get_functions (call->module); + + /* We now hold a reference on module until finalize */ +} + +GckCall* +_gck_call_async_ready (gpointer data, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GckArguments *args = (GckArguments*)data; + g_assert (GCK_IS_CALL (args->call)); + + args->call->cancellable = cancellable; + if (cancellable) { + g_assert (G_IS_CANCELLABLE (cancellable)); + g_object_ref (cancellable); + } + + args->call->callback = callback; + args->call->user_data = user_data; + + return args->call; +} + +void +_gck_call_async_go (GckCall *call) +{ + g_assert (GCK_IS_CALL (call)); + + /* To keep things balanced, process at one completed event */ + process_completed(GCK_CALL_GET_CLASS (call)); + + g_assert (GCK_CALL_GET_CLASS (call)->thread_pool); + g_thread_pool_push (GCK_CALL_GET_CLASS (call)->thread_pool, call, NULL); +} + +void +_gck_call_async_ready_go (gpointer data, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GckCall *call = _gck_call_async_ready (data, cancellable, callback, user_data); + _gck_call_async_go (call); +} + +gboolean +_gck_call_basic_finish (GAsyncResult *result, GError **err) +{ + CK_RV rv; + + g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + + rv = GCK_CALL (result)->rv; + if (rv == CKR_OK) + return TRUE; + + g_set_error (err, GCK_ERROR, rv, "%s", gck_message_from_rv (rv)); + return FALSE; +} + +void +_gck_call_async_short (GckCall *call, CK_RV rv) +{ + g_assert (GCK_IS_CALL (call)); + + call->rv = rv; + + /* Already complete, so just push it for processing in main loop */ + g_assert (GCK_CALL_GET_CLASS (call)->completed_queue); + g_async_queue_push (GCK_CALL_GET_CLASS (call)->completed_queue, call); + g_main_context_wakeup (NULL); +} + +gpointer +_gck_call_get_arguments (GckCall *call) +{ + g_assert (GCK_IS_CALL (call)); + return call->args; +} diff --git a/gck/gck-deprecated.h b/gck/gck-deprecated.h new file mode 100644 index 0000000..9314db7 --- /dev/null +++ b/gck/gck-deprecated.h @@ -0,0 +1,109 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-deprecated.h - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef GCK_DEPRECATED_H +#define GCK_DEPRECATED_H + +#include "gck.h" + +G_BEGIN_DECLS + +#ifndef GCK_DISABLE_DEPRECATED + +typedef GArray GckMechanisms; + +#define gck_mechanisms_free(a) (g_array_free (a, TRUE)) + +#define CKR_GCK_MODULE_PROBLEM GCK_ERROR_MODULE_PROBLEM + +GQuark gck_get_error_quark (void); + +GQuark gck_uri_get_error_quark (void); + +#define GCK_URI_BAD_PREFIX GCK_URI_BAD_SCHEME + +GType gck_attributes_get_boxed_type (void) G_GNUC_CONST; + +GckAttributes * gck_attributes_new_full (GckAllocator allocator); + +GckAttribute * gck_attributes_add (GckAttributes *attrs, + GckAttribute *attr); + +void gck_attributes_add_all (GckAttributes *attrs, + GckAttributes *from); + +GckAttribute * gck_attributes_add_data (GckAttributes *attrs, + gulong attr_type, + const guchar *value, + gsize length); + +GckAttribute * gck_attributes_add_invalid (GckAttributes *attrs, + gulong attr_type); + +GckAttribute * gck_attributes_add_empty (GckAttributes *attrs, + gulong attr_type); + +GckAttribute* gck_attributes_add_boolean (GckAttributes *attrs, + gulong attr_type, + gboolean value); + +GckAttribute* gck_attributes_add_string (GckAttributes *attrs, + gulong attr_type, + const gchar *value); + +GckAttribute* gck_attributes_add_date (GckAttributes *attrs, + gulong attr_type, + const GDate *value); + +GckAttribute* gck_attributes_add_ulong (GckAttributes *attrs, + gulong attr_type, + gulong value); + +void gck_attributes_set (GckAttributes *attrs, + GckAttribute *attr); + +void gck_attributes_set_boolean (GckAttributes *attrs, + gulong attr_type, + gboolean value); + +void gck_attributes_set_ulong (GckAttributes *attrs, + gulong attr_type, + gulong value); + +void gck_attributes_set_string (GckAttributes *attrs, + gulong attr_type, + const gchar *value); + +void gck_attributes_set_date (GckAttributes *attrs, + gulong attr_type, + const GDate *value); + +void gck_attributes_set_all (GckAttributes *attrs, + GckAttributes *from); + +GckAttributes * gck_attributes_dup (GckAttributes *attrs); + +#endif /* GCK_DISABLE_DEPRECATED */ + +G_END_DECLS + +#endif /* GCK_H */ diff --git a/gck/gck-dump.c b/gck/gck-dump.c new file mode 100644 index 0000000..58ca5d5 --- /dev/null +++ b/gck/gck-dump.c @@ -0,0 +1,360 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-dump - the GObject PKCS#11 wrapper library + + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "egg/egg-hex.h" + +#include +#include + +#include "pkcs11i.h" +#include "pkcs11x.h" + +static void +dump_class_value (gulong klass) +{ + switch (klass) { + #define DX(x) case x: g_printerr ("%s", #x); break; + DX(CKO_DATA); + DX(CKO_CERTIFICATE); + DX(CKO_PUBLIC_KEY); + DX(CKO_PRIVATE_KEY); + DX(CKO_SECRET_KEY); + DX(CKO_HW_FEATURE); + DX(CKO_DOMAIN_PARAMETERS); + DX(CKO_MECHANISM); + DX(CKO_G_COLLECTION); + DX(CKO_G_SEARCH); + DX(CKO_G_CREDENTIAL); + DX(CKO_X_TRUST_ASSERTION); + #undef DX + + default: + g_printerr ("%s0x%08x", + (klass & CKO_VENDOR_DEFINED) == CKA_VENDOR_DEFINED ? + "CKO_VENDOR_DEFINED|" : "", + (unsigned int)klass); + break; + } +} + +static void +dump_assertion_type_value (gulong type) +{ + switch (type) { + #define DX(x) case x: g_printerr ("%s", #x); break; + DX(CKT_X_DISTRUSTED_CERTIFICATE); + DX(CKT_X_PINNED_CERTIFICATE); + DX(CKT_X_ANCHORED_CERTIFICATE); + #undef DX + + default: + g_printerr ("%u", (unsigned int)type); + break; + } +} + +static void +dump_attribute_value (const GckAttribute *attr) +{ + gchar *data; + gsize len; + + g_assert (attr->length != G_MAXULONG); + + if (attr->value == NULL) { + g_printerr ("[null]"); + return; + } + + switch (attr->type) { + case CKA_CLASS: + if (attr->length == sizeof (CK_OBJECT_CLASS)) { + dump_class_value (*(CK_ULONG_PTR)attr->value); + return; + } + break; + + case CKA_X_ASSERTION_TYPE: + if (attr->length == sizeof (CK_X_ASSERTION_TYPE)) { + dump_assertion_type_value (*(CK_X_ASSERTION_TYPE*)attr->value); + return; + } + break; + + case CKA_CERTIFICATE_TYPE: + case CKA_CERTIFICATE_CATEGORY: + case CKA_JAVA_MIDP_SECURITY_DOMAIN: + case CKA_KEY_TYPE: + case CKA_PRIME_BITS: + case CKA_SUB_PRIME_BITS: + case CKA_VALUE_BITS: + case CKA_VALUE_LEN: + case CKA_KEY_GEN_MECHANISM: + case CKA_HW_FEATURE_TYPE: + case CKA_PIXEL_X: + case CKA_PIXEL_Y: + case CKA_RESOLUTION: + case CKA_CHAR_ROWS: + case CKA_CHAR_COLUMNS: + case CKA_BITS_PER_PIXEL: + case CKA_MECHANISM_TYPE: + case CKA_G_DESTRUCT_IDLE: + case CKA_G_DESTRUCT_AFTER: + case CKA_G_DESTRUCT_USES: + case CKA_G_OBJECT: + case CKA_G_CREDENTIAL: + if (attr->length == sizeof (CK_ULONG)) { + g_printerr ("%llu", (unsigned long long)*(CK_ULONG_PTR)attr->value); + return; + } + break; + + case CKA_TOKEN: + case CKA_PRIVATE: + case CKA_TRUSTED: + case CKA_SENSITIVE: + case CKA_ENCRYPT: + case CKA_DECRYPT: + case CKA_WRAP: + case CKA_UNWRAP: + case CKA_SIGN: + case CKA_SIGN_RECOVER: + case CKA_VERIFY: + case CKA_VERIFY_RECOVER: + case CKA_DERIVE: + case CKA_EXTRACTABLE: + case CKA_LOCAL: + case CKA_NEVER_EXTRACTABLE: + case CKA_ALWAYS_SENSITIVE: + case CKA_MODIFIABLE: + case CKA_ALWAYS_AUTHENTICATE: + case CKA_WRAP_WITH_TRUSTED: + case CKA_RESET_ON_INIT: + case CKA_HAS_RESET: + case CKA_COLOR: + case CKA_G_LOCKED: + case CKA_G_LOGIN_COLLECTION: + if (attr->length == sizeof (CK_BBOOL)) { + g_printerr ("%s", (*(CK_BBOOL*)attr->value) ? "TRUE" : "FALSE"); + return; + } + break; + + case CKA_LABEL: + case CKA_URL: + case CKA_CHAR_SETS: + case CKA_ENCODING_METHODS: + case CKA_MIME_TYPES: + case CKA_G_COLLECTION: + case CKA_G_SCHEMA: + case CKA_X_PURPOSE: + case CKA_X_PEER: + if (g_utf8_validate ((const gchar *)attr->value, attr->length, NULL)) { + int length = MIN (32, attr->length); + g_printerr ("%.*s%s", length, (gchar*)attr->value, + length < attr->length ? "..." : ""); + return; + } + break; + + case CKA_START_DATE: + case CKA_END_DATE: + case CKA_G_CREATED: + case CKA_G_MODIFIED: + if (attr->length == sizeof (CK_DATE)) { + const CK_DATE* date = (const CK_DATE *)attr->value; + g_printerr ("%.4s-%.2s-%.2s", date->year, date->month, date->day); + return; + } + break; + + default: + break; + }; + + len = MIN (20, attr->length); + data = egg_hex_encode_full (attr->value, len, TRUE, ":", 1); + g_printerr ("%s%s", data, len < attr->length ? "..." : ""); + g_free (data); +} + +static void +dump_attribute_type (const GckAttribute *attr) +{ + switch (attr->type) { + #define DX(x) case x: g_printerr ("%s", #x); break; + DX(CKA_CLASS); + DX(CKA_TOKEN); + DX(CKA_PRIVATE); + DX(CKA_LABEL); + DX(CKA_APPLICATION); + DX(CKA_VALUE); + DX(CKA_OBJECT_ID); + DX(CKA_CERTIFICATE_TYPE); + DX(CKA_ISSUER); + DX(CKA_SERIAL_NUMBER); + DX(CKA_AC_ISSUER); + DX(CKA_OWNER); + DX(CKA_ATTR_TYPES); + DX(CKA_TRUSTED); + DX(CKA_CERTIFICATE_CATEGORY); + DX(CKA_JAVA_MIDP_SECURITY_DOMAIN); + DX(CKA_URL); + DX(CKA_HASH_OF_SUBJECT_PUBLIC_KEY); + DX(CKA_HASH_OF_ISSUER_PUBLIC_KEY); + DX(CKA_CHECK_VALUE); + DX(CKA_KEY_TYPE); + DX(CKA_SUBJECT); + DX(CKA_ID); + DX(CKA_SENSITIVE); + DX(CKA_ENCRYPT); + DX(CKA_DECRYPT); + DX(CKA_WRAP); + DX(CKA_UNWRAP); + DX(CKA_SIGN); + DX(CKA_SIGN_RECOVER); + DX(CKA_VERIFY); + DX(CKA_VERIFY_RECOVER); + DX(CKA_DERIVE); + DX(CKA_START_DATE); + DX(CKA_END_DATE); + DX(CKA_MODULUS); + DX(CKA_MODULUS_BITS); + DX(CKA_PUBLIC_EXPONENT); + DX(CKA_PRIVATE_EXPONENT); + DX(CKA_PRIME_1); + DX(CKA_PRIME_2); + DX(CKA_EXPONENT_1); + DX(CKA_EXPONENT_2); + DX(CKA_COEFFICIENT); + DX(CKA_PRIME); + DX(CKA_SUBPRIME); + DX(CKA_BASE); + DX(CKA_PRIME_BITS); + DX(CKA_SUB_PRIME_BITS); + DX(CKA_VALUE_BITS); + DX(CKA_VALUE_LEN); + DX(CKA_EXTRACTABLE); + DX(CKA_LOCAL); + DX(CKA_NEVER_EXTRACTABLE); + DX(CKA_ALWAYS_SENSITIVE); + DX(CKA_KEY_GEN_MECHANISM); + DX(CKA_MODIFIABLE); + /* DX(CKA_ECDSA_PARAMS); */ + DX(CKA_EC_PARAMS); + DX(CKA_EC_POINT); + DX(CKA_SECONDARY_AUTH); + DX(CKA_AUTH_PIN_FLAGS); + DX(CKA_ALWAYS_AUTHENTICATE); + DX(CKA_WRAP_WITH_TRUSTED); + DX(CKA_HW_FEATURE_TYPE); + DX(CKA_RESET_ON_INIT); + DX(CKA_HAS_RESET); + DX(CKA_PIXEL_X); + DX(CKA_PIXEL_Y); + DX(CKA_RESOLUTION); + DX(CKA_CHAR_ROWS); + DX(CKA_CHAR_COLUMNS); + DX(CKA_COLOR); + DX(CKA_BITS_PER_PIXEL); + DX(CKA_CHAR_SETS); + DX(CKA_ENCODING_METHODS); + DX(CKA_MIME_TYPES); + DX(CKA_MECHANISM_TYPE); + DX(CKA_REQUIRED_CMS_ATTRIBUTES); + DX(CKA_DEFAULT_CMS_ATTRIBUTES); + DX(CKA_SUPPORTED_CMS_ATTRIBUTES); + DX(CKA_WRAP_TEMPLATE); + DX(CKA_UNWRAP_TEMPLATE); + DX(CKA_ALLOWED_MECHANISMS); + + /* GNOME */ + DX(CKA_G_LOCKED); + DX(CKA_G_CREATED); + DX(CKA_G_MODIFIED); + DX(CKA_G_FIELDS); + DX(CKA_G_COLLECTION); + DX(CKA_G_MATCHED); + DX(CKA_G_SCHEMA); + DX(CKA_G_LOGIN_COLLECTION); + DX(CKA_G_DESTRUCT_IDLE); + DX(CKA_G_DESTRUCT_AFTER); + DX(CKA_G_DESTRUCT_USES); + DX(CKA_G_OBJECT); + DX(CKA_G_CREDENTIAL); + DX(CKA_G_CREDENTIAL_TEMPLATE); + DX(CKA_X_ASSERTION_TYPE); + DX(CKA_X_CERTIFICATE_VALUE); + DX(CKA_X_PURPOSE); + DX(CKA_X_PEER); + #undef DX + + default: + g_printerr ("%s0x%08x", + (attr->type & CKA_VENDOR_DEFINED) == CKA_VENDOR_DEFINED ? + "CKA_VENDOR_DEFINED|" : "", + (unsigned int)attr->type); + break; + } +} + +/** + * gck_attribute_dump: + * @attr: The attribute + * + * Dump the specified attribute using g_printerr(). + */ +void +gck_attribute_dump (const GckAttribute *attr) +{ + dump_attribute_type (attr); + if (attr->length == G_MAXULONG) { + g_printerr ("\n [invalid]\n"); + } else { + g_printerr ("\n [%lu] ", (unsigned long)attr->length); + dump_attribute_value (attr); + g_printerr ("\n"); + } +} + +/** + * gck_attributes_dump: + * @attrs: The attributes + * + * Dump the attributes using g_printerr(). + */ +void +gck_attributes_dump (GckAttributes *attrs) +{ + const GckAttribute *attr; + guint i, count; + + for (i = 0, count = gck_attributes_count (attrs); i < count; ++i) { + attr = gck_attributes_at (attrs, i); + gck_attribute_dump (attr); + } +} diff --git a/gck/gck-enum-types.h b/gck/gck-enum-types.h new file mode 100644 index 0000000..05637fc --- /dev/null +++ b/gck/gck-enum-types.h @@ -0,0 +1,33 @@ + +/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ + + +#include + +G_BEGIN_DECLS + +/* enumerations from "gck/gck.h" */ +#ifndef GCK_TYPE_ERROR +GType gck_error_get_type (void) G_GNUC_CONST; +#define GCK_TYPE_ERROR (gck_error_get_type ()) +#endif +#ifndef GCK_TYPE_SESSION_OPTIONS +GType gck_session_options_get_type (void) G_GNUC_CONST; +#define GCK_TYPE_SESSION_OPTIONS (gck_session_options_get_type ()) +#endif +#ifndef GCK_TYPE_BUILDER_FLAGS +GType gck_builder_flags_get_type (void) G_GNUC_CONST; +#define GCK_TYPE_BUILDER_FLAGS (gck_builder_flags_get_type ()) +#endif +#ifndef GCK_TYPE_URI_ERROR +GType gck_uri_error_get_type (void) G_GNUC_CONST; +#define GCK_TYPE_URI_ERROR (gck_uri_error_get_type ()) +#endif +#ifndef GCK_TYPE_URI_FLAGS +GType gck_uri_flags_get_type (void) G_GNUC_CONST; +#define GCK_TYPE_URI_FLAGS (gck_uri_flags_get_type ()) +#endif +G_END_DECLS + +/* Generated data ends here */ + diff --git a/gck/gck-enumerator.c b/gck/gck-enumerator.c new file mode 100644 index 0000000..3121aff --- /dev/null +++ b/gck/gck-enumerator.c @@ -0,0 +1,1356 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-enumerator.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2010, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include + +/** + * SECTION:gck-enumerator + * @title: GckEnumerator + * @short_description: Enumerates through PKCS\#11 objects. + * + * A GckEnumerator can be used to enumerate through PKCS\#11 objects. It will + * automatically create sessions as necessary. + * + * Use gck_modules_enumerate_objects() or gck_modules_enumerate_uri() to create + * an enumerator. To get the objects use gck_enumerator_next() or + * gck_enumerator_next_async() functions. + */ + +enum { + PROP_0, + PROP_INTERACTION, + PROP_OBJECT_TYPE, + PROP_CHAINED +}; + +/** + * GckEnumerator: + * + * An object that allows enumerating of objects across modules, tokens. + */ + +typedef struct _GckEnumeratorResult { + gulong handle; + GckSession *session; + GckAttributes *attrs; +} GckEnumeratorResult; + +typedef struct _GckEnumeratorState GckEnumeratorState; + +typedef gpointer (*GckEnumeratorFunc) (GckEnumeratorState *args, + gboolean forward); + +struct _GckEnumeratorState { + gpointer enumerator; + GckEnumeratorState *chained; + + /* For the current call */ + gint want_objects; + + /* The state we're currently in */ + GckEnumeratorFunc handler; + + /* Input to enumerator */ + GList *modules; + GckUriData *match; + GckSessionOptions session_options; + GTlsInteraction *interaction; + + /* The type of objects to create */ + GType object_type; + gpointer object_class; + const gulong *attr_types; + gint attr_count; + + /* state_slots */ + GList *slots; + + /* state_slot */ + GckSlot *slot; + GckTokenInfo *token_info; + CK_FUNCTION_LIST_PTR funcs; + + /* state_session */ + GckSession *session; + + /* state_find */ + GQueue *found; + + /* state_results */ + GQueue *results; +}; + +struct _GckEnumeratorPrivate { + GMutex *mutex; + GckEnumeratorState *the_state; + GTlsInteraction *interaction; + GType object_type; + GckObjectClass *object_class; + gulong *attr_types; + gint attr_count; + GckEnumerator *chained; +}; + +G_DEFINE_TYPE (GckEnumerator, gck_enumerator, G_TYPE_OBJECT); + +static gpointer state_modules (GckEnumeratorState *args, + gboolean forward); + +static gpointer state_slots (GckEnumeratorState *args, + gboolean forward); + +static gpointer state_slot (GckEnumeratorState *args, + gboolean forward); + +static gpointer state_session (GckEnumeratorState *args, + gboolean forward); + +static gpointer state_find (GckEnumeratorState *args, + gboolean forward); + +static gpointer state_results (GckEnumeratorState *args, + gboolean forward); + + +static void +_gck_enumerator_result_free (gpointer data) +{ + GckEnumeratorResult *result = data; + g_object_unref (result->session); + if (result->attrs) + gck_attributes_unref (result->attrs); + g_slice_free (GckEnumeratorResult, result); +} + +static gpointer +rewind_state (GckEnumeratorState *args, GckEnumeratorFunc handler) +{ + g_assert (args); + g_assert (handler); + g_assert (args->handler); + + while (handler != args->handler) { + args->handler = (args->handler) (args, FALSE); + g_assert (args->handler); + } + + return handler; +} + +static void +cleanup_state (GckEnumeratorState *args) +{ + g_assert (args); + + /* Have each state cleanup */ + rewind_state (args, state_modules); + + /* state_slots */ + g_assert (!args->slots); + + /* state_slot */ + g_assert (!args->slot); + g_assert (!args->token_info); + g_assert (!args->funcs); + + /* state_session */ + g_assert (!args->session); + + /* state_find */ + if (args->found) { + g_queue_foreach (args->found, (GFunc) _gck_enumerator_result_free, NULL); + g_queue_free (args->found); + args->found = NULL; + } + + /* state_results */ + if (args->results) { + g_queue_foreach (args->results, (GFunc) _gck_enumerator_result_free, NULL); + g_queue_free (args->results); + args->results = NULL; + } + + gck_list_unref_free (args->modules); + args->modules = NULL; + + g_clear_object (&args->interaction); + + if (args->object_class) + g_type_class_unref (args->object_class); + args->object_class = NULL; + args->object_type = 0; + + if (args->match) { + gck_uri_data_free (args->match); + args->match = NULL; + } +} + +static gpointer +state_modules (GckEnumeratorState *args, gboolean forward) +{ + GckModule *module; + + g_assert (args->slots == NULL); + + if (forward) { + + /* There are no more modules? */ + if (!args->modules) { + g_debug ("no more modules, stopping enumerator"); + return NULL; + } + + /* Pop off the current module */ + module = args->modules->data; + g_assert (GCK_IS_MODULE (module)); + args->modules = g_list_delete_link (args->modules, args->modules); + + args->slots = gck_module_get_slots (module, TRUE); + + GckModuleInfo *info = gck_module_get_info (module); + g_debug ("enumerating into module: %s", info->library_description); + gck_module_info_free (info); + + g_object_unref (module); + return state_slots; + } + + /* Should never be asked to go backward from start state */ + g_assert_not_reached (); +} + +static gpointer +state_slots (GckEnumeratorState *args, gboolean forward) +{ + GckSlot *slot; + GckModule *module; + GckTokenInfo *token_info; + gboolean matched; + + g_assert (args->slot == NULL); + + /* slots to slot state */ + if (forward) { + + /* If there are no more slots go back to start state */ + if (!args->slots) { + g_debug ("no more slots, want next module"); + return rewind_state (args, state_modules); + } + + /* Pop the next slot off the stack */ + slot = args->slots->data; + args->slots = g_list_delete_link (args->slots, args->slots); + + token_info = gck_slot_get_token_info (slot); + if (!token_info) { + g_message ("couldn't get token info for slot while enumerating"); + g_object_unref (slot); + + /* Skip over this slot to the next slot */ + return state_slots; + } + + /* Do we have unrecognized matches? */ + if (args->match->any_unrecognized) { + g_debug ("token uri had unrecognized, not matching any tokens"); + matched = FALSE; + + /* Are we trying to match the slot? */ + } else if (args->match->token_info) { + /* No match? Go to next slot */ + matched = _gck_token_info_match (args->match->token_info, token_info); + + g_debug ("%s token: %s", matched ? "matched" : "did not match", + token_info->label); + + } else { + g_debug ("matching all tokens: %s", token_info->label); + matched = TRUE; + } + + if (!matched) { + g_object_unref (slot); + gck_token_info_free (token_info); + return state_slots; + } + + module = gck_slot_get_module (slot); + args->funcs = gck_module_get_functions (module); + g_assert (args->funcs); + g_object_unref (module); + + /* We have a slot */ + args->slot = slot; + args->token_info = token_info; + return state_slot; + + /* slots state to modules state */ + } else { + + gck_list_unref_free (args->slots); + args->slots = NULL; + return state_modules; + } +} + +static gpointer +state_slot (GckEnumeratorState *args, gboolean forward) +{ + CK_SESSION_HANDLE session; + CK_FLAGS flags; + CK_RV rv; + + g_assert (args->slot); + g_assert (args->funcs); + g_assert (args->session == NULL); + + /* slot to session state */ + if (forward) { + flags = CKF_SERIAL_SESSION; + if ((args->session_options & GCK_SESSION_READ_WRITE) == GCK_SESSION_READ_WRITE) + flags |= CKF_RW_SESSION; + + rv = (args->funcs->C_OpenSession) (gck_slot_get_handle (args->slot), + flags, NULL, NULL, &session); + + if (rv != CKR_OK) { + g_message ("couldn't open session on module while enumerating objects: %s", + gck_message_from_rv (rv)); + return rewind_state (args, state_slots); + } + + g_debug ("opened %s session", flags & CKF_RW_SESSION ? "read-write" : "read-only"); + args->session = gck_session_from_handle (args->slot, session, args->session_options); + return state_session; + + /* slot to slots state */ + } else { + g_object_unref (args->slot); + args->slot = NULL; + args->funcs = NULL; + + gck_token_info_free (args->token_info); + args->token_info = NULL; + + return state_slots; + } +} + +static gpointer +state_session (GckEnumeratorState *args, gboolean forward) +{ + GTlsInteraction *interaction; + CK_RV rv; + + g_assert (args->funcs); + g_assert (args->session); + g_assert (args->token_info); + + /* session to authenticated state */ + if (forward) { + + /* Don't want to authenticate? */ + if ((args->session_options & GCK_SESSION_LOGIN_USER) == 0) { + g_debug ("no authentication necessary, skipping"); + return state_find; + } + + /* Compatibility, hook into GckModule signals if no interaction set */ + if (args->interaction) + interaction = g_object_ref (args->interaction); + else + interaction = _gck_interaction_new (args->slot); + + rv = _gck_session_authenticate_token (args->funcs, + gck_session_get_handle (args->session), + args->slot, interaction, NULL); + + g_object_unref (interaction); + + if (rv != CKR_OK) + g_message ("couldn't authenticate when enumerating: %s", gck_message_from_rv (rv)); + + /* We try to proceed anyway with the enumeration */ + return state_find; + + /* Session to slot state */ + } else { + g_object_unref (args->session); + args->session = NULL; + return state_slot; + } +} + +static gpointer +state_find (GckEnumeratorState *args, + gboolean forward) +{ + CK_OBJECT_HANDLE objects[128]; + CK_SESSION_HANDLE session; + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs, i,count; + GckEnumeratorResult *result; + CK_RV rv; + + /* Just go back, no logout */ + if (!forward) + return state_session; + + /* This is where we do the actual searching */ + + g_assert (args->session != NULL); + g_assert (args->want_objects > 0); + g_assert (args->funcs != NULL); + + if (!args->found) + args->found = g_queue_new (); + + if (args->match->attributes) { + attrs = _gck_attributes_commit_out (args->match->attributes, &n_attrs); + gchar *string = gck_attributes_to_string (args->match->attributes); + g_debug ("finding objects matching: %s", string); + g_free (string); + } else { + attrs = NULL; + n_attrs = 0; + g_debug ("finding all objects"); + } + + session = gck_session_get_handle (args->session); + g_return_val_if_fail (session, NULL); + + /* Get all the objects */ + rv = (args->funcs->C_FindObjectsInit) (session, attrs, n_attrs); + + if (rv == CKR_OK) { + for(;;) { + rv = (args->funcs->C_FindObjects) (session, objects, G_N_ELEMENTS (objects), &count); + if (rv != CKR_OK || count == 0) + break; + + g_debug ("matched %lu objects", count); + + for (i = 0; i < count; i++) { + result = g_slice_new0 (GckEnumeratorResult); + result->handle = objects[i]; + result->session = g_object_ref (args->session); + g_queue_push_tail (args->found, result); + } + } + + (args->funcs->C_FindObjectsFinal) (session); + } + + g_debug ("finding objects completed with: %s", _gck_stringize_rv (rv)); + return state_results; +} + +static gpointer +state_results (GckEnumeratorState *args, + gboolean forward) +{ + GckEnumeratorResult *result; + GckBuilder builder; + GckAttributes *attrs; + CK_ATTRIBUTE_PTR template; + CK_ULONG n_template; + CK_SESSION_HANDLE session; + gint count; + CK_RV rv; + gint i; + + g_assert (args->funcs != NULL); + g_assert (args->object_class != NULL); + g_assert (args->found != NULL); + + /* No cleanup, just unwind */ + if (!forward) + return state_find; + + if (!args->results) + args->results = g_queue_new (); + + session = gck_session_get_handle (args->session); + g_return_val_if_fail (session, NULL); + + /* Get the attributes for want_objects */ + for (count = 0; count < args->want_objects; count++) { + result = g_queue_pop_head (args->found); + if (result == NULL) { + g_debug ("wanted %d objects, have %d, looking for more", + args->want_objects, g_queue_get_length (args->results)); + return rewind_state (args, state_slots); + } + + /* If no request for attributes, just go forward */ + if (args->attr_count == 0) { + g_queue_push_tail (args->results, result); + continue; + } + + gck_builder_init (&builder); + + for (i = 0; i < args->attr_count; ++i) + gck_builder_add_empty (&builder, args->attr_types[i]); + + /* Ask for attribute sizes */ + template = _gck_builder_prepare_in (&builder, &n_template); + + rv = (args->funcs->C_GetAttributeValue) (session, result->handle, template, n_template); + if (GCK_IS_GET_ATTRIBUTE_RV_OK (rv)) { + + /* Allocate memory for each value */ + template = _gck_builder_commit_in (&builder, &n_template); + + /* Now get the actual values */ + rv = (args->funcs->C_GetAttributeValue) (session, result->handle, template, n_template); + } + + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + if (GCK_IS_GET_ATTRIBUTE_RV_OK (rv)) { + gchar *string = gck_attributes_to_string (attrs); + g_debug ("retrieved attributes for object %lu: %s", + result->handle, string); + g_free (string); + result->attrs = attrs; + g_queue_push_tail (args->results, result); + + } else { + g_message ("couldn't retrieve attributes when enumerating: %s", + gck_message_from_rv (rv)); + gck_attributes_unref (attrs); + _gck_enumerator_result_free (result); + } + } + + g_debug ("wanted %d objects, returned %d objects", + args->want_objects, g_queue_get_length (args->results)); + + /* We got all the results we wanted */ + return NULL; +} + +static void +gck_enumerator_init (GckEnumerator *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_ENUMERATOR, GckEnumeratorPrivate); + self->pv->mutex = g_new0 (GMutex, 1); + g_mutex_init (self->pv->mutex); + self->pv->the_state = g_new0 (GckEnumeratorState, 1); + self->pv->object_type = GCK_TYPE_OBJECT; + self->pv->object_class = g_type_class_ref (self->pv->object_type); + g_assert (self->pv->object_class); +} + +static void +gck_enumerator_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GckEnumerator *self = GCK_ENUMERATOR (obj); + + switch (prop_id) { + case PROP_INTERACTION: + g_value_take_object (value, gck_enumerator_get_interaction (self)); + break; + case PROP_OBJECT_TYPE: + g_value_set_gtype (value, gck_enumerator_get_object_type (self)); + break; + case PROP_CHAINED: + g_value_set_object (value, gck_enumerator_get_chained (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_enumerator_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GckEnumerator *self = GCK_ENUMERATOR (obj); + + switch (prop_id) { + case PROP_INTERACTION: + gck_enumerator_set_interaction (self, g_value_get_object (value)); + break; + case PROP_OBJECT_TYPE: + gck_enumerator_set_object_type (self, g_value_get_gtype (value)); + break; + case PROP_CHAINED: + gck_enumerator_set_chained (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_enumerator_dispose (GObject *obj) +{ + GckEnumerator *self = GCK_ENUMERATOR (obj); + + gck_enumerator_set_interaction (self, NULL); + gck_enumerator_set_chained (self, NULL); + + G_OBJECT_CLASS (gck_enumerator_parent_class)->dispose (obj); +} + +static void +gck_enumerator_finalize (GObject *obj) +{ + GckEnumerator *self = GCK_ENUMERATOR (obj); + + g_assert (self->pv->interaction == NULL); + + g_assert (self->pv->the_state != NULL); + cleanup_state (self->pv->the_state); + g_free (self->pv->the_state); + + g_mutex_clear (self->pv->mutex); + g_free (self->pv->mutex); + g_type_class_unref (self->pv->object_class); + g_free (self->pv->attr_types); + + G_OBJECT_CLASS (gck_enumerator_parent_class)->finalize (obj); +} + +static void +gck_enumerator_class_init (GckEnumeratorClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*)klass; + + gobject_class->get_property = gck_enumerator_get_property; + gobject_class->set_property = gck_enumerator_set_property; + gobject_class->dispose = gck_enumerator_dispose; + gobject_class->finalize = gck_enumerator_finalize; + + g_type_class_add_private (klass, sizeof (GckEnumeratorPrivate)); + + /** + * GckEnumerator:interaction: + * + * Interaction object used to ask the user for pins when opening + * sessions. Used if the session_options of the enumerator have + * %GCK_SESSION_LOGIN_USER + */ + g_object_class_install_property (gobject_class, PROP_INTERACTION, + g_param_spec_object ("interaction", "Interaction", "Interaction asking for pins", + G_TYPE_TLS_INTERACTION, G_PARAM_READWRITE)); + + /** + * GckEnumerator:object-type: (skip) + * + * The type of objects that are created by the enumerator. Must be + * GckObject or derived from it. + */ + g_object_class_install_property (gobject_class, PROP_OBJECT_TYPE, + g_param_spec_gtype ("object-type", "Object Type", "Type of objects created", + GCK_TYPE_OBJECT, G_PARAM_READWRITE)); + + /** + * GckEnumerator:chained: + * + * Chained enumerator, which will be enumerated when this enumerator + * has enumerated all its objects. + */ + g_object_class_install_property (gobject_class, PROP_CHAINED, + g_param_spec_object ("chained", "Chained", "Chained enumerator", + GCK_TYPE_ENUMERATOR, G_PARAM_READWRITE)); +} + +static void +created_enumerator (GckUriData *uri_data, + const gchar *type) +{ + gchar *attrs, *uri; + attrs = uri_data->attributes ? gck_attributes_to_string (uri_data->attributes) : NULL; + uri = uri_data ? gck_uri_build (uri_data, GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE) : NULL; + g_debug ("for = %s, tokens = %s, objects = %s", type, uri, attrs); + g_free (attrs); + g_free (uri); +} + +GckEnumerator * +_gck_enumerator_new_for_modules (GList *modules, + GckSessionOptions session_options, + GckUriData *uri_data) +{ + GckEnumerator *self; + GckEnumeratorState *state; + + self = g_object_new (GCK_TYPE_ENUMERATOR, NULL); + state = self->pv->the_state; + + state->session_options = session_options; + + state->modules = gck_list_ref_copy (modules); + state->slots = NULL; + state->handler = state_modules; + state->match = uri_data; + + created_enumerator (uri_data, "modules"); + return self; +} + +GckEnumerator * +_gck_enumerator_new_for_slots (GList *slots, + GckSessionOptions session_options, + GckUriData *uri_data) +{ + GckEnumerator *self; + GckEnumeratorState *state; + + self = g_object_new (GCK_TYPE_ENUMERATOR, NULL); + state = self->pv->the_state; + + state->session_options = session_options; + + state->slots = gck_list_ref_copy (slots); + state->modules = NULL; + state->handler = state_slots; + state->match = uri_data; + + created_enumerator (uri_data, "slots"); + return self; +} + +GckEnumerator * +_gck_enumerator_new_for_session (GckSession *session, + GckUriData *uri_data) +{ + GckEnumerator *self; + GckEnumeratorState *state; + GckModule *module; + + self = g_object_new (GCK_TYPE_ENUMERATOR, NULL); + state = self->pv->the_state; + + state->session = g_object_ref (session); + state->modules = NULL; + state->slots = NULL; + state->handler = state_session; + state->match = uri_data; + + state->slot = gck_session_get_slot (session); + state->token_info = gck_slot_get_token_info (state->slot); + + module = gck_session_get_module (session); + state->funcs = gck_module_get_functions (module); + g_object_unref (module); + + created_enumerator (uri_data, "session"); + return self; +} + +typedef struct _EnumerateNext { + GckArguments base; + GckEnumeratorState *state; + gint want_objects; +} EnumerateNext; + +static CK_RV +perform_enumerate_next (EnumerateNext *args) +{ + GckEnumeratorFunc handler; + GckEnumeratorState *state; + gint count = 0; + + g_assert (args->state); + + for (state = args->state; state != NULL; state = state->chained) { + g_assert (state->handler); + state->want_objects = args->want_objects - count; + for (;;) { + handler = (state->handler) (state, TRUE); + if (!handler) + break; + state->handler = handler; + } + + count += state->results ? g_queue_get_length (state->results) : 0; + if (count >= args->want_objects) + break; + } + + /* TODO: In some modes, errors */ + return CKR_OK; +} + +static void +free_enumerate_next (EnumerateNext *args) +{ + /* Should have been assigned back to enumerator */ + g_assert (!args->state); + + g_free (args); +} + +/** + * gck_enumerator_get_object_type: + * @self: an enumerator + * + * Get the type of objects created by this enumerator. The type will always + * either be #GckObject or derived from it. + * + * Returns: the type of objects created + */ +GType +gck_enumerator_get_object_type (GckEnumerator *self) +{ + GType result; + + g_return_val_if_fail (GCK_IS_ENUMERATOR (self), 0); + + g_mutex_lock (self->pv->mutex); + + result = self->pv->object_type; + + g_mutex_unlock (self->pv->mutex); + + return result; +} + +/** + * gck_enumerator_set_object_type: (skip) + * @self: an enumerator + * @object_type: the type of objects to create + * + * Set the type of objects to be created by this enumerator. The type must + * always be either #GckObject or derived from it. + * + * If the #GckObjectCache interface is implemented on the derived class + * and the default_types class field is set, then the enumerator will retrieve + * attributes for each object. + */ +void +gck_enumerator_set_object_type (GckEnumerator *self, + GType object_type) +{ + gck_enumerator_set_object_type_full (self, object_type, NULL, 0); +} + +/** + * gck_enumerator_set_object_type_full: (rename-to gck_enumerator_set_object_type) + * @self: an enumerator + * @object_type: the type of objects to create + * @attr_types: (array length=attr_count): types of attributes to retrieve for objects + * @attr_count: the number of attributes to retrieve + * + * Set the type of objects to be created by this enumerator. The type must + * always be either #GckObject or derived from it. + * + * If @attr_types and @attr_count are non-NULL and non-zero respectively, + * then the #GckObjectCache interface is expected to be implemented on the + * derived class, then the enumerator will retrieve attributes for each object. + */ +void +gck_enumerator_set_object_type_full (GckEnumerator *self, + GType object_type, + const gulong *attr_types, + gint attr_count) +{ + gpointer klass; + + g_return_if_fail (GCK_IS_ENUMERATOR (self)); + + if (!g_type_is_a (object_type, GCK_TYPE_OBJECT)) { + g_warning ("the object_type '%s' is not a derived type of GckObject", + g_type_name (object_type)); + return; + } + + klass = g_type_class_ref (object_type); + + g_mutex_lock (self->pv->mutex); + + if (self->pv->object_type) + g_type_class_unref (self->pv->object_class); + self->pv->object_type = object_type; + self->pv->object_class = klass; + + g_free (self->pv->attr_types); + self->pv->attr_types = NULL; + self->pv->attr_count = 0; + + if (attr_types) { + self->pv->attr_types = g_memdup (attr_types, sizeof (gulong) * attr_count); + self->pv->attr_count = attr_count; + } + + g_mutex_unlock (self->pv->mutex); +} + +/** + * gck_enumerator_get_chained: + * @self: the enumerator + * + * Get the enumerator that will be run after all objects from this one + * are seen. + * + * Returns: (transfer full) (allow-none): the chained enumerator or %NULL + */ +GckEnumerator * +gck_enumerator_get_chained (GckEnumerator *self) +{ + GckEnumerator *chained = NULL; + + g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL); + + g_mutex_lock (self->pv->mutex); + + if (self->pv->chained) + chained = g_object_ref (self->pv->chained); + + g_mutex_unlock (self->pv->mutex); + + return chained; +} + +/** + * gck_enumerator_set_chained: + * @self: the enumerator + * @chained: (allow-none): the chained enumerator or %NULL + * + * Set a chained enumerator that will be run after all objects from this one + * are seen. + */ +void +gck_enumerator_set_chained (GckEnumerator *self, + GckEnumerator *chained) +{ + GckEnumerator *old_chained = NULL; + + g_return_if_fail (GCK_IS_ENUMERATOR (self)); + g_return_if_fail (chained == NULL || GCK_IS_ENUMERATOR (chained)); + + g_mutex_lock (self->pv->mutex); + + old_chained = self->pv->chained; + if (chained) + g_object_ref (chained); + self->pv->chained = chained; + + g_mutex_unlock (self->pv->mutex); + + if (old_chained) + g_object_unref (old_chained); + + g_object_notify (G_OBJECT (self), "chained"); +} + +/** + * gck_enumerator_get_interaction: + * @self: the enumerator + * + * Get the interaction used when a pin is needed + * + * Returns: (transfer full) (allow-none): the interaction or %NULL + */ +GTlsInteraction * +gck_enumerator_get_interaction (GckEnumerator *self) +{ + GTlsInteraction *result = NULL; + + g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL); + + g_mutex_lock (self->pv->mutex); + + if (self->pv->interaction) + result = g_object_ref (self->pv->interaction); + + g_mutex_unlock (self->pv->mutex); + + return result; +} + +/** + * gck_enumerator_set_interaction: + * @self: the enumerator + * @interaction: (allow-none): the interaction or %NULL + * + * Set the interaction used when a pin is needed + */ +void +gck_enumerator_set_interaction (GckEnumerator *self, + GTlsInteraction *interaction) +{ + GTlsInteraction *previous = NULL; + + g_return_if_fail (GCK_IS_ENUMERATOR (self)); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + + g_mutex_lock (self->pv->mutex); + + if (interaction != self->pv->interaction) { + previous = self->pv->interaction; + self->pv->interaction = interaction; + if (interaction) + g_object_ref (interaction); + } + + g_mutex_unlock (self->pv->mutex); + + g_clear_object (&previous); + g_object_notify (G_OBJECT (self), "interaction"); +} + +static GckEnumeratorState * +check_out_enumerator_state (GckEnumerator *self) +{ + GckEnumeratorState *state = NULL; + GTlsInteraction *old_interaction = NULL; + gpointer old_object_class = NULL; + GckEnumeratorState *chained_state = NULL; + GckObjectCacheIface *object_iface; + GckEnumerator *chained; + + chained = gck_enumerator_get_chained (self); + if (chained) { + chained_state = check_out_enumerator_state (chained); + g_object_unref (chained); + } + + g_mutex_lock (self->pv->mutex); + + if (self->pv->the_state) { + state = self->pv->the_state; + self->pv->the_state = NULL; + + state->enumerator = g_object_ref (self); + g_assert (state->chained == NULL); + state->chained = chained_state; + + old_interaction = state->interaction; + if (self->pv->interaction) + state->interaction = g_object_ref (self->pv->interaction); + else + state->interaction = NULL; + + old_object_class = state->object_class; + + /* Must already be holding a reference, state also holds a ref */ + state->object_type = self->pv->object_type; + state->object_class = g_type_class_peek (state->object_type); + g_assert (state->object_class == self->pv->object_class); + + object_iface = g_type_interface_peek (state->object_class, + GCK_TYPE_OBJECT_CACHE); + + if (self->pv->attr_types) { + state->attr_types = self->pv->attr_types; + state->attr_count = self->pv->attr_count; + } else if (object_iface && object_iface->default_types) { + state->attr_types = object_iface->default_types; + state->attr_count = object_iface->n_default_types; + } + + g_type_class_ref (state->object_type); + } + + g_mutex_unlock (self->pv->mutex); + + if (state == NULL) + g_warning ("this enumerator is already running a next operation"); + + /* Free these outside the lock */ + if (old_interaction) + g_object_unref (old_interaction); + if (old_object_class) + g_type_class_unref (old_object_class); + + return state; +} + +static void +check_in_enumerator_state (GckEnumeratorState *state) +{ + GckEnumeratorState *chained = NULL; + GckEnumerator *self; + + g_assert (GCK_IS_ENUMERATOR (state->enumerator)); + self = state->enumerator; + + g_mutex_lock (self->pv->mutex); + + state->enumerator = NULL; + g_assert (self->pv->the_state == NULL); + self->pv->the_state = state; + chained = state->chained; + state->chained = NULL; + + g_mutex_unlock (self->pv->mutex); + + /* matches ref in check_in */ + g_object_unref (self); + + if (chained) + check_in_enumerator_state (chained); +} + +static GckObject * +extract_result (GckEnumeratorState *state) +{ + GckEnumeratorResult *result = NULL; + GckModule *module; + GckObject *object; + + g_assert (state != NULL); + + if (state->results != NULL) + result = g_queue_pop_head (state->results); + if (result == NULL) { + if (state->chained) + return extract_result (state->chained); + return NULL; + } + + module = gck_session_get_module (result->session); + object = g_object_new (state->object_type, + "module", module, + "handle", result->handle, + "session", result->session, + result->attrs ? "attributes" : NULL, result->attrs, + NULL); + g_object_unref (module); + + _gck_enumerator_result_free (result); + return object; +} + +static GList * +extract_results (GckEnumeratorState *state, + gint *want_objects) +{ + GList *objects = NULL; + GckObject *object; + gint i; + + g_assert (state != NULL); + g_assert (want_objects != NULL); + + for (i = 0; i < *want_objects; i++) { + object = extract_result (state); + if (object == NULL) + break; + objects = g_list_prepend (objects, object); + } + + *want_objects -= i; + return g_list_reverse (objects); +} + +/** + * gck_enumerator_next: + * @self: The enumerator + * @cancellable: A #GCancellable or %NULL + * @error: A location to store an error on failure + * + * Get the next object in the enumerator, or %NULL if there are no more objects. + * + * %NULL is also returned if the function fails. Use the @error to determine + * whether a failure occurred or not. + * + * Returns: (transfer full) (allow-none): The next object, which must be released + * using g_object_unref, or %NULL. + */ +GckObject * +gck_enumerator_next (GckEnumerator *self, + GCancellable *cancellable, + GError **error) +{ + EnumerateNext args = { GCK_ARGUMENTS_INIT, NULL, 0, }; + GckObject *result = NULL; + + g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + args.state = check_out_enumerator_state (self); + g_return_val_if_fail (args.state != NULL, NULL); + + /* A result from a previous run? */ + result = extract_result (args.state); + if (result == NULL) { + args.want_objects = 1; + + /* Run the operation and steal away the results */ + if (_gck_call_sync (NULL, perform_enumerate_next, NULL, &args, cancellable, error)) + result = extract_result (args.state); + + args.want_objects = 0; + } + + /* Put the state back */ + check_in_enumerator_state (args.state); + + return result; +} + +/** + * gck_enumerator_next_n: + * @self: An enumerator + * @max_objects: The maximum amount of objects to enumerate + * @cancellable: A #GCancellable or %NULL + * @error: A location to store an error on failure + * + * Get the next set of objects from the enumerator. The maximum number of + * objects can be specified with @max_objects. If -1 is specified, then all + * the remaining objects will be returned. + * + * %NULL is also returned if the function fails. Use the @error to determine + * whether a failure occurred or not. + * + * Returns: (transfer full) (element-type Gck.Object): A list of objects, which + * should be freed using gck_list_unref_free(). + */ +GList * +gck_enumerator_next_n (GckEnumerator *self, + gint max_objects, + GCancellable *cancellable, + GError **error) +{ + EnumerateNext args = { GCK_ARGUMENTS_INIT, NULL, 0, }; + GList *results = NULL; + gint want_objects; + + g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL); + g_return_val_if_fail (max_objects == -1 || max_objects > 0, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + /* Remove the state and own it ourselves */ + args.state = check_out_enumerator_state (self); + g_return_val_if_fail (args.state != NULL, NULL); + + want_objects = max_objects <= 0 ? G_MAXINT : max_objects; + + /* A result from a previous run? */ + results = extract_results (args.state, &want_objects); + if (want_objects > 0) { + args.want_objects = want_objects; + + /* Run the operation and steal away the results */ + if (_gck_call_sync (NULL, perform_enumerate_next, NULL, &args, cancellable, error)) + results = g_list_concat (results, extract_results (args.state, &want_objects)); + + args.want_objects = 0; + } + + /* Put the state back */ + check_in_enumerator_state (args.state); + + if (results) + g_clear_error (error); + + return results; +} + +/** + * gck_enumerator_next_async: + * @self: An enumerator + * @max_objects: The maximum number of objects to get + * @cancellable: A #GCancellable or %NULL + * @callback: Called when the result is ready + * @user_data: Data to pass to the callback + * + * Get the next set of objects from the enumerator. This operation completes + * asynchronously.The maximum number of objects can be specified with + * @max_objects. If -1 is specified, then all the remaining objects will be + * enumerated. + */ +void +gck_enumerator_next_async (GckEnumerator *self, gint max_objects, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GckEnumeratorState *state; + EnumerateNext *args; + + g_return_if_fail (GCK_IS_ENUMERATOR (self)); + g_return_if_fail (max_objects == -1 || max_objects > 0); + + g_object_ref (self); + + /* Remove the state and own it ourselves */ + state = check_out_enumerator_state (self); + g_return_if_fail (state != NULL); + + args = _gck_call_async_prep (NULL, self, perform_enumerate_next, NULL, + sizeof (*args), free_enumerate_next); + args->want_objects = max_objects <= 0 ? G_MAXINT : max_objects; + + args->state = state; + _gck_call_async_ready_go (args, cancellable, callback, user_data); + g_object_unref (self); +} + +/** + * gck_enumerator_next_finish: + * @self: An enumerator + * @result: The result passed to the callback + * @error: A location to raise an error on failure. + * + * Complete an operation to enumerate next objects. + * + * %NULL is also returned if the function fails. Use the @error to determine + * whether a failure occurred or not. + * + * Returns: (element-type Gck.Object) (transfer full): The list of objects, which + * should be freed with gck_list_unref_free() + */ +GList* +gck_enumerator_next_finish (GckEnumerator *self, GAsyncResult *result, GError **error) +{ + EnumerateNext *args; + GckEnumeratorState *state; + GList *results = NULL; + gint want_objects; + + g_object_ref (self); + + args = _gck_call_arguments (result, EnumerateNext); + state = args->state; + args->state = NULL; + want_objects = args->want_objects; + args->want_objects = 0; + + if (_gck_call_basic_finish (result, error)) + results = extract_results (state, &want_objects); + + /* Put the state back */ + check_in_enumerator_state (state); + + g_object_unref (self); + + return results; +} diff --git a/gck/gck-interaction.c b/gck/gck-interaction.c new file mode 100644 index 0000000..ebbdc77 --- /dev/null +++ b/gck/gck-interaction.c @@ -0,0 +1,176 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-interaction.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck-private.h" + +#include + +#define GCK_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCK_TYPE_INTERACTION, GckInteraction)) +#define GCK_IS_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCK_TYPE_INTERACTION)) +#define GCK_INTERACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCK_TYPE_INTERACTION, GckInteractionClass)) + +typedef struct _GckInteractionClass GckInteractionClass; + +struct _GckInteraction { + GTlsInteraction interaction; + GckModule *module; +}; + +struct _GckInteractionClass { + GTlsInteractionClass parent; +}; + +enum { + PROP_0, + PROP_MODULE +}; + +G_DEFINE_TYPE (GckInteraction, _gck_interaction, G_TYPE_TLS_INTERACTION); + +static void +_gck_interaction_init (GckInteraction *self) +{ + +} + +static void +_gck_interaction_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GckInteraction *self = GCK_INTERACTION (obj); + + switch (prop_id) { + case PROP_MODULE: + g_value_set_object (value, self->module); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gck_interaction_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GckInteraction *self = GCK_INTERACTION (obj); + + switch (prop_id) { + case PROP_MODULE: + g_return_if_fail (self->module == NULL); + self->module = g_value_dup_object (value); + g_return_if_fail (self->module != NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gck_interaction_dispose (GObject *obj) +{ + GckInteraction *self = GCK_INTERACTION (obj); + + g_clear_object (&self->module); + + G_OBJECT_CLASS (_gck_interaction_parent_class)->dispose (obj); +} + +static GTlsInteractionResult +_gck_interaction_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + GckInteraction *self = GCK_INTERACTION (interaction); + gchar *value = NULL; + gboolean ret = FALSE; + GckSlot *token; + GckObject *key; + + if (!self->module) + return G_TLS_INTERACTION_UNHANDLED; + + token = gck_password_get_token (GCK_PASSWORD (password)); + if (token != NULL) { + g_signal_emit_by_name (self->module, "authenticate-slot", token, + g_tls_password_get_description (password), + &value, &ret); + g_object_unref (token); + + } else { + key = gck_password_get_key (GCK_PASSWORD (password)); + g_return_val_if_fail (GCK_IS_OBJECT (key), G_TLS_INTERACTION_UNHANDLED); + + g_signal_emit_by_name (self->module, "authenticate-object", key, + g_tls_password_get_description (password), + &value, &ret); + g_object_unref (key); + } + + if (ret) { + g_tls_password_set_value_full (password, (guchar *)value, -1, g_free); + return G_TLS_INTERACTION_HANDLED; + } else { + return G_TLS_INTERACTION_UNHANDLED; + } +} + +static void +_gck_interaction_class_init (GckInteractionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass); + + object_class->get_property = _gck_interaction_get_property; + object_class->set_property = _gck_interaction_set_property; + object_class->dispose = _gck_interaction_dispose; + + interaction_class->ask_password = _gck_interaction_ask_password; + + g_object_class_install_property (object_class, PROP_MODULE, + g_param_spec_object ("module", "Module", "PKCS11 Module", + GCK_TYPE_MODULE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +GTlsInteraction * +_gck_interaction_new (gpointer token_or_key) +{ + GTlsInteraction *result; + GModule *module = NULL; + + g_return_val_if_fail (GCK_IS_SLOT (token_or_key) || + GCK_IS_OBJECT (token_or_key), NULL); + + g_object_get (token_or_key, "module", &module, NULL); + result = g_object_new (GCK_TYPE_INTERACTION, "module", module, NULL); + g_object_unref (module); + + return result; +} diff --git a/gck/gck-marshal.list b/gck/gck-marshal.list new file mode 100644 index 0000000..d9553af --- /dev/null +++ b/gck/gck-marshal.list @@ -0,0 +1,3 @@ +BOOLEAN:STRING,POINTER +BOOLEAN:OBJECT,STRING,POINTER +BOOLEAN:ULONG diff --git a/gck/gck-misc.c b/gck/gck-misc.c new file mode 100644 index 0000000..0e3586b --- /dev/null +++ b/gck/gck-misc.c @@ -0,0 +1,517 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-misc.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "egg/egg-secure-memory.h" + +#include + +#include + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); + +/** + * SECTION:gck-library + * @title: Library Utilities + * @short_description: Library utilities such as version checks + * + * Basic library utilities such as version checks. + */ + +/** + * GCK_CHECK_VERSION: + * @major: the major version to check for + * @minor: the minor version to check for + * @micro: the micro version to check for + * + * Checks the version of the Gck libarry that is being compiled + * against. + * + * + * Checking the version of the Gck library + * + * #if !GCK_CHECK_VERSION (3, 0, 0) + * #warning Old Gck version, disabling functionality + * #endif + * + * + * + * Returns: %TRUE if the version of the GLib header files + * is the same as or newer than the passed-in version. + */ + +/** + * GCK_MAJOR_VERSION: + * + * The major version number of the Gck library. + */ + +/** + * GCK_MINOR_VERSION: + * + * The minor version number of the Gck library. + */ + +/** + * GCK_MICRO_VERSION: + * + * The micro version number of the Gck library. + */ + +/** + * SECTION:gck-error + * @title: Errors + * @short_description: Gck Errors and error codes. + * + * Errors are returned as GError structures. The code member of GError + * contains the raw PKCS11 CK_RV result value. + */ + +/** + * SECTION:gck-private + * @title: Private, not used in docs + * @short_description: Should not show up in docs + * + * Should not show up in the docs + */ + +/** + * GCK_INVALID: + * + * Used as a terminator at the end of variable argument lists. + */ + +/** + * GCK_VENDOR_CODE: + * + * Custom PKCS11 errors that originate from the gck library, are + * based at this error code. + */ + +/** + * GckError: + * @GCK_ERROR_MODULE_PROBLEM: a result code that signifies there was a problem + * loading a PKCS\#11 module, usually a shared library + * + * Various error codes. All the CKR_XXX error codes from PKCS\#11 are also + * relevant error codes. + */ + +/** + * GCK_ERROR: + * + * The error domain for gck library errors. + */ + +GQuark +gck_get_error_quark (void) +{ + /* This is the deprecated version */ + return gck_error_get_quark (); +} + +GQuark +gck_error_get_quark (void) +{ + static GQuark domain = 0; + static volatile gsize quark_inited = 0; + + if (g_once_init_enter (&quark_inited)) { + domain = g_quark_from_static_string ("gck-error"); + g_once_init_leave (&quark_inited, 1); + } + + return domain; +} + +/** + * gck_message_from_rv: + * @rv: The PKCS\#11 return value to get a message for. + * + * Get a message for a PKCS\#11 return value or error code. Do not + * pass CKR_OK or other such non errors to this function. + * + * Return value: The user readable message. + **/ +const gchar* +gck_message_from_rv (gulong rv) +{ + switch (rv) { + + /* These are not really errors, or not current */ + case CKR_OK: + case CKR_NO_EVENT: + case CKR_FUNCTION_NOT_PARALLEL: + case CKR_SESSION_PARALLEL_NOT_SUPPORTED: + g_return_val_if_reached (""); + + default: + return p11_kit_strerror (rv); + } +} + +const gchar * +_gck_stringize_rv (CK_RV rv) +{ + switch(rv) { + #define X(x) case x: return #x; + X (CKR_OK) + X (CKR_CANCEL) + X (CKR_HOST_MEMORY) + X (CKR_SLOT_ID_INVALID) + X (CKR_GENERAL_ERROR) + X (CKR_FUNCTION_FAILED) + X (CKR_ARGUMENTS_BAD) + X (CKR_NO_EVENT) + X (CKR_NEED_TO_CREATE_THREADS) + X (CKR_CANT_LOCK) + X (CKR_ATTRIBUTE_READ_ONLY) + X (CKR_ATTRIBUTE_SENSITIVE) + X (CKR_ATTRIBUTE_TYPE_INVALID) + X (CKR_ATTRIBUTE_VALUE_INVALID) + X (CKR_DATA_INVALID) + X (CKR_DATA_LEN_RANGE) + X (CKR_DEVICE_ERROR) + X (CKR_DEVICE_MEMORY) + X (CKR_DEVICE_REMOVED) + X (CKR_ENCRYPTED_DATA_INVALID) + X (CKR_ENCRYPTED_DATA_LEN_RANGE) + X (CKR_FUNCTION_CANCELED) + X (CKR_FUNCTION_NOT_PARALLEL) + X (CKR_FUNCTION_NOT_SUPPORTED) + X (CKR_KEY_HANDLE_INVALID) + X (CKR_KEY_SIZE_RANGE) + X (CKR_KEY_TYPE_INCONSISTENT) + X (CKR_KEY_NOT_NEEDED) + X (CKR_KEY_CHANGED) + X (CKR_KEY_NEEDED) + X (CKR_KEY_INDIGESTIBLE) + X (CKR_KEY_FUNCTION_NOT_PERMITTED) + X (CKR_KEY_NOT_WRAPPABLE) + X (CKR_KEY_UNEXTRACTABLE) + X (CKR_MECHANISM_INVALID) + X (CKR_MECHANISM_PARAM_INVALID) + X (CKR_OBJECT_HANDLE_INVALID) + X (CKR_OPERATION_ACTIVE) + X (CKR_OPERATION_NOT_INITIALIZED) + X (CKR_PIN_INCORRECT) + X (CKR_PIN_INVALID) + X (CKR_PIN_LEN_RANGE) + X (CKR_PIN_EXPIRED) + X (CKR_PIN_LOCKED) + X (CKR_SESSION_CLOSED) + X (CKR_SESSION_COUNT) + X (CKR_SESSION_HANDLE_INVALID) + X (CKR_SESSION_PARALLEL_NOT_SUPPORTED) + X (CKR_SESSION_READ_ONLY) + X (CKR_SESSION_EXISTS) + X (CKR_SESSION_READ_ONLY_EXISTS) + X (CKR_SESSION_READ_WRITE_SO_EXISTS) + X (CKR_SIGNATURE_INVALID) + X (CKR_SIGNATURE_LEN_RANGE) + X (CKR_TEMPLATE_INCOMPLETE) + X (CKR_TEMPLATE_INCONSISTENT) + X (CKR_TOKEN_NOT_PRESENT) + X (CKR_TOKEN_NOT_RECOGNIZED) + X (CKR_TOKEN_WRITE_PROTECTED) + X (CKR_UNWRAPPING_KEY_HANDLE_INVALID) + X (CKR_UNWRAPPING_KEY_SIZE_RANGE) + X (CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT) + X (CKR_USER_ALREADY_LOGGED_IN) + X (CKR_USER_NOT_LOGGED_IN) + X (CKR_USER_PIN_NOT_INITIALIZED) + X (CKR_USER_TYPE_INVALID) + X (CKR_USER_ANOTHER_ALREADY_LOGGED_IN) + X (CKR_USER_TOO_MANY_TYPES) + X (CKR_WRAPPED_KEY_INVALID) + X (CKR_WRAPPED_KEY_LEN_RANGE) + X (CKR_WRAPPING_KEY_HANDLE_INVALID) + X (CKR_WRAPPING_KEY_SIZE_RANGE) + X (CKR_WRAPPING_KEY_TYPE_INCONSISTENT) + X (CKR_RANDOM_SEED_NOT_SUPPORTED) + X (CKR_RANDOM_NO_RNG) + X (CKR_DOMAIN_PARAMS_INVALID) + X (CKR_BUFFER_TOO_SMALL) + X (CKR_SAVED_STATE_INVALID) + X (CKR_INFORMATION_SENSITIVE) + X (CKR_STATE_UNSAVEABLE) + X (CKR_CRYPTOKI_NOT_INITIALIZED) + X (CKR_CRYPTOKI_ALREADY_INITIALIZED) + X (CKR_MUTEX_BAD) + X (CKR_MUTEX_NOT_LOCKED) + X (CKR_FUNCTION_REJECTED) + X (CKR_VENDOR_DEFINED) + #undef X + default: + return "CKR_??????"; + } +} + +CK_RV +_gck_rv_from_error (GError *error, + CK_RV catch_all_code) +{ + g_return_val_if_fail (error != NULL, CKR_GENERAL_ERROR); + + if (error->domain == GCK_ERROR) + return error->code; + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return CKR_FUNCTION_CANCELED; + + return catch_all_code; +} + +/** + * SECTION:gck-misc + * @title: Miscellaneous Functions + * @short_description: Other miscellaneous functions. + * + * A few supporting functions that come in handy when dealing with the gck + * library or PKCS11 in general. + */ + +GType +gck_list_get_boxed_type (void) +{ + static GType type = 0; + if (!type) + type = g_boxed_type_register_static ("GckList", + (GBoxedCopyFunc)gck_list_ref_copy, + (GBoxedFreeFunc)gck_list_unref_free); + return type; + +} + +/** + * gck_list_unref_free: (skip) + * @reflist: (element-type GObject.Object): list of Gobject reference counted pointers + * + * Free a list of GObject based pointers. All objects in the list + * will be unreffed and then the list itself will be freed. + **/ +void +gck_list_unref_free (GList *reflist) +{ + GList *l; + for (l = reflist; l; l = g_list_next (l)) { + g_return_if_fail (G_IS_OBJECT (l->data)); + g_object_unref (l->data); + } + g_list_free (reflist); +} + +/** + * gck_list_ref_copy: (skip) + * @reflist: (element-type GObject.Object): list of GObject reference counted + * objects + * + * Copy a list of GObject based pointers. All objects + * in the list will be reffed and the list will be copied. + * + * Return value: (transfer full) (element-type GObject.Object): the copied and + * reffed list, when done, free it with gck_list_unref_free () + **/ +GList * +gck_list_ref_copy (GList *reflist) +{ + GList *l, *copy = g_list_copy (reflist); + for (l = copy; l; l = g_list_next (l)) { + g_return_val_if_fail (G_IS_OBJECT (l->data), NULL); + g_object_ref (l->data); + } + return copy; +} + +/** + * gck_string_from_chars: (skip) + * @data: The character data to turn into a null terminated string. + * @max: The maximum length of the charater data. + * + * Create a string from a set of PKCS\#11 characters. This is + * similar to g_strndup, except for that it also strips trailing + * spaces. These space padded strings are often used in PKCS\#11 + * structures. + * + * If the space padded string is filled with null characters then + * this function will return %NULL. + * + * Return value: The null terminated string. + */ +gchar* +gck_string_from_chars (const guchar *data, gsize max) +{ + gchar *string; + + g_return_val_if_fail (data, NULL); + g_return_val_if_fail (max, NULL); + + /* Means no value */ + if (!data[0]) + return NULL; + + string = g_strndup ((gchar*)data, max); + g_strchomp (string); + return string; +} + +/** + * gck_string_to_chars: (skip) + * @data: The character buffer to place string into. + * @max: The maximum length of the charater buffer. + * @string: The string to place in the buffer. + * + * Create a space padded PKCS\#11 string from a null terminated string. + * The string must be shorter than the buffer or %FALSE will be + * returned. + * + * If a %NULL string is passed, then the space padded string will be + * set to zero characters. + * + * Return value: The null terminated string. + */ +gboolean +gck_string_to_chars (guchar *data, gsize max, const gchar *string) +{ + gsize len; + + g_return_val_if_fail (data, FALSE); + g_return_val_if_fail (max, FALSE); + + if (!string) { + memset (data, 0, max); + return TRUE; + } + + len = strlen (string); + if (len > max) + return FALSE; + + memset (data, ' ', max); + memcpy (data, string, len); + return TRUE; +} + +guint +_gck_ulong_hash (gconstpointer v) +{ + const signed char *p = v; + guint32 i, h = *p; + + for(i = 0; i < sizeof (gulong); ++i) + h = (h << 5) - h + *(p++); + + return h; +} + +gboolean +_gck_ulong_equal (gconstpointer v1, gconstpointer v2) +{ + return *((const gulong*)v1) == *((const gulong*)v2); +} + +/** + * gck_value_to_ulong: + * @value: (array length=length): memory to convert + * @length: length of memory + * @result: A location to store the result + * + * Convert CK_ULONG type memory to a boolean. + * + * Returns: Whether the conversion was successful. + */ +gboolean +gck_value_to_ulong (const guchar *value, + gsize length, + gulong *result) +{ + if (!value || length != sizeof (CK_ULONG)) + return FALSE; + if (result) + *result = *((CK_ULONG*)value); + return TRUE; +} + +/** + * gck_value_to_boolean: + * @value: (array length=length): memory to convert + * @length: length of memory + * @result: A location to store the result + * + * Convert CK_BBOOL type memory to a boolean. + * + * Returns: Whether the conversion was successful. + */ +gboolean +gck_value_to_boolean (const guchar *value, + gsize length, + gboolean *result) +{ + if (!value || length != sizeof (CK_BBOOL)) + return FALSE; + if (result) + *result = *((CK_BBOOL*)value) ? TRUE : FALSE; + return TRUE; +} + +static gboolean +match_info_string (const gchar *match, const gchar *string) +{ + /* NULL matches anything */ + if (match == NULL) + return TRUE; + + if (string == NULL) + return FALSE; + + return g_str_equal (match, string); +} + +gboolean +_gck_module_info_match (GckModuleInfo *match, GckModuleInfo *info) +{ + /* Matches two GckModuleInfo for use in PKCS#11 URI's */ + + g_return_val_if_fail (match, FALSE); + g_return_val_if_fail (info, FALSE); + + return (match_info_string (match->library_description, info->library_description) && + match_info_string (match->manufacturer_id, info->manufacturer_id)); +} + +gboolean +_gck_token_info_match (GckTokenInfo *match, GckTokenInfo *info) +{ + /* Matches two GckTokenInfo for use in PKCS#11 URI's */ + + g_return_val_if_fail (match, FALSE); + g_return_val_if_fail (info, FALSE); + + return (match_info_string (match->label, info->label) && + match_info_string (match->manufacturer_id, info->manufacturer_id) && + match_info_string (match->model, info->model) && + match_info_string (match->serial_number, info->serial_number)); +} diff --git a/gck/gck-mock.c b/gck/gck-mock.c new file mode 100644 index 0000000..30b5462 --- /dev/null +++ b/gck/gck-mock.c @@ -0,0 +1,1850 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gck.h" +#include "gck-mock.h" + +#include +#include "pkcs11i.h" + +#include + +#include + +/* + * This is *NOT* how you'd want to implement a PKCS#11 module. This + * fake module simply provides enough for gck library to test against. + * It doesn't pass any tests, or behave as expected from a PKCS#11 module. + */ + + +static gboolean initialized = FALSE; +static gchar *the_pin = NULL; +static gulong n_the_pin = 0; + +static gboolean logged_in = FALSE; +static CK_USER_TYPE user_type = 0; +static CK_FUNCTION_LIST functionList; + +typedef enum _Operation { + OP_FIND = 1, + OP_CRYPTO +} Operation; + +typedef struct _Session { + CK_SESSION_HANDLE handle; + CK_SESSION_INFO info; + GHashTable *objects; + + Operation operation; + + /* For find operations */ + GList *matches; + + /* For crypto operations */ + CK_OBJECT_HANDLE crypto_key; + CK_ATTRIBUTE_TYPE crypto_method; + CK_MECHANISM_TYPE crypto_mechanism; + CK_BBOOL want_context_login; + + /* For 'signing' with CKM_MOCK_PREFIX */ + CK_BYTE sign_prefix[128]; + CK_ULONG n_sign_prefix; +} Session; + +static guint unique_identifier = 100; +static GHashTable *the_sessions = NULL; +static GHashTable *the_objects = NULL; + +enum { + PRIVATE_KEY_CAPITALIZE = 3, + PUBLIC_KEY_CAPITALIZE = 4, + PRIVATE_KEY_PREFIX = 5, + PUBLIC_KEY_PREFIX = 6 +}; + +#define SIGNED_PREFIX "signed-prefix:" + +static void +free_session (gpointer data) +{ + Session *sess = (Session*)data; + if (sess) + g_hash_table_destroy (sess->objects); + g_free (sess); +} + +static GckAttributes * +lookup_object (Session *session, + CK_OBJECT_HANDLE hObject, + GHashTable **table) +{ + GckAttributes *attrs; + + attrs = g_hash_table_lookup (the_objects, GUINT_TO_POINTER (hObject)); + if (attrs) { + if (table) + *table = the_objects; + return attrs; + } + + attrs = g_hash_table_lookup (session->objects, GUINT_TO_POINTER (hObject)); + if (attrs) { + if (table) + *table = session->objects; + return attrs; + } + + return NULL; +} + +CK_OBJECT_HANDLE +gck_mock_module_add_object (GckAttributes *attrs) +{ + GckBuilder builder; + gboolean token; + guint handle; + + g_return_val_if_fail (the_objects, 0); + + + handle = ++unique_identifier; + if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token)) { + g_return_val_if_fail (token == TRUE, 0); + gck_attributes_ref_sink (attrs); + } else { + gck_builder_init (&builder); + gck_builder_add_except (&builder, attrs, CKA_TOKEN, GCK_INVALID); + gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE); + gck_attributes_unref (attrs); + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + } + g_hash_table_insert (the_objects, GUINT_TO_POINTER (handle), attrs); + + return handle; +} + +void +gck_mock_module_enumerate_objects (CK_SESSION_HANDLE handle, GckMockEnumerator func, + gpointer user_data) +{ + GHashTableIter iter; + gpointer key; + gpointer value; + Session *session; + + g_assert (the_objects); + g_assert (func); + + /* Token objects */ + g_hash_table_iter_init (&iter, the_objects); + while (g_hash_table_iter_next (&iter, &key, &value)) { + if (!(func) (GPOINTER_TO_UINT (key), value, user_data)) + return; + } + + /* session objects */ + if (handle) { + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (handle)); + if (session) { + g_hash_table_iter_init (&iter, session->objects); + while (g_hash_table_iter_next (&iter, &key, &value)) { + if (!(func) (GPOINTER_TO_UINT (key), value, user_data)) + return; + } + } + } +} + +typedef struct _FindObject { + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs; + CK_OBJECT_HANDLE object; +} FindObject; + +static gboolean +enumerate_and_find_object (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data) +{ + FindObject *ctx = user_data; + CK_ATTRIBUTE_PTR match; + const GckAttribute *attr; + CK_ULONG i; + + for (i = 0; i < ctx->n_attrs; ++i) { + match = ctx->attrs + i; + attr = gck_attributes_find (attrs, match->type); + if (!attr) + return TRUE; /* Continue */ + + if (attr->length != match->ulValueLen || + memcmp (attr->value, match->pValue, attr->length) != 0) + return TRUE; /* Continue */ + } + + ctx->object = object; + return FALSE; /* Stop iteration */ +} + +CK_OBJECT_HANDLE +gck_mock_module_find_object (CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR attrs, CK_ULONG n_attrs) +{ + FindObject ctx; + + ctx.attrs = attrs; + ctx.n_attrs = n_attrs; + ctx.object = 0; + + gck_mock_module_enumerate_objects (session, enumerate_and_find_object, &ctx); + + return ctx.object; +} + +static gboolean +enumerate_and_count_objects (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data) +{ + guint *n_objects = user_data; + ++(*n_objects); + return TRUE; /* Continue */ +} + +guint +gck_mock_module_count_objects (CK_SESSION_HANDLE session) +{ + guint n_objects = 0; + gck_mock_module_enumerate_objects (session, enumerate_and_count_objects, &n_objects); + return n_objects; +} + +static GckAttributes * +replace_attributes (GckAttributes *atts, + CK_ATTRIBUTE_PTR attrs, + CK_ULONG n_attrs) +{ + GckBuilder builder; + CK_ULONG i; + CK_ATTRIBUTE_PTR set; + gulong *types; + + if (!n_attrs) + return gck_attributes_ref_sink (atts); + + gck_builder_init (&builder); + types = g_new0 (gulong, n_attrs); + for (i = 0; i < n_attrs; ++i) { + set = attrs + i; + types[i] = set->type; + gck_builder_add_data (&builder, set->type, set->pValue, set->ulValueLen); + } + gck_builder_add_exceptv (&builder, atts, types, n_attrs); + g_free (types); + return gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +void +gck_mock_module_set_object (CK_OBJECT_HANDLE object, CK_ATTRIBUTE_PTR attrs, + CK_ULONG n_attrs) +{ + GckAttributes *atts; + GckAttributes *replaced; + + g_return_if_fail (object != 0); + g_return_if_fail (the_objects); + + atts = g_hash_table_lookup (the_objects, GUINT_TO_POINTER (object)); + g_return_if_fail (atts); + + if (!n_attrs) + return; + + replaced = replace_attributes (atts, attrs, n_attrs); + g_hash_table_replace (the_objects, GUINT_TO_POINTER (object), replaced); +} + +void +gck_mock_module_set_pin (const gchar *password) +{ + g_free (the_pin); + the_pin = g_strdup (password); + n_the_pin = strlen (password); +} + +CK_RV +gck_mock_C_Initialize (CK_VOID_PTR pInitArgs) +{ + GckBuilder builder; + CK_ULONG value; + CK_C_INITIALIZE_ARGS_PTR args; + + g_return_val_if_fail (initialized == FALSE, CKR_CRYPTOKI_ALREADY_INITIALIZED); + + args = (CK_C_INITIALIZE_ARGS_PTR)pInitArgs; + if (args) { + g_return_val_if_fail( + (args->CreateMutex == NULL && args->DestroyMutex == NULL && + args->LockMutex == NULL && args->UnlockMutex == NULL) || + (args->CreateMutex != NULL && args->DestroyMutex != NULL && + args->LockMutex != NULL && args->UnlockMutex != NULL), + CKR_ARGUMENTS_BAD); + + /* Flags should allow OS locking and os threads */ + g_return_val_if_fail ((args->flags & CKF_OS_LOCKING_OK), CKR_CANT_LOCK); + g_return_val_if_fail ((args->flags & CKF_LIBRARY_CANT_CREATE_OS_THREADS) == 0, CKR_NEED_TO_CREATE_THREADS); + } + + the_pin = g_strdup ("booo"); + n_the_pin = strlen (the_pin); + the_sessions = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, free_session); + the_objects = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)gck_attributes_unref); + + /* Our token object */ + gck_builder_init (&builder); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL"); + g_hash_table_insert (the_objects, GUINT_TO_POINTER (2), + gck_attributes_ref_sink (gck_builder_end (&builder))); + + /* Private capitalize key */ + value = CKM_MOCK_CAPITALIZE; + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); + gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key"); + gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value)); + gck_builder_add_boolean (&builder, CKA_DECRYPT, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_WRAP, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_UNWRAP, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_DERIVE, CK_TRUE); + gck_builder_add_string (&builder, CKA_VALUE, "value"); + gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique1"); + g_hash_table_insert (the_objects, GUINT_TO_POINTER (PRIVATE_KEY_CAPITALIZE), + gck_attributes_ref_sink (gck_builder_end (&builder))); + + /* Public capitalize key */ + value = CKM_MOCK_CAPITALIZE; + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); + gck_builder_add_string (&builder, CKA_LABEL, "Public Capitalize Key"); + gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value)); + gck_builder_add_boolean (&builder, CKA_ENCRYPT, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE); + gck_builder_add_string (&builder, CKA_VALUE, "value"); + gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique2"); + g_hash_table_insert (the_objects, GUINT_TO_POINTER (PUBLIC_KEY_CAPITALIZE), gck_builder_end (&builder)); + + /* Private prefix key */ + value = CKM_MOCK_PREFIX; + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); + gck_builder_add_string (&builder, CKA_LABEL, "Private prefix key"); + gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value)); + gck_builder_add_boolean (&builder, CKA_SIGN, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_ALWAYS_AUTHENTICATE, CK_TRUE); + gck_builder_add_string (&builder, CKA_VALUE, "value"); + gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique3"); + g_hash_table_insert (the_objects, GUINT_TO_POINTER (PRIVATE_KEY_PREFIX), + gck_attributes_ref_sink (gck_builder_end (&builder))); + + /* Private prefix key */ + value = CKM_MOCK_PREFIX; + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); + gck_builder_add_string (&builder, CKA_LABEL, "Public prefix key"); + gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value)); + gck_builder_add_boolean (&builder, CKA_VERIFY, CK_TRUE); + gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE); + gck_builder_add_string (&builder, CKA_VALUE, "value"); + gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique4"); + g_hash_table_insert (the_objects, GUINT_TO_POINTER (PUBLIC_KEY_PREFIX), + gck_attributes_ref_sink (gck_builder_end (&builder))); + + logged_in = FALSE; + initialized = TRUE; + return CKR_OK; +} + +CK_RV +gck_mock_validate_and_C_Initialize (CK_VOID_PTR pInitArgs) +{ + CK_C_INITIALIZE_ARGS_PTR args; + void *mutex; + CK_RV rv; + + args = (CK_C_INITIALIZE_ARGS_PTR)pInitArgs; + if (args) { + g_assert ((args->CreateMutex) (NULL) == CKR_ARGUMENTS_BAD && "CreateMutex succeeded wrong"); + g_assert ((args->DestroyMutex) (NULL) == CKR_MUTEX_BAD && "DestroyMutex succeeded wrong"); + g_assert ((args->LockMutex) (NULL) == CKR_MUTEX_BAD && "LockMutex succeeded wrong"); + g_assert ((args->UnlockMutex) (NULL) == CKR_MUTEX_BAD && "UnlockMutex succeeded wrong"); + + /* Try to create an actual mutex */ + rv = (args->CreateMutex) (&mutex); + g_assert (rv == CKR_OK && "CreateMutex g_assert_not_reacheded"); + g_assert (mutex != NULL && "CreateMutex created null mutex"); + + /* Try and lock the mutex */ + rv = (args->LockMutex) (mutex); + g_assert (rv == CKR_OK && "LockMutex g_assert_not_reacheded"); + + /* Try and unlock the mutex */ + rv = (args->UnlockMutex) (mutex); + g_assert (rv == CKR_OK && "UnlockMutex g_assert_not_reacheded"); + + /* Try and destroy the mutex */ + rv = (args->DestroyMutex) (mutex); + g_assert (rv == CKR_OK && "DestroyMutex g_assert_not_reacheded"); + } + + return gck_mock_C_Initialize (pInitArgs); +} + +CK_RV +gck_mock_C_Finalize (CK_VOID_PTR pReserved) +{ + g_return_val_if_fail (pReserved == NULL, CKR_ARGUMENTS_BAD); + g_return_val_if_fail (initialized == TRUE, CKR_CRYPTOKI_NOT_INITIALIZED); + + initialized = FALSE; + logged_in = FALSE; + g_hash_table_destroy (the_objects); + the_objects = NULL; + + g_hash_table_destroy (the_sessions); + the_sessions = NULL; + + g_free (the_pin); + return CKR_OK; +} + +static const CK_INFO TEST_INFO = { + { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR }, + "TEST MANUFACTURER ", + 0, + "TEST LIBRARY ", + { 45, 145 } +}; + +CK_RV +gck_mock_C_GetInfo (CK_INFO_PTR pInfo) +{ + g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD); + memcpy (pInfo, &TEST_INFO, sizeof (*pInfo)); + return CKR_OK; +} + +CK_RV +gck_mock_C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list) +{ + g_return_val_if_fail (list, CKR_ARGUMENTS_BAD); + *list = &functionList; + return CKR_OK; +} + +/* + * Two slots + * ONE: token present + * TWO: token not present + */ + +CK_RV +gck_mock_C_GetSlotList (CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount) +{ + CK_ULONG count; + + g_return_val_if_fail (pulCount, CKR_ARGUMENTS_BAD); + + count = tokenPresent ? 1 : 2; + + /* Application only wants to know the number of slots. */ + if (pSlotList == NULL) { + *pulCount = count; + return CKR_OK; + } + + if (*pulCount < count) + g_return_val_if_reached (CKR_BUFFER_TOO_SMALL); + + *pulCount = count; + pSlotList[0] = GCK_MOCK_SLOT_ONE_ID; + if (!tokenPresent) + pSlotList[1] = GCK_MOCK_SLOT_TWO_ID; + + return CKR_OK; +} + +/* Update gck-mock.h URIs when updating this */ + +static const CK_SLOT_INFO TEST_INFO_ONE = { + "TEST SLOT ", + "TEST MANUFACTURER ", + CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE, + { 55, 155 }, + { 65, 165 }, +}; + +/* Update gck-mock.h URIs when updating this */ + +static const CK_SLOT_INFO TEST_INFO_TWO = { + "TEST SLOT ", + "TEST MANUFACTURER ", + CKF_REMOVABLE_DEVICE, + { 55, 155 }, + { 65, 165 }, +}; + +CK_RV +gck_mock_C_GetSlotInfo (CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) +{ + g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD); + + if (slotID == GCK_MOCK_SLOT_ONE_ID) { + memcpy (pInfo, &TEST_INFO_ONE, sizeof (*pInfo)); + return CKR_OK; + } else if (slotID == GCK_MOCK_SLOT_TWO_ID) { + memcpy (pInfo, &TEST_INFO_TWO, sizeof (*pInfo)); + return CKR_OK; + } else { + g_return_val_if_reached (CKR_SLOT_ID_INVALID); + } +} + +/* Update gck-mock.h URIs when updating this */ + +static const CK_TOKEN_INFO TEST_TOKEN_ONE = { + "TEST LABEL ", + "TEST MANUFACTURER ", + "TEST MODEL ", + "TEST SERIAL ", + CKF_LOGIN_REQUIRED | CKF_USER_PIN_INITIALIZED | CKF_CLOCK_ON_TOKEN | CKF_TOKEN_INITIALIZED, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + { 75, 175 }, + { 85, 185 }, + { '1', '9', '9', '9', '0', '5', '2', '5', '0', '9', '1', '9', '5', '9', '0', '0' } +}; + +CK_RV +gck_mock_C_GetTokenInfo (CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo) +{ + g_return_val_if_fail (pInfo != NULL, CKR_ARGUMENTS_BAD); + + if (slotID == GCK_MOCK_SLOT_ONE_ID) { + memcpy (pInfo, &TEST_TOKEN_ONE, sizeof (*pInfo)); + return CKR_OK; + } else if (slotID == GCK_MOCK_SLOT_TWO_ID) { + return CKR_TOKEN_NOT_PRESENT; + } else { + g_return_val_if_reached (CKR_SLOT_ID_INVALID); + } +} + +CK_RV +gck_mock_fail_C_GetTokenInfo (CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo) +{ + return CKR_GENERAL_ERROR; +} + +/* + * TWO mechanisms: + * CKM_MOCK_CAPITALIZE + * CKM_MOCK_PREFIX + */ + +CK_RV +gck_mock_C_GetMechanismList (CK_SLOT_ID slotID, CK_MECHANISM_TYPE_PTR pMechanismList, + CK_ULONG_PTR pulCount) +{ + g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID); + g_return_val_if_fail (pulCount, CKR_ARGUMENTS_BAD); + + /* Application only wants to know the number of slots. */ + if (pMechanismList == NULL) { + *pulCount = 2; + return CKR_OK; + } + + if (*pulCount != 2) + g_return_val_if_reached (CKR_BUFFER_TOO_SMALL); + + pMechanismList[0] = CKM_MOCK_CAPITALIZE; + pMechanismList[1] = CKM_MOCK_PREFIX; + return CKR_OK; +} + +static const CK_MECHANISM_INFO TEST_MECH_CAPITALIZE = { + 512, 4096, 0 +}; + +static const CK_MECHANISM_INFO TEST_MECH_PREFIX = { + 2048, 2048, 0 +}; + +CK_RV +gck_mock_C_GetMechanismInfo (CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, + CK_MECHANISM_INFO_PTR pInfo) +{ + g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID); + g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD); + + if (type == CKM_MOCK_CAPITALIZE) { + memcpy (pInfo, &TEST_MECH_CAPITALIZE, sizeof (*pInfo)); + return CKR_OK; + } else if (type == CKM_MOCK_PREFIX) { + memcpy (pInfo, &TEST_MECH_PREFIX, sizeof (*pInfo)); + return CKR_OK; + } else { + g_return_val_if_reached (CKR_MECHANISM_INVALID); + } +} + +CK_RV +gck_mock_specific_args_C_InitToken (CK_SLOT_ID slotID, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen, + CK_UTF8CHAR_PTR pLabel) +{ + g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID); + + g_return_val_if_fail (pPin, CKR_PIN_INVALID); + g_return_val_if_fail (strlen ("TEST PIN") == ulPinLen, CKR_PIN_INVALID); + g_return_val_if_fail (strncmp ((gchar*)pPin, "TEST PIN", ulPinLen) == 0, CKR_PIN_INVALID); + g_return_val_if_fail (pLabel != NULL, CKR_PIN_INVALID); + g_return_val_if_fail (strcmp ((gchar*)pPin, "TEST LABEL") == 0, CKR_PIN_INVALID); + + g_free (the_pin); + the_pin = g_strndup ((gchar*)pPin, ulPinLen); + n_the_pin = ulPinLen; + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_WaitForSlotEvent (CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, CK_VOID_PTR pReserved) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_C_OpenSession (CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication, + CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession) +{ + Session *sess; + + g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID || slotID == GCK_MOCK_SLOT_TWO_ID, CKR_SLOT_ID_INVALID); + g_return_val_if_fail (phSession != NULL, CKR_ARGUMENTS_BAD); + g_return_val_if_fail ((flags & CKF_SERIAL_SESSION) == CKF_SERIAL_SESSION, CKR_SESSION_PARALLEL_NOT_SUPPORTED); + + sess = g_new0 (Session, 1); + sess->handle = ++unique_identifier; + sess->info.flags = flags; + sess->info.slotID = slotID; + sess->info.state = 0; + sess->info.ulDeviceError = 1414; + sess->objects = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)gck_attributes_unref); + *phSession = sess->handle; + + g_hash_table_replace (the_sessions, GUINT_TO_POINTER (sess->handle), sess); + return CKR_OK; +} + +CK_RV +gck_mock_fail_C_OpenSession (CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication, + CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession) +{ + return CKR_GENERAL_ERROR; +} + +CK_RV +gck_mock_C_CloseSession (CK_SESSION_HANDLE hSession) +{ + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID); + + g_hash_table_remove (the_sessions, GUINT_TO_POINTER (hSession)); + return CKR_OK; +} + +CK_RV +gck_mock_C_CloseAllSessions (CK_SLOT_ID slotID) +{ + g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID); + + g_hash_table_remove_all (the_sessions); + return CKR_OK; +} + +CK_RV +gck_mock_C_GetFunctionStatus (CK_SESSION_HANDLE hSession) +{ + return CKR_FUNCTION_NOT_PARALLEL; +} + +CK_RV +gck_mock_C_CancelFunction (CK_SESSION_HANDLE hSession) +{ + return CKR_FUNCTION_NOT_PARALLEL; +} + +CK_RV +gck_mock_C_GetSessionInfo (CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo) +{ + Session *session; + + g_return_val_if_fail (pInfo != NULL, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_assert (session != NULL && "No such session found"); + if (!session) + return CKR_SESSION_HANDLE_INVALID; + + if (logged_in) { + if (session->info.flags & CKF_RW_SESSION) + session->info.state = CKS_RW_USER_FUNCTIONS; + else + session->info.state = CKS_RO_USER_FUNCTIONS; + } else { + if (session->info.flags & CKF_RW_SESSION) + session->info.state = CKS_RW_PUBLIC_SESSION; + else + session->info.state = CKS_RO_PUBLIC_SESSION; + } + + memcpy (pInfo, &session->info, sizeof (*pInfo)); + return CKR_OK; +} + +CK_RV +gck_mock_fail_C_GetSessionInfo (CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo) +{ + return CKR_GENERAL_ERROR; +} + +CK_RV +gck_mock_C_InitPIN (CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pPin, + CK_ULONG ulPinLen) +{ + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID); + + g_free (the_pin); + the_pin = g_strndup ((gchar*)pPin, ulPinLen); + n_the_pin = ulPinLen; + return CKR_OK; +} + +CK_RV +gck_mock_C_SetPIN (CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pOldPin, + CK_ULONG ulOldLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewLen) +{ + Session *session; + gboolean match; + gchar *old; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID); + + old = g_strndup ((gchar*)pOldPin, ulOldLen); + match = old && g_str_equal (old, the_pin); + g_free (old); + + if (!match) + return CKR_PIN_INCORRECT; + + g_free (the_pin); + the_pin = g_strndup ((gchar*)pNewPin, ulNewLen); + n_the_pin = ulNewLen; + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_GetOperationState (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState, + CK_ULONG_PTR pulOperationStateLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_SetOperationState (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState, + CK_ULONG ulOperationStateLen, CK_OBJECT_HANDLE hEncryptionKey, + CK_OBJECT_HANDLE hAuthenticationKey) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_C_Login (CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, + CK_UTF8CHAR_PTR pPin, CK_ULONG pPinLen) +{ + Session *session; + + g_return_val_if_fail (userType == CKU_SO || + userType == CKU_USER || + userType == CKU_CONTEXT_SPECIFIC, + CKR_USER_TYPE_INVALID); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + g_return_val_if_fail (logged_in == FALSE, CKR_USER_ALREADY_LOGGED_IN); + + if (!pPin) + return CKR_PIN_INCORRECT; + + if (pPinLen != strlen (the_pin)) + return CKR_PIN_INCORRECT; + if (strncmp ((gchar*)pPin, the_pin, pPinLen) != 0) + return CKR_PIN_INCORRECT; + + if (userType == CKU_CONTEXT_SPECIFIC) { + g_return_val_if_fail (session->want_context_login == TRUE, CKR_OPERATION_NOT_INITIALIZED); + session->want_context_login = CK_FALSE; + } else { + logged_in = TRUE; + user_type = userType; + } + + return CKR_OK; +} + +CK_RV +gck_mock_C_Logout (CK_SESSION_HANDLE hSession) +{ + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_assert (session != NULL && "No such session found"); + if (!session) + return CKR_SESSION_HANDLE_INVALID; + + g_assert (logged_in && "Not logged in"); + logged_in = FALSE; + user_type = 0; + return CKR_OK; +} + +CK_RV +gck_mock_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject) +{ + GckBuilder builder; + GckAttributes *attrs; + Session *session; + gboolean token, priv; + CK_OBJECT_CLASS klass; + CK_OBJECT_HANDLE object; + const GckAttribute *attr; + CK_ULONG i; + + g_return_val_if_fail (phObject, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID); + + gck_builder_init (&builder); + for (i = 0; i < ulCount; ++i) + gck_builder_add_data (&builder, pTemplate[i].type, pTemplate[i].pValue, pTemplate[i].ulValueLen); + + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) { + if (!logged_in) { + gck_attributes_unref (attrs); + return CKR_USER_NOT_LOGGED_IN; + } + } + + /* In order to create a credential we must check CK_VALUE */ + if (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_G_CREDENTIAL) { + if (gck_attributes_find_ulong (attrs, CKA_G_OBJECT, &object)) { + attr = gck_attributes_find (attrs, CKA_VALUE); + if (!attr || attr->length != n_the_pin || + memcmp (attr->value, the_pin, attr->length) != 0) { + gck_attributes_unref (attrs); + return CKR_PIN_INCORRECT; + } + } + } + + *phObject = ++unique_identifier; + if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token) + g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phObject), attrs); + else + g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phObject), attrs); + + return CKR_OK; +} + +CK_RV +gck_mock_fail_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject) +{ + /* Always fails */ + return CKR_FUNCTION_FAILED; +} + +CK_RV +gck_mock_unsupported_C_CopyObject (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phNewObject) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_C_DestroyObject (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject) +{ + GckAttributes *attrs; + Session *session; + gboolean priv; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID); + + attrs = lookup_object (session, hObject, NULL); + g_return_val_if_fail (attrs, CKR_OBJECT_HANDLE_INVALID); + + if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) { + if (!logged_in) + return CKR_USER_NOT_LOGGED_IN; + } + + g_hash_table_remove (the_objects, GUINT_TO_POINTER (hObject)); + g_hash_table_remove (session->objects, GUINT_TO_POINTER (hObject)); + + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_GetObjectSize (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, + CK_ULONG_PTR pulSize) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_C_GetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) +{ + CK_ATTRIBUTE_PTR result; + CK_RV ret = CKR_OK; + GckAttributes *attrs; + const GckAttribute *attr; + Session *session; + CK_ULONG i; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + if (session == NULL) + return CKR_SESSION_HANDLE_INVALID; + + attrs = lookup_object (session, hObject, NULL); + if (!attrs) + return CKR_OBJECT_HANDLE_INVALID; + + for (i = 0; i < ulCount; ++i) { + result = pTemplate + i; + attr = gck_attributes_find (attrs, result->type); + if (!attr) { + result->ulValueLen = (CK_ULONG)-1; + ret = CKR_ATTRIBUTE_TYPE_INVALID; + continue; + } + + if (!result->pValue) { + result->ulValueLen = attr->length; + continue; + } + + if (result->ulValueLen >= attr->length) { + memcpy (result->pValue, attr->value, attr->length); + continue; + } + + result->ulValueLen = (CK_ULONG)-1; + ret = CKR_BUFFER_TOO_SMALL; + } + + return ret; +} + +CK_RV +gck_mock_fail_C_GetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) +{ + return CKR_FUNCTION_FAILED; +} + +CK_RV +gck_mock_C_SetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) +{ + Session *session; + GckAttributes *attrs; + GckAttributes *replaced; + GHashTable *table; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID); + + attrs = lookup_object (session, hObject, &table); + g_return_val_if_fail (attrs, CKR_OBJECT_HANDLE_INVALID); + + replaced = replace_attributes (attrs, pTemplate, ulCount); + g_hash_table_replace (table, GUINT_TO_POINTER (hObject), replaced); + + return CKR_OK; +} + +typedef struct _FindObjects { + CK_ATTRIBUTE_PTR template; + CK_ULONG count; + Session *session; +} FindObjects; + +static gboolean +enumerate_and_find_objects (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data) +{ + FindObjects *ctx = user_data; + CK_ATTRIBUTE_PTR match; + const GckAttribute *attr; + CK_ULONG i; + + for (i = 0; i < ctx->count; ++i) { + match = ctx->template + i; + attr = gck_attributes_find (attrs, match->type); + if (!attr) + return TRUE; /* Continue */ + + if (attr->length != match->ulValueLen || + memcmp (attr->value, match->pValue, attr->length) != 0) + return TRUE; /* Continue */ + } + + ctx->session->matches = g_list_prepend (ctx->session->matches, GUINT_TO_POINTER (object)); + return TRUE; /* Continue */ +} + +CK_RV +gck_mock_C_FindObjectsInit (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount) +{ + Session *session; + FindObjects ctx; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + /* Starting an operation, cancels any previous one */ + if (session->operation != 0) + session->operation = 0; + + session->operation = OP_FIND; + + ctx.template = pTemplate; + ctx.count = ulCount; + ctx.session = session; + + gck_mock_module_enumerate_objects (hSession, enumerate_and_find_objects, &ctx); + return CKR_OK; +} + +CK_RV +gck_mock_fail_C_FindObjects (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject, + CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount) +{ + /* Always fails */ + return CKR_FUNCTION_FAILED; +} + +CK_RV +gck_mock_C_FindObjects (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject, + CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount) +{ + Session *session; + + g_return_val_if_fail (phObject, CKR_ARGUMENTS_BAD); + g_return_val_if_fail (pulObjectCount, CKR_ARGUMENTS_BAD); + g_return_val_if_fail (ulMaxObjectCount != 0, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + g_return_val_if_fail (session->operation == OP_FIND, CKR_OPERATION_NOT_INITIALIZED); + + *pulObjectCount = 0; + while (ulMaxObjectCount > 0 && session->matches) { + *phObject = GPOINTER_TO_UINT (session->matches->data); + ++phObject; + --ulMaxObjectCount; + ++(*pulObjectCount); + session->matches = g_list_remove (session->matches, session->matches->data); + } + + return CKR_OK; +} + +CK_RV +gck_mock_C_FindObjectsFinal (CK_SESSION_HANDLE hSession) +{ + + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + g_return_val_if_fail (session->operation == OP_FIND, CKR_OPERATION_NOT_INITIALIZED); + + session->operation = 0; + g_list_free (session->matches); + session->matches = NULL; + + return CKR_OK; +} + +CK_RV +gck_mock_C_EncryptInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey) +{ + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + /* Starting an operation, cancels any previous one */ + if (session->operation != 0) + session->operation = 0; + + g_assert (pMechanism); + g_assert (pMechanism->mechanism == CKM_MOCK_CAPITALIZE); + g_assert (hKey == PUBLIC_KEY_CAPITALIZE); + + session->operation = OP_CRYPTO; + session->crypto_method = CKA_ENCRYPT; + session->crypto_mechanism = CKM_MOCK_CAPITALIZE; + session->crypto_key = hKey; + return CKR_OK; +} + +CK_RV +gck_mock_C_Encrypt (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, + CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen) +{ + Session *session; + CK_ULONG i; + + g_return_val_if_fail (pData, CKR_DATA_INVALID); + g_return_val_if_fail (pulEncryptedDataLen, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED); + g_return_val_if_fail (session->crypto_method == CKA_ENCRYPT, CKR_OPERATION_NOT_INITIALIZED); + + g_assert (session->crypto_mechanism == CKM_MOCK_CAPITALIZE); + g_assert (session->crypto_key == PUBLIC_KEY_CAPITALIZE); + + if (!pEncryptedData) { + *pulEncryptedDataLen = ulDataLen; + return CKR_OK; + } + + if (*pulEncryptedDataLen < ulDataLen) { + *pulEncryptedDataLen = ulDataLen; + return CKR_BUFFER_TOO_SMALL; + } + + for (i = 0; i < ulDataLen; ++i) + pEncryptedData[i] = g_ascii_toupper (pData[i]); + *pulEncryptedDataLen = ulDataLen; + + session->operation = 0; + session->crypto_method = 0; + session->crypto_mechanism = 0; + session->crypto_key = 0; + + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_EncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, + CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, + CK_ULONG_PTR pulEncryptedPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_EncryptFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pLastEncryptedPart, + CK_ULONG_PTR pulLastEncryptedPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_C_DecryptInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey) +{ + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + /* Starting an operation, cancels any previous one */ + if (session->operation != 0) + session->operation = 0; + + g_assert (pMechanism); + g_assert (pMechanism->mechanism == CKM_MOCK_CAPITALIZE); + g_assert (hKey == PRIVATE_KEY_CAPITALIZE); + + session->operation = OP_CRYPTO; + session->crypto_method = CKA_DECRYPT; + session->crypto_mechanism = CKM_MOCK_CAPITALIZE; + session->crypto_key = hKey; + return CKR_OK; +} + +CK_RV +gck_mock_C_Decrypt (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData, + CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen) +{ + Session *session; + CK_ULONG i; + + g_return_val_if_fail (pEncryptedData, CKR_ENCRYPTED_DATA_INVALID); + g_return_val_if_fail (pulDataLen, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED); + g_return_val_if_fail (session->crypto_method == CKA_DECRYPT, CKR_OPERATION_NOT_INITIALIZED); + + g_assert (session->crypto_method == CKA_DECRYPT); + g_assert (session->crypto_mechanism == CKM_MOCK_CAPITALIZE); + g_assert (session->crypto_key == PRIVATE_KEY_CAPITALIZE); + + if (!pData) { + *pulDataLen = ulEncryptedDataLen; + return CKR_OK; + } + + if (*pulDataLen < ulEncryptedDataLen) { + *pulDataLen = ulEncryptedDataLen; + return CKR_BUFFER_TOO_SMALL; + } + + for (i = 0; i < ulEncryptedDataLen; ++i) + pData[i] = g_ascii_tolower (pEncryptedData[i]); + *pulDataLen = ulEncryptedDataLen; + + session->operation = 0; + session->crypto_method = 0; + session->crypto_mechanism = 0; + session->crypto_key = 0; + + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_DecryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart, + CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DecryptFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pLastPart, + CK_ULONG_PTR pulLastPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DigestInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_Digest (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, + CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DigestUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DigestKey (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DigestFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest, + CK_ULONG_PTR pulDigestLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_C_SignInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey) +{ + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + /* Starting an operation, cancels any previous one */ + if (session->operation != 0) + session->operation = 0; + + g_assert (pMechanism); + g_assert (pMechanism->mechanism == CKM_MOCK_PREFIX); + g_assert (hKey == PRIVATE_KEY_PREFIX); + + session->operation = OP_CRYPTO; + session->crypto_method = CKA_SIGN; + session->crypto_mechanism = CKM_MOCK_PREFIX; + session->crypto_key = hKey; + + if (pMechanism->pParameter) { + g_assert (pMechanism->ulParameterLen < sizeof (session->sign_prefix)); + memcpy (session->sign_prefix, pMechanism->pParameter, pMechanism->ulParameterLen); + session->n_sign_prefix = pMechanism->ulParameterLen; + } else { + g_assert (strlen (SIGNED_PREFIX) + 1 < sizeof (session->sign_prefix)); + strcpy ((gchar*)session->sign_prefix, SIGNED_PREFIX); + session->n_sign_prefix = strlen (SIGNED_PREFIX); + } + + /* The private key has CKA_ALWAYS_AUTHENTICATE above */ + session->want_context_login = CK_TRUE; + + return CKR_OK; +} + +CK_RV +gck_mock_C_Sign (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, + CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen) +{ + Session *session; + CK_ULONG length; + + g_return_val_if_fail (pData, CKR_DATA_INVALID); + g_return_val_if_fail (pulSignatureLen, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED); + g_return_val_if_fail (session->crypto_method == CKA_SIGN, CKR_OPERATION_NOT_INITIALIZED); + + if (session->want_context_login) + return CKR_USER_NOT_LOGGED_IN; + + g_assert (session->crypto_method == CKA_SIGN); + g_assert (session->crypto_mechanism == CKM_MOCK_PREFIX); + g_assert (session->crypto_key == PRIVATE_KEY_PREFIX); + + length = session->n_sign_prefix + ulDataLen; + + if (!pSignature) { + *pulSignatureLen = length; + return CKR_OK; + } + + if (*pulSignatureLen < length) { + *pulSignatureLen = length; + return CKR_BUFFER_TOO_SMALL; + } + + memcpy (pSignature, session->sign_prefix, session->n_sign_prefix); + memcpy (pSignature + session->n_sign_prefix, pData, ulDataLen); + *pulSignatureLen = length; + + session->operation = 0; + session->crypto_method = 0; + session->crypto_mechanism = 0; + session->crypto_key = 0; + + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_SignUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_SignFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, + CK_ULONG_PTR pulSignatureLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_SignRecoverInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_SignRecover (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, + CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_C_VerifyInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey) +{ + Session *session; + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + /* Starting an operation, cancels any previous one */ + if (session->operation != 0) + session->operation = 0; + + g_assert (pMechanism); + g_assert (pMechanism->mechanism == CKM_MOCK_PREFIX); + g_assert (hKey == PUBLIC_KEY_PREFIX); + + session->operation = OP_CRYPTO; + session->crypto_method = CKA_VERIFY; + session->crypto_mechanism = CKM_MOCK_PREFIX; + session->crypto_key = hKey; + + if (pMechanism->pParameter) { + g_assert (pMechanism->ulParameterLen < sizeof (session->sign_prefix)); + memcpy (session->sign_prefix, pMechanism->pParameter, pMechanism->ulParameterLen); + session->n_sign_prefix = pMechanism->ulParameterLen; + } else { + g_assert (strlen (SIGNED_PREFIX) + 1 < sizeof (session->sign_prefix)); + strcpy ((gchar*)session->sign_prefix, SIGNED_PREFIX); + session->n_sign_prefix = strlen (SIGNED_PREFIX); + } + + return CKR_OK; +} + +CK_RV +gck_mock_C_Verify (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, + CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen) +{ + Session *session; + CK_ULONG length; + + g_return_val_if_fail (pData, CKR_DATA_INVALID); + g_return_val_if_fail (pSignature, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED); + g_return_val_if_fail (session->crypto_method == CKA_VERIFY, CKR_OPERATION_NOT_INITIALIZED); + + g_assert (session->crypto_method == CKA_VERIFY); + g_assert (session->crypto_mechanism == CKM_MOCK_PREFIX); + g_assert (session->crypto_key == PUBLIC_KEY_PREFIX); + + length = session->n_sign_prefix + ulDataLen; + + if (ulSignatureLen < length) { + g_assert (FALSE); + return CKR_SIGNATURE_LEN_RANGE; + } + + if (memcmp (pSignature, session->sign_prefix, session->n_sign_prefix) == 0 && + memcmp (pSignature + session->n_sign_prefix, pData, ulDataLen) == 0) + return CKR_OK; + + return CKR_SIGNATURE_INVALID; +} + +CK_RV +gck_mock_unsupported_C_VerifyUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_VerifyFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, + CK_ULONG pulSignatureLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_VerifyRecoverInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_VerifyRecover (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, + CK_ULONG pulSignatureLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DigestEncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, + CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, + CK_ULONG_PTR ulEncryptedPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DecryptDigestUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart, + CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, + CK_ULONG_PTR pulPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_SignEncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, + CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, + CK_ULONG_PTR ulEncryptedPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_DecryptVerifyUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart, + CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, + CK_ULONG_PTR pulPartLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_GenerateKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phKey) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_ATTRIBUTE_PTR pPublicKeyTemplate, CK_ULONG ulPublicKeyAttributeCount, + CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateKeyAttributeCount, + CK_OBJECT_HANDLE_PTR phPublicKey, CK_OBJECT_HANDLE_PTR phPrivateKey) +{ + GckBuilder builder; + GckAttributes *attrs; + Session *session; + gboolean token; + CK_ULONG i; + + g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID); + g_return_val_if_fail (pPublicKeyTemplate, CKR_TEMPLATE_INCOMPLETE); + g_return_val_if_fail (ulPublicKeyAttributeCount, CKR_TEMPLATE_INCOMPLETE); + g_return_val_if_fail (pPrivateKeyTemplate, CKR_TEMPLATE_INCOMPLETE); + g_return_val_if_fail (ulPrivateKeyAttributeCount, CKR_TEMPLATE_INCOMPLETE); + g_return_val_if_fail (phPublicKey, CKR_ARGUMENTS_BAD); + g_return_val_if_fail (phPrivateKey, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + if (pMechanism->mechanism != CKM_MOCK_GENERATE) + return CKR_MECHANISM_INVALID; + + if (!pMechanism->pParameter || pMechanism->ulParameterLen != 9 || + memcmp (pMechanism->pParameter, "generate", 9) != 0) + g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID); + + gck_builder_init (&builder); + gck_builder_add_string (&builder, CKA_VALUE, "generated"); + for (i = 0; i < ulPublicKeyAttributeCount; ++i) + gck_builder_add_data (&builder, pPublicKeyTemplate[i].type, + pPublicKeyTemplate[i].pValue, + pPublicKeyTemplate[i].ulValueLen); + *phPublicKey = ++unique_identifier; + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token) + g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPublicKey), attrs); + else + g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phPublicKey), attrs); + + gck_builder_init (&builder); + gck_builder_add_string (&builder, CKA_VALUE, "generated"); + for (i = 0; i < ulPrivateKeyAttributeCount; ++i) + gck_builder_add_data (&builder, pPrivateKeyTemplate[i].type, + pPrivateKeyTemplate[i].pValue, + pPrivateKeyTemplate[i].ulValueLen); + *phPrivateKey = ++unique_identifier; + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token) + g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPrivateKey), attrs); + else + g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phPrivateKey), attrs); + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_WrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey, + CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen) +{ + GckAttributes *attrs; + const GckAttribute *attr; + Session *session; + + g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID); + g_return_val_if_fail (hWrappingKey, CKR_OBJECT_HANDLE_INVALID); + g_return_val_if_fail (hKey, CKR_OBJECT_HANDLE_INVALID); + g_return_val_if_fail (pulWrappedKeyLen, CKR_WRAPPED_KEY_LEN_RANGE); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + attrs = lookup_object (session, hWrappingKey, NULL); + g_return_val_if_fail (attrs, CKR_WRAPPING_KEY_HANDLE_INVALID); + + attrs = lookup_object (session, hKey, NULL); + g_return_val_if_fail (attrs, CKR_WRAPPED_KEY_INVALID); + + if (pMechanism->mechanism != CKM_MOCK_WRAP) + return CKR_MECHANISM_INVALID; + + if (pMechanism->pParameter) { + if (pMechanism->ulParameterLen != 4 || + memcmp (pMechanism->pParameter, "wrap", 4) != 0) + g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID); + } + + attr = gck_attributes_find (attrs, CKA_VALUE); + if (attr == NULL) + return CKR_WRAPPED_KEY_INVALID; + + if (!pWrappedKey) { + *pulWrappedKeyLen = attr->length; + return CKR_OK; + } + + if (*pulWrappedKeyLen < attr->length) { + *pulWrappedKeyLen = attr->length; + return CKR_BUFFER_TOO_SMALL; + } + + memcpy (pWrappedKey, attr->value, attr->length); + *pulWrappedKeyLen = attr->length; + + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_UnwrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey, + CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey) +{ + GckBuilder builder; + GckAttributes *attrs; + Session *session; + gboolean token; + CK_ULONG i; + + g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID); + g_return_val_if_fail (hUnwrappingKey, CKR_WRAPPING_KEY_HANDLE_INVALID); + g_return_val_if_fail (pWrappedKey, CKR_WRAPPED_KEY_INVALID); + g_return_val_if_fail (ulWrappedKeyLen, CKR_WRAPPED_KEY_LEN_RANGE); + g_return_val_if_fail (phKey, CKR_ARGUMENTS_BAD); + g_return_val_if_fail (pTemplate, CKR_TEMPLATE_INCOMPLETE); + g_return_val_if_fail (ulCount, CKR_TEMPLATE_INCONSISTENT); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID); + + attrs = lookup_object (session, hUnwrappingKey, NULL); + g_return_val_if_fail (attrs, CKR_WRAPPING_KEY_HANDLE_INVALID); + + if (pMechanism->mechanism != CKM_MOCK_WRAP) + return CKR_MECHANISM_INVALID; + + if (pMechanism->pParameter) { + if (pMechanism->ulParameterLen != 4 || + memcmp (pMechanism->pParameter, "wrap", 4) != 0) + g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID); + } + + gck_builder_init (&builder); + gck_builder_add_data (&builder, CKA_VALUE, pWrappedKey, ulWrappedKeyLen); + for (i = 0; i < ulCount; ++i) + gck_builder_add_data (&builder, pTemplate[i].type, + pTemplate[i].pValue, + pTemplate[i].ulValueLen); + *phKey = ++unique_identifier; + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token) + g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), attrs); + else + g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phKey), attrs); + + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_DeriveKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey) +{ + GckBuilder builder; + GckAttributes *attrs, *copy; + Session *session; + gboolean token; + CK_ULONG i; + + g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID); + g_return_val_if_fail (ulCount, CKR_TEMPLATE_INCOMPLETE); + g_return_val_if_fail (pTemplate, CKR_TEMPLATE_INCOMPLETE); + g_return_val_if_fail (phKey, CKR_ARGUMENTS_BAD); + + session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession)); + g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID); + + attrs = lookup_object (session, hBaseKey, NULL); + g_return_val_if_fail (attrs, CKR_KEY_HANDLE_INVALID); + + if (pMechanism->mechanism != CKM_MOCK_DERIVE) + return CKR_MECHANISM_INVALID; + + if (pMechanism->pParameter) { + if (pMechanism->ulParameterLen != 6 || + memcmp (pMechanism->pParameter, "derive", 6) != 0) + g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID); + } + + gck_builder_init (&builder); + gck_builder_add_string (&builder, CKA_VALUE, "derived"); + for (i = 0; i < ulCount; ++i) + gck_builder_add_data (&builder, pTemplate[i].type, + pTemplate[i].pValue, + pTemplate[i].ulValueLen); + gck_builder_add_all (&builder, attrs); + *phKey = ++unique_identifier; + copy = gck_attributes_ref_sink (gck_builder_end (&builder)); + if (gck_attributes_find_boolean (copy, CKA_TOKEN, &token) && token) + g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), copy); + else + g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phKey), copy); + + return CKR_OK; +} + +CK_RV +gck_mock_unsupported_C_SeedRandom (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +CK_RV +gck_mock_unsupported_C_GenerateRandom (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pRandomData, + CK_ULONG ulRandomLen) +{ + return CKR_FUNCTION_NOT_SUPPORTED; +} + +static CK_FUNCTION_LIST functionList = { + { 2, 11 }, /* version */ + gck_mock_C_Initialize, + gck_mock_C_Finalize, + gck_mock_C_GetInfo, + gck_mock_C_GetFunctionList, + gck_mock_C_GetSlotList, + gck_mock_C_GetSlotInfo, + gck_mock_C_GetTokenInfo, + gck_mock_C_GetMechanismList, + gck_mock_C_GetMechanismInfo, + gck_mock_specific_args_C_InitToken, + gck_mock_C_InitPIN, + gck_mock_C_SetPIN, + gck_mock_C_OpenSession, + gck_mock_C_CloseSession, + gck_mock_C_CloseAllSessions, + gck_mock_C_GetSessionInfo, + gck_mock_unsupported_C_GetOperationState, + gck_mock_unsupported_C_SetOperationState, + gck_mock_C_Login, + gck_mock_C_Logout, + gck_mock_C_CreateObject, + gck_mock_unsupported_C_CopyObject, + gck_mock_C_DestroyObject, + gck_mock_unsupported_C_GetObjectSize, + gck_mock_C_GetAttributeValue, + gck_mock_C_SetAttributeValue, + gck_mock_C_FindObjectsInit, + gck_mock_C_FindObjects, + gck_mock_C_FindObjectsFinal, + gck_mock_C_EncryptInit, + gck_mock_C_Encrypt, + gck_mock_unsupported_C_EncryptUpdate, + gck_mock_unsupported_C_EncryptFinal, + gck_mock_C_DecryptInit, + gck_mock_C_Decrypt, + gck_mock_unsupported_C_DecryptUpdate, + gck_mock_unsupported_C_DecryptFinal, + gck_mock_unsupported_C_DigestInit, + gck_mock_unsupported_C_Digest, + gck_mock_unsupported_C_DigestUpdate, + gck_mock_unsupported_C_DigestKey, + gck_mock_unsupported_C_DigestFinal, + gck_mock_C_SignInit, + gck_mock_C_Sign, + gck_mock_unsupported_C_SignUpdate, + gck_mock_unsupported_C_SignFinal, + gck_mock_unsupported_C_SignRecoverInit, + gck_mock_unsupported_C_SignRecover, + gck_mock_C_VerifyInit, + gck_mock_C_Verify, + gck_mock_unsupported_C_VerifyUpdate, + gck_mock_unsupported_C_VerifyFinal, + gck_mock_unsupported_C_VerifyRecoverInit, + gck_mock_unsupported_C_VerifyRecover, + gck_mock_unsupported_C_DigestEncryptUpdate, + gck_mock_unsupported_C_DecryptDigestUpdate, + gck_mock_unsupported_C_SignEncryptUpdate, + gck_mock_unsupported_C_DecryptVerifyUpdate, + gck_mock_unsupported_C_GenerateKey, + gck_mock_unsupported_C_GenerateKeyPair, + gck_mock_unsupported_C_WrapKey, + gck_mock_unsupported_C_UnwrapKey, + gck_mock_unsupported_C_DeriveKey, + gck_mock_unsupported_C_SeedRandom, + gck_mock_unsupported_C_GenerateRandom, + gck_mock_C_GetFunctionStatus, + gck_mock_C_CancelFunction, + gck_mock_unsupported_C_WaitForSlotEvent +}; diff --git a/gck/gck-mock.h b/gck/gck-mock.h new file mode 100644 index 0000000..da08a31 --- /dev/null +++ b/gck/gck-mock.h @@ -0,0 +1,418 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include + +#include "gck.h" + +#include +#include "pkcs11i.h" + +#ifndef GCK_MOCK_H +#define GCK_MOCK_H + +CK_RV gck_mock_C_Initialize (CK_VOID_PTR pInitArgs); + +CK_RV gck_mock_validate_and_C_Initialize (CK_VOID_PTR pInitArgs); + +CK_RV gck_mock_C_Finalize (CK_VOID_PTR pReserved); + +CK_RV gck_mock_C_GetInfo (CK_INFO_PTR pInfo); + +CK_RV gck_mock_C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list); + +CK_RV gck_mock_C_GetSlotList (CK_BBOOL tokenPresent, + CK_SLOT_ID_PTR pSlotList, + CK_ULONG_PTR pulCount); + +CK_RV gck_mock_C_GetSlotInfo (CK_SLOT_ID slotID, + CK_SLOT_INFO_PTR pInfo); + +CK_RV gck_mock_C_GetTokenInfo (CK_SLOT_ID slotID, + CK_TOKEN_INFO_PTR pInfo); + +CK_RV gck_mock_fail_C_GetTokenInfo (CK_SLOT_ID slotID, + CK_TOKEN_INFO_PTR pInfo); + +CK_RV gck_mock_C_GetMechanismList (CK_SLOT_ID slotID, + CK_MECHANISM_TYPE_PTR pMechanismList, + CK_ULONG_PTR pulCount); + +CK_RV gck_mock_C_GetMechanismInfo (CK_SLOT_ID slotID, + CK_MECHANISM_TYPE type, + CK_MECHANISM_INFO_PTR pInfo); + +CK_RV gck_mock_specific_args_C_InitToken (CK_SLOT_ID slotID, + CK_UTF8CHAR_PTR pPin, + CK_ULONG ulPinLen, + CK_UTF8CHAR_PTR pLabel); + +CK_RV gck_mock_unsupported_C_WaitForSlotEvent (CK_FLAGS flags, + CK_SLOT_ID_PTR pSlot, + CK_VOID_PTR pReserved); + +CK_RV gck_mock_C_OpenSession (CK_SLOT_ID slotID, + CK_FLAGS flags, + CK_VOID_PTR pApplication, + CK_NOTIFY Notify, + CK_SESSION_HANDLE_PTR phSession); + +CK_RV gck_mock_fail_C_OpenSession (CK_SLOT_ID slotID, + CK_FLAGS flags, + CK_VOID_PTR pApplication, + CK_NOTIFY Notify, + CK_SESSION_HANDLE_PTR phSession); + +CK_RV gck_mock_C_CloseSession (CK_SESSION_HANDLE hSession); + +CK_RV gck_mock_C_CloseAllSessions (CK_SLOT_ID slotID); + +CK_RV gck_mock_C_GetFunctionStatus (CK_SESSION_HANDLE hSession); + +CK_RV gck_mock_C_CancelFunction (CK_SESSION_HANDLE hSession); + +CK_RV gck_mock_C_GetSessionInfo (CK_SESSION_HANDLE hSession, + CK_SESSION_INFO_PTR pInfo); + +CK_RV gck_mock_fail_C_GetSessionInfo (CK_SESSION_HANDLE hSession, + CK_SESSION_INFO_PTR pInfo); + +CK_RV gck_mock_C_InitPIN (CK_SESSION_HANDLE hSession, + CK_UTF8CHAR_PTR pPin, + CK_ULONG ulPinLen); + +CK_RV gck_mock_C_SetPIN (CK_SESSION_HANDLE hSession, + CK_UTF8CHAR_PTR pOldPin, + CK_ULONG ulOldLen, + CK_UTF8CHAR_PTR pNewPin, + CK_ULONG ulNewLen); + +CK_RV gck_mock_unsupported_C_GetOperationState (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pOperationState, + CK_ULONG_PTR pulOperationStateLen); + +CK_RV gck_mock_unsupported_C_SetOperationState (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pOperationState, + CK_ULONG ulOperationStateLen, + CK_OBJECT_HANDLE hEncryptionKey, + CK_OBJECT_HANDLE hAuthenticationKey); + +CK_RV gck_mock_C_Login (CK_SESSION_HANDLE hSession, + CK_USER_TYPE userType, + CK_UTF8CHAR_PTR pPin, + CK_ULONG pPinLen); + +CK_RV gck_mock_C_Logout (CK_SESSION_HANDLE hSession); + +CK_RV gck_mock_C_CreateObject (CK_SESSION_HANDLE hSession, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phObject); + +CK_RV gck_mock_fail_C_CreateObject (CK_SESSION_HANDLE hSession, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phObject); + +CK_RV gck_mock_unsupported_C_CopyObject (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phNewObject); + +CK_RV gck_mock_C_DestroyObject (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE hObject); + +CK_RV gck_mock_unsupported_C_GetObjectSize (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE hObject, + CK_ULONG_PTR pulSize); + +CK_RV gck_mock_C_GetAttributeValue (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount); + +CK_RV gck_mock_fail_C_GetAttributeValue (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount); + +CK_RV gck_mock_C_SetAttributeValue (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount); + +CK_RV gck_mock_C_FindObjectsInit (CK_SESSION_HANDLE hSession, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount); + +CK_RV gck_mock_C_FindObjects (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE_PTR phObject, + CK_ULONG ulMaxObjectCount, + CK_ULONG_PTR pulObjectCount); + +CK_RV gck_mock_fail_C_FindObjects (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE_PTR phObject, + CK_ULONG ulMaxObjectCount, + CK_ULONG_PTR pulObjectCount); + +CK_RV gck_mock_C_FindObjectsFinal (CK_SESSION_HANDLE hSession); + +CK_RV gck_mock_C_EncryptInit (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey); + +CK_RV gck_mock_C_Encrypt (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pData, + CK_ULONG ulDataLen, + CK_BYTE_PTR pEncryptedData, + CK_ULONG_PTR pulEncryptedDataLen); + +CK_RV gck_mock_unsupported_C_EncryptUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pPart, + CK_ULONG ulPartLen, + CK_BYTE_PTR pEncryptedPart, + CK_ULONG_PTR pulEncryptedPartLen); + +CK_RV gck_mock_unsupported_C_EncryptFinal (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pLastEncryptedPart, + CK_ULONG_PTR pulLastEncryptedPartLen); + +CK_RV gck_mock_C_DecryptInit (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey); + +CK_RV gck_mock_C_Decrypt (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pEncryptedData, + CK_ULONG ulEncryptedDataLen, + CK_BYTE_PTR pData, + CK_ULONG_PTR pulDataLen); + +CK_RV gck_mock_unsupported_C_DecryptUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pEncryptedPart, + CK_ULONG ulEncryptedPartLen, + CK_BYTE_PTR pPart, + CK_ULONG_PTR pulPartLen); + +CK_RV gck_mock_unsupported_C_DecryptFinal (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pLastPart, + CK_ULONG_PTR pulLastPartLen); + +CK_RV gck_mock_unsupported_C_DigestInit (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism); + +CK_RV gck_mock_unsupported_C_Digest (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pData, + CK_ULONG ulDataLen, + CK_BYTE_PTR pDigest, + CK_ULONG_PTR pulDigestLen); + +CK_RV gck_mock_unsupported_C_DigestUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pPart, + CK_ULONG ulPartLen); + +CK_RV gck_mock_unsupported_C_DigestKey (CK_SESSION_HANDLE hSession, + CK_OBJECT_HANDLE hKey); + +CK_RV gck_mock_unsupported_C_DigestFinal (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pDigest, + CK_ULONG_PTR pulDigestLen); + +CK_RV gck_mock_C_SignInit (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey); + +CK_RV gck_mock_C_Sign (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pData, + CK_ULONG ulDataLen, + CK_BYTE_PTR pSignature, + CK_ULONG_PTR pulSignatureLen); + +CK_RV gck_mock_unsupported_C_SignUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pPart, + CK_ULONG ulPartLen); + +CK_RV gck_mock_unsupported_C_SignFinal (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pSignature, + CK_ULONG_PTR pulSignatureLen); + +CK_RV gck_mock_unsupported_C_SignRecoverInit (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey); + +CK_RV gck_mock_unsupported_C_SignRecover (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pData, + CK_ULONG ulDataLen, + CK_BYTE_PTR pSignature, + CK_ULONG_PTR pulSignatureLen); + +CK_RV gck_mock_C_VerifyInit (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey); + +CK_RV gck_mock_C_Verify (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pData, + CK_ULONG ulDataLen, + CK_BYTE_PTR pSignature, + CK_ULONG ulSignatureLen); + +CK_RV gck_mock_unsupported_C_VerifyUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pPart, + CK_ULONG ulPartLen); + +CK_RV gck_mock_unsupported_C_VerifyFinal (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pSignature, + CK_ULONG pulSignatureLen); + +CK_RV gck_mock_unsupported_C_VerifyRecoverInit (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hKey); + +CK_RV gck_mock_unsupported_C_VerifyRecover (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pSignature, + CK_ULONG pulSignatureLen, + CK_BYTE_PTR pData, + CK_ULONG_PTR pulDataLen); + +CK_RV gck_mock_unsupported_C_DigestEncryptUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pPart, + CK_ULONG ulPartLen, + CK_BYTE_PTR pEncryptedPart, + CK_ULONG_PTR ulEncryptedPartLen); + +CK_RV gck_mock_unsupported_C_DecryptDigestUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pEncryptedPart, + CK_ULONG ulEncryptedPartLen, + CK_BYTE_PTR pPart, + CK_ULONG_PTR pulPartLen); + +CK_RV gck_mock_unsupported_C_SignEncryptUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pPart, + CK_ULONG ulPartLen, + CK_BYTE_PTR pEncryptedPart, + CK_ULONG_PTR ulEncryptedPartLen); + +CK_RV gck_mock_unsupported_C_DecryptVerifyUpdate (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pEncryptedPart, + CK_ULONG ulEncryptedPartLen, + CK_BYTE_PTR pPart, + CK_ULONG_PTR pulPartLen); + +CK_RV gck_mock_unsupported_C_GenerateKey (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phKey); + +CK_RV gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_ATTRIBUTE_PTR pPublicKeyTemplate, + CK_ULONG ulPublicKeyAttributeCount, + CK_ATTRIBUTE_PTR pPrivateKeyTemplate, + CK_ULONG ulPrivateKeyAttributeCount, + CK_OBJECT_HANDLE_PTR phPublicKey, + CK_OBJECT_HANDLE_PTR phPrivateKey); + +CK_RV gck_mock_unsupported_C_WrapKey (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hWrappingKey, + CK_OBJECT_HANDLE hKey, + CK_BYTE_PTR pWrappedKey, + CK_ULONG_PTR pulWrappedKeyLen); + +CK_RV gck_mock_unsupported_C_UnwrapKey (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE pUnwrappingKey, + CK_BYTE_PTR pWrappedKey, + CK_ULONG pulWrappedKeyLen, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phKey); + +CK_RV gck_mock_unsupported_C_DeriveKey (CK_SESSION_HANDLE hSession, + CK_MECHANISM_PTR pMechanism, + CK_OBJECT_HANDLE hBaseKey, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phKey); + +CK_RV gck_mock_unsupported_C_SeedRandom (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pSeed, + CK_ULONG ulSeedLen); + +CK_RV gck_mock_unsupported_C_GenerateRandom (CK_SESSION_HANDLE hSession, + CK_BYTE_PTR pRandomData, + CK_ULONG ulRandomLen); + +CK_OBJECT_HANDLE gck_mock_module_find_object (CK_SESSION_HANDLE session, + CK_ATTRIBUTE_PTR attrs, + CK_ULONG n_attrs); + +guint gck_mock_module_count_objects (CK_SESSION_HANDLE session); + +typedef gboolean (*GckMockEnumerator) (CK_OBJECT_HANDLE handle, + GckAttributes *attrs, + gpointer user_data); + +void gck_mock_module_enumerate_objects (CK_SESSION_HANDLE session, + GckMockEnumerator func, + gpointer user_data); + +CK_OBJECT_HANDLE gck_mock_module_add_object (GckAttributes *attrs); + +void gck_mock_module_set_object (CK_OBJECT_HANDLE object, + CK_ATTRIBUTE_PTR attrs, + CK_ULONG n_attrs); + +void gck_mock_module_set_pin (const gchar *password); + +/* + * Some dumb crypto mechanisms for simple testing. + * + * CKM_T_CAPITALIZE (encrypt/decrypt) + * capitalizes to encrypt + * lowercase to decrypt + * + * CKM_T_PREFIX (sign/verify) + * sign prefixes data with key label + * verify unprefixes data with key label. + * + * CKM_T_GENERATE (generate-pair) + * generates a pair of keys, mechanism param should be 'generate' + * + * CKM_T_WRAP (wrap key) + * wraps key by returning value, mechanism param should be 'wrap' + * + * CKM_T_DERIVE (derive-key) + * derives key by setting value to 'derived'. + * mechanism param should be 'derive' + */ + +#define CKM_MOCK_CAPITALIZE (CKM_VENDOR_DEFINED | 1) +#define CKM_MOCK_PREFIX (CKM_VENDOR_DEFINED | 2) +#define CKM_MOCK_GENERATE (CKM_VENDOR_DEFINED | 3) +#define CKM_MOCK_WRAP (CKM_VENDOR_DEFINED | 4) +#define CKM_MOCK_DERIVE (CKM_VENDOR_DEFINED | 5) + +#define GCK_MOCK_SLOT_ONE_ID 52 +#define GCK_MOCK_SLOT_TWO_ID 134 + +#define GCK_MOCK_SLOT_ONE_URI "pkcs11:manufacturer=TEST%20MANUFACTURER;serial=TEST%20SERIAL" + +#endif /* GCK_MOCK_H */ diff --git a/gck/gck-module.c b/gck/gck-module.c new file mode 100644 index 0000000..2c63bd6 --- /dev/null +++ b/gck/gck-module.c @@ -0,0 +1,721 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-module.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "gck/gck-marshal.h" + +#include + +#define P11_KIT_FUTURE_UNSTABLE_API 1 +#include + +#include + +/** + * SECTION:gck-module + * @title: GckModule + * @short_description: A loaded and initialized PKCS\#11 module. + * + * A GckModule object holds a loaded PKCS\#11 module. A PKCS\#11 module is a shared library. + * + * You can load and initialize a PKCS\#11 module with the gck_module_initialize() call. If you already + * have a loaded and initialized module that you'd like to use with the various gck functions, then + * you can use gck_module_new(). + */ + +/** + * GckModule: + * + * Holds a loaded and initialized PKCS\#11 module. + */ + +/** + * GckModuleInfo: + * @pkcs11_version_major: The major version of the module. + * @pkcs11_version_minor: The minor version of the module. + * @manufacturer_id: The module manufacturer. + * @flags: The module PKCS#11 flags. + * @library_description: The module description. + * @library_version_major: The major version of the library. + * @library_version_minor: The minor version of the library. + * + * Holds information about the PKCS#11 module. + * + * This structure corresponds to CK_MODULE_INFO in the PKCS\#11 standard. The + * strings are NULL terminated for easier use. + * + * Use gck_module_info_free() to release this structure when done with it. + */ + +/* + * MT safe + * + * The only thing that can change after object initialization in + * a GckModule is the finalized flag, which can be set + * to 1 in dispose. + */ + +enum { + PROP_0, + PROP_PATH, + PROP_FUNCTIONS +}; + +enum { + AUTHENTICATE_SLOT, + AUTHENTICATE_OBJECT, + LAST_SIGNAL +}; + +struct _GckModulePrivate { + gchar *path; + gboolean initialized; + CK_FUNCTION_LIST_PTR funcs; + CK_C_INITIALIZE_ARGS init_args; + + /* Modified atomically */ + gint finalized; +}; + +G_DEFINE_TYPE (GckModule, gck_module, G_TYPE_OBJECT); + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* ---------------------------------------------------------------------------- + * OBJECT + */ + +static gboolean +gck_module_real_authenticate_slot (GckModule *module, GckSlot *self, gchar *label, gchar **password) +{ + return FALSE; +} + +static gboolean +gck_module_real_authenticate_object (GckModule *module, GckObject *object, gchar *label, gchar **password) +{ + return FALSE; +} + +static void +gck_module_init (GckModule *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_MODULE, GckModulePrivate); +} + +static void +gck_module_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GckModule *self = GCK_MODULE (obj); + + switch (prop_id) { + case PROP_PATH: + g_value_set_string (value, gck_module_get_path (self)); + break; + case PROP_FUNCTIONS: + g_value_set_pointer (value, gck_module_get_functions (self)); + break; + } +} + +static void +gck_module_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GckModule *self = GCK_MODULE (obj); + + /* Only allowed during initialization */ + switch (prop_id) { + case PROP_PATH: + g_return_if_fail (!self->pv->path); + self->pv->path = g_value_dup_string (value); + break; + case PROP_FUNCTIONS: + g_return_if_fail (!self->pv->funcs); + self->pv->funcs = g_value_get_pointer (value); + break; + } +} + +static void +gck_module_dispose (GObject *obj) +{ + GckModule *self = GCK_MODULE (obj); + gboolean finalize = FALSE; + CK_RV rv; + + if (self->pv->initialized && self->pv->funcs) { + if (g_atomic_int_compare_and_exchange (&self->pv->finalized, 0, 1)) + finalize = TRUE; + } + + /* Must be careful when accessing funcs */ + if (finalize) { + rv = p11_kit_module_finalize (self->pv->funcs); + if (rv != CKR_OK) { + g_warning ("C_Finalize on module '%s' failed: %s", + self->pv->path, gck_message_from_rv (rv)); + } + } + + G_OBJECT_CLASS (gck_module_parent_class)->dispose (obj); +} + +static void +gck_module_finalize (GObject *obj) +{ + GckModule *self = GCK_MODULE (obj); + + if (self->pv->initialized && self->pv->funcs) + p11_kit_module_release (self->pv->funcs); + self->pv->funcs = NULL; + + g_free (self->pv->path); + self->pv->path = NULL; + + G_OBJECT_CLASS (gck_module_parent_class)->finalize (obj); +} + + +static void +gck_module_class_init (GckModuleClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*)klass; + gck_module_parent_class = g_type_class_peek_parent (klass); + + gobject_class->get_property = gck_module_get_property; + gobject_class->set_property = gck_module_set_property; + gobject_class->dispose = gck_module_dispose; + gobject_class->finalize = gck_module_finalize; + + klass->authenticate_object = gck_module_real_authenticate_object; + klass->authenticate_slot = gck_module_real_authenticate_slot; + + /** + * GckModule:path: + * + * The PKCS#11 module file path. + * + * This may be set to NULL if this object was created from an already + * initialized module via the gck_module_new() function. + */ + g_object_class_install_property (gobject_class, PROP_PATH, + g_param_spec_string ("path", "Module Path", "Path to the PKCS11 Module", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckModule:functions: + * + * The raw PKCS#11 function list for the module. + * + * This points to a CK_FUNCTION_LIST structure. + */ + g_object_class_install_property (gobject_class, PROP_FUNCTIONS, + g_param_spec_pointer ("functions", "Function List", "PKCS11 Function List", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckModule::authenticate-slot: + * @module: The module + * @slot: The slot to be authenticated. + * @string: A displayable label which describes the object. + * @password: A gchar** where a password should be returned. + * + * Use gck_session_set_interaction() instead of connecting to this signal. + * + * Deprecated: Since 3.4 + */ + signals[AUTHENTICATE_SLOT] = g_signal_new ("authenticate-slot", GCK_TYPE_MODULE, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GckModuleClass, authenticate_slot), + g_signal_accumulator_true_handled, NULL, _gck_marshal_BOOLEAN__OBJECT_STRING_POINTER, + G_TYPE_BOOLEAN, 3, GCK_TYPE_SLOT, G_TYPE_STRING, G_TYPE_POINTER); + + /** + * GckModule::authenticate-object: + * @module: The module. + * @object: The object to be authenticated. + * @label: A displayable label which describes the object. + * @password: A gchar** where a password should be returned. + * + * Use gck_session_set_interaction() instead of connecting to this signal. + * + * Deprecated: Since 3.4 + */ + signals[AUTHENTICATE_OBJECT] = g_signal_new ("authenticate-object", GCK_TYPE_MODULE, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GckModuleClass, authenticate_object), + g_signal_accumulator_true_handled, NULL, _gck_marshal_BOOLEAN__OBJECT_STRING_POINTER, + G_TYPE_BOOLEAN, 3, GCK_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_POINTER); + + g_type_class_add_private (gobject_class, sizeof (GckModulePrivate)); +} + +GType +gck_module_info_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckModuleInfo", + (GBoxedCopyFunc)gck_module_info_copy, + (GBoxedFreeFunc)gck_module_info_free); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gck_module_info_copy: + * @module_info: a module info + * + * Make a copy of the module info. + * + * Returns: (transfer full): a newly allocated copy module info + */ +GckModuleInfo * +gck_module_info_copy (GckModuleInfo *module_info) +{ + if (module_info == NULL) + return NULL; + + module_info = g_memdup (module_info, sizeof (GckModuleInfo)); + module_info->manufacturer_id = g_strdup (module_info->manufacturer_id); + module_info->library_description = g_strdup (module_info->library_description); + return module_info; + +} + +/** + * gck_module_info_free: + * @module_info: The module info to free, or NULL. + * + * Free a GckModuleInfo structure. + **/ +void +gck_module_info_free (GckModuleInfo *module_info) +{ + if (!module_info) + return; + g_free (module_info->library_description); + g_free (module_info->manufacturer_id); + g_free (module_info); +} + +typedef struct { + GckArguments base; + gchar *path; + GckModule *result; + GError *error; +} Initialize; + +static CK_RV +perform_initialize (Initialize *args) +{ + CK_FUNCTION_LIST_PTR funcs; + GckModule *result; + CK_RV rv; + + funcs = p11_kit_module_load (args->path, P11_KIT_MODULE_CRITICAL); + if (funcs == NULL) { + g_set_error (&args->error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM, + _("Error loading PKCS#11 module: %s"), p11_kit_message ()); + return CKR_GCK_MODULE_PROBLEM; + } + + result = g_object_new (GCK_TYPE_MODULE, + "functions", funcs, + "path", args->path, + NULL); + + /* Now initialize the module */ + rv = p11_kit_module_initialize (funcs); + if (rv != CKR_OK) { + p11_kit_module_release (funcs); + g_set_error (&args->error, GCK_ERROR, rv, + _("Couldn’t initialize PKCS#11 module: %s"), + gck_message_from_rv (rv)); + g_object_unref (result); + return rv; + } + + result->pv->initialized = TRUE; + args->result = result; + return CKR_OK; +} + +static void +free_initialize (Initialize *args) +{ + g_free (args->path); + g_clear_error (&args->error); + g_clear_object (&args->result); + g_free (args); +} + +/** + * gck_module_initialize: + * @path: The file system path to the PKCS\#11 module to load. + * @cancellable: (allow-none): optional cancellation object + * @error: A location to store an error resulting from a failed load. + * + * Load and initialize a PKCS\#11 module represented by a GckModule object. + * + * Return value: (transfer full): The loaded PKCS\#11 module or %NULL if failed. + **/ +GckModule* +gck_module_initialize (const gchar *path, + GCancellable *cancellable, + GError **error) +{ + Initialize args = { GCK_ARGUMENTS_INIT, 0, }; + + g_return_val_if_fail (path != NULL, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + args.path = g_strdup (path); + + if (!_gck_call_sync (NULL, perform_initialize, NULL, &args, cancellable, error)) { + + /* A custom error from perform_initialize */ + if (args.error) { + g_clear_error (error); + g_propagate_error (error, args.error); + args.error = NULL; + } + } + + g_free (args.path); + g_clear_error (&args.error); + return args.result; +} + +/** + * gck_module_initialize_async: + * @path: the file system path to the PKCS\#11 module to load + * @cancellable: (allow-none): optional cancellation object + * @callback: a callback which will be called when the operation completes + * @user_data: data to pass to the callback + * + * Asynchronously load and initialize a PKCS\#11 module represented by a + * #GckModule object. + **/ +void +gck_module_initialize_async (const gchar *path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + Initialize *args; + + g_return_if_fail (path != NULL); + + args = _gck_call_async_prep (NULL, NULL, perform_initialize, NULL, + sizeof (*args), free_initialize); + args->path = g_strdup (path); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_module_initialize_finish: + * @result: the asynchronous result + * @error: location to place an error on failure + * + * Finishes the asynchronous initialize operation. + * + * Returns: (transfer full) (allow-none): The initialized module, or NULL + */ +GckModule * +gck_module_initialize_finish (GAsyncResult *result, + GError **error) +{ + GckModule *module = NULL; + Initialize *args; + + args = _gck_call_arguments (result, Initialize); + if (_gck_call_basic_finish (result, error)) { + module = args->result; + args->result = NULL; + + } else { + /* A custom error from perform_initialize */ + if (args->error) { + g_clear_error (error); + g_propagate_error (error, args->error); + args->error = NULL; + } + } + + return module; +} + +/** + * gck_module_new: (skip) + * @funcs: Initialized PKCS\#11 function list pointer + * + * Create a GckModule representing a PKCS\#11 module. It is assumed that + * this the module is already initialized. In addition it will not be + * finalized when complete. + * + * Return value: The new PKCS\#11 module. + **/ +GckModule* +gck_module_new (CK_FUNCTION_LIST_PTR funcs) +{ + g_return_val_if_fail (funcs != NULL, NULL); + return g_object_new (GCK_TYPE_MODULE, "functions", funcs, NULL); +} + +GckModule* +_gck_module_new_initialized (CK_FUNCTION_LIST_PTR funcs) +{ + GckModule *module = gck_module_new (funcs); + module->pv->initialized = TRUE; /* As if we initialized it */ + return module; +} + +/** + * gck_module_equal: + * @module1: (type Gck.Module): a pointer to the first #GckModule + * @module2: (type Gck.Module): a pointer to the second #GckModule + * + * Checks equality of two modules. Two GckModule objects can point to the same + * underlying PKCS\#11 module. + * + * Return value: TRUE if module1 and module2 are equal. FALSE if either is not a GckModule. + **/ +gboolean +gck_module_equal (gconstpointer module1, gconstpointer module2) +{ + GckModule *mod1, *mod2; + + if (module1 == module2) + return TRUE; + if (!GCK_IS_MODULE (module1) || !GCK_IS_MODULE (module2)) + return FALSE; + + mod1 = GCK_MODULE (module1); + mod2 = GCK_MODULE (module2); + + return mod1->pv->funcs == mod2->pv->funcs; +} + +/** + * gck_module_hash: + * @module: (type Gck.Module): a pointer to a #GckModule + * + * Create a hash value for the GckModule. + * + * This function is intended for easily hashing a GckModule to add to + * a GHashTable or similar data structure. + * + * Return value: An integer that can be used as a hash value, or 0 if invalid. + **/ +guint +gck_module_hash (gconstpointer module) +{ + GckModule *self; + + g_return_val_if_fail (GCK_IS_MODULE (module), 0); + self = GCK_MODULE (module); + return g_direct_hash (self->pv->funcs); +} + +GckModuleInfo* +_gck_module_info_from_pkcs11 (CK_INFO_PTR info) +{ + GckModuleInfo *modinfo; + + modinfo = g_new0 (GckModuleInfo, 1); + modinfo->flags = info->flags; + modinfo->library_description = gck_string_from_chars (info->libraryDescription, + sizeof (info->libraryDescription)); + modinfo->manufacturer_id = gck_string_from_chars (info->manufacturerID, + sizeof (info->manufacturerID)); + modinfo->library_version_major = info->libraryVersion.major; + modinfo->library_version_minor = info->libraryVersion.minor; + modinfo->pkcs11_version_major = info->cryptokiVersion.major; + modinfo->pkcs11_version_minor = info->cryptokiVersion.minor; + + return modinfo; +} + +void +_gck_module_info_to_pkcs11 (GckModuleInfo* module_info, CK_INFO_PTR info) +{ + info->flags = module_info->flags; + if (!gck_string_to_chars (info->libraryDescription, + sizeof (info->libraryDescription), + module_info->library_description)) + g_return_if_reached (); + if (!gck_string_to_chars (info->manufacturerID, + sizeof (info->manufacturerID), + module_info->manufacturer_id)) + g_return_if_reached (); + + info->libraryVersion.major = module_info->library_version_major; + info->libraryVersion.minor = module_info->library_version_minor; + info->cryptokiVersion.major = module_info->pkcs11_version_major; + info->cryptokiVersion.minor = module_info->pkcs11_version_minor; +} + +/** + * gck_module_get_info: + * @self: The module to get info for. + * + * Get the info about a PKCS\#11 module. + * + * Returns: (transfer full): the module info; release this with gck_module_info_free() + **/ +GckModuleInfo* +gck_module_get_info (GckModule *self) +{ + CK_INFO info; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_MODULE (self), NULL); + g_return_val_if_fail (self->pv->funcs, NULL); + + memset (&info, 0, sizeof (info)); + rv = (self->pv->funcs->C_GetInfo (&info)); + if (rv != CKR_OK) { + g_warning ("couldn't get module info: %s", gck_message_from_rv (rv)); + return NULL; + } + + return _gck_module_info_from_pkcs11 (&info); +} + +/** + * gck_module_get_slots: + * @self: The module for which to get the slots. + * @token_present: Whether to limit only to slots with a token present. + * + * Get the GckSlot objects for a given module. + * + * Return value: (element-type Gck.Slot) (transfer full): The possibly empty + * list of slots. Release this with gck_list_unref_free(). + */ +GList* +gck_module_get_slots (GckModule *self, gboolean token_present) +{ + CK_SLOT_ID_PTR slot_list; + CK_ULONG count, i; + GList *result; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_MODULE (self), NULL); + g_return_val_if_fail (self->pv->funcs, NULL); + + rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, NULL, &count); + if (rv != CKR_OK) { + g_warning ("couldn't get slot count: %s", gck_message_from_rv (rv)); + return NULL; + } + + if (!count) + return NULL; + + slot_list = g_new (CK_SLOT_ID, count); + rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, slot_list, &count); + if (rv != CKR_OK) { + g_warning ("couldn't get slot list: %s", gck_message_from_rv (rv)); + g_free (slot_list); + return NULL; + } + + result = NULL; + for (i = 0; i < count; ++i) { + result = g_list_prepend (result, g_object_new (GCK_TYPE_SLOT, + "handle", slot_list[i], + "module", self, NULL)); + } + + g_free (slot_list); + return g_list_reverse (result); +} + +/** + * gck_module_get_path: + * @self: The module for which to get the path. + * + * Get the file path of this module. This may not be an absolute path, and + * usually reflects the path passed to gck_module_initialize(). + * + * Return value: The path, do not modify or free this value. + **/ +const gchar* +gck_module_get_path (GckModule *self) +{ + g_return_val_if_fail (GCK_IS_MODULE (self), NULL); + return self->pv->path; +} + +/** + * gck_module_get_functions: (skip) + * @self: The module for which to get the function list. + * + * Get the PKCS\#11 function list for the module. + * + * Return value: The function list, do not modify this structure. + **/ +CK_FUNCTION_LIST_PTR +gck_module_get_functions (GckModule *self) +{ + g_return_val_if_fail (GCK_IS_MODULE (self), NULL); + return self->pv->funcs; +} + +/** + * gck_module_match: + * @self: the module to match + * @uri: the uri to match against the module + * + * Check whether the PKCS\#11 URI matches the module + * + * Returns: whether the URI matches or not + */ +gboolean +gck_module_match (GckModule *self, + GckUriData *uri) +{ + gboolean match = TRUE; + GckModuleInfo *info; + + g_return_val_if_fail (GCK_IS_MODULE (self), FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + if (uri->any_unrecognized) + match = FALSE; + + if (match && uri->module_info) { + info = gck_module_get_info (self); + match = _gck_module_info_match (uri->module_info, info); + gck_module_info_free (info); + } + + return match; +} diff --git a/gck/gck-modules.c b/gck/gck-modules.c new file mode 100644 index 0000000..57530ab --- /dev/null +++ b/gck/gck-modules.c @@ -0,0 +1,429 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-modules.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2010, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "gck/gck-marshal.h" + +#include + +#define P11_KIT_FUTURE_UNSTABLE_API 1 +#include + +#include +#include + +/** + * SECTION:gck-modules + * @title: GckModule lists + * @short_description: Dealing with lists of PKCS\#11 modules. + * + * These functions are useful for dealing with lists of modules, and performing + * operations on all of them. + */ + +typedef struct { + GckArguments base; + GList *results; + GError *error; +} InitializeRegistered; + +static CK_RV +perform_initialize_registered (InitializeRegistered *args) +{ + GckModule *module; + CK_FUNCTION_LIST_PTR *modules, *funcs; + + modules = p11_kit_modules_load_and_initialize (0); + if (modules == NULL) { + g_set_error (&args->error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM, + _("Couldn’t initialize registered PKCS#11 modules: %s"), p11_kit_message ()); + return CKR_GCK_MODULE_PROBLEM; + } + + for (funcs = modules; *funcs; ++funcs) { + module = _gck_module_new_initialized (*funcs); + args->results = g_list_prepend (args->results, module); + } + + free (modules); + return CKR_OK; +} + +static void +free_initialize_registered (InitializeRegistered *args) +{ + g_clear_error (&args->error); + gck_list_unref_free (args->results); + g_free (args); +} + +/** + * gck_modules_initialize_registered: + * @cancellable: (allow-none): optional cancellation object + * @error: (allow-none): location to place an error on failure + * + * Load and initialize all the registered modules. + * + * Returns: (transfer full) (element-type Gck.Module): A newly allocated list + * of #GckModule objects, which should be released with gck_list_unref_free(). + */ +GList* +gck_modules_initialize_registered (GCancellable *cancellable, + GError **error) +{ + InitializeRegistered args = { GCK_ARGUMENTS_INIT, 0, }; + + if (!_gck_call_sync (NULL, perform_initialize_registered, NULL, &args, cancellable, error)) { + if (args.error) { + g_clear_error (error); + g_propagate_error (error, args.error); + args.error = NULL; + } + } + + g_clear_error (&args.error); + return args.results; +} + +/** + * gck_modules_initialize_registered_async: + * @cancellable: optional cancellation object + * @callback: a callback which will be called when the operation completes + * @user_data: data to pass to the callback + * + * Load and initialize all the registered modules asynchronously. + */ +void +gck_modules_initialize_registered_async (GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + InitializeRegistered *args; + + args = _gck_call_async_prep (NULL, NULL, perform_initialize_registered, NULL, + sizeof (*args), free_initialize_registered); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_modules_initialize_registered_finish: + * @result: the asynchronous result + * @error: location to place an error on failure + * + * Finishes the asynchronous operation to initialize the registered + * PKCS\#11 modules. + * + * Returns: (transfer full) (element-type Gck.Module): a list of newly + * initialized #GckModule objects + */ +GList * +gck_modules_initialize_registered_finish (GAsyncResult *result, + GError **error) +{ + GList *modules = NULL; + InitializeRegistered *args; + + args = _gck_call_arguments (result, InitializeRegistered); + if (_gck_call_basic_finish (result, error)) { + modules = args->results; + args->results = NULL; + + } else { + /* A custom error from perform_initialize */ + if (args->error) { + g_clear_error (error); + g_propagate_error (error, args->error); + args->error = NULL; + } + } + + return modules; +} + +/** + * gck_modules_get_slots: + * @modules: (element-type Gck.Module): The modules + * @token_present: Whether to only list slots with token present + * + * Get a list of slots for across all of the modules. + * + * Returns: (transfer full) (element-type Gck.Slot): A list of #GckSlot + * objects, which should be freed with gck_list_unref_free(). + */ +GList* +gck_modules_get_slots (GList *modules, gboolean token_present) +{ + GList *result = NULL; + GList *m; + + for (m = modules; m; m = g_list_next (m)) { + result = g_list_concat (result, gck_module_get_slots (m->data, token_present)); + } + + return result; +} + +/** + * gck_modules_enumerate_objects: + * @modules: (element-type Gck.Module): The modules + * @attrs: attributes that the objects must have, or empty for all objects + * @session_options: Options from GckSessionOptions + * + * Setup an enumerator for listing matching objects on the modules. + * + * This call will not block but will return an enumerator immediately. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * Return value: (transfer full): A new enumerator, which should be released + * with g_object_unref(). + **/ +GckEnumerator* +gck_modules_enumerate_objects (GList *modules, + GckAttributes *attrs, + GckSessionOptions session_options) +{ + GckUriData *uri_data; + + g_return_val_if_fail (attrs, NULL); + + uri_data = gck_uri_data_new (); + uri_data->attributes = gck_attributes_ref_sink (attrs); + + return _gck_enumerator_new_for_modules (modules, session_options, uri_data); +} + +static GList * +tokens_for_uri (GList *modules, + const gchar *uri, + gboolean only_one, + GError **error) +{ + GckTokenInfo *token_info; + GList *results = NULL; + GckUriData *uri_data; + GckModuleInfo *module_info; + GList *slots; + GList *m, *s; + gboolean matched; + GckUriFlags flags; + + flags = GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE | GCK_URI_FOR_MODULE_WITH_VERSION; + uri_data = gck_uri_parse (uri, flags, error); + if (uri_data == NULL) + return NULL; + + if (!uri_data->any_unrecognized) { + for (m = modules; m != NULL; m = g_list_next (m)) { + if (only_one && results) + break; + if (uri_data->module_info) { + module_info = gck_module_get_info (m->data); + matched = _gck_module_info_match (uri_data->module_info, module_info); + gck_module_info_free (module_info); + if (!matched) + continue; + } + + slots = gck_module_get_slots (m->data, TRUE); + for (s = slots; s != NULL; s = g_list_next (s)) { + if (only_one && results) + break; + if (!uri_data->token_info) { + results = g_list_prepend (results, g_object_ref (s->data)); + } else { + token_info = gck_slot_get_token_info (s->data); + if (token_info && _gck_token_info_match (uri_data->token_info, token_info)) + results = g_list_prepend (results, g_object_ref (s->data)); + gck_token_info_free (token_info); + } + } + gck_list_unref_free (slots); + } + } + + gck_uri_data_free (uri_data); + return results; +} + +/** + * gck_modules_token_for_uri: + * @modules: (element-type Gck.Module): The modules + * @uri: The URI that the token must match + * @error: A location to raise an error on failure + * + * Lookup a token that matches the URI. + * + * Returns: (transfer full): A newly allocated #GckSlot or %NULL if no such + * token was found. + */ +GckSlot* +gck_modules_token_for_uri (GList *modules, + const gchar *uri, + GError **error) +{ + GList *results; + GckSlot *slot = NULL; + + g_return_val_if_fail (uri != NULL, NULL); + + results = tokens_for_uri (modules, uri, TRUE, error); + if (results) + slot = g_object_ref (results->data); + gck_list_unref_free (results); + + return slot; +} + +/** + * gck_modules_tokens_for_uri: + * @modules: (element-type Gck.Module): The modules + * @uri: The URI that the token must match + * @error: A location to raise an error on failure + * + * Lookup a token that matches the URI. + * + * Returns: (transfer full) (element-type Gck.Slot): A list of newly allocated + * #GckSlot objects. Use gck_list_unref_free() to release the list once you're + * done with it. + */ +GList * +gck_modules_tokens_for_uri (GList *modules, + const gchar *uri, + GError **error) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return tokens_for_uri (modules, uri, FALSE, error); +} + +/** + * gck_modules_object_for_uri: + * @modules: (element-type Gck.Module): The modules + * @uri: The URI the objects must match + * @session_options: Options from GckSessionOptions + * @error: A location to raise an error on failure. + * + * Find an object that matches a URI. + * + * This call can block. Use gck_modules_enumerate_uri() for a non-blocking + * version. + * + * Returns: (transfer full) (allow-none): A new #GckObject which should be released with + * g_object_unref(), or %NULL if no matching object was found. + */ +GckObject* +gck_modules_object_for_uri (GList *modules, + const gchar *uri, + GckSessionOptions session_options, + GError **error) +{ + GckEnumerator *en; + GckObject *result; + + g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + en = gck_modules_enumerate_uri (modules, uri, session_options, error); + if (en == NULL) + return NULL; + + result = gck_enumerator_next (en, NULL, error); + g_object_unref (en); + + return result; +} + +/** + * gck_modules_objects_for_uri: + * @modules: (element-type Gck.Module): The modules + * @uri: The URI the objects must match + * @session_options: Options from GckSessionOptions + * @error: A location to raise an error on failure. + * + * Find objects that match a URI. + * + * This call can block. Use gck_modules_enumerate_uri() for a non-blocking + * version. + * + * Returns: (transfer full) (element-type Gck.Object): A list of #GckObject which + * should be released with gck_list_unref_free(), or %NULL if no matching object + * was found. + */ +GList* +gck_modules_objects_for_uri (GList *modules, + const gchar *uri, + GckSessionOptions session_options, + GError **error) +{ + GckEnumerator *en; + GList *results; + + g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + en = gck_modules_enumerate_uri (modules, uri, session_options, error); + if (en == NULL) + return NULL; + + results = gck_enumerator_next_n (en, -1, NULL, error); + g_object_unref (en); + + return results; +} + +/** + * gck_modules_enumerate_uri: + * @modules: (element-type Gck.Module): The modules + * @uri: The URI that the enumerator will match + * @session_options: Options from GckSessionOptions + * @error: A location to raise an error on failure. + * + * Enumerate objects that match a URI. + * + * This call will not block. Use the #GckEnumerator functions in order to + * get at the actual objects that match. + * + * Returns: (transfer full): A new #GckEnumerator, or %NULL if an error occurs. + */ +GckEnumerator* +gck_modules_enumerate_uri (GList *modules, + const gchar *uri, + GckSessionOptions session_options, + GError **error) +{ + GckUriData *uri_data; + + g_return_val_if_fail (uri != NULL, NULL); + + uri_data = gck_uri_parse (uri, GCK_URI_FOR_ANY, error); + if (uri_data == NULL) + return NULL; + + /* Takes ownership of uri_info */ + return _gck_enumerator_new_for_modules (modules, session_options, uri_data); +} diff --git a/gck/gck-object-cache.c b/gck/gck-object-cache.c new file mode 100644 index 0000000..8da15cb --- /dev/null +++ b/gck/gck-object-cache.c @@ -0,0 +1,469 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-object-cache.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include + +/** + * SECTION:gck-object-cache + * @title: GckObjectCache + * @short_description: An interface which holds attributes for a PKCS\#11 object + * + * #GckObjectCache is an interface implemented by derived classes of + * #GckObject to indicate which attributes they'd like an enumerator to retrieve. + * These attributes are then cached on the object and can be retrieved through + * the #GckObjectCache:attributes property. + */ + +/** + * GckObjectCache: + * + * An interface implemented on an #GckObject which contains a cache of attributes. + */ + +/** + * GckObjectCacheIface: + * @interface: parent interface + * @default_types: (array length=n_default_types): attribute types that an + * enumerator should retrieve + * @n_default_types: number of attribute types to be retrieved + * @fill: virtual method to add attributes to the cache + * + * Interface for #GckObjectCache. If the @default_types field is set by + * a implementing class, then the a #GckEnumerator which has been setup using + * gck_enumerator_set_object_type() + * + * The implementation for @populate should add the attributes to the + * cache. It must be thread safe. + */ + +typedef GckObjectCacheIface GckObjectCacheInterface; +G_DEFINE_INTERFACE (GckObjectCache, gck_object_cache, GCK_TYPE_OBJECT); + +static void +gck_object_cache_default_init (GckObjectCacheIface *iface) +{ + static volatile gsize initialized = 0; + if (g_once_init_enter (&initialized)) { + + /** + * GckObjectCache:attributes: + * + * The attributes cached on this object. + */ + g_object_interface_install_property (iface, + g_param_spec_boxed ("attributes", "Attributes", "PKCS#11 Attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_once_init_leave (&initialized, 1); + } +} + +/** + * gck_object_cache_get_attributes: (skip): + * @object: an object with an attribute cache + * + * Gets the attributes cached on this object. + * + * Returns: (transfer full) (allow-none): the attributes + */ +GckAttributes * +gck_object_cache_get_attributes (GckObjectCache *object) +{ + GckAttributes *attributes = NULL; + g_return_val_if_fail (GCK_IS_OBJECT_CACHE (object), NULL); + g_object_get (object, "attributes", &attributes, NULL); + return attributes; +} + +/** + * gck_object_cache_set_attributes: + * @object: an object with an attribute cache + * @attrs: (allow-none): the attributes to set + * + * Sets the attributes cached on this object. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + */ +void +gck_object_cache_set_attributes (GckObjectCache *object, + GckAttributes *attrs) +{ + g_return_if_fail (GCK_IS_OBJECT_CACHE (object)); + + gck_attributes_ref_sink (attrs); + g_object_set (object, "attributes", attrs, NULL); + gck_attributes_unref (attrs); +} + +/** + * gck_object_cache_fill: + * @object: an object with the cache + * @attrs: the attributes to cache + * + * Adds the attributes to the set cached on this object. If an attribute is + * already present in the cache it will be overridden by this value. + * + * This will be done in a thread-safe manner. + * + * If the @attrs #GckAttributes is floating, it is consumed. + */ +void +gck_object_cache_fill (GckObjectCache *object, + GckAttributes *attrs) +{ + GckObjectCacheIface *iface; + + g_return_if_fail (GCK_IS_OBJECT_CACHE (object)); + g_return_if_fail (attrs != NULL); + + iface = GCK_OBJECT_CACHE_GET_INTERFACE (object); + g_return_if_fail (iface->fill != NULL); + + gck_attributes_ref_sink (attrs); + (iface->fill) (object, attrs); + gck_attributes_unref (attrs); +} + +/** + * gck_object_cache_update: + * @object: the object with the cache + * @attr_types: (array length=n_attr_types): the types of attributes to update + * @n_attr_types: the number of attribute types + * @cancellable: optional cancellation object + * @error: location to place an error + * + * Update the object cache with given attributes. If an attribute already + * exists in the cache, it will be updated, and if it doesn't it will be added. + * + * This may block, use the asynchronous version when this is not desirable + * + * Returns: whether the cache update was successful + */ +gboolean +gck_object_cache_update (GckObjectCache *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GError **error) +{ + GckObjectCacheIface *iface; + GckAttributes *attrs; + + g_return_val_if_fail (GCK_IS_OBJECT_CACHE (object), FALSE); + g_return_val_if_fail (attr_types != NULL || n_attr_types == 0, FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + iface = GCK_OBJECT_CACHE_GET_INTERFACE (object); + + if (attr_types == NULL) { + attr_types = iface->default_types; + n_attr_types = iface->n_default_types; + + if (attr_types == NULL || n_attr_types == 0) { + g_warning ("no attribute types passed to gck_object_cache_update() " + "and no default types on object."); + return FALSE; + } + } + + attrs = gck_object_get_full (GCK_OBJECT (object), + attr_types, n_attr_types, + cancellable, error); + + if (attrs != NULL) { + gck_object_cache_fill (object, attrs); + gck_attributes_unref (attrs); + } + + return attrs != NULL; +} + +static void +on_cache_object_get (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GckAttributes *attrs; + GError *error = NULL; + + attrs = gck_object_get_finish (GCK_OBJECT (source), result, &error); + if (error == NULL) { + gck_object_cache_fill (GCK_OBJECT_CACHE (source), attrs); + gck_attributes_unref (attrs); + } else { + g_simple_async_result_take_error (res, error); + } + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +/** + * gck_object_cache_update_async: + * @object: the object with the cache + * @attr_types: (array length=n_attr_types): the types of attributes to update + * @n_attr_types: the number of attribute types + * @cancellable: optional cancellation object + * @callback: called when the operation completes + * @user_data: data to be passed to the callback + * + * Update the object cache with given attributes. If an attribute already + * exists in the cache, it will be updated, and if it doesn't it will be added. + * + * This call will return immediately and complete asynchronously. + */ +void +gck_object_cache_update_async (GckObjectCache *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GckObjectCacheIface *iface; + GSimpleAsyncResult *res; + + g_return_if_fail (GCK_IS_OBJECT_CACHE (object)); + g_return_if_fail (attr_types != NULL || n_attr_types == 0); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + iface = GCK_OBJECT_CACHE_GET_INTERFACE (object); + + if (attr_types == NULL) { + attr_types = iface->default_types; + n_attr_types = iface->n_default_types; + + if (attr_types == NULL || n_attr_types == 0) { + g_warning ("no attribute types passed to gck_object_cache_update_async() " + "and no default types on object."); + return; + } + } + + res = g_simple_async_result_new (G_OBJECT (object), callback, user_data, + gck_object_cache_update_async); + + gck_object_get_async (GCK_OBJECT (object), attr_types, n_attr_types, + cancellable, on_cache_object_get, g_object_ref (res)); + + g_object_unref (res); +} + +/** + * gck_object_cache_update_finish: + * @object: the object with the cache + * @result: the asynchronous result passed to the callback + * @error: location to place an error + * + * Complete an asynchronous operation to update the object cache with given + * attributes. + * + * Returns: whether the cache update was successful + */ +gboolean +gck_object_cache_update_finish (GckObjectCache *object, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GCK_IS_OBJECT_CACHE (object), FALSE); + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (object), + gck_object_cache_update_async), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +static gboolean +check_have_attributes (GckAttributes *attrs, + const gulong *attr_types, + gint n_attr_types) +{ + gint i; + + if (attrs == NULL) + return FALSE; + + for (i = 0; i < n_attr_types; i++) { + if (!gck_attributes_find (attrs, attr_types[i])) + return FALSE; + } + + return TRUE; +} + +/** + * gck_object_cache_lookup: + * @object: the object + * @attr_types: (array length=n_attr_types): the types of attributes to update + * @n_attr_types: the number of attribute types + * @cancellable: optional cancellation object + * @error: location to place an error + * + * Lookup attributes in the cache, or retrieve them from the object if necessary. + * + * If @object is a #GckObjectCache then this will lookup the attributes there + * first if available, otherwise will read them from the object and update + * the cache. + * + * If @object is not a #GckObjectCache, then the attributes will simply be + * read from the object. + * + * This may block, use the asynchronous version when this is not desirable + * + * Returns: (transfer full): the attributes retrieved or %NULL on failure + */ +GckAttributes * +gck_object_cache_lookup (GckObject *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GError **error) +{ + GckAttributes *attrs; + GckObjectCache *cache; + + g_return_val_if_fail (GCK_IS_OBJECT (object), NULL); + g_return_val_if_fail (attr_types != NULL || n_attr_types == 0, NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + if (GCK_IS_OBJECT_CACHE (object)) { + cache = GCK_OBJECT_CACHE (object); + attrs = gck_object_cache_get_attributes (cache); + if (check_have_attributes (attrs, attr_types, n_attr_types)) + return attrs; + gck_attributes_unref (attrs); + + if (!gck_object_cache_update (cache, attr_types, n_attr_types, + cancellable, error)) + return NULL; + + return gck_object_cache_get_attributes (cache); + + } else { + return gck_object_get_full (object, attr_types, n_attr_types, + cancellable, error); + } +} + +/** + * gck_object_cache_lookup_async: + * @object: the object + * @attr_types: (array length=n_attr_types): the types of attributes to update + * @n_attr_types: the number of attribute types + * @cancellable: optional cancellation object + * @callback: called when the operation completes + * @user_data: data to pass to the callback + * + * Lookup attributes in the cache, or retrieve them from the object if necessary. + * + * If @object is a #GckObjectCache then this will lookup the attributes there + * first if available, otherwise will read them from the object and update + * the cache. + * + * If @object is not a #GckObjectCache, then the attributes will simply be + * read from the object. + * + * This will return immediately and complete asynchronously + */ +void +gck_object_cache_lookup_async (GckObject *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + GckAttributes *attrs; + GckObjectCache *cache; + gboolean have; + + g_return_if_fail (GCK_IS_OBJECT (object)); + g_return_if_fail (attr_types != NULL || n_attr_types == 0); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + if (GCK_IS_OBJECT_CACHE (object)) { + cache = GCK_OBJECT_CACHE (object); + attrs = gck_object_cache_get_attributes (cache); + have = check_have_attributes (attrs, attr_types, n_attr_types); + gck_attributes_unref (attrs); + + if (have) { + res = g_simple_async_result_new (G_OBJECT (cache), callback, user_data, + gck_object_cache_lookup_async); + g_simple_async_result_complete_in_idle (res); + g_object_unref (res); + } else { + gck_object_cache_update_async (cache, attr_types, n_attr_types, + cancellable, callback, user_data); + } + } else { + gck_object_get_async (object, attr_types, n_attr_types, cancellable, + callback, user_data); + } +} + +/** + * gck_object_cache_lookup_finish: + * @object: the object + * @result: the asynchrounous result passed to the callback + * @error: location to place an error + * + * Complete an operation to lookup attributes in the cache or retrieve them + * from the object if necessary. + * + * Returns: (transfer full): the attributes retrieved or %NULL on failure + */ +GckAttributes * +gck_object_cache_lookup_finish (GckObject *object, + GAsyncResult *result, + GError **error) +{ + GckObjectCache *cache; + + g_return_val_if_fail (GCK_IS_OBJECT (object), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + if (GCK_IS_OBJECT_CACHE (object)) { + cache = GCK_OBJECT_CACHE (object); + if (!g_simple_async_result_is_valid (result, G_OBJECT (object), + gck_object_cache_lookup_async)) + if (!gck_object_cache_update_finish (cache, result, error)) + return NULL; + return gck_object_cache_get_attributes (cache); + } else { + + return gck_object_get_finish (object, result, error); + } +} diff --git a/gck/gck-object.c b/gck/gck-object.c new file mode 100644 index 0000000..cc7753e --- /dev/null +++ b/gck/gck-object.c @@ -0,0 +1,1313 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-object.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include + +/** + * SECTION:gck-object + * @title: GckObject + * @short_description: Represents a PKCS11 object such as a key or certificate. + * + * A GckObject holds a handle to a PKCS11 object such as a key or certificate. Token objects + * are stored on the token persistently. Others are transient and are called session objects. + */ + +/** + * GckObject: + * + * Represents a PKCS11 object handle such as a key or certifiacte. + */ + +/** + * GckObjectClass: + * @parent: derived from this + * + * The class for a #GckObject. + * + * If the @attribute_types field is set by a derived class, then the a + * #GckEnumerator which has been setup using gck_enumerator_set_object_type() + * with this derived type will retrieve these attributes when enumerating. In + * this case the class must implement an 'attributes' property of boxed type + * GCK_TYPE_ATTRIBUTES. + */ + +/* + * MT safe -- Nothing in GckObjectData changes between + * init and finalize. All GckObjectPrivate access between init + * and finalize is locked. + */ + +enum { + PROP_0, + PROP_MODULE, + PROP_SESSION, + PROP_HANDLE +}; + +struct _GckObjectPrivate { + GckModule *module; + GckSession *session; + CK_OBJECT_HANDLE handle; +}; + +G_DEFINE_TYPE (GckObject, gck_object, G_TYPE_OBJECT); + +/* ---------------------------------------------------------------------------- + * OBJECT + */ + +static void +gck_object_init (GckObject *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_OBJECT, GckObjectPrivate); +} + +static void +gck_object_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GckObject *self = GCK_OBJECT (obj); + + switch (prop_id) { + case PROP_MODULE: + g_value_take_object (value, gck_object_get_module (self)); + break; + case PROP_SESSION: + g_value_take_object (value, gck_object_get_session (self)); + break; + case PROP_HANDLE: + g_value_set_ulong (value, gck_object_get_handle (self)); + break; + } +} + +static void +gck_object_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GckObject *self = GCK_OBJECT (obj); + + /* The sets to data below are only allowed during construction */ + + switch (prop_id) { + case PROP_MODULE: + g_return_if_fail (!self->pv->module); + self->pv->module = g_value_get_object (value); + g_return_if_fail (self->pv->module); + g_object_ref (self->pv->module); + break; + case PROP_SESSION: + g_return_if_fail (!self->pv->session); + self->pv->session = g_value_get_object (value); + g_return_if_fail (self->pv->session); + g_object_ref (self->pv->session); + break; + case PROP_HANDLE: + g_return_if_fail (!self->pv->handle); + self->pv->handle = g_value_get_ulong (value); + break; + } +} + +static void +gck_object_finalize (GObject *obj) +{ + GckObject *self = GCK_OBJECT (obj); + + if (self->pv->session) + g_object_unref (self->pv->session); + self->pv->session = NULL; + + if (self->pv->module) + g_object_unref (self->pv->module); + self->pv->module = NULL; + + self->pv->handle = 0; + + G_OBJECT_CLASS (gck_object_parent_class)->finalize (obj); +} + + +static void +gck_object_class_init (GckObjectClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*)klass; + gck_object_parent_class = g_type_class_peek_parent (klass); + + gobject_class->get_property = gck_object_get_property; + gobject_class->set_property = gck_object_set_property; + gobject_class->finalize = gck_object_finalize; + + /** + * GckObject:module: + * + * The GckModule that this object belongs to. + */ + g_object_class_install_property (gobject_class, PROP_MODULE, + g_param_spec_object ("module", "Module", "PKCS11 Module", + GCK_TYPE_MODULE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckObject:handle: + * + * The raw PKCS11 handle for this object. + */ + g_object_class_install_property (gobject_class, PROP_HANDLE, + g_param_spec_ulong ("handle", "Object Handle", "PKCS11 Object Handle", + 0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckObject:session: + * + * The PKCS11 session to make calls on when this object needs to + * perform operations on itself. + * + * If this is NULL then a new session is opened for each operation, + * such as gck_object_get(), gck_object_set() or gck_object_destroy(). + */ + g_object_class_install_property (gobject_class, PROP_SESSION, + g_param_spec_object ("session", "session", "PKCS11 Session to make calls on", + GCK_TYPE_SESSION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (klass, sizeof (GckObjectPrivate)); +} + +/* ---------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gck_object_from_handle: + * @session: The session through which this object is accessed or created. + * @object_handle: The raw CK_OBJECT_HANDLE of the object. + * + * Initialize a GckObject from a raw PKCS\#11 handle. Normally you would use + * gck_session_create_object() or gck_session_find_objects() to access objects. + * + * Return value: (transfer full): The new GckObject. You should use + * g_object_unref() when done with this object. + **/ +GckObject * +gck_object_from_handle (GckSession *session, + gulong object_handle) +{ + GckModule *module = NULL; + GckObject *object; + + g_return_val_if_fail (GCK_IS_SESSION (session), NULL); + + module = gck_session_get_module (session); + object = g_object_new (GCK_TYPE_OBJECT, + "module", module, + "handle", object_handle, + "session", session, + NULL); + g_object_unref (module); + + return object; +} + +/** + * gck_objects_from_handle_array: + * @session: The session for these objects + * @object_handles: (array length=n_object_handles): The raw object handles. + * @n_object_handles: The number of raw object handles. + * + * Initialize a list of GckObject from raw PKCS\#11 handles. The handles argument must contain + * contiguous CK_OBJECT_HANDLE handles in an array. + * + * Returns: (transfer full) (element-type Gck.Object): The list of #GckObject + * objects. You should use gck_list_unref_free() when done with this + * list. + **/ +GList * +gck_objects_from_handle_array (GckSession *session, + gulong *object_handles, + gulong n_object_handles) +{ + GList *results = NULL; + CK_ULONG i; + + g_return_val_if_fail (GCK_IS_SESSION (session), NULL); + g_return_val_if_fail (n_object_handles == 0 || object_handles != NULL, NULL); + + for (i = 0; i < n_object_handles; ++i) + results = g_list_prepend (results, gck_object_from_handle (session, object_handles[i])); + return g_list_reverse (results); +} + +/** + * gck_object_equal: + * @object1: (type Gck.Object): a pointer to the first #GckObject + * @object2: (type Gck.Object): a pointer to the second #GckObject + * + * Checks equality of two objects. Two GckObject objects can point to the same + * underlying PKCS\#11 object. + * + * Return value: TRUE if object1 and object2 are equal. FALSE if either is not a GckObject. + **/ +gboolean +gck_object_equal (gconstpointer object1, gconstpointer object2) +{ + GckObject *obj1, *obj2; + GckSlot *slot1, *slot2; + gboolean ret; + + if (object1 == object2) + return TRUE; + if (!GCK_IS_OBJECT (object1) || !GCK_IS_OBJECT (object2)) + return FALSE; + + obj1 = GCK_OBJECT (object1); + obj2 = GCK_OBJECT (object2); + + slot1 = gck_session_get_slot (obj1->pv->session); + slot2 = gck_session_get_slot (obj2->pv->session); + + ret = obj1->pv->handle == obj2->pv->handle && + gck_slot_equal (slot1, slot2); + + g_object_unref (slot1); + g_object_unref (slot2); + + return ret; +} + +/** + * gck_object_hash: + * @object: (type Gck.Object): a pointer to a #GckObject + * + * Create a hash value for the GckObject. + * + * This function is intended for easily hashing a GckObject to add to + * a GHashTable or similar data structure. + * + * Return value: An integer that can be used as a hash value, or 0 if invalid. + **/ +guint +gck_object_hash (gconstpointer object) +{ + GckObject *self; + GckSlot *slot; + guint hash; + + g_return_val_if_fail (GCK_IS_OBJECT (object), 0); + + self = GCK_OBJECT (object); + slot = gck_session_get_slot (self->pv->session); + + hash = _gck_ulong_hash (&self->pv->handle) ^ + gck_slot_hash (slot); + + g_object_unref (slot); + + return hash; +} + + +/** + * gck_object_get_handle: + * @self: The object. + * + * Get the raw PKCS\#11 handle of a GckObject. + * + * Return value: the raw CK_OBJECT_HANDLE object handle + **/ +gulong +gck_object_get_handle (GckObject *self) +{ + g_return_val_if_fail (GCK_IS_OBJECT (self), (CK_OBJECT_HANDLE)-1); + return self->pv->handle; +} + +/** + * gck_object_get_module: + * @self: The object. + * + * Get the PKCS\#11 module to which this object belongs. + * + * Returns: (transfer full): the module, which should be unreffed after use + **/ +GckModule * +gck_object_get_module (GckObject *self) +{ + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); + return g_object_ref (self->pv->module); +} + + +/** + * gck_object_get_session: + * @self: The object + * + * Get the PKCS\#11 session assigned to make calls on when operating + * on this object. + * + * This will only return a session if it was set explitly on this + * object. By default an object will open and close sessions + * appropriate for its calls. + * + * Returns: (transfer full): the assigned session, which must be unreffed after use + **/ +GckSession * +gck_object_get_session (GckObject *self) +{ + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), NULL); + return g_object_ref (self->pv->session); +} + +/* -------------------------------------------------------------------------------------- + * DESTROY + */ + +typedef struct _Destroy { + GckArguments base; + CK_OBJECT_HANDLE object; +} Destroy; + +static CK_RV +perform_destroy (Destroy *args) +{ + g_assert (args); + return (args->base.pkcs11->C_DestroyObject) (args->base.handle, args->object); +} + +/** + * gck_object_destroy: + * @self: The object to destroy. + * @cancellable: Optional cancellable object, or NULL to ignore. + * @error: A location to return an error. + * + * Destroy a PKCS\#11 object, deleting it from storage or the session. + * This call may block for an indefinite period. + * + * Return value: Whether the call was successful or not. + **/ +gboolean +gck_object_destroy (GckObject *self, GCancellable *cancellable, GError **error) +{ + Destroy args = { GCK_ARGUMENTS_INIT, 0 }; + + g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); + g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + args.object = self->pv->handle; + return _gck_call_sync (self->pv->session, perform_destroy, NULL, &args, cancellable, error); +} + +/** + * gck_object_destroy_async: + * @self: The object to destroy. + * @cancellable: Optional cancellable object, or NULL to ignore. + * @callback: Callback which is called when operation completes. + * @user_data: Data to pass to the callback. + * + * Destroy a PKCS\#11 object, deleting it from storage or the session. + * This call will return immediately and complete asynchronously. + **/ +void +gck_object_destroy_async (GckObject *self, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + Destroy* args; + + g_return_if_fail (GCK_IS_OBJECT (self)); + g_return_if_fail (GCK_IS_SESSION (self->pv->session)); + + args = _gck_call_async_prep (self->pv->session, self, perform_destroy, NULL, sizeof (*args), NULL); + args->object = self->pv->handle; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_object_destroy_finish: + * @self: The object being destroyed. + * @result: The result of the destory operation passed to the callback. + * @error: A location to store an error. + * + * Get the status of the operation to destroy a PKCS\#11 object, begun with + * gck_object_destroy_async(). + * + * Return value: Whether the object was destroyed successfully or not. + */ +gboolean +gck_object_destroy_finish (GckObject *self, GAsyncResult *result, GError **error) +{ + g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); + g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + return _gck_call_basic_finish (result, error); +} + +/* -------------------------------------------------------------------------------------- + * SET ATTRIBUTES + */ + +typedef struct _SetAttributes { + GckArguments base; + GckAttributes *attrs; + CK_OBJECT_HANDLE object; +} SetAttributes; + +static CK_RV +perform_set_attributes (SetAttributes *args) +{ + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs; + + g_assert (args); + attrs = _gck_attributes_commit_out (args->attrs, &n_attrs); + + return (args->base.pkcs11->C_SetAttributeValue) (args->base.handle, args->object, + attrs, n_attrs); +} + +static void +free_set_attributes (SetAttributes *args) +{ + g_assert (args); + gck_attributes_unref (args->attrs); + g_free (args); +} + +/** + * gck_object_set: + * @self: The object to set attributes on. + * @attrs: The attributes to set on the object. + * @cancellable: Optional cancellable object, or NULL to ignore. + * @error: A location to return an error. + * + * Set PKCS\#11 attributes on an object. This call may block for an indefinite period. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * Return value: Whether the call was successful or not. + **/ +gboolean +gck_object_set (GckObject *self, GckAttributes *attrs, + GCancellable *cancellable, GError **error) +{ + SetAttributes args; + gboolean ret = FALSE; + + g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); + g_return_val_if_fail (attrs != NULL, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + memset (&args, 0, sizeof (args)); + args.attrs = attrs; + args.object = self->pv->handle; + + gck_attributes_ref_sink (attrs); + + ret = _gck_call_sync (self->pv->session, perform_set_attributes, NULL, &args, cancellable, error); + + gck_attributes_unref (attrs); + + return ret; +} + +/** + * gck_object_set_async: + * @self: The object to set attributes on. + * @attrs: The attributes to set on the object. + * @cancellable: Optional cancellable object, or NULL to ignore. + * @callback: Callback which is called when operation completes. + * @user_data: Data to pass to the callback. + * + * Set PKCS\#11 attributes on an object. This call will return + * immediately and completes asynchronously. + * + * If the @attrs #GckAttributes is floating, it is consumed. + **/ +void +gck_object_set_async (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + SetAttributes *args; + + g_return_if_fail (GCK_IS_OBJECT (self)); + g_return_if_fail (attrs != NULL); + + args = _gck_call_async_prep (self->pv->session, self, perform_set_attributes, + NULL, sizeof (*args), free_set_attributes); + + args->attrs = gck_attributes_ref_sink (attrs); + args->object = self->pv->handle; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_object_set_finish: + * @self: The object to set attributes on. + * @result: The result of the destory operation passed to the callback. + * @error: A location to store an error. + * + * Get the status of the operation to set attributes on a PKCS\#11 object, + * begun with gck_object_set_async(). + * + * Return value: Whether the attributes were successfully set on the object or not. + */ +gboolean +gck_object_set_finish (GckObject *self, GAsyncResult *result, GError **error) +{ + SetAttributes *args; + + g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); + g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + /* Unlock the attributes we were using */ + args = _gck_call_arguments (result, SetAttributes); + g_assert (args->attrs); + + return _gck_call_basic_finish (result, error); +} + +/* ------------------------------------------------------------------------------------ + * GET ATTRIBUTES + */ + +typedef struct _GetAttributes { + GckArguments base; + CK_OBJECT_HANDLE object; + GckBuilder builder; +} GetAttributes; + +static CK_RV +perform_get_attributes (GetAttributes *args) +{ + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs; + CK_RV rv; + + g_assert (args != NULL); + + /* Prepare all the attributes */ + attrs = _gck_builder_prepare_in (&args->builder, &n_attrs); + + /* Get the size of each value */ + rv = (args->base.pkcs11->C_GetAttributeValue) (args->base.handle, args->object, + attrs, n_attrs); + if (!GCK_IS_GET_ATTRIBUTE_RV_OK (rv)) + return rv; + + /* Allocate memory for each value */ + attrs = _gck_builder_commit_in (&args->builder, &n_attrs); + + /* Now get the actual values */ + rv = (args->base.pkcs11->C_GetAttributeValue) (args->base.handle, args->object, + attrs, n_attrs); + + if (GCK_IS_GET_ATTRIBUTE_RV_OK (rv)) + rv = CKR_OK; + + return rv; +} + +static void +free_get_attributes (GetAttributes *args) +{ + g_assert (args != NULL); + gck_builder_clear (&args->builder); + g_free (args); +} + + +/** + * gck_object_get: + * @self: The object to get attributes from. + * @cancellable: A #GCancellable or %NULL + * @error: A location to store an error. + * @...: The attribute types to get. + * + * Get the specified attributes from the object. This call may + * block for an indefinite period. + * + * Returns: (transfer full): the resulting PKCS\#11 attributes, or %NULL if an + * error occurred; the result must be unreffed when you're finished + * with it + **/ +GckAttributes * +gck_object_get (GckObject *self, GCancellable *cancellable, GError **error, ...) +{ + GckAttributes *attrs; + GArray *array; + va_list va; + gulong type; + + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + array = g_array_new (FALSE, TRUE, sizeof (gulong)); + va_start (va, error); + for (;;) { + type = va_arg (va, gulong); + if (type == GCK_INVALID) + break; + g_array_append_val (array, type); + } + va_end (va); + + attrs = gck_object_get_full (self, (gulong*)array->data, array->len, cancellable, error); + g_array_free (array, TRUE); + + return attrs; +} + +/** + * gck_object_get_full: + * @self: The object to get attributes from. + * @attr_types: (array length=n_attr_types): the types of the attributes to get + * @n_attr_types: the number of attr_types + * @cancellable: optional cancellation object, or %NULL + * @error: A location to store an error. + * + * Get the specified attributes from the object. This call may + * block for an indefinite period. + * + * No extra references are added to the returned attributes pointer. + * During this call you may not access the attributes in any way. + * + * Returns: (transfer full): a pointer to the filled in attributes if successful, + * or %NULL if not + **/ +GckAttributes * +gck_object_get_full (GckObject *self, + const gulong *attr_types, + guint n_attr_types, + GCancellable *cancellable, + GError **error) +{ + GetAttributes args; + gboolean ret; + guint i; + + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + memset (&args, 0, sizeof (args)); + + gck_builder_init (&args.builder); + for (i = 0; i < n_attr_types; ++i) + gck_builder_add_empty (&args.builder, attr_types[i]); + + args.object = self->pv->handle; + + ret = _gck_call_sync (self->pv->session, perform_get_attributes, NULL, &args, cancellable, error); + + if (ret) { + return gck_attributes_ref_sink (gck_builder_end (&args.builder)); + } else { + gck_builder_clear (&args.builder); + return NULL; + } +} + +/** + * gck_object_get_async: + * @self: The object to get attributes from. + * @attr_types: (array length=n_attr_types): the types of the attributes to get + * @n_attr_types: the number of attr_types + * @cancellable: optional cancellation object, or %NULL + * @callback: A callback which is called when the operation completes. + * @user_data: Data to be passed to the callback. + * + * Get the specified attributes from the object. The attributes will be cleared + * of their current values, and new attributes will be stored. The attributes + * should not be accessed in any way except for referencing and unreferencing + * them until gck_object_get_finish() is called. + * + * This call returns immediately and completes asynchronously. + **/ +void +gck_object_get_async (GckObject *self, + const gulong *attr_types, + guint n_attr_types, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GetAttributes *args; + guint i; + + g_return_if_fail (GCK_IS_OBJECT (self)); + + args = _gck_call_async_prep (self->pv->session, self, perform_get_attributes, + NULL, sizeof (*args), free_get_attributes); + + gck_builder_init (&args->builder); + for (i = 0; i < n_attr_types; ++i) + gck_builder_add_empty (&args->builder, attr_types[i]); + + args->object = self->pv->handle; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_object_get_finish: + * @self: The object to get attributes from. + * @result: The result passed to the callback. + * @error: A location to store an error. + * + * Get the result of a get operation and return specified attributes from + * the object. + * + * No extra references are added to the returned attributes pointer. + * + * Return value: The filled in attributes structure if successful or + * NULL if not successful. + **/ +GckAttributes* +gck_object_get_finish (GckObject *self, GAsyncResult *result, GError **error) +{ + GetAttributes *args; + + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (GCK_IS_CALL (result), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + args = _gck_call_arguments (result, GetAttributes); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + + return gck_attributes_ref_sink (gck_builder_end (&args->builder)); +} + +/* --------------------------------------------------------------------------------- + * GET ATTRIBUTE DATA + */ + +typedef struct _GetAttributeData { + GckArguments base; + CK_OBJECT_HANDLE object; + CK_ATTRIBUTE_TYPE type; + GckAllocator allocator; + guchar *result; + gsize n_result; +} GetAttributeData; + +static CK_RV +perform_get_attribute_data (GetAttributeData *args) +{ + CK_ATTRIBUTE attr; + CK_RV rv; + + g_assert (args); + g_assert (args->allocator); + + attr.type = args->type; + attr.ulValueLen = 0; + attr.pValue = 0; + + /* Get the size of the value */ + rv = (args->base.pkcs11->C_GetAttributeValue) (args->base.handle, args->object, + &attr, 1); + if (rv != CKR_OK) + return rv; + + /* Allocate memory for the value */ + args->result = (args->allocator) (NULL, attr.ulValueLen + 1); + g_assert (args->result); + attr.pValue = args->result; + + /* Now get the actual value */ + rv = (args->base.pkcs11->C_GetAttributeValue) (args->base.handle, args->object, + &attr, 1); + + if (rv == CKR_OK) { + args->n_result = attr.ulValueLen; + args->result[args->n_result] = 0; + } + + return rv; +} + +static void +free_get_attribute_data (GetAttributeData *args) +{ + g_assert (args); + g_free (args->result); + g_free (args); +} + +/** + * gck_object_get_data: + * @self: The object to get attribute data from. + * @attr_type: The attribute to get data for. + * @cancellable: A #GCancellable or %NULL + * @n_data: The length of the resulting data. + * @error: A location to store an error. + * + * Get the data for the specified attribute from the object. For convenience + * the returned data has a null terminator. + * + * This call may block for an indefinite period. + * + * Returns: (transfer full) (array length=n_data): the resulting PKCS\#11 + * attribute data, or %NULL if an error occurred + **/ +guchar * +gck_object_get_data (GckObject *self, + gulong attr_type, + GCancellable *cancellable, + gsize *n_data, + GError **error) +{ + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (n_data, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + return gck_object_get_data_full (self, attr_type, g_realloc, cancellable, n_data, error); +} + +/** + * gck_object_get_data_full: (skip) + * @self: The object to get attribute data from. + * @attr_type: The attribute to get data for. + * @allocator: An allocator with which to allocate memory for the data, or NULL for default. + * @cancellable: Optional cancellation object, or NULL. + * @n_data: The length of the resulting data. + * @error: A location to store an error. + * + * Get the data for the specified attribute from the object. For convenience + * the returned data has an extra null terminator, not included in the returned length. + * + * This call may block for an indefinite period. + * + * Returns: (transfer full) (array length=n_data): The resulting PKCS\#11 + * attribute data, or %NULL if an error occurred. + **/ +guchar * +gck_object_get_data_full (GckObject *self, gulong attr_type, GckAllocator allocator, + GCancellable *cancellable, gsize *n_data, GError **error) +{ + GetAttributeData args; + gboolean ret; + + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (n_data, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + if (!allocator) + allocator = g_realloc; + + memset (&args, 0, sizeof (args)); + args.allocator = allocator; + args.object = self->pv->handle; + args.type = attr_type; + + ret = _gck_call_sync (self->pv->session, perform_get_attribute_data, NULL, &args, cancellable, error); + + /* Free any value if failed */ + if (!ret) { + if (args.result) + (allocator) (args.result, 0); + return NULL; + } + + *n_data = args.n_result; + return args.result; +} + +/** + * gck_object_get_data_async: + * @self: The object to get attribute data from. + * @attr_type: The attribute to get data for. + * @allocator: (skip): An allocator with which to allocate memory for the data, or NULL for default. + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to be passed to the callback. + * + * Get the data for the specified attribute from the object. + * + * This call will return immediately and complete asynchronously. + **/ +void +gck_object_get_data_async (GckObject *self, gulong attr_type, GckAllocator allocator, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + GetAttributeData *args; + + g_return_if_fail (GCK_IS_OBJECT (self)); + + if (!allocator) + allocator = g_realloc; + + args = _gck_call_async_prep (self->pv->session, self, perform_get_attribute_data, + NULL, sizeof (*args), free_get_attribute_data); + + args->allocator = allocator; + args->object = self->pv->handle; + args->type = attr_type; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_object_get_data_finish: + * @self: The object to get an attribute from. + * @result: The result passed to the callback. + * @n_data: The length of the resulting data. + * @error: A location to store an error. + * + * Get the result of an operation to get attribute data from + * an object. For convenience the returned data has an extra null terminator, + * not included in the returned length. + * + * Returns: (transfer full) (array length=n_data): The PKCS\#11 attribute data + * or %NULL if an error occurred. + **/ +guchar * +gck_object_get_data_finish (GckObject *self, + GAsyncResult *result, + gsize *n_data, + GError **error) +{ + GetAttributeData *args; + guchar *data; + + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (GCK_IS_CALL (result), NULL); + g_return_val_if_fail (n_data, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + + args = _gck_call_arguments (result, GetAttributeData); + + *n_data = args->n_result; + data = args->result; + args->result = NULL; + + return data; +} + +/* --------------------------------------------------------------------------------------- + * SET TEMPLATE + */ + +typedef struct _set_template_args { + GckArguments base; + CK_OBJECT_HANDLE object; + CK_ATTRIBUTE_TYPE type; + GckAttributes *attrs; +} set_template_args; + +static CK_RV +perform_set_template (set_template_args *args) +{ + CK_ATTRIBUTE attr; + CK_ULONG n_attrs; + + g_assert (args); + + attr.type = args->type; + attr.pValue = _gck_attributes_commit_out (args->attrs, &n_attrs); + attr.ulValueLen = n_attrs * sizeof (CK_ATTRIBUTE); + + return (args->base.pkcs11->C_SetAttributeValue) (args->base.handle, args->object, &attr, 1); +} + +static void +free_set_template (set_template_args *args) +{ + g_assert (args); + gck_attributes_unref (args->attrs); + g_free (args); +} + +/** + * gck_object_set_template: + * @self: The object to set an attribute template on. + * @attr_type: The attribute template type. + * @attrs: The attribute template. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to store an error. + * + * Set an attribute template on the object. The attr_type must be for + * an attribute which contains a template. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * This call may block for an indefinite period. + * + * Return value: TRUE if the operation succeeded. + **/ +gboolean +gck_object_set_template (GckObject *self, gulong attr_type, GckAttributes *attrs, + GCancellable *cancellable, GError **error) +{ + set_template_args args; + gboolean ret = FALSE; + + g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); + g_return_val_if_fail (attrs, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + memset (&args, 0, sizeof (args)); + args.attrs = attrs; + args.type = attr_type; + args.object = self->pv->handle; + + gck_attributes_ref_sink (attrs); + + ret = _gck_call_sync (self->pv->session, perform_set_template, NULL, &args, cancellable, error); + + gck_attributes_unref (attrs); + + return ret; +} + +/** + * gck_object_set_template_async: + * @self: The object to set an attribute template on. + * @attr_type: The attribute template type. + * @attrs: The attribute template. + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to be passed to the callback. + * + * Set an attribute template on the object. The attr_type must be for + * an attribute which contains a template. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * This call will return immediately and complete asynchronously. + **/ +void +gck_object_set_template_async (GckObject *self, gulong attr_type, GckAttributes *attrs, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + set_template_args *args; + + g_return_if_fail (GCK_IS_OBJECT (self)); + g_return_if_fail (attrs); + + args = _gck_call_async_prep (self->pv->session, self, perform_set_template, + NULL, sizeof (*args), free_set_template); + + args->attrs = gck_attributes_ref_sink (attrs); + args->type = attr_type; + args->object = self->pv->handle; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_object_set_template_finish: + * @self: The object to set an attribute template on. + * @result: The result passed to the callback. + * @error: A location to store an error. + * + * Get the result of an operation to set attribute template on + * an object. + * + * Return value: TRUE if the operation succeeded. + **/ +gboolean +gck_object_set_template_finish (GckObject *self, GAsyncResult *result, GError **error) +{ + set_template_args *args; + + g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); + g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + /* Unlock the attributes we were using */ + args = _gck_call_arguments (result, set_template_args); + g_assert (args->attrs); + + return _gck_call_basic_finish (result, error); +} + +/* --------------------------------------------------------------------------------------- + * GET TEMPLATE + */ + +typedef struct _get_template_args { + GckArguments base; + CK_OBJECT_HANDLE object; + CK_ATTRIBUTE_TYPE type; + GckBuilder builder; +} get_template_args; + +static CK_RV +perform_get_template (get_template_args *args) +{ + CK_ATTRIBUTE attr; + CK_ULONG n_attrs, i; + CK_RV rv; + + g_assert (args); + + gck_builder_init (&args->builder); + attr.type = args->type; + attr.ulValueLen = 0; + attr.pValue = 0; + + /* Get the length of the entire template */ + rv = (args->base.pkcs11->C_GetAttributeValue) (args->base.handle, args->object, &attr, 1); + if (rv != CKR_OK) + return rv; + + /* Number of attributes, rounded down */ + n_attrs = (attr.ulValueLen / sizeof (CK_ATTRIBUTE)); + for (i = 0; i < n_attrs; ++i) + gck_builder_add_empty (&args->builder, 0); + + /* Prepare all the attributes */ + attr.pValue = _gck_builder_prepare_in (&args->builder, &n_attrs); + + /* Get the size of each value */ + rv = (args->base.pkcs11->C_GetAttributeValue) (args->base.handle, args->object, &attr, 1); + if (rv != CKR_OK) + return rv; + + /* Allocate memory for each value */ + attr.pValue = _gck_builder_commit_in (&args->builder, &n_attrs); + + /* Now get the actual values */ + return (args->base.pkcs11->C_GetAttributeValue) (args->base.handle, args->object, &attr, 1); +} + +static void +free_get_template (get_template_args *args) +{ + g_assert (args != NULL); + gck_builder_clear (&args->builder); + g_free (args); +} + +/** + * gck_object_get_template: + * @self: The object to get an attribute template from. + * @attr_type: The template attribute type. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to store an error. + * + * Get an attribute template from the object. The attr_type must be for + * an attribute which returns a template. + * + * This call may block for an indefinite period. + * + * Returns: (transfer full): the resulting PKCS\#11 attribute template, or %NULL + * if an error occurred + **/ +GckAttributes * +gck_object_get_template (GckObject *self, gulong attr_type, + GCancellable *cancellable, GError **error) +{ + get_template_args args; + gboolean ret; + + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + memset (&args, 0, sizeof (args)); + args.object = self->pv->handle; + args.type = attr_type; + + ret = _gck_call_sync (self->pv->session, perform_get_template, NULL, &args, cancellable, error); + + /* Free any value if failed */ + if (!ret) { + gck_builder_clear (&args.builder); + return NULL; + } + + return gck_attributes_ref_sink (gck_builder_end (&args.builder)); +} + +/** + * gck_object_get_template_async: + * @self: The object to get an attribute template from. + * @attr_type: The template attribute type. + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to be passed to the callback. + * + * Get an attribute template from the object. The attr_type must be for + * an attribute which returns a template. + * + * This call will return immediately and complete asynchronously. + **/ +void +gck_object_get_template_async (GckObject *self, gulong attr_type, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + get_template_args *args; + + g_return_if_fail (GCK_IS_OBJECT (self)); + + args = _gck_call_async_prep (self->pv->session, self, perform_get_template, + NULL, sizeof (*args), free_get_template); + + args->object = self->pv->handle; + args->type = attr_type; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_object_get_template_finish: + * @self: The object to get an attribute from. + * @result: The result passed to the callback. + * @error: A location to store an error. + * + * Get the result of an operation to get attribute template from + * an object. + * + * Returns: (transfer full): the resulting PKCS\#11 attribute template, or %NULL + * if an error occurred + **/ +GckAttributes * +gck_object_get_template_finish (GckObject *self, GAsyncResult *result, + GError **error) +{ + get_template_args *args; + + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); + g_return_val_if_fail (GCK_IS_CALL (result), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + + args = _gck_call_arguments (result, get_template_args); + return gck_attributes_ref_sink (gck_builder_end (&args->builder)); +} diff --git a/gck/gck-password.c b/gck/gck-password.c new file mode 100644 index 0000000..90926c9 --- /dev/null +++ b/gck/gck-password.c @@ -0,0 +1,253 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-password.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "egg/egg-timegm.h" + +#include + +/** + * SECTION:gck-password + * @title: GckPassword + * @short_description: Represents a password hich is requested of the user + * + * This is used in conjuction with GTlsInteraction. #GckPassword is a + * GTlsPassword which contains additional information about which PKCS\#11 + * token or key the password is being requested for. + */ + +/** + * GckPassword: + * + * A #GTlsPasswordClass that contains information about the PKCS\#11 token + * or key the password is being requested for. + */ + +/** + * GckPasswordClass: + * @parent: parent class + * + * The class for #GTlsPassword. + */ +enum { + PROP_0, + PROP_MODULE, + PROP_TOKEN, + PROP_KEY +}; + +struct _GckPasswordPrivate { + gboolean for_token; + gpointer token_or_key; +}; + +G_DEFINE_TYPE (GckPassword, gck_password, G_TYPE_TLS_PASSWORD); + +static void +gck_password_init (GckPassword *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_PASSWORD, GckPasswordPrivate); +} + +static void +gck_password_constructed (GObject *obj) +{ + GckPassword *self = GCK_PASSWORD (obj); + + G_OBJECT_CLASS (gck_password_parent_class)->constructed (obj); + + g_return_if_fail (GCK_IS_SLOT (self->pv->token_or_key) || + GCK_IS_OBJECT (self->pv->token_or_key)); +} + +static void +gck_password_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GckPassword *self = GCK_PASSWORD (obj); + + switch (prop_id) { + case PROP_MODULE: + g_value_take_object (value, gck_password_get_module (self)); + break; + case PROP_TOKEN: + g_value_take_object (value, gck_password_get_token (self)); + break; + case PROP_KEY: + g_value_take_object (value, gck_password_get_key (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_password_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GckPassword *self = GCK_PASSWORD (obj); + gpointer object; + + /* All writes to data members below, happen only during construct phase */ + + switch (prop_id) { + case PROP_TOKEN: + object = g_value_dup_object (value); + if (object != NULL) { + g_assert (self->pv->token_or_key == NULL); + self->pv->token_or_key = object; + self->pv->for_token = TRUE; + } + break; + case PROP_KEY: + object = g_value_dup_object (value); + if (object != NULL) { + g_assert (self->pv->token_or_key == NULL); + self->pv->token_or_key = object; + self->pv->for_token = FALSE; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_password_finalize (GObject *obj) +{ + GckPassword *self = GCK_PASSWORD (obj); + + g_clear_object (&self->pv->token_or_key); + + G_OBJECT_CLASS (gck_password_parent_class)->finalize (obj); +} + +static void +gck_password_class_init (GckPasswordClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*)klass; + + gobject_class->constructed = gck_password_constructed; + gobject_class->get_property = gck_password_get_property; + gobject_class->set_property = gck_password_set_property; + gobject_class->finalize = gck_password_finalize; + + /** + * GckPassword:module: + * + * The PKCS\#11 module that is requesting the password + */ + g_object_class_install_property (gobject_class, PROP_MODULE, + g_param_spec_object ("module", "Module", "PKCS11 Module", + GCK_TYPE_MODULE, G_PARAM_READABLE)); + + /** + * GckPassword:token: + * + * The PKCS\#11 token the password is for, if this is set then + * the GckPassword:object property will be %NULL + */ + g_object_class_install_property (gobject_class, PROP_TOKEN, + g_param_spec_object ("token", "Token", "PKCS11 Token", + GCK_TYPE_SLOT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckPassword:key: + * + * The PKCS\#11 key that the password is being requested for. If this + * is set then the GckPassword:token property will be %NULL + */ + g_object_class_install_property (gobject_class, PROP_KEY, + g_param_spec_object ("key", "Object", "PKCS11 Key Object", + GCK_TYPE_OBJECT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (gobject_class, sizeof (GckPasswordPrivate)); +} + +/** + * gck_password_get_module: + * @self: the password object + * + * Get the PKCS\#11 module that is requesting the password. + * + * Returns: (transfer full): the module that is requesting the password, which + * must be unreferenced after use + */ +GckModule * +gck_password_get_module (GckPassword *self) +{ + g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL); + if (self->pv->for_token) + return gck_slot_get_module (self->pv->token_or_key); + else + return gck_object_get_module (self->pv->token_or_key); +} + +/** + * gck_password_get_token: + * @self: the password object + * + * If the password request is to unlock a PKCS\#11 token, then this is the + * slot containing that token. + * + * Returns: (transfer full): the slot that contains the token, or %NULL if not + * being requested for a token; must be unreferenced after use + */ +GckSlot * +gck_password_get_token (GckPassword *self) +{ + g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL); + if (!self->pv->for_token) + return NULL; + g_return_val_if_fail (GCK_IS_SLOT (self->pv->token_or_key), NULL); + return g_object_ref (self->pv->token_or_key); +} + +/** + * gck_password_get_key: + * @self: the password object + * + * If the password request is to unlock a PKCS\#11 key, then this is the + * the object representing that key. + * + * Returns: (transfer full): the password is for this key, or %NULL if not + * being requested for a key; must be unreferenced after use + */ +GckObject * +gck_password_get_key (GckPassword *self) +{ + g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL); + if (self->pv->for_token) + return NULL; + g_return_val_if_fail (GCK_IS_OBJECT (self->pv->token_or_key), NULL); + return g_object_ref (self->pv->token_or_key); +} diff --git a/gck/gck-private.h b/gck/gck-private.h new file mode 100644 index 0000000..dc4c44b --- /dev/null +++ b/gck/gck-private.h @@ -0,0 +1,212 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-private.h - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef GCK_PRIVATE_H_ +#define GCK_PRIVATE_H_ + +#include "gck.h" + +#include +#include +#include + +G_BEGIN_DECLS + +#define GCK_IS_GET_ATTRIBUTE_RV_OK(rv) \ + ((rv) == CKR_OK || (rv) == CKR_ATTRIBUTE_SENSITIVE || (rv) == CKR_ATTRIBUTE_TYPE_INVALID) + +/* --------------------------------------------------------------------------- + * ATTRIBUTE INTERNALS + */ + +CK_ATTRIBUTE_PTR _gck_attributes_commit_out (GckAttributes *attrs, + CK_ULONG_PTR n_attrs); + +CK_ATTRIBUTE_PTR _gck_builder_prepare_in (GckBuilder *attrs, + CK_ULONG_PTR n_attrs); + +CK_ATTRIBUTE_PTR _gck_builder_commit_in (GckBuilder *attrs, + CK_ULONG_PTR n_attrs); + +/* ---------------------------------------------------------------------------- + * MISC + */ + +guint _gck_ulong_hash (gconstpointer v); + +gboolean _gck_ulong_equal (gconstpointer v1, + gconstpointer v2); + +const gchar * _gck_stringize_rv (CK_RV rv); + +CK_RV _gck_rv_from_error (GError *error, + CK_RV catch_all_code); + +/* ---------------------------------------------------------------------------- + * MODULE + */ + +GckModule* _gck_module_new_initialized (CK_FUNCTION_LIST_PTR funcs); + +GckModuleInfo* _gck_module_info_from_pkcs11 (CK_INFO_PTR info); + +void _gck_module_info_to_pkcs11 (GckModuleInfo* module_info, + CK_INFO_PTR info); + +gboolean _gck_module_info_match (GckModuleInfo *match, + GckModuleInfo *module_info); + +/* ----------------------------------------------------------------------------- + * ENUMERATOR + */ + +GckEnumerator * _gck_enumerator_new_for_modules (GList *modules, + GckSessionOptions session_options, + GckUriData *uri_data); + +GckEnumerator * _gck_enumerator_new_for_slots (GList *slots, + GckSessionOptions session_options, + GckUriData *uri_data); + +GckEnumerator * _gck_enumerator_new_for_session (GckSession *session, + GckUriData *uri_data); + +/* ---------------------------------------------------------------------------- + * SLOT + */ + +GckTokenInfo* _gck_token_info_from_pkcs11 (CK_TOKEN_INFO_PTR info); + +void _gck_token_info_to_pkcs11 (GckTokenInfo *token_info, + CK_TOKEN_INFO_PTR info); + +gboolean _gck_token_info_match (GckTokenInfo *match, + GckTokenInfo *info); + +CK_RV _gck_session_authenticate_token (CK_FUNCTION_LIST_PTR funcs, + CK_SESSION_HANDLE session, + GckSlot *token, + GTlsInteraction *interaction, + GCancellable *cancellable); + +CK_RV _gck_session_authenticate_key (CK_FUNCTION_LIST_PTR funcs, + CK_SESSION_HANDLE session, + GckObject *key, + GTlsInteraction *interaction, + GCancellable *cancellable); + +/* ---------------------------------------------------------------------------- + * PASSWORD + */ + +void _gck_password_update (GckPassword *self, + gboolean request_retry); + +/* ---------------------------------------------------------------------------- + * INTERACTION + */ + +#define GCK_TYPE_INTERACTION (_gck_interaction_get_type ()) +#define GCK_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_INTERACTION, GckInteraction)) +#define GCK_IS_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_INTERACTION)) + +typedef struct _GckInteraction GckInteraction; + +GType _gck_interaction_get_type (void) G_GNUC_CONST; + +GTlsInteraction * _gck_interaction_new (gpointer token_or_key); + +/* ---------------------------------------------------------------------------- + * CALL + */ + +typedef CK_RV (*GckPerformFunc) (gpointer call_data); +typedef gboolean (*GckCompleteFunc) (gpointer call_data, CK_RV result); + +typedef struct _GckCall GckCall; + +typedef struct _GckArguments { + GckCall *call; + + /* For the call function to use */ + CK_FUNCTION_LIST_PTR pkcs11; + CK_ULONG handle; + +} GckArguments; + +#define GCK_MECHANISM_EMPTY { 0UL, NULL, 0 } + +#define GCK_ARGUMENTS_INIT { NULL, NULL, 0 } + +#define GCK_TYPE_CALL (_gck_call_get_type()) +#define GCK_CALL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_CALL, GckCall)) +#define GCK_CALL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_CALL, GckCall)) +#define GCK_IS_CALL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_CALL)) +#define GCK_IS_CALL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_CALL)) +#define GCK_CALL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_CALL, GckCallClass)) + +typedef struct _GckCallClass GckCallClass; + +GType _gck_call_get_type (void) G_GNUC_CONST; + +#define _gck_call_arguments(call, type) (type*)(_gck_call_get_arguments (GCK_CALL (call))) + +gpointer _gck_call_get_arguments (GckCall *call); + +void _gck_call_uninitialize (void); + +gboolean _gck_call_sync (gpointer object, + gpointer perform, + gpointer complete, + gpointer args, + GCancellable *cancellable, + GError **err); + +gpointer _gck_call_async_prep (gpointer object, + gpointer cb_object, + gpointer perform, + gpointer complete, + gsize args_size, + gpointer destroy_func); + +GckCall* _gck_call_async_ready (gpointer args, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +void _gck_call_async_go (GckCall *call); + +void _gck_call_async_ready_go (gpointer args, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +void _gck_call_async_short (GckCall *call, + CK_RV rv); + +gboolean _gck_call_basic_finish (GAsyncResult *result, + GError **err); + +void _gck_call_async_object (GckCall *call, + gpointer object); + +#endif /* GCK_PRIVATE_H_ */ diff --git a/gck/gck-session.c b/gck/gck-session.c new file mode 100644 index 0000000..05a1386 --- /dev/null +++ b/gck/gck-session.c @@ -0,0 +1,3583 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-session.h - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "gck/gck-marshal.h" + +#include + +#include + +/** + * SECTION:gck-session + * @title: GckSession + * @short_description: Represents an open PKCS11 session. + * + * Before performing any PKCS11 operations, a session must be opened. This is + * analogous to an open database handle, or a file handle. + */ + +/** + * GckSession: + * + * Represents an open PKCS11 session. + */ + +/** + * GckSessionOptions: + * @GCK_SESSION_READ_ONLY: Open session as read only + * @GCK_SESSION_READ_WRITE: Open sessions as read/write + * @GCK_SESSION_LOGIN_USER: Login as user on new sessions + * @GCK_SESSION_AUTHENTICATE: Authenticate as necessary + * + * Options for creating sessions. + */ + +/** + * GckMechanism: + * @type: The mechanism type + * @parameter: Mechanism specific data. + * @n_parameter: Length of mechanism specific data. + * + * Represents a mechanism used with crypto operations. + */ + +enum { + DISCARD_HANDLE, + LAST_SIGNAL +}; + +enum { + PROP_0, + PROP_MODULE, + PROP_HANDLE, + PROP_INTERACTION, + PROP_SLOT, + PROP_OPTIONS, + PROP_OPENING_FLAGS, + PROP_APP_DATA +}; + +struct _GckSessionPrivate { + /* Not modified after construct/init */ + GckSlot *slot; + CK_SESSION_HANDLE handle; + GckSessionOptions options; + gulong opening_flags; + gpointer app_data; + + /* Changable data locked by mutex */ + GMutex *mutex; + GTlsInteraction *interaction; + gboolean discarded; +}; + +static void gck_session_initable_iface (GInitableIface *iface); + +static void gck_session_async_initable_iface (GAsyncInitableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GckSession, gck_session, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, gck_session_initable_iface); + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, gck_session_async_initable_iface); +); + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* ---------------------------------------------------------------------------- + * OBJECT + */ + +static gboolean +gck_session_real_discard_handle (GckSession *self, CK_OBJECT_HANDLE handle) +{ + CK_FUNCTION_LIST_PTR funcs; + GckModule *module; + CK_RV rv; + + /* The default functionality, close the handle */ + + module = gck_session_get_module (self); + g_return_val_if_fail (module != NULL, FALSE); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, FALSE); + + rv = (funcs->C_CloseSession) (handle); + if (rv != CKR_OK) { + g_warning ("couldn't close session properly: %s", + gck_message_from_rv (rv)); + } + + g_object_unref (module); + return TRUE; +} + +static void +gck_session_init (GckSession *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SESSION, GckSessionPrivate); + self->pv->mutex = g_new0 (GMutex, 1); + g_mutex_init (self->pv->mutex); +} + +static void +gck_session_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GckSession *self = GCK_SESSION (obj); + + switch (prop_id) { + case PROP_MODULE: + g_value_take_object (value, gck_session_get_module (self)); + break; + case PROP_HANDLE: + g_value_set_ulong (value, gck_session_get_handle (self)); + break; + case PROP_SLOT: + g_value_take_object (value, gck_session_get_slot (self)); + break; + case PROP_OPTIONS: + g_value_set_uint (value, gck_session_get_options (self)); + break; + case PROP_INTERACTION: + g_value_take_object (value, gck_session_get_interaction (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_session_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GckSession *self = GCK_SESSION (obj); + + /* Only valid calls are from constructor */ + + switch (prop_id) { + case PROP_HANDLE: + g_return_if_fail (!self->pv->handle); + self->pv->handle = g_value_get_ulong (value); + break; + case PROP_INTERACTION: + gck_session_set_interaction (self, g_value_get_object (value)); + break; + case PROP_SLOT: + g_return_if_fail (!self->pv->slot); + self->pv->slot = g_value_dup_object (value); + g_return_if_fail (self->pv->slot); + break; + case PROP_OPTIONS: + g_return_if_fail (!self->pv->options); + self->pv->options = g_value_get_flags (value); + break; + case PROP_OPENING_FLAGS: + self->pv->opening_flags = g_value_get_ulong (value); + break; + case PROP_APP_DATA: + self->pv->app_data = g_value_get_pointer (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_session_constructed (GObject *obj) +{ + GckSession *self = GCK_SESSION (obj); + + G_OBJECT_CLASS (gck_session_parent_class)->constructed (obj); + + self->pv->opening_flags |= CKF_SERIAL_SESSION; + if (self->pv->options & GCK_SESSION_READ_WRITE) + self->pv->opening_flags |= CKF_RW_SESSION; +} + +static void +gck_session_dispose (GObject *obj) +{ + GckSession *self = GCK_SESSION (obj); + gboolean discard = FALSE; + gboolean handled; + + g_return_if_fail (GCK_IS_SESSION (self)); + + if (self->pv->handle != 0) { + g_mutex_lock (self->pv->mutex); + discard = !self->pv->discarded; + self->pv->discarded = TRUE; + g_mutex_unlock (self->pv->mutex); + } + + if (discard) { + /* + * Let the world know that we're discarding the session + * handle. This allows any necessary session reuse to work. + */ + + g_signal_emit_by_name (self, "discard-handle", self->pv->handle, &handled); + g_return_if_fail (handled); + } + + G_OBJECT_CLASS (gck_session_parent_class)->dispose (obj); +} + +static void +gck_session_finalize (GObject *obj) +{ + GckSession *self = GCK_SESSION (obj); + + g_assert (self->pv->handle == 0 || self->pv->discarded); + + g_clear_object (&self->pv->interaction); + g_clear_object (&self->pv->slot); + + g_mutex_clear (self->pv->mutex); + g_free (self->pv->mutex); + + G_OBJECT_CLASS (gck_session_parent_class)->finalize (obj); +} + +static void +gck_session_class_init (GckSessionClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*)klass; + gck_session_parent_class = g_type_class_peek_parent (klass); + + gobject_class->constructed = gck_session_constructed; + gobject_class->get_property = gck_session_get_property; + gobject_class->set_property = gck_session_set_property; + gobject_class->dispose = gck_session_dispose; + gobject_class->finalize = gck_session_finalize; + + klass->discard_handle = gck_session_real_discard_handle; + + /** + * GckSession:module: + * + * The GckModule that this session is opened on. + */ + g_object_class_install_property (gobject_class, PROP_MODULE, + g_param_spec_object ("module", "Module", "PKCS11 Module", + GCK_TYPE_MODULE, G_PARAM_READABLE)); + + /** + * GckSession:handle: + * + * The raw CK_SESSION_HANDLE handle of this session. + */ + g_object_class_install_property (gobject_class, PROP_HANDLE, + g_param_spec_ulong ("handle", "Session Handle", "PKCS11 Session Handle", + 0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckSession:slot: + * + * The GckSlot this session is opened on. + */ + g_object_class_install_property (gobject_class, PROP_SLOT, + g_param_spec_object ("slot", "Slot that this session uses", "PKCS11 Slot", + GCK_TYPE_SLOT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckSession:options: + * + * The options this session was opened with. + */ + g_object_class_install_property (gobject_class, PROP_OPTIONS, + g_param_spec_flags ("options", "Session Options", "Session Options", + GCK_TYPE_SESSION_OPTIONS, GCK_SESSION_READ_ONLY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckSession:interaction: + * + * Interaction object used to ask the user for pins when opening + * sessions. Used if the session_options of the enumerator have + * %GCK_SESSION_LOGIN_USER + */ + g_object_class_install_property (gobject_class, PROP_INTERACTION, + g_param_spec_object ("interaction", "Interaction", "Interaction asking for pins", + G_TYPE_TLS_INTERACTION, G_PARAM_READWRITE)); + + /** + * GckSession:opening-flags: + * + * Raw PKCS\#11 flags used to open the PKCS\#11 session. + */ + g_object_class_install_property (gobject_class, PROP_OPENING_FLAGS, + g_param_spec_ulong ("opening-flags", "Opening flags", "PKCS#11 open session flags", + 0, G_MAXULONG, 0, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckSession:app-data: + * + * Raw PKCS\#11 application data used to open the PKCS\#11 session. + */ + g_object_class_install_property (gobject_class, PROP_APP_DATA, + g_param_spec_pointer ("app-data", "App data", "PKCS#11 application data", + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckSession::discard-handle: + * @session: The session. + * @handle: The handle being discarded. + * + * When a GckSession is being disposed of it emits this signal to allow + * a session pool to pick up the handle and keep it around. + * + * If no signal handler claims the handle, then it is closed. + * + * Returns: Whether or not this handle was claimed. + */ + signals[DISCARD_HANDLE] = g_signal_new ("discard-handle", GCK_TYPE_SESSION, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GckSessionClass, discard_handle), + g_signal_accumulator_true_handled, NULL, + _gck_marshal_BOOLEAN__ULONG, G_TYPE_BOOLEAN, 1, G_TYPE_ULONG); + + g_type_class_add_private (klass, sizeof (GckSessionPrivate)); +} + +typedef struct OpenSession { + GckArguments base; + GTlsInteraction *interaction; + GckSlot *slot; + gulong flags; + gpointer app_data; + CK_NOTIFY notify; + gboolean auto_login; + CK_SESSION_HANDLE session; +} OpenSession; + +static void +free_open_session (OpenSession *args) +{ + g_clear_object (&args->interaction); + g_clear_object (&args->slot); + g_free (args); +} + +static CK_RV +perform_open_session (OpenSession *args) +{ + GTlsInteraction *interaction; + CK_RV rv = CKR_OK; + + /* First step, open session */ + if (!args->session) { + rv = (args->base.pkcs11->C_OpenSession) (args->base.handle, args->flags, + args->app_data, args->notify, &args->session); + } + + if (rv != CKR_OK || !args->auto_login) + return rv; + + /* Compatibility, hook into GckModule signals if no interaction set */ + if (args->interaction) + interaction = g_object_ref (args->interaction); + else + interaction = _gck_interaction_new (args->slot); + + rv = _gck_session_authenticate_token (args->base.pkcs11, args->session, + args->slot, interaction, NULL); + + g_object_unref (interaction); + + return rv; +} + +static gboolean +gck_session_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GckSession *self = GCK_SESSION (initable); + OpenSession args = { GCK_ARGUMENTS_INIT, 0, }; + GckModule *module = NULL; + gboolean ret = FALSE; + gboolean want_login; + + want_login = (self->pv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER; + + /* Already have a session setup? */ + if (self->pv->handle && !want_login) + return TRUE; + + g_object_ref (self); + module = gck_session_get_module (self); + + /* Open a new session */ + args.slot = self->pv->slot; + args.app_data = self->pv->app_data; + args.notify = NULL; + args.session = self->pv->handle; + args.flags = self->pv->opening_flags; + args.interaction = self->pv->interaction ? g_object_ref (self->pv->interaction) : NULL; + args.auto_login = want_login; + + if (_gck_call_sync (self->pv->slot, perform_open_session, NULL, &args, cancellable, error)) { + self->pv->handle = args.session; + ret = TRUE; + } + + g_clear_object (&args.interaction); + g_object_unref (module); + g_object_unref (self); + + return ret; +} + +static void +gck_session_initable_iface (GInitableIface *iface) +{ + iface->init = gck_session_initable_init; +} + +static void +gck_session_initable_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GckSession *self = GCK_SESSION (initable); + OpenSession *args; + gboolean want_login; + GckCall *call; + + g_object_ref (self); + + args = _gck_call_async_prep (self->pv->slot, self, perform_open_session, NULL, + sizeof (*args), free_open_session); + + want_login = (self->pv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER; + args->session = self->pv->handle; + + call = _gck_call_async_ready (args, cancellable, callback, user_data); + + /* Already have a session setup? */ + if (self->pv->handle && !want_login) { + _gck_call_async_short (call, CKR_OK); + g_object_unref (self); + return; + } + + args->app_data = self->pv->app_data; + args->notify = NULL; + args->slot = g_object_ref (self->pv->slot); + args->interaction = self->pv->interaction ? g_object_ref (self->pv->interaction) : NULL; + args->auto_login = want_login; + args->flags = self->pv->opening_flags; + + _gck_call_async_go (call); + g_object_unref (self); +} + +static gboolean +gck_session_initable_init_finish (GAsyncInitable *initable, + GAsyncResult *result, + GError **error) +{ + GckSession *self = GCK_SESSION (initable); + gboolean ret = FALSE; + + g_object_ref (self); + + { + OpenSession *args; + + if (_gck_call_basic_finish (result, error)) { + args = _gck_call_arguments (result, OpenSession); + self->pv->handle = args->session; + ret = TRUE; + } + } + + g_object_unref (self); + + return ret; +} + +static void +gck_session_async_initable_iface (GAsyncInitableIface *iface) +{ + iface->init_async = gck_session_initable_init_async; + iface->init_finish = gck_session_initable_init_finish; +} + +/* ---------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * GckSessionInfo: + * @slot_id: The handle of the PKCS11 slot that this session is opened on. + * @state: The user login state of the session. + * @flags: Various PKCS11 flags. + * @device_error: The last device error that occurred from an operation on this session. + * + * Information about the session. This is analogous to a CK_SESSION_INFO structure. + * + * When done with this structure, release it using gck_session_info_free(). + */ + +GType +gck_session_info_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckSessionInfo", + (GBoxedCopyFunc)gck_session_info_copy, + (GBoxedFreeFunc)gck_session_info_free); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gck_session_info_copy: + * @session_info: a session info structure + * + * Make a new copy of a session info structure. + * + * Returns: (transfer full): a new copy of the session info + */ +GckSessionInfo * +gck_session_info_copy (GckSessionInfo *session_info) +{ + return g_memdup (session_info, sizeof (GckSessionInfo)); +} + +/** + * gck_session_info_free: + * @session_info: Session info to free. + * + * Free the GckSessionInfo structure and all associated memory. + **/ +void +gck_session_info_free (GckSessionInfo *session_info) +{ + if (!session_info) + return; + g_free (session_info); +} + +/** + * gck_session_from_handle: + * @slot: The slot which the session belongs to. + * @session_handle: the raw PKCS\#11 handle of the session + * @options: Session options. Those which are used during opening a session have no effect. + * + * Initialize a GckSession object from a raw PKCS\#11 session handle. + * Usually one would use the gck_slot_open_session() function to + * create a session. + * + * Returns: (transfer full): the new GckSession object + **/ +GckSession * +gck_session_from_handle (GckSlot *slot, + gulong session_handle, + GckSessionOptions options) +{ + GckSession *session; + + g_return_val_if_fail (GCK_IS_SLOT (slot), NULL); + + session = g_object_new (GCK_TYPE_SESSION, + "handle", session_handle, + "slot", slot, + "options", options, + NULL); + + return session; +} + +/** + * gck_session_get_handle: + * @self: The session object. + * + * Get the raw PKCS\#11 session handle from a GckSession object. + * + * Return value: The raw session handle. + **/ +gulong +gck_session_get_handle (GckSession *self) +{ + g_return_val_if_fail (GCK_IS_SESSION (self), (CK_SESSION_HANDLE)-1); + return self->pv->handle; +} + +/** + * gck_session_get_module: + * @self: The session object. + * + * Get the PKCS\#11 module to which this session belongs. + * + * Returns: (transfer full): the module, which should be unreffed after use + **/ +GckModule * +gck_session_get_module (GckSession *self) +{ + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + return gck_slot_get_module (self->pv->slot); +} + +/** + * gck_session_get_slot: + * @self: The session object. + * + * Get the PKCS\#11 slot to which this session belongs. + * + * Return value: (transfer full): The slot, which should be unreffed after use. + **/ +GckSlot * +gck_session_get_slot (GckSession *self) +{ + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + g_return_val_if_fail (GCK_IS_SLOT (self->pv->slot), NULL); + return g_object_ref (self->pv->slot); +} + +/** + * gck_session_get_info: + * @self: The session object. + * + * Get information about the session. + * + * Returns: (transfer full): the session info. Use the gck_session_info_free() + * to release when done + **/ +GckSessionInfo* +gck_session_get_info (GckSession *self) +{ + GckSessionInfo *sessioninfo; + CK_FUNCTION_LIST_PTR funcs; + CK_SESSION_INFO info; + GckModule *module; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + + module = gck_session_get_module (self); + g_return_val_if_fail (GCK_IS_MODULE (module), NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, NULL); + + memset (&info, 0, sizeof (info)); + rv = (funcs->C_GetSessionInfo) (self->pv->handle, &info); + + g_object_unref (module); + + if (rv != CKR_OK) { + g_warning ("couldn't get session info: %s", gck_message_from_rv (rv)); + return NULL; + } + + sessioninfo = g_new0 (GckSessionInfo, 1); + sessioninfo->flags = info.flags; + sessioninfo->slot_id = info.slotID; + sessioninfo->state = info.state; + sessioninfo->device_error = info.ulDeviceError; + + return sessioninfo; +} + +/** + * gck_session_get_state: + * @self: the session + * + * Get the session state. The state is the various PKCS\#11 CKS_XXX flags. + * + * Returns: the session state + */ +gulong +gck_session_get_state (GckSession *self) +{ + CK_FUNCTION_LIST_PTR funcs; + CK_SESSION_INFO info; + GckModule *module; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SESSION (self), 0); + + module = gck_session_get_module (self); + g_return_val_if_fail (GCK_IS_MODULE (module), 0); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, 0); + + memset (&info, 0, sizeof (info)); + rv = (funcs->C_GetSessionInfo) (self->pv->handle, &info); + + g_object_unref (module); + + if (rv != CKR_OK) { + g_warning ("couldn't get session info: %s", gck_message_from_rv (rv)); + return 0; + } + + return info.state; +} + +/** + * gck_session_get_options: + * @self: The session to get options from. + * + * Get the options this session was opened with. + * + * Return value: The session options. + **/ +GckSessionOptions +gck_session_get_options (GckSession *self) +{ + g_return_val_if_fail (GCK_IS_SESSION (self), 0); + return self->pv->options; +} + +/** + * gck_session_get_interaction: + * @self: the session + * + * Get the interaction object set on this session, which is used to prompt + * for pins and the like. + * + * Returns: (transfer full) (allow-none): the interaction object, or %NULL + */ +GTlsInteraction * +gck_session_get_interaction (GckSession *self) +{ + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + + if (self->pv->interaction) + return g_object_ref (self->pv->interaction); + + return NULL; +} + +/** + * gck_session_set_interaction: + * @self: the session + * @interaction: (allow-none): the interaction or %NULL + * + * Set the interaction object on this session, which is used to prompt for + * pins and the like. + */ +void +gck_session_set_interaction (GckSession *self, + GTlsInteraction *interaction) +{ + GTlsInteraction *previous; + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + + if (interaction) + g_object_ref (interaction); + + g_mutex_lock (self->pv->mutex); + + previous = self->pv->interaction; + self->pv->interaction = interaction; + + g_mutex_unlock (self->pv->mutex); + + if (previous) + g_object_unref (previous); +} + +/** + * gck_session_open: + * @slot: the slot to open session on + * @options: session options + * @interaction: (allow-none): optional interaction for logins or object authentication + * @cancellable: optional cancellation object + * @error: location to place error or %NULL + * + * Open a session on the slot. This call may block for an indefinite period. + * + * Returns: (transfer full): the new session + */ +GckSession * +gck_session_open (GckSlot *slot, + GckSessionOptions options, + GTlsInteraction *interaction, + GCancellable *cancellable, + GError **error) +{ + return g_initable_new (GCK_TYPE_SESSION, cancellable, error, + "slot", slot, + "interaction", interaction, + "options", options, + NULL); +} + +/** + * gck_session_open_async: + * @slot: the slot to open session on + * @options: session options + * @interaction: (allow-none): optional interaction for logins or object authentication + * @cancellable: optional cancellation object + * @callback: called when the operation completes + * @user_data: data to pass to callback + * + * Open a session on the slot. This call will return immediately and complete + * asynchronously. + */ +void +gck_session_open_async (GckSlot *slot, + GckSessionOptions options, + GTlsInteraction *interaction, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (GCK_TYPE_SESSION, G_PRIORITY_DEFAULT, + cancellable, callback, user_data, + "slot", slot, + "interaction", interaction, + "options", options, + NULL); +} + +/** + * gck_session_open_finish: + * @result: the result passed to the callback + * @error: location to return an error or %NULL + * + * Get the result of an open session operation. + * + * Returns: (transfer full): the new session + */ +GckSession * +gck_session_open_finish (GAsyncResult *result, + GError **error) +{ + GObject *ret; + GObject *source; + + source = g_async_result_get_source_object (result); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source), result, error); + g_object_unref (source); + + return ret ? GCK_SESSION (ret) : NULL; +} + +/* --------------------------------------------------------------------------------------------- + * INIT PIN + */ + +typedef struct _InitPin { + GckArguments base; + guchar *pin; + gsize n_pin; +} InitPin; + + +static void +free_init_pin (InitPin *args) +{ + g_free (args->pin); + g_free (args); +} + +static CK_RV +perform_init_pin (InitPin *args) +{ + return (args->base.pkcs11->C_InitPIN) (args->base.handle, (CK_BYTE_PTR)args->pin, + args->n_pin); +} + +/** + * gck_session_init_pin: + * @self: Initialize PIN for this session's slot. + * @pin: (allow-none) (array length=n_pin): the user's PIN, or %NULL for + * protected authentication path + * @n_pin: the length of the PIN + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error. + * + * Initialize the user's pin on this slot that this session is opened on. + * According to the PKCS\#11 standards, the session must be logged in with + * the CKU_SO user type. + * + * This call may block for an indefinite period. + * + * Return value: Whether successful or not. + **/ +gboolean +gck_session_init_pin (GckSession *self, const guchar *pin, gsize n_pin, + GCancellable *cancellable, GError **error) +{ + InitPin args = { GCK_ARGUMENTS_INIT, (guchar*)pin, n_pin }; + return _gck_call_sync (self, perform_init_pin, NULL, &args, cancellable, error); + +} + +/** + * gck_session_init_pin_async: + * @self: Initialize PIN for this session's slot. + * @pin: (allow-none) (array length=n_pin): the user's PIN, or %NULL for protected authentication path + * @n_pin: the length of the PIN + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Initialize the user's pin on this slot that this session is opened on. + * According to the PKCS\#11 standards, the session must be logged in with + * the CKU_SO user type. + * + * This call will return immediately and completes asynchronously. + **/ +void +gck_session_init_pin_async (GckSession *self, const guchar *pin, gsize n_pin, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + InitPin* args = _gck_call_async_prep (self, self, perform_init_pin, NULL, sizeof (*args), free_init_pin); + + args->pin = pin && n_pin ? g_memdup (pin, n_pin) : NULL; + args->n_pin = n_pin; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_init_pin_finish: + * @self: The session. + * @result: The result passed to the callback. + * @error: A location to return an error. + * + * Get the result of initializing a user's PIN. + * + * Return value: Whether the operation was successful or not. + **/ +gboolean +gck_session_init_pin_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + return _gck_call_basic_finish (result, error); +} + + +/* --------------------------------------------------------------------------------------------- + * SET PIN + */ + +typedef struct _SetPin { + GckArguments base; + guchar *old_pin; + gsize n_old_pin; + guchar *new_pin; + gsize n_new_pin; +} SetPin; + +static void +free_set_pin (SetPin *args) +{ + g_free (args->old_pin); + g_free (args->new_pin); + g_free (args); +} + +static CK_RV +perform_set_pin (SetPin *args) +{ + return (args->base.pkcs11->C_SetPIN) (args->base.handle, (CK_BYTE_PTR)args->old_pin, + args->n_old_pin, args->new_pin, args->n_new_pin); +} + +/** + * gck_session_set_pin: + * @self: Change the PIN for this session's slot. + * @old_pin: (allow-none) (array length=n_old_pin): the user's old PIN, or %NULL + * for protected authentication path. + * @n_old_pin: The length of the PIN. + * @new_pin: (allow-none) (array length=n_new_pin): the user's new PIN, or %NULL + * for protected authentication path + * @n_new_pin: The length of the PIN. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error. + * + * Change the user's pin on this slot that this session is opened on. + * + * This call may block for an indefinite period. + * + * Return value: Whether successful or not. + **/ +gboolean +gck_session_set_pin (GckSession *self, const guchar *old_pin, gsize n_old_pin, + const guchar *new_pin, gsize n_new_pin, GCancellable *cancellable, + GError **error) +{ + SetPin args = { GCK_ARGUMENTS_INIT, (guchar*)old_pin, n_old_pin, (guchar*)new_pin, n_new_pin }; + return _gck_call_sync (self, perform_set_pin, NULL, &args, cancellable, error); +} + +/** + * gck_session_set_pin_async: + * @self: Change the PIN for this session's slot. + * @old_pin: (allow-none) (array length=n_new_pin): the user's old PIN, or %NULL + * for protected authentication path + * @n_old_pin: the length of the old PIN + * @new_pin: (allow-none) (array length=n_new_pin): the user's new PIN, or %NULL + * for protected authentication path + * @n_new_pin: the length of the new PIN + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Change the user's pin on this slot that this session is opened on. + * + * This call will return immediately and completes asynchronously. + **/ +void +gck_session_set_pin_async (GckSession *self, const guchar *old_pin, gsize n_old_pin, + const guchar *new_pin, gsize n_new_pin, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + SetPin* args = _gck_call_async_prep (self, self, perform_set_pin, NULL, sizeof (*args), free_set_pin); + + args->old_pin = old_pin && n_old_pin ? g_memdup (old_pin, n_old_pin) : NULL; + args->n_old_pin = n_old_pin; + args->new_pin = new_pin && n_new_pin ? g_memdup (new_pin, n_new_pin) : NULL; + args->n_new_pin = n_new_pin; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_set_pin_finish: + * @self: The session. + * @result: The result passed to the callback. + * @error: A location to return an error. + * + * Get the result of changing a user's PIN. + * + * Return value: Whether the operation was successful or not. + **/ +gboolean +gck_session_set_pin_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + return _gck_call_basic_finish (result, error); +} + + +/* --------------------------------------------------------------------------------------------- + * LOGIN + */ + +typedef struct _Login { + GckArguments base; + gulong user_type; + guchar *pin; + gsize n_pin; +} Login; + +static void +free_login (Login *args) +{ + g_free (args->pin); + g_free (args); +} + +static CK_RV +perform_login (Login *args) +{ + return (args->base.pkcs11->C_Login) (args->base.handle, args->user_type, + (CK_BYTE_PTR)args->pin, args->n_pin); +} + +/** + * gck_session_login: + * @self: Log in to this session. + * @user_type: The type of login user. + * @pin: (allow-none) (array length=n_pin): the user's PIN, or %NULL for + * protected authentication path + * @n_pin: The length of the PIN. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error. + * + * Login the user on the session. This call may block for + * an indefinite period. + * + * Return value: Whether successful or not. + **/ +gboolean +gck_session_login (GckSession *self, gulong user_type, const guchar *pin, + gsize n_pin, GCancellable *cancellable, GError **error) +{ + Login args = { GCK_ARGUMENTS_INIT, user_type, (guchar*)pin, n_pin }; + return _gck_call_sync (self, perform_login, NULL, &args, cancellable, error); + +} + +/** + * gck_session_login_async: + * @self: Log in to this session. + * @user_type: The type of login user. + * @pin: (allow-none) (array length=n_pin): the user's PIN, or %NULL for + * protected authentication path + * @n_pin: The length of the PIN. + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Login the user on the session. This call will return + * immediately and completes asynchronously. + **/ +void +gck_session_login_async (GckSession *self, gulong user_type, const guchar *pin, + gsize n_pin, GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + Login* args = _gck_call_async_prep (self, self, perform_login, NULL, sizeof (*args), free_login); + + args->user_type = user_type; + args->pin = pin && n_pin ? g_memdup (pin, n_pin) : NULL; + args->n_pin = n_pin; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_login_finish: + * @self: The session logged into. + * @result: The result passed to the callback. + * @error: A location to return an error. + * + * Get the result of a login operation. + * + * Return value: Whether the operation was successful or not. + **/ +gboolean +gck_session_login_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + return _gck_call_basic_finish (result, error); +} + +typedef struct _Interactive { + GckArguments base; + GTlsInteraction *interaction; + GCancellable *cancellable; + GckSlot *token; +} Interactive; + +static void +free_interactive (Interactive *args) +{ + g_clear_object (&args->token); + g_clear_object (&args->cancellable); + g_clear_object (&args->interaction); + g_free (args); +} + +static CK_RV +perform_interactive (Interactive *args) +{ + return _gck_session_authenticate_token (args->base.pkcs11, args->base.handle, + args->token, args->interaction, args->cancellable); +} + +/** + * gck_session_login_interactive: + * @self: session to use for login + * @user_type: the type of login user + * @interaction: (allow-none): interaction to request PIN when necessary + * @cancellable: optional cancellation object, or %NULL + * @error: location to return an error + * + * Login the user on the session requesting the password interactively + * when necessary. This call may block for an indefinite period. + * + * Return value: Whether successful or not. + */ +gboolean +gck_session_login_interactive (GckSession *self, + gulong user_type, + GTlsInteraction *interaction, + GCancellable *cancellable, + GError **error) +{ + Interactive args = { GCK_ARGUMENTS_INIT, interaction, cancellable, NULL, }; + + g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); + g_return_val_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction), FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + /* TODO: For now this is all we support */ + g_return_val_if_fail (user_type == CKU_USER, FALSE); + + args.token = self->pv->slot; + + return _gck_call_sync (self, perform_interactive, NULL, &args, cancellable, error); +} + +/** + * gck_session_login_interactive_async: + * @self: session to use for login + * @user_type: the type of login user + * @interaction: (allow-none): interaction to request PIN when necessary + * @cancellable: optional cancellation object, or %NULL + * @callback: called when the operation completes + * @user_data: data to pass to the callback + * + * Login the user on the session prompting for passwords interactively when + * necessary. This call will return immediately and completes asynchronously. + **/ +void +gck_session_login_interactive_async (GckSession *self, + gulong user_type, + GTlsInteraction *interaction, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + Interactive* args = _gck_call_async_prep (self, self, perform_interactive, NULL, sizeof (*args), free_interactive); + + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + /* TODO: For now this is all we support */ + g_return_if_fail (user_type == CKU_USER); + + args->cancellable = cancellable ? g_object_ref (cancellable) : NULL; + args->interaction = interaction ? g_object_ref (interaction) : NULL; + args->token = g_object_ref (self->pv->slot); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_login_interactive_finish: + * @self: the session logged into + * @result: the result passed to the callback + * @error: location to return an error + * + * Get the result of a login operation. + * + * Return value: Whether the operation was successful or not. + **/ +gboolean +gck_session_login_interactive_finish (GckSession *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); + + return _gck_call_basic_finish (result, error); +} + +/* LOGOUT */ + +static CK_RV +perform_logout (GckArguments *args) +{ + return (args->pkcs11->C_Logout) (args->handle); +} + +/** + * gck_session_logout: + * @self: Logout of this session. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error. + * + * Log out of the session. This call may block for an indefinite period. + * + * Return value: Whether the logout was successful or not. + **/ +gboolean +gck_session_logout (GckSession *self, GCancellable *cancellable, GError **error) +{ + GckArguments args = GCK_ARGUMENTS_INIT; + return _gck_call_sync (self, perform_logout, NULL, &args, cancellable, error); +} + +/** + * gck_session_logout_async: + * @self: Logout of this session. + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Log out of the session. This call returns immediately and completes + * asynchronously. + **/ +void +gck_session_logout_async (GckSession *self, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GckArguments *args = _gck_call_async_prep (self, self, perform_logout, NULL, 0, NULL); + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_logout_finish: + * @self: Logout of this session. + * @result: The result passed to the callback. + * @error: A location to return an error. + * + * Get the result of logging out of a session. + * + * Return value: Whether the logout was successful or not. + **/ +gboolean +gck_session_logout_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + return _gck_call_basic_finish (result, error); +} + + + + +/* CREATE OBJECT */ + +typedef struct _CreateObject { + GckArguments base; + GckAttributes *attrs; + CK_OBJECT_HANDLE object; +} CreateObject; + +static void +free_create_object (CreateObject *args) +{ + gck_attributes_unref (args->attrs); + g_free (args); +} + +static CK_RV +perform_create_object (CreateObject *args) +{ + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs; + CK_RV rv; + + attrs = _gck_attributes_commit_out (args->attrs, &n_attrs); + + rv = (args->base.pkcs11->C_CreateObject) (args->base.handle, + attrs, n_attrs, + &args->object); + + gchar *string = gck_attributes_to_string (args->attrs); + if (rv == CKR_OK) + g_debug ("created object: %s", string); + else + g_debug ("failed %s to create object: %s", + _gck_stringize_rv (rv), string); + g_free (string); + + return rv; +} + +/** + * gck_session_create_object: + * @self: The session to create the object on. + * @attrs: The attributes to create the object with. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Create a new PKCS\#11 object. This call may block for an + * indefinite period. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * Returns: (transfer full): the newly created object or %NULL if an error occurred + **/ +GckObject * +gck_session_create_object (GckSession *self, GckAttributes *attrs, + GCancellable *cancellable, GError **error) +{ + CreateObject args = { GCK_ARGUMENTS_INIT, attrs, 0 }; + gboolean ret; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + g_return_val_if_fail (attrs != NULL, NULL); + + gck_attributes_ref_sink (attrs); + ret = _gck_call_sync (self, perform_create_object, NULL, &args, cancellable, error); + gck_attributes_unref (attrs); + + if (!ret) + return NULL; + + return gck_object_from_handle (self, args.object); +} + +/** + * gck_session_create_object_async: + * @self: The session to create the object on. + * @attrs: The attributes to create the object with. + * @cancellable: Optional cancellation object or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Create a new PKCS\#11 object. This call will return immediately + * and complete asynchronously. + * + * If the @attrs #GckAttributes is floating, it is consumed. + **/ +void +gck_session_create_object_async (GckSession *self, GckAttributes *attrs, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + CreateObject *args = _gck_call_async_prep (self, self, perform_create_object, + NULL, sizeof (*args), free_create_object); + + g_return_if_fail (attrs); + + args->attrs = gck_attributes_ref_sink (attrs); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_create_object_finish: + * @self: The session to create the object on. + * @result: The result passed to the callback. + * @error: A location to return an error, or NULL. + * + * Get the result of creating a new PKCS\#11 object. + * + * Return value: (transfer full): the newly created object or NULL if an error occurred + **/ +GckObject * +gck_session_create_object_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + CreateObject *args; + + args = _gck_call_arguments (result, CreateObject); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + return gck_object_from_handle (self, args->object); +} + + + +/* FIND OBJECTS */ + +typedef struct _FindObjects { + GckArguments base; + GckAttributes *attrs; + CK_OBJECT_HANDLE_PTR objects; + CK_ULONG n_objects; +} FindObjects; + +static void +free_find_objects (FindObjects *args) +{ + gck_attributes_unref (args->attrs); + g_free (args->objects); + g_free (args); +} + +static CK_RV +perform_find_objects (FindObjects *args) +{ + CK_OBJECT_HANDLE_PTR batch; + CK_ULONG n_batch, n_found; + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs; + GArray *array; + CK_RV rv; + + gchar *string = gck_attributes_to_string (args->attrs); + g_debug ("matching: %s", string); + g_free (string); + + attrs = _gck_attributes_commit_out (args->attrs, &n_attrs); + + rv = (args->base.pkcs11->C_FindObjectsInit) (args->base.handle, + attrs, n_attrs); + if (rv != CKR_OK) + return rv; + + batch = NULL; + n_found = n_batch = 4; + array = g_array_new (0, 1, sizeof (CK_OBJECT_HANDLE)); + + do { + /* + * Reallocate and double in size: + * - First time. + * - Each time we found as many as batch + */ + + if (n_found == n_batch) { + n_batch *= 2; + batch = g_realloc (batch, sizeof (CK_OBJECT_HANDLE) * n_batch); + } + + rv = (args->base.pkcs11->C_FindObjects) (args->base.handle, + batch, n_batch, &n_found); + if (rv != CKR_OK) + break; + + g_array_append_vals (array, batch, n_found); + + } while (n_found > 0); + + g_free (batch); + + if (rv == CKR_OK) { + args->n_objects = array->len; + args->objects = (CK_OBJECT_HANDLE_PTR)g_array_free (array, FALSE); + rv = (args->base.pkcs11->C_FindObjectsFinal) (args->base.handle); + } else { + args->objects = NULL; + args->n_objects = 0; + g_array_free (array, TRUE); + } + + return rv; +} + +/** + * gck_session_find_handles: + * @self: the session to find objects on + * @match: the attributes to match against objects + * @cancellable: optional cancellation object or %NULL + * @n_handles: location to return number of handles + * @error: a location to return an error or %NULL + * + * Find the objects matching the passed attributes. This call may + * block for an indefinite period. + * + * If the @match #GckAttributes is floating, it is consumed. + * + * Returns: (transfer full) (array length=n_handles) (allow-none): a list of + * the matching objects, which may be empty + **/ +gulong * +gck_session_find_handles (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + gulong *n_handles, + GError **error) +{ + FindObjects args = { GCK_ARGUMENTS_INIT, match, NULL, 0 }; + gulong *results = NULL; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + g_return_val_if_fail (match != NULL, NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (n_handles != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + gck_attributes_ref_sink (match); + if (_gck_call_sync (self, perform_find_objects, NULL, &args, cancellable, error)) { + results = args.objects; + *n_handles = args.n_objects; + args.objects = NULL; + } + gck_attributes_unref (match); + + g_free (args.objects); + return results; +} + +/** + * gck_session_find_handles_async: + * @self: the session to find objects on + * @match: the attributes to match against the objects + * @cancellable: optional cancellation object or %NULL + * @callback: called when the operation completes + * @user_data: data to pass to the callback + * + * Find the objects matching the passed attributes. This call will + * return immediately and complete asynchronously. + * + * If the @match #GckAttributes is floating, it is consumed. + **/ +void +gck_session_find_handles_async (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + FindObjects *args; + + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (match != NULL); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + args = _gck_call_async_prep (self, self, perform_find_objects, + NULL, sizeof (*args), free_find_objects); + args->attrs = gck_attributes_ref_sink (match); + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_find_handles_finish: + * @self: the session + * @result: the asynchronous result + * @n_handles: location to store number of handles returned + * @error: a location to return an error on failure + * + * Get the result of a find handles operation. + * + * Returns: (transfer full) (array length=n_handles) (allow-none): an array of + * handles that matched, which may be empty, or %NULL on failure + **/ +gulong * +gck_session_find_handles_finish (GckSession *self, + GAsyncResult *result, + gulong *n_handles, + GError **error) +{ + gulong *results = NULL; + FindObjects *args; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + g_return_val_if_fail (n_handles != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + args = _gck_call_arguments (result, FindObjects); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + *n_handles = args->n_objects; + results = args->objects; + args->objects = NULL; + return results; +} + +/** + * gck_session_find_objects: + * @self: The session to find objects on. + * @match: the attributes to match + * @cancellable: Optional cancellation object or NULL. + * @error: A location to return an error or NULL. + * + * Find the objects matching the passed attributes. This call may + * block for an indefinite period. + * + * If the @match #GckAttributes is floating, it is consumed. + * + * Returns: (transfer full) (element-type Gck.Object): a list of the matching + * objects, which may be empty + **/ +GList * +gck_session_find_objects (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + GError **error) +{ + GList *results = NULL; + gulong *handles; + gulong n_handles; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + g_return_val_if_fail (match != NULL, NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + handles = gck_session_find_handles (self, match, cancellable, &n_handles, error); + if (handles == NULL) + return NULL; + + results = gck_objects_from_handle_array (self, handles, n_handles); + g_free (handles); + return results; +} + +/** + * gck_session_find_objects_async: + * @self: The session to find objects on. + * @match: The attributes to match. + * @cancellable: Optional cancellation object or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Find the objects matching the passed attributes. This call will + * return immediately and complete asynchronously. + * + * If the @match #GckAttributes is floating, it is consumed. + **/ +void +gck_session_find_objects_async (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (match != NULL); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + gck_session_find_handles_async (self, match, cancellable, callback, user_data); +} + +/** + * gck_session_find_objects_finish: + * @self: The session to find objects on. + * @result: The attributes to match. + * @error: A location to return an error. + * + * Get the result of a find operation. + * + * Returns: (transfer full) (element-type Gck.Object): a list of the matching + * objects, which may be empty + **/ +GList * +gck_session_find_objects_finish (GckSession *self, + GAsyncResult *result, + GError **error) +{ + GList *results = NULL; + gulong *handles; + gulong n_handles; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + handles = gck_session_find_handles_finish (self, result, &n_handles, error); + if (handles == NULL) + return NULL; + + results = gck_objects_from_handle_array (self, handles, n_handles); + g_free (handles); + return results; + +} + +/** + * gck_session_enumerate_objects: + * @self: session to enumerate objects on + * @match: attributes that the objects must match, or empty for all objects + * + * Setup an enumerator for listing matching objects available via this session. + * + * If the @match #GckAttributes is floating, it is consumed. + * + * This call will not block but will return an enumerator immediately. + * + * Returns: (transfer full): a new enumerator + **/ +GckEnumerator * +gck_session_enumerate_objects (GckSession *session, + GckAttributes *match) +{ + GckUriData *uri_data; + + g_return_val_if_fail (match != NULL, NULL); + + uri_data = gck_uri_data_new (); + uri_data->attributes = gck_attributes_ref_sink (match); + + return _gck_enumerator_new_for_session (session, uri_data); +} + +/* ----------------------------------------------------------------------------- + * KEY PAIR GENERATION + */ + +typedef struct _GenerateKeyPair { + GckArguments base; + GckMechanism mechanism; + GckAttributes *public_attrs; + GckAttributes *private_attrs; + CK_OBJECT_HANDLE public_key; + CK_OBJECT_HANDLE private_key; +} GenerateKeyPair; + +static void +free_generate_key_pair (GenerateKeyPair *args) +{ + gck_attributes_unref (args->public_attrs); + gck_attributes_unref (args->private_attrs); + g_free (args); +} + +static CK_RV +perform_generate_key_pair (GenerateKeyPair *args) +{ + CK_ATTRIBUTE_PTR pub_attrs, priv_attrs; + CK_ULONG n_pub_attrs, n_priv_attrs; + + g_assert (sizeof (CK_MECHANISM) == sizeof (GckMechanism)); + + pub_attrs = _gck_attributes_commit_out (args->public_attrs, &n_pub_attrs); + priv_attrs = _gck_attributes_commit_out (args->private_attrs, &n_priv_attrs); + + return (args->base.pkcs11->C_GenerateKeyPair) (args->base.handle, + (CK_MECHANISM_PTR)&(args->mechanism), + pub_attrs, n_pub_attrs, + priv_attrs, n_priv_attrs, + &args->public_key, + &args->private_key); +} + +/** + * gck_session_generate_key_pair: + * @self: The session to use. + * @mech_type: The mechanism type to use for key generation. + * @public_attrs: Additional attributes for the generated public key. + * @private_attrs: Additional attributes for the generated private key. + * @public_key: (allow-none) (out): location to return the resulting public key + * @private_key: (allow-none) (out): location to return the resulting private key. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Generate a new key pair of public and private keys. This call may block for an + * indefinite period. + * + * If the @public_attrs and/or @private_attrs #GckAttributes is floating, it is + * consumed. + * + * Return value: TRUE if the operation succeeded. + **/ +gboolean +gck_session_generate_key_pair (GckSession *self, gulong mech_type, + GckAttributes *public_attrs, GckAttributes *private_attrs, + GckObject **public_key, GckObject **private_key, + GCancellable *cancellable, GError **error) +{ + GckMechanism mech = { mech_type, NULL, 0 }; + return gck_session_generate_key_pair_full (self, &mech, public_attrs, private_attrs, public_key, private_key, cancellable, error); +} + +/** + * gck_session_generate_key_pair_full: + * @self: The session to use. + * @mechanism: The mechanism to use for key generation. + * @public_attrs: Additional attributes for the generated public key. + * @private_attrs: Additional attributes for the generated private key. + * @public_key: (allow-none) (out): a location to return the resulting public key + * @private_key: (allow-none) (out): a location to return the resulting private key + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Generate a new key pair of public and private keys. This call may block for an + * indefinite period. + * + * If the @public_attrs and/or @private_attrs #GckAttributes is floating, it is + * consumed. + * + * Return value: TRUE if the operation succeeded. + **/ +gboolean +gck_session_generate_key_pair_full (GckSession *self, + GckMechanism *mechanism, + GckAttributes *public_attrs, + GckAttributes *private_attrs, + GckObject **public_key, + GckObject **private_key, + GCancellable *cancellable, + GError **error) +{ + GenerateKeyPair args = { GCK_ARGUMENTS_INIT, GCK_MECHANISM_EMPTY, public_attrs, private_attrs, 0, 0 }; + gboolean ret; + + g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); + g_return_val_if_fail (mechanism, FALSE); + g_return_val_if_fail (public_attrs, FALSE); + g_return_val_if_fail (private_attrs, FALSE); + + /* Shallow copy of the mechanism structure */ + memcpy (&args.mechanism, mechanism, sizeof (args.mechanism)); + + gck_attributes_ref_sink (public_attrs); + gck_attributes_ref_sink (private_attrs); + + ret = _gck_call_sync (self, perform_generate_key_pair, NULL, &args, cancellable, error); + + gck_attributes_unref (private_attrs); + gck_attributes_unref (public_attrs); + + if (!ret) + return FALSE; + + if (public_key) + *public_key = gck_object_from_handle (self, args.public_key); + if (private_key) + *private_key = gck_object_from_handle (self, args.private_key); + return TRUE; +} + +/** + * gck_session_generate_key_pair_async: + * @self: The session to use. + * @mechanism: The mechanism to use for key generation. + * @public_attrs: Additional attributes for the generated public key. + * @private_attrs: Additional attributes for the generated private key. + * @cancellable: Optional cancellation object or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Generate a new key pair of public and private keys. This call will + * return immediately and complete asynchronously. + * + * If the @public_attrs and/or @private_attrs #GckAttributes is floating, it is + * consumed. + **/ +void +gck_session_generate_key_pair_async (GckSession *self, GckMechanism *mechanism, + GckAttributes *public_attrs, GckAttributes *private_attrs, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + GenerateKeyPair *args = _gck_call_async_prep (self, self, perform_generate_key_pair, + NULL, sizeof (*args), free_generate_key_pair); + + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (mechanism); + g_return_if_fail (public_attrs); + g_return_if_fail (private_attrs); + + /* Shallow copy of the mechanism structure */ + memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); + + args->public_attrs = gck_attributes_ref_sink (public_attrs); + args->private_attrs = gck_attributes_ref_sink (private_attrs); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_generate_key_pair_finish: + * @self: The session to use. + * @result: The async result passed to the callback. + * @public_key: (allow-none) (out): a location to return the resulting public key + * @private_key: (allow-none) (out): a location to return the resulting private key + * @error: A location to return an error. + * + * Get the result of a generate key pair operation. + * + * Return value: TRUE if the operation succeeded. + **/ +gboolean +gck_session_generate_key_pair_finish (GckSession *self, + GAsyncResult *result, + GckObject **public_key, + GckObject **private_key, + GError **error) +{ + GenerateKeyPair *args; + + g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + args = _gck_call_arguments (result, GenerateKeyPair); + + if (!_gck_call_basic_finish (result, error)) + return FALSE; + + if (public_key) + *public_key = gck_object_from_handle (self, args->public_key); + if (private_key) + *private_key = gck_object_from_handle (self, args->private_key); + return TRUE; +} + +/* ----------------------------------------------------------------------------- + * KEY WRAPPING + */ + +typedef struct _WrapKey { + GckArguments base; + GckMechanism mechanism; + CK_OBJECT_HANDLE wrapper; + CK_OBJECT_HANDLE wrapped; + gpointer result; + gulong n_result; +} WrapKey; + +static void +free_wrap_key (WrapKey *args) +{ + g_free (args->result); + g_free (args); +} + +static CK_RV +perform_wrap_key (WrapKey *args) +{ + CK_RV rv; + + g_assert (sizeof (CK_MECHANISM) == sizeof (GckMechanism)); + + /* Get the length of the result */ + rv = (args->base.pkcs11->C_WrapKey) (args->base.handle, + (CK_MECHANISM_PTR)&(args->mechanism), + args->wrapper, args->wrapped, + NULL, &args->n_result); + if (rv != CKR_OK) + return rv; + + /* And try again with a real buffer */ + args->result = g_malloc0 (args->n_result); + return (args->base.pkcs11->C_WrapKey) (args->base.handle, + (CK_MECHANISM_PTR)&(args->mechanism), + args->wrapper, args->wrapped, + args->result, &args->n_result); +} + +/** + * gck_session_wrap_key: + * @self: The session to use. + * @wrapper: The key to use for wrapping. + * @mech_type: The mechanism type to use for wrapping. + * @wrapped: The key to wrap. + * @n_result: A location in which to return the length of the wrapped data. + * @cancellable: A #GCancellable or %NULL + * @error: A location to return an error, or NULL. + * + * Wrap a key into a byte stream. This call may block for an + * indefinite period. + * + * Returns: (transfer full) (array length=n_result): the wrapped data or %NULL + * if the operation failed + **/ +guchar * +gck_session_wrap_key (GckSession *self, GckObject *key, gulong mech_type, + GckObject *wrapped, gsize *n_result, GCancellable *cancellable, GError **error) +{ + GckMechanism mech = { mech_type, NULL, 0 }; + return gck_session_wrap_key_full (self, key, &mech, wrapped, n_result, cancellable, error); +} + +/** + * gck_session_wrap_key_full: + * @self: The session to use. + * @wrapper: The key to use for wrapping. + * @mechanism: The mechanism to use for wrapping. + * @wrapped: The key to wrap. + * @n_result: A location in which to return the length of the wrapped data. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Wrap a key into a byte stream. This call may block for an + * indefinite period. + * + * Returns: (transfer full) (array length=n_result): the wrapped data or %NULL + * if the operation failed + **/ +guchar * +gck_session_wrap_key_full (GckSession *self, GckObject *wrapper, GckMechanism *mechanism, + GckObject *wrapped, gsize *n_result, GCancellable *cancellable, + GError **error) +{ + WrapKey args = { GCK_ARGUMENTS_INIT, GCK_MECHANISM_EMPTY, 0, 0, NULL, 0 }; + gboolean ret; + + g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); + g_return_val_if_fail (mechanism, FALSE); + g_return_val_if_fail (GCK_IS_OBJECT (wrapped), FALSE); + g_return_val_if_fail (GCK_IS_OBJECT (wrapper), FALSE); + g_return_val_if_fail (n_result, FALSE); + + /* Shallow copy of the mechanism structure */ + memcpy (&args.mechanism, mechanism, sizeof (args.mechanism)); + + g_object_get (wrapper, "handle", &args.wrapper, NULL); + g_return_val_if_fail (args.wrapper != 0, NULL); + g_object_get (wrapped, "handle", &args.wrapped, NULL); + g_return_val_if_fail (args.wrapped != 0, NULL); + + ret = _gck_call_sync (self, perform_wrap_key, NULL, &args, cancellable, error); + + if (!ret) + return FALSE; + + *n_result = args.n_result; + return args.result; +} + +/** + * gck_session_wrap_key_async: + * @self: The session to use. + * @wrapper: The key to use for wrapping. + * @mechanism: The mechanism to use for wrapping. + * @wrapped: The key to wrap. + * @cancellable: Optional cancellation object or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Wrap a key into a byte stream. This call will + * return immediately and complete asynchronously. + **/ +void +gck_session_wrap_key_async (GckSession *self, GckObject *key, GckMechanism *mechanism, + GckObject *wrapped, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + WrapKey *args = _gck_call_async_prep (self, self, perform_wrap_key, + NULL, sizeof (*args), free_wrap_key); + + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (mechanism); + g_return_if_fail (GCK_IS_OBJECT (wrapped)); + g_return_if_fail (GCK_IS_OBJECT (key)); + + /* Shallow copy of the mechanism structure */ + memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); + + g_object_get (key, "handle", &args->wrapper, NULL); + g_return_if_fail (args->wrapper != 0); + g_object_get (wrapped, "handle", &args->wrapped, NULL); + g_return_if_fail (args->wrapped != 0); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_wrap_key_finish: + * @self: The session to use. + * @result: The async result passed to the callback. + * @n_result: A location in which to return the length of the wrapped data. + * @error: A location to return an error. + * + * Get the result of a wrap key operation. + * + * Returns: (transfer full) (array length=n_result): the wrapped data or %NULL + * if the operation failed + **/ +guchar * +gck_session_wrap_key_finish (GckSession *self, GAsyncResult *result, + gsize *n_result, GError **error) +{ + WrapKey *args; + gpointer ret; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + g_return_val_if_fail (n_result, NULL); + + args = _gck_call_arguments (result, WrapKey); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + + *n_result = args->n_result; + args->n_result = 0; + ret = args->result; + args->result = NULL; + + return ret; +} + +/* ----------------------------------------------------------------------------- + * KEY UNWRAPPING + */ + +typedef struct _UnwrapKey { + GckArguments base; + GckMechanism mechanism; + GckAttributes *attrs; + CK_OBJECT_HANDLE wrapper; + gconstpointer input; + gulong n_input; + CK_OBJECT_HANDLE unwrapped; +} UnwrapKey; + +static void +free_unwrap_key (UnwrapKey *args) +{ + gck_attributes_unref (args->attrs); + g_free (args); +} + +static CK_RV +perform_unwrap_key (UnwrapKey *args) +{ + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs; + + g_assert (sizeof (CK_MECHANISM) == sizeof (GckMechanism)); + + attrs = _gck_attributes_commit_out (args->attrs, &n_attrs); + + return (args->base.pkcs11->C_UnwrapKey) (args->base.handle, + (CK_MECHANISM_PTR)&(args->mechanism), + args->wrapper, (CK_BYTE_PTR)args->input, + args->n_input, attrs, n_attrs, + &args->unwrapped); +} + +/** + * gck_session_unwrap_key: + * @self: The session to use. + * @wrapper: The key to use for unwrapping. + * @mech_type: The mechanism to use for unwrapping. + * @input: (array length=n_input): the wrapped data as a byte stream + * @n_input: The length of the wrapped data. + * @attrs: Additional attributes for the unwrapped key. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Unwrap a key from a byte stream. This call may block for an + * indefinite period. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * Returns: (transfer full): the new unwrapped key or NULL if the + * operation failed + **/ +GckObject * +gck_session_unwrap_key (GckSession *self, + GckObject *wrapper, + gulong mech_type, + const guchar *input, + gsize n_input, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error) +{ + GckMechanism mech = { mech_type, NULL, 0 }; + return gck_session_unwrap_key_full (self, wrapper, &mech, input, n_input, attrs, cancellable, error); +} + +/** + * gck_session_unwrap_key_full: + * @self: The session to use. + * @wrapper: The key to use for unwrapping. + * @mechanism: The mechanism to use for unwrapping. + * @input: (array length=n_input): the wrapped data as a byte stream + * @n_input: The length of the wrapped data. + * @attrs: Additional attributes for the unwrapped key. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Unwrap a key from a byte stream. This call may block for an + * indefinite period. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * Returns: (transfer full): the new unwrapped key or NULL if the operation + * failed + **/ +GckObject * +gck_session_unwrap_key_full (GckSession *self, + GckObject *wrapper, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error) +{ + UnwrapKey args = { GCK_ARGUMENTS_INIT, GCK_MECHANISM_EMPTY, attrs, 0, input, n_input, 0 }; + gboolean ret; + + g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); + g_return_val_if_fail (GCK_IS_OBJECT (wrapper), FALSE); + g_return_val_if_fail (mechanism, FALSE); + g_return_val_if_fail (attrs, FALSE); + + /* Shallow copy of the mechanism structure */ + memcpy (&args.mechanism, mechanism, sizeof (args.mechanism)); + + g_object_get (wrapper, "handle", &args.wrapper, NULL); + g_return_val_if_fail (args.wrapper != 0, NULL); + + gck_attributes_ref_sink (attrs); + + ret = _gck_call_sync (self, perform_unwrap_key, NULL, &args, cancellable, error); + + gck_attributes_unref (attrs); + + if (!ret) + return NULL; + + return gck_object_from_handle (self, args.unwrapped); +} + +/** + * gck_session_unwrap_key_async: + * @self: The session to use. + * @wrapper: The key to use for unwrapping. + * @mechanism: The mechanism to use for unwrapping. + * @input: (array length=n_input): the wrapped data as a byte stream + * @n_input: The length of the wrapped data. + * @attrs: Additional attributes for the unwrapped key. + * @cancellable: Optional cancellation object or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Unwrap a key from a byte stream. This call will + * return immediately and complete asynchronously. + * + * If the @attrs #GckAttributes is floating, it is consumed. + **/ +void +gck_session_unwrap_key_async (GckSession *self, + GckObject *wrapper, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + GckAttributes *attrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + UnwrapKey *args = _gck_call_async_prep (self, self, perform_unwrap_key, + NULL, sizeof (*args), free_unwrap_key); + + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (GCK_IS_OBJECT (wrapper)); + g_return_if_fail (attrs); + + g_object_get (wrapper, "handle", &args->wrapper, NULL); + g_return_if_fail (args->wrapper != 0); + + /* Shallow copy of the mechanism structure */ + memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); + + args->attrs = gck_attributes_ref_sink (attrs); + args->input = input; + args->n_input = n_input; + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_unwrap_key_finish: + * @self: The session to use. + * @result: The async result passed to the callback. + * @error: A location to return an error. + * + * Get the result of a unwrap key operation. + * + * Returns: (transfer full): the new unwrapped key or %NULL if the operation + * failed. + **/ +GckObject * +gck_session_unwrap_key_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + UnwrapKey *args; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + + args = _gck_call_arguments (result, UnwrapKey); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + return gck_object_from_handle (self, args->unwrapped); +} + +/* ----------------------------------------------------------------------------- + * KEY DERIVATION + */ + +typedef struct _DeriveKey { + GckArguments base; + GckMechanism mechanism; + GckAttributes *attrs; + CK_OBJECT_HANDLE key; + CK_OBJECT_HANDLE derived; +} DeriveKey; + +static void +free_derive_key (DeriveKey *args) +{ + gck_attributes_unref (args->attrs); + g_free (args); +} + +static CK_RV +perform_derive_key (DeriveKey *args) +{ + CK_ATTRIBUTE_PTR attrs; + CK_ULONG n_attrs; + + g_assert (sizeof (CK_MECHANISM) == sizeof (GckMechanism)); + + attrs = _gck_attributes_commit_out (args->attrs, &n_attrs); + + return (args->base.pkcs11->C_DeriveKey) (args->base.handle, + (CK_MECHANISM_PTR)&(args->mechanism), + args->key, attrs, n_attrs, + &args->derived); +} + +/** + * gck_session_derive_key: + * @self: The session to use. + * @base: The key to derive from. + * @mech_type: The mechanism to use for derivation. + * @attrs: Additional attributes for the derived key. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Derive a key from another key. This call may block for an + * indefinite period. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * Returns: (transfer full): the new derived key or NULL if the operation + * failed + **/ +GckObject * +gck_session_derive_key (GckSession *self, GckObject *base, gulong mech_type, + GckAttributes *attrs, GCancellable *cancellable, GError **error) +{ + GckMechanism mech = { mech_type, NULL, 0 }; + return gck_session_derive_key_full (self, base, &mech, attrs, cancellable, error); +} + +/** + * gck_session_derive_key_full: + * @self: The session to use. + * @base: The key to derive from. + * @mechanism: The mechanism to use for derivation. + * @attrs: Additional attributes for the derived key. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Derive a key from another key. This call may block for an + * indefinite period. + * + * If the @attrs #GckAttributes is floating, it is consumed. + * + * Returns: (transfer full): the new derived key or NULL if the operation + * failed + **/ +GckObject* +gck_session_derive_key_full (GckSession *self, GckObject *base, GckMechanism *mechanism, + GckAttributes *attrs, GCancellable *cancellable, GError **error) +{ + DeriveKey args = { GCK_ARGUMENTS_INIT, GCK_MECHANISM_EMPTY, attrs, 0, 0 }; + gboolean ret; + + g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); + g_return_val_if_fail (GCK_IS_OBJECT (base), FALSE); + g_return_val_if_fail (mechanism, FALSE); + g_return_val_if_fail (attrs, FALSE); + + /* Shallow copy of the mechanism structure */ + memcpy (&args.mechanism, mechanism, sizeof (args.mechanism)); + + g_object_get (base, "handle", &args.key, NULL); + g_return_val_if_fail (args.key != 0, NULL); + + gck_attributes_ref_sink (attrs); + + ret = _gck_call_sync (self, perform_derive_key, NULL, &args, cancellable, error); + + gck_attributes_unref (attrs); + + if (!ret) + return NULL; + + return gck_object_from_handle (self, args.derived); +} + +/** + * gck_session_derive_key_async: + * @self: The session to use. + * @base: The key to derive from. + * @mechanism: The mechanism to use for derivation. + * @attrs: Additional attributes for the derived key. + * @cancellable: Optional cancellation object or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Derive a key from another key. This call will + * return immediately and complete asynchronously. + * + * If the @attrs #GckAttributes is floating, it is consumed. + **/ +void +gck_session_derive_key_async (GckSession *self, GckObject *base, GckMechanism *mechanism, + GckAttributes *attrs, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + DeriveKey *args = _gck_call_async_prep (self, self, perform_derive_key, + NULL, sizeof (*args), free_derive_key); + + g_return_if_fail (GCK_IS_SESSION (self)); + g_return_if_fail (GCK_IS_OBJECT (base)); + g_return_if_fail (attrs); + + g_object_get (base, "handle", &args->key, NULL); + g_return_if_fail (args->key != 0); + + /* Shallow copy of the mechanism structure */ + memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); + + args->attrs = gck_attributes_ref_sink (attrs); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_derive_key_finish: + * @self: The session to use. + * @result: The async result passed to the callback. + * @error: A location to return an error. + * + * Get the result of a derive key operation. + * + * Returns: (transfer full): the new derived key or %NULL if the operation + * failed + **/ +GckObject * +gck_session_derive_key_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + DeriveKey *args; + + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); + + args = _gck_call_arguments (result, DeriveKey); + + if (!_gck_call_basic_finish (result, error)) + return NULL; + + return gck_object_from_handle (self, args->derived); +} + +/* -------------------------------------------------------------------------------------------------- + * COMMON CRYPTO ROUTINES + */ + +typedef struct _Crypt { + GckArguments base; + + /* Functions to call */ + CK_C_EncryptInit init_func; + CK_C_Encrypt complete_func; + + /* Interaction */ + GckObject *key_object; + GTlsInteraction *interaction; + + /* Input */ + CK_OBJECT_HANDLE key; + GckMechanism mechanism; + guchar *input; + CK_ULONG n_input; + + /* Output */ + guchar *result; + CK_ULONG n_result; + +} Crypt; + +static CK_RV +perform_crypt (Crypt *args) +{ + GTlsInteraction *interaction; + CK_RV rv; + + g_assert (args); + g_assert (args->init_func); + g_assert (args->complete_func); + g_assert (!args->result); + g_assert (!args->n_result); + + /* Initialize the crypt operation */ + rv = (args->init_func) (args->base.handle, (CK_MECHANISM_PTR)&(args->mechanism), args->key); + if (rv != CKR_OK) + return rv; + + /* Compatibility, hook into GckModule signals if no interaction set */ + if (args->interaction) + interaction = g_object_ref (args->interaction); + else + interaction = _gck_interaction_new (args->key_object); + + rv = _gck_session_authenticate_key (args->base.pkcs11, args->base.handle, + args->key_object, interaction, NULL); + + g_object_unref (interaction); + + if (rv != CKR_OK) + return rv; + + /* Get the length of the result */ + rv = (args->complete_func) (args->base.handle, args->input, args->n_input, NULL, &args->n_result); + if (rv != CKR_OK) + return rv; + + /* And try again with a real buffer */ + args->result = g_malloc0 (args->n_result); + return (args->complete_func) (args->base.handle, args->input, args->n_input, args->result, &args->n_result); +} + +static void +free_crypt (Crypt *args) +{ + g_clear_object (&args->interaction); + g_clear_object (&args->key_object); + + g_free (args->input); + g_free (args->result); + g_free (args); +} + +static guchar* +crypt_sync (GckSession *self, GckObject *key, GckMechanism *mechanism, const guchar *input, + gsize n_input, gsize *n_result, GCancellable *cancellable, GError **error, + CK_C_EncryptInit init_func, CK_C_Encrypt complete_func) +{ + Crypt args; + + g_return_val_if_fail (GCK_IS_OBJECT (key), NULL); + g_return_val_if_fail (mechanism, NULL); + g_return_val_if_fail (init_func, NULL); + g_return_val_if_fail (complete_func, NULL); + + memset (&args, 0, sizeof (args)); + g_object_get (key, "handle", &args.key, NULL); + g_return_val_if_fail (args.key != 0, NULL); + + /* Shallow copy of the mechanism structure */ + memcpy (&args.mechanism, mechanism, sizeof (args.mechanism)); + + /* No need to copy in this case */ + args.input = (guchar*)input; + args.n_input = n_input; + + args.init_func = init_func; + args.complete_func = complete_func; + + args.key_object = key; + args.interaction = gck_session_get_interaction (self); + + if (!_gck_call_sync (self, perform_crypt, NULL, &args, cancellable, error)) { + g_free (args.result); + args.result = NULL; + } else { + *n_result = args.n_result; + } + + g_clear_object (&args.interaction); + return args.result; +} + +static void +crypt_async (GckSession *self, GckObject *key, GckMechanism *mechanism, const guchar *input, + gsize n_input, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data, + CK_C_EncryptInit init_func, CK_C_Encrypt complete_func) +{ + Crypt *args = _gck_call_async_prep (self, self, perform_crypt, NULL, sizeof (*args), free_crypt); + + g_return_if_fail (GCK_IS_OBJECT (key)); + g_return_if_fail (mechanism); + g_return_if_fail (init_func); + g_return_if_fail (complete_func); + + g_object_get (key, "handle", &args->key, NULL); + g_return_if_fail (args->key != 0); + + /* Shallow copy of the mechanism structure */ + memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); + + args->input = input && n_input ? g_memdup (input, n_input) : NULL; + args->n_input = n_input; + + args->init_func = init_func; + args->complete_func = complete_func; + + args->key_object = g_object_ref (key); + args->interaction = gck_session_get_interaction (self); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +static guchar* +crypt_finish (GckSession *self, GAsyncResult *result, gsize *n_result, GError **error) +{ + Crypt *args; + guchar *res; + + if (!_gck_call_basic_finish (result, error)) + return NULL; + args = _gck_call_arguments (result, Crypt); + + /* Steal the values from the results */ + res = args->result; + args->result = NULL; + *n_result = args->n_result; + args->n_result = 0; + + return res; +} + +/* -------------------------------------------------------------------------------------------------- + * ENCRYPT + */ + +/** + * gck_session_encrypt: + * @self: The session. + * @key: The key to encrypt with. + * @mech_type: The mechanism type to use for encryption. + * @input: (array length=n_input): the data to encrypt + * @n_input: the length of the data to encrypt + * @n_result: location to store the length of the result data + * @cancellable: Optional cancellation object, or %NULL + * @error: A location to place error information. + * + * Encrypt data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: (transfer full) (array length=n_result): the data that was encrypted, + * or %NULL if an error occured. + */ +guchar * +gck_session_encrypt (GckSession *self, GckObject *key, gulong mech_type, const guchar *input, + gsize n_input, gsize *n_result, GCancellable *cancellable, GError **error) +{ + GckMechanism mechanism = { mech_type, NULL, 0 }; + return gck_session_encrypt_full (self, key, &mechanism, input, n_input, n_result, cancellable, error); +} + +/** + * gck_session_encrypt_full: + * @self: The session. + * @key: The key to encrypt with. + * @mechanism: The mechanism type and parameters to use for encryption. + * @input: (array length=n_input): the data to encrypt + * @n_input: the length of the data to encrypt + * @n_result: location to store the length of the result data + * @cancellable: A GCancellable which can be used to cancel the operation. + * @error: A location to place error information. + * + * Encrypt data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: (transfer full) (array length=n_result): the data that was encrypted, + * or %NULL if an error occured + */ +guchar * +gck_session_encrypt_full (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, gsize *n_result, + GCancellable *cancellable, GError **error) +{ + GckModule *module = NULL; + CK_FUNCTION_LIST_PTR funcs; + guchar *ret; + + g_object_get (self, "module", &module, NULL); + g_return_val_if_fail (module != NULL, NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (module != NULL, NULL); + + ret = crypt_sync (self, key, mechanism, input, n_input, n_result, cancellable, error, + funcs->C_EncryptInit, funcs->C_Encrypt); + + g_object_unref (module); + return ret; +} + +/** + * gck_session_encrypt_async: + * @self: The session. + * @key: The key to encrypt with. + * @mechanism: The mechanism type and parameters to use for encryption. + * @input: (array length=n_input): the data to encrypt + * @n_input: length of the data to encrypt + * @cancellable: A GCancellable which can be used to cancel the operation. + * @callback: Called when the operation completes. + * @user_data: A pointer to pass to the callback. + * + * Encrypt data in a mechanism specific manner. This call will + * return immediately and complete asynchronously. + **/ +void +gck_session_encrypt_async (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GckModule *module = NULL; + CK_FUNCTION_LIST_PTR funcs; + + g_object_get (self, "module", &module, NULL); + g_return_if_fail (module != NULL); + + funcs = gck_module_get_functions (module); + g_return_if_fail (module != NULL); + + crypt_async (self, key, mechanism, input, n_input, cancellable, callback, user_data, + funcs->C_EncryptInit, funcs->C_Encrypt); + + g_object_unref (module); +} + +/** + * gck_session_encrypt_finish: + * @self: The session. + * @result: The result object passed to the callback. + * @n_result: A location to store the length of the result data. + * @error: A location to place error information. + * + * Get the result of an encryption operation. + * + * Returns: (transfer full) (array length=n_result): the data that was encrypted, + * or %NULL if an error occurred. + */ +guchar* +gck_session_encrypt_finish (GckSession *self, GAsyncResult *result, gsize *n_result, + GError **error) +{ + return crypt_finish (self, result, n_result, error); +} + +/* -------------------------------------------------------------------------------------------------- + * DECRYPT + */ + +/** + * gck_session_decrypt: + * @self: The session. + * @key: The key to decrypt with. + * @mech_type: The mechanism type to use for decryption. + * @input: (array length=n_input): data to decrypt + * @n_input: length of the data to decrypt + * @n_result: location to store the length of the result data + * @cancellable: Optional cancellation object, or %NULL + * @error: A location to place an error. + * + * Decrypt data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: (transfer full) (array length=n_result): the data that was decrypted, + * or NULL if an error occured + */ +guchar * +gck_session_decrypt (GckSession *self, GckObject *key, gulong mech_type, const guchar *input, + gsize n_input, gsize *n_result, GCancellable *cancellable, GError **error) +{ + GckMechanism mechanism = { mech_type, NULL, 0 }; + return gck_session_decrypt_full (self, key, &mechanism, input, n_input, n_result, cancellable, error); +} + +/** + * gck_session_decrypt_full: + * @self: The session. + * @key: The key to decrypt with. + * @mechanism: The mechanism type and parameters to use for decryption. + * @input: (array length=n_input): data to decrypt + * @n_input: length of the data to decrypt + * @n_result: location to store the length of the result data + * @cancellable: A GCancellable which can be used to cancel the operation. + * @error: A location to place error information. + * + * Decrypt data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: (transfer full) (array length=n_result): the data that was decrypted, + * or %NULL if an error occured + */ +guchar * +gck_session_decrypt_full (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, gsize *n_result, + GCancellable *cancellable, GError **error) +{ + GckModule *module = NULL; + CK_FUNCTION_LIST_PTR funcs; + guchar *ret; + + g_object_get (self, "module", &module, NULL); + g_return_val_if_fail (module != NULL, NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (module != NULL, NULL); + + ret = crypt_sync (self, key, mechanism, input, n_input, n_result, cancellable, error, + funcs->C_DecryptInit, funcs->C_Decrypt); + g_object_unref (module); + return ret; +} + +/** + * gck_session_decrypt_async: + * @self: The session. + * @key: The key to decrypt with. + * @mechanism: The mechanism type and parameters to use for decryption. + * @input: (array length=n_input): data to decrypt + * @n_input: length of the data to decrypt + * @cancellable: A GCancellable which can be used to cancel the operation. + * @callback: Called when the operation completes. + * @user_data: A pointer to pass to the callback. + * + * Decrypt data in a mechanism specific manner. This call will + * return immediately and complete asynchronously. + */ +void +gck_session_decrypt_async (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GckModule *module = NULL; + CK_FUNCTION_LIST_PTR funcs; + + g_object_get (self, "module", &module, NULL); + g_return_if_fail (module != NULL); + + funcs = gck_module_get_functions (module); + g_return_if_fail (module != NULL); + + crypt_async (self, key, mechanism, input, n_input, cancellable, callback, user_data, + funcs->C_DecryptInit, funcs->C_Decrypt); + g_object_unref (module); +} + +/** + * gck_session_decrypt_finish: + * @self: The session. + * @result: The result object passed to the callback. + * @n_result: A location to store the length of the result data. + * @error: A location to place error information. + * + * Get the result of an decryption operation. + * + * Returns: (transfer full) (array length=n_result): the data that was decrypted, + * or NULL if an error occurred + */ +guchar* +gck_session_decrypt_finish (GckSession *self, GAsyncResult *result, + gsize *n_result, GError **error) +{ + return crypt_finish (self, result, n_result, error); +} + +/* -------------------------------------------------------------------------------------------------- + * SIGN + */ + +/** + * gck_session_sign: + * @self: The session. + * @key: The key to sign with. + * @mech_type: The mechanism type to use for signing. + * @input: (array length=n_input): data to sign + * @n_input: length of the data to sign + * @n_result: location to store the length of the result data + * @cancellable: Optional cancellation object, or %NULL + * @error: A location to place an error. + * + * Sign data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: (transfer full) (array length=n_result): the data that was signed, + * or %NULL if an error occured + */ +guchar * +gck_session_sign (GckSession *self, GckObject *key, gulong mech_type, const guchar *input, + gsize n_input, gsize *n_result, GCancellable *cancellable, GError **error) +{ + GckMechanism mechanism = { mech_type, NULL, 0 }; + return gck_session_sign_full (self, key, &mechanism, input, n_input, n_result, NULL, error); +} + +/** + * gck_session_sign_full: + * @self: The session. + * @key: The key to sign with. + * @mechanism: The mechanism type and parameters to use for signing. + * @input: (array length=n_input): data to sign + * @n_input: length of the data to sign + * @n_result: location to store the length of the result data + * @cancellable: A GCancellable which can be used to cancel the operation. + * @error: A location to place error information. + * + * Sign data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: The data that was signed, or NULL if an error occured. + */ +guchar* +gck_session_sign_full (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, gsize *n_result, + GCancellable *cancellable, GError **error) +{ + GckModule *module = NULL; + CK_FUNCTION_LIST_PTR funcs; + guchar *ret; + + g_object_get (self, "module", &module, NULL); + g_return_val_if_fail (module != NULL, NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (module != NULL, NULL); + + ret = crypt_sync (self, key, mechanism, input, n_input, n_result, cancellable, error, + funcs->C_SignInit, funcs->C_Sign); + g_object_unref (module); + return ret; +} + +/** + * gck_session_sign_async: + * @self: The session. + * @key: The key to sign with. + * @mechanism: The mechanism type and parameters to use for signing. + * @input: (array length=n_input): data to sign + * @n_input: length of the data to sign + * @cancellable: A GCancellable which can be used to cancel the operation. + * @callback: Called when the operation completes. + * @user_data: A pointer to pass to the callback. + * + * Sign data in a mechanism specific manner. This call will + * return immediately and complete asynchronously. + */ +void +gck_session_sign_async (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GckModule *module = NULL; + CK_FUNCTION_LIST_PTR funcs; + + g_object_get (self, "module", &module, NULL); + g_return_if_fail (module != NULL); + + funcs = gck_module_get_functions (module); + g_return_if_fail (module != NULL); + + crypt_async (self, key, mechanism, input, n_input, cancellable, callback, user_data, + funcs->C_SignInit, funcs->C_Sign); + g_object_unref (module); +} + +/** + * gck_session_sign_finish: + * @self: The session. + * @result: The result object passed to the callback. + * @n_result: A location to store the length of the result data. + * @error: A location to place error information. + * + * Get the result of an signing operation. + * + * Returns: (transfer full) (array length=n_result): the data that was signed, + * or %NULL if an error occurred + */ +guchar * +gck_session_sign_finish (GckSession *self, GAsyncResult *result, + gsize *n_result, GError **error) +{ + return crypt_finish (self, result, n_result, error); +} + +/* -------------------------------------------------------------------------------------------------- + * VERIFY + */ + +typedef struct _Verify { + GckArguments base; + + /* Interaction */ + GckObject *key_object; + GTlsInteraction *interaction; + + /* Input */ + CK_OBJECT_HANDLE key; + GckMechanism mechanism; + guchar *input; + CK_ULONG n_input; + guchar *signature; + CK_ULONG n_signature; + +} Verify; + +static CK_RV +perform_verify (Verify *args) +{ + GTlsInteraction *interaction; + CK_RV rv; + + /* Initialize the crypt operation */ + rv = (args->base.pkcs11->C_VerifyInit) (args->base.handle, (CK_MECHANISM_PTR)&(args->mechanism), args->key); + if (rv != CKR_OK) + return rv; + + /* Compatibility, hook into GckModule signals if no interaction set */ + if (args->interaction) + interaction = g_object_ref (args->interaction); + else + interaction = _gck_interaction_new (args->key_object); + + + rv = _gck_session_authenticate_key (args->base.pkcs11, args->base.handle, + args->key_object, interaction, NULL); + + g_object_unref (interaction); + + if (rv != CKR_OK) + return rv; + + /* Do the actual verify */ + return (args->base.pkcs11->C_Verify) (args->base.handle, args->input, args->n_input, + args->signature, args->n_signature); +} + +static void +free_verify (Verify *args) +{ + g_clear_object (&args->interaction); + g_clear_object (&args->key_object); + + g_free (args->input); + g_free (args->signature); + g_free (args); +} + +/** + * gck_session_verify: + * @self: The session. + * @key: The key to verify with. + * @mech_type: The mechanism type to use for verifying. + * @input: (array length=n_input): data to verify + * @n_input: length of the data to verify + * @signature: (array length=n_signature): the signature + * @n_signature: length of the signature + * @cancellable: Optional cancellation object, or %NULL + * @error: A location to place an error. + * + * Verify data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: TRUE if the data verified correctly, otherwise a failure or error occurred. + */ +gboolean +gck_session_verify (GckSession *self, GckObject *key, gulong mech_type, const guchar *input, + gsize n_input, const guchar *signature, gsize n_signature, GCancellable *cancellable, GError **error) +{ + GckMechanism mechanism = { mech_type, NULL, 0 }; + return gck_session_verify_full (self, key, &mechanism, input, n_input, + signature, n_signature, NULL, error); +} + +/** + * gck_session_verify_full: + * @self: The session. + * @key: The key to verify with. + * @mechanism: The mechanism type and parameters to use for signing. + * @input: (array length=n_input): data to verify + * @n_input: the length of the data to verify + * @signature: (array length=n_signature): the signature + * @n_signature: length of the signature + * @cancellable: A GCancellable which can be used to cancel the operation. + * @error: A location to place an error. + * + * Verify data in a mechanism specific manner. This call may + * block for an indefinite period. + * + * Returns: TRUE if the data verified correctly, otherwise a failure or error occurred. + */ +gboolean +gck_session_verify_full (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, const guchar *signature, + gsize n_signature, GCancellable *cancellable, GError **error) +{ + Verify args; + gboolean ret; + + g_return_val_if_fail (GCK_IS_OBJECT (key), FALSE); + g_return_val_if_fail (mechanism, FALSE); + + memset (&args, 0, sizeof (args)); + g_object_get (key, "handle", &args.key, NULL); + g_return_val_if_fail (args.key != 0, FALSE); + + /* Shallow copy of the mechanism structure */ + memcpy (&args.mechanism, mechanism, sizeof (args.mechanism)); + + /* No need to copy in this case */ + args.input = (guchar*)input; + args.n_input = n_input; + args.signature = (guchar*)signature; + args.n_signature = n_signature; + + args.key_object = key; + args.interaction = gck_session_get_interaction (self); + + ret = _gck_call_sync (self, perform_verify, NULL, &args, cancellable, error); + + g_clear_object (&args.interaction); + + return ret; +} + +/** + * gck_session_verify_async: + * @self: The session. + * @key: The key to verify with. + * @mechanism: The mechanism type and parameters to use for signing. + * @input: (array length=n_input): data to verify + * @n_input: the length of the data to verify + * @signature: (array length=n_signature): the signature + * @n_signature: the length of the signature + * @cancellable: A GCancellable which can be used to cancel the operation. + * @callback: Called when the operation completes. + * @user_data: A pointer to pass to the callback. + * + * Verify data in a mechanism specific manner. This call returns + * immediately and completes asynchronously. + */ +void +gck_session_verify_async (GckSession *self, GckObject *key, GckMechanism *mechanism, + const guchar *input, gsize n_input, const guchar *signature, + gsize n_signature, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + Verify *args = _gck_call_async_prep (self, self, perform_verify, NULL, sizeof (*args), free_verify); + + g_return_if_fail (GCK_IS_OBJECT (key)); + g_return_if_fail (mechanism); + + g_object_get (key, "handle", &args->key, NULL); + g_return_if_fail (args->key != 0); + + /* Shallow copy of the mechanism structure */ + memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); + + args->input = input && n_input ? g_memdup (input, n_input) : NULL; + args->n_input = n_input; + args->signature = signature && n_signature ? g_memdup (signature, n_signature) : NULL; + args->n_signature = n_signature; + + args->key_object = g_object_ref (key); + args->interaction = gck_session_get_interaction (self); + + _gck_call_async_ready_go (args, cancellable, callback, user_data); +} + +/** + * gck_session_verify_finish: + * @self: The session. + * @result: The result object passed to the callback. + * @error: A location to place error information. + * + * Get the result of an verify operation. + * + * Returns: TRUE if the data verified correctly, otherwise a failure or error occurred. + */ +gboolean +gck_session_verify_finish (GckSession *self, GAsyncResult *result, GError **error) +{ + return _gck_call_basic_finish (result, error); +} + +static void +update_password_for_token (GTlsPassword *password, + CK_TOKEN_INFO *token_info, + gboolean request_retry) +{ + GTlsPasswordFlags flags; + gchar *label; + + label = gck_string_from_chars (token_info->label, sizeof (token_info->label)); + g_tls_password_set_description (password, label); + g_free (label); + + flags = 0; + if (request_retry) + flags |= G_TLS_PASSWORD_RETRY; + if (token_info && token_info->flags & CKF_USER_PIN_COUNT_LOW) + flags |= G_TLS_PASSWORD_MANY_TRIES; + if (token_info && token_info->flags & CKF_USER_PIN_FINAL_TRY) + flags |= G_TLS_PASSWORD_FINAL_TRY; + g_tls_password_set_flags (password, flags); +} + +CK_RV +_gck_session_authenticate_token (CK_FUNCTION_LIST_PTR funcs, + CK_SESSION_HANDLE session, + GckSlot *token, + GTlsInteraction *interaction, + GCancellable *cancellable) +{ + CK_SESSION_INFO session_info; + GTlsPassword *password = NULL; + CK_TOKEN_INFO token_info; + GTlsInteractionResult res; + gboolean request_retry; + CK_SLOT_ID slot_id; + CK_BYTE_PTR pin; + gsize n_pin; + CK_RV rv = CKR_OK; + GError *error = NULL; + + g_assert (funcs != NULL); + g_assert (GCK_IS_SLOT (token)); + + slot_id = gck_slot_get_handle (token); + request_retry = FALSE; + + do { + if (g_cancellable_is_cancelled (cancellable)) { + rv = CKR_FUNCTION_CANCELED; + break; + } + + rv = (funcs->C_GetTokenInfo) (slot_id, &token_info); + if (rv != CKR_OK) { + g_warning ("couldn't get token info when logging in: %s", + gck_message_from_rv (rv)); + break; + } + + /* No login necessary? */ + if ((token_info.flags & CKF_LOGIN_REQUIRED) == 0) { + g_debug ("no login required for token, skipping login"); + rv = CKR_OK; + break; + } + + /* Next check if session is logged in? */ + rv = (funcs->C_GetSessionInfo) (session, &session_info); + if (rv != CKR_OK) { + g_warning ("couldn't get session info when logging in: %s", + gck_message_from_rv (rv)); + break; + } + + /* Already logged in? */ + if (session_info.state == CKS_RW_USER_FUNCTIONS || + session_info.state == CKS_RO_USER_FUNCTIONS || + session_info.state == CKS_RW_SO_FUNCTIONS) { + g_debug ("already logged in, skipping login"); + rv = CKR_OK; + break; + } + + if (token_info.flags & CKF_PROTECTED_AUTHENTICATION_PATH) { + g_debug ("trying to log into session: protected authentication path, no password"); + + /* No password passed for PAP */ + pin = NULL; + n_pin = 0; + + + /* Not protected auth path */ + } else { + g_debug ("trying to log into session: want password %s", + request_retry ? "login was incorrect" : ""); + + if (password == NULL) + password = g_object_new (GCK_TYPE_PASSWORD, "token", token, NULL); + + update_password_for_token (password, &token_info, request_retry); + + if (interaction == NULL) + res = G_TLS_INTERACTION_UNHANDLED; + + else + res = g_tls_interaction_invoke_ask_password (interaction, + G_TLS_PASSWORD (password), + NULL, &error); + + if (res == G_TLS_INTERACTION_FAILED) { + g_message ("interaction couldn't ask password: %s", error->message); + rv = _gck_rv_from_error (error, CKR_USER_NOT_LOGGED_IN); + g_clear_error (&error); + break; + + } else if (res == G_TLS_INTERACTION_UNHANDLED) { + g_message ("couldn't authenticate: no interaction handler"); + rv = CKR_USER_NOT_LOGGED_IN; + break; + } + + pin = (CK_BYTE_PTR)g_tls_password_get_value (password, &n_pin); + } + + /* Try to log in */ + rv = (funcs->C_Login) (session, CKU_USER, (CK_BYTE_PTR)pin, (CK_ULONG)n_pin); + + /* Only one C_Login call if protected auth path */ + if (token_info.flags & CKF_PROTECTED_AUTHENTICATION_PATH) + break; + + request_retry = TRUE; + } while (rv == CKR_PIN_INCORRECT); + + g_clear_object (&password); + + return rv; +} + +static void +update_password_for_key (GTlsPassword *password, + CK_TOKEN_INFO *token_info, + gboolean request_retry) +{ + GTlsPasswordFlags flags; + + flags = 0; + if (request_retry) + flags |= G_TLS_PASSWORD_RETRY; + if (token_info && token_info->flags & CKF_USER_PIN_COUNT_LOW) + flags |= G_TLS_PASSWORD_MANY_TRIES; + if (token_info && token_info->flags & CKF_USER_PIN_FINAL_TRY) + flags |= G_TLS_PASSWORD_FINAL_TRY; + g_tls_password_set_flags (password, flags); +} + +CK_RV +_gck_session_authenticate_key (CK_FUNCTION_LIST_PTR funcs, + CK_SESSION_HANDLE session, + GckObject *key, + GTlsInteraction *interaction, + GCancellable *cancellable) +{ + CK_ATTRIBUTE attrs[2]; + CK_SESSION_INFO session_info; + CK_TOKEN_INFO token_info; + GTlsPassword *password = NULL; + CK_OBJECT_HANDLE handle; + GTlsInteractionResult res; + gboolean request_retry; + GError *error = NULL; + CK_BYTE_PTR pin; + gsize pin_len; + CK_BBOOL bvalue; + gboolean got_label; + CK_RV rv; + + g_assert (funcs != NULL); + + handle = gck_object_get_handle (key); + + attrs[0].type = CKA_LABEL; + attrs[0].pValue = NULL; + attrs[0].ulValueLen = 0; + attrs[1].type = CKA_ALWAYS_AUTHENTICATE; + attrs[1].pValue = &bvalue; + attrs[1].ulValueLen = sizeof (bvalue); + + rv = (funcs->C_GetAttributeValue) (session, handle, attrs, 2); + if (rv == CKR_ATTRIBUTE_TYPE_INVALID) { + bvalue = CK_FALSE; + + } else if (rv != CKR_OK) { + g_message ("couldn't check whether key requires authentication, assuming it doesn't: %s", + gck_message_from_rv (rv)); + return CKR_OK; + } + + /* No authentication needed, on this object */ + if (bvalue != CK_TRUE) { + g_debug ("key does not require authentication"); + return CKR_OK; + } + + got_label = FALSE; + request_retry = FALSE; + + do { + if (g_cancellable_is_cancelled (cancellable)) { + rv = CKR_FUNCTION_CANCELED; + break; + } + + rv = (funcs->C_GetSessionInfo) (session, &session_info); + if (rv != CKR_OK) { + g_warning ("couldn't get session info when authenticating key: %s", + gck_message_from_rv (rv)); + return rv; + } + + rv = (funcs->C_GetTokenInfo) (session_info.slotID, &token_info); + if (rv != CKR_OK) { + g_warning ("couldn't get token info when authenticating key: %s", + gck_message_from_rv (rv)); + return rv; + } + + /* Protected authentication path, just use NULL passwords */ + if (token_info.flags & CKF_PROTECTED_AUTHENTICATION_PATH) { + + password = NULL; + pin = NULL; + pin_len = 0; + + /* Need to prompt for a password */ + } else { + g_debug ("trying to log into session: want password %s", + request_retry ? "login was incorrect" : ""); + + if (password == NULL) + password = g_object_new (GCK_TYPE_PASSWORD, "key", key, NULL); + + /* Set the password */ + update_password_for_key (password, &token_info, request_retry); + + /* Set the label properly */ + if (!got_label) { + if (attrs[0].ulValueLen && attrs[0].ulValueLen != GCK_INVALID) { + attrs[0].pValue = g_malloc0 (attrs[0].ulValueLen + 1); + rv = (funcs->C_GetAttributeValue) (session, handle, attrs, 1); + if (rv == CKR_OK) { + ((gchar *)attrs[0].pValue)[attrs[0].ulValueLen] = 0; + g_tls_password_set_description (password, attrs[0].pValue); + } + g_free (attrs[0].pValue); + attrs[0].pValue = NULL; + } + + got_label = TRUE; + } + + if (interaction == NULL) + res = G_TLS_INTERACTION_UNHANDLED; + + else + res = g_tls_interaction_invoke_ask_password (interaction, + G_TLS_PASSWORD (password), + NULL, &error); + + if (res == G_TLS_INTERACTION_FAILED) { + g_message ("interaction couldn't ask password: %s", error->message); + rv = _gck_rv_from_error (error, CKR_USER_NOT_LOGGED_IN); + g_clear_error (&error); + break; + + } else if (res == G_TLS_INTERACTION_UNHANDLED) { + g_message ("couldn't authenticate: no interaction handler"); + rv = CKR_USER_NOT_LOGGED_IN; + break; + } + + pin = (CK_BYTE_PTR)g_tls_password_get_value (G_TLS_PASSWORD (password), &pin_len); + } + + /* Try to log in */ + rv = (funcs->C_Login) (session, CKU_CONTEXT_SPECIFIC, pin, pin_len); + + /* Only one C_Login call if protected auth path */ + if (token_info.flags & CKF_PROTECTED_AUTHENTICATION_PATH) + break; + + request_retry = TRUE; + } while (rv == CKR_PIN_INCORRECT); + + g_clear_object (&password); + + return rv; +} diff --git a/gck/gck-slot.c b/gck/gck-slot.c new file mode 100644 index 0000000..7218d0e --- /dev/null +++ b/gck/gck-slot.c @@ -0,0 +1,1154 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-slot.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "egg/egg-timegm.h" + +#include + +/** + * SECTION:gck-slot + * @title: GckSlot + * @short_description: Represents a PKCS\#11 slot that can contain a token. + * + * A PKCS11 slot can contain a token. As an example, a slot might be a card reader, and the token + * the card. If the PKCS\#11 module is not a hardware driver, often the slot and token are equivalent. + */ + +/** + * GckSlot: + * + * Represents a PKCS11 slot. + */ + +enum { + PROP_0, + PROP_MODULE, + PROP_HANDLE +}; + +struct _GckSlotPrivate { + GckModule *module; + CK_SLOT_ID handle; +}; + +G_DEFINE_TYPE (GckSlot, gck_slot, G_TYPE_OBJECT); + +/* ---------------------------------------------------------------------------- + * OBJECT + */ + +static void +gck_slot_init (GckSlot *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SLOT, GckSlotPrivate); +} + +static void +gck_slot_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GckSlot *self = GCK_SLOT (obj); + + switch (prop_id) { + case PROP_MODULE: + g_value_take_object (value, gck_slot_get_module (self)); + break; + case PROP_HANDLE: + g_value_set_ulong (value, gck_slot_get_handle (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_slot_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GckSlot *self = GCK_SLOT (obj); + + /* All writes to data members below, happen only during construct phase */ + + switch (prop_id) { + case PROP_MODULE: + g_assert (!self->pv->module); + self->pv->module = g_value_get_object (value); + g_assert (self->pv->module); + g_object_ref (self->pv->module); + break; + case PROP_HANDLE: + g_assert (!self->pv->handle); + self->pv->handle = g_value_get_ulong (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gck_slot_finalize (GObject *obj) +{ + GckSlot *self = GCK_SLOT (obj); + + g_clear_object (&self->pv->module); + + G_OBJECT_CLASS (gck_slot_parent_class)->finalize (obj); +} + +static void +gck_slot_class_init (GckSlotClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*)klass; + gck_slot_parent_class = g_type_class_peek_parent (klass); + + gobject_class->get_property = gck_slot_get_property; + gobject_class->set_property = gck_slot_set_property; + gobject_class->finalize = gck_slot_finalize; + + /** + * GckSlot:module: + * + * The PKCS11 object that this slot is a part of. + */ + g_object_class_install_property (gobject_class, PROP_MODULE, + g_param_spec_object ("module", "Module", "PKCS11 Module", + GCK_TYPE_MODULE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GckSlot:handle: + * + * The raw CK_SLOT_ID handle of this slot. + */ + g_object_class_install_property (gobject_class, PROP_HANDLE, + g_param_spec_ulong ("handle", "Handle", "PKCS11 Slot ID", + 0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (gobject_class, sizeof (GckSlotPrivate)); +} + +/* ---------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * GckSlotInfo: + * @slot_description: Description of the slot. + * @manufacturer_id: The manufacturer of this slot. + * @flags: Various PKCS11 flags that apply to this slot. + * @hardware_version_major: The major version of the hardware. + * @hardware_version_minor: The minor version of the hardware. + * @firmware_version_major: The major version of the firmware. + * @firmware_version_minor: The minor version of the firmware. + * + * Represents information about a PKCS11 slot. + * + * This is analogous to a CK_SLOT_INFO structure, but the + * strings are far more usable. + * + * When you're done with this structure it should be released with + * gck_slot_info_free(). + */ + +GType +gck_slot_info_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckSlotInfo", + (GBoxedCopyFunc)gck_slot_info_copy, + (GBoxedFreeFunc)gck_slot_info_free); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gck_slot_info_copy: + * @slot_info: a slot info + * + * Make a copy of the slot info. + * + * Returns: (transfer full): a newly allocated copy slot info + */ +GckSlotInfo * +gck_slot_info_copy (GckSlotInfo *slot_info) +{ + if (slot_info == NULL) + return NULL; + + slot_info = g_memdup (slot_info, sizeof (GckSlotInfo)); + slot_info->manufacturer_id = g_strdup (slot_info->manufacturer_id); + slot_info->slot_description = g_strdup (slot_info->slot_description); + + return slot_info; +} + + +/** + * gck_slot_info_free: + * @slot_info: The slot info to free, or NULL. + * + * Free the GckSlotInfo and associated resources. + **/ +void +gck_slot_info_free (GckSlotInfo *slot_info) +{ + if (!slot_info) + return; + g_free (slot_info->slot_description); + g_free (slot_info->manufacturer_id); + g_free (slot_info); +} + +/** + * GckTokenInfo: + * @label: The displayable token label. + * @manufacturer_id: The manufacturer of this slot. + * @model: The token model number as a string. + * @serial_number: The token serial number as a string. + * @flags: Various PKCS11 flags that apply to this token. + * @max_session_count: The maximum number of sessions allowed on this token. + * @session_count: The number of sessions open on this token. + * @max_rw_session_count: The maximum number of read/write sessions allowed on this token. + * @rw_session_count: The number of sessions open on this token. + * @max_pin_len: The maximum length of a PIN for locking this token. + * @min_pin_len: The minimum length of a PIN for locking this token. + * @total_public_memory: The total amount of memory on this token for storing public objects. + * @free_public_memory: The available amount of memory on this token for storing public objects. + * @total_private_memory: The total amount of memory on this token for storing private objects. + * @free_private_memory: The available amount of memory on this token for storing private objects. + * @hardware_version_major: The major version of the hardware. + * @hardware_version_minor: The minor version of the hardware. + * @firmware_version_major: The major version of the firmware. + * @firmware_version_minor: The minor version of the firmware. + * @utc_time: If the token has a hardware clock, this is set to the number of seconds since the epoch. + * + * Represents information about a PKCS11 token. + * + * This is analogous to a CK_TOKEN_INFO structure, but the + * strings are far more usable. + * + * When you're done with this structure it should be released with + * gck_token_info_free(). + */ + +GType +gck_token_info_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckTokenInfo", + (GBoxedCopyFunc)gck_token_info_copy, + (GBoxedFreeFunc)gck_token_info_free); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gck_token_info_copy: + * @token_info: a token info + * + * Make a copy of the token info. + * + * Returns: (transfer full): a newly allocated copy token info + */ +GckTokenInfo * +gck_token_info_copy (GckTokenInfo *token_info) +{ + if (token_info == NULL) + return NULL; + + token_info = g_memdup (token_info, sizeof (GckTokenInfo)); + token_info->label = g_strdup (token_info->label); + token_info->manufacturer_id = g_strdup (token_info->manufacturer_id); + token_info->model = g_strdup (token_info->model); + token_info->serial_number = g_strdup (token_info->serial_number); + return token_info; +} + +/** + * gck_token_info_free: + * @token_info: The token info to free, or NULL. + * + * Free the GckTokenInfo and associated resources. + **/ +void +gck_token_info_free (GckTokenInfo *token_info) +{ + if (!token_info) + return; + g_free (token_info->label); + g_free (token_info->manufacturer_id); + g_free (token_info->model); + g_free (token_info->serial_number); + g_free (token_info); +} + +/** + * GckMechanismInfo: + * @min_key_size: The minimum key size that can be used with this mechanism. + * @max_key_size: The maximum key size that can be used with this mechanism. + * @flags: Various PKCS11 flags that apply to this mechanism. + * + * Represents information about a PKCS11 mechanism. + * + * This is analogous to a CK_MECHANISM_INFO structure. + * + * When you're done with this structure it should be released with + * gck_mechanism_info_free(). + */ + +GType +gck_mechanism_info_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckMechanismInfo", + (GBoxedCopyFunc)gck_mechanism_info_copy, + (GBoxedFreeFunc)gck_mechanism_info_free); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gck_mechanism_info_copy: + * @mech_info: a mechanism info + * + * Make a copy of the mechanism info. + * + * Returns: (transfer full): a newly allocated copy mechanism info + */ +GckMechanismInfo * +gck_mechanism_info_copy (GckMechanismInfo *mech_info) +{ + return g_memdup (mech_info, sizeof (GckMechanismInfo)); +} + +/** + * gck_mechanism_info_free: + * @mech_info: The mechanism info to free, or NULL. + * + * Free the GckMechanismInfo and associated resources. + **/ +void +gck_mechanism_info_free (GckMechanismInfo *mech_info) +{ + if (!mech_info) + return; + g_free (mech_info); +} + +/** + * GckMechanisms: + * + * A set of GckMechanismInfo structures. + */ + +/** + * gck_mechanisms_length: + * @a: A GckMechanisms set. + * + * Get the number of GckMechanismInfo in the set. + * + * Returns: The number in the set. + */ + +/** + * gck_mechanisms_at: + * @a: A GckMechanisms set. + * @i: The index of a mechanism + * + * Get a specific mechanism in a the set. + * + * Returns: the mechanism + */ + +/** + * gck_mechanisms_free: + * @a: A GckMechanism set. + * + * Free a GckMechanisms set. + */ + +/** + * gck_mechanisms_check: + * @mechanisms: (element-type ulong): A list of mechanisms, perhaps + * retrieved from gck_slot_get_mechanisms(). + * @...: A list of mechanism types followed by GCK_INVALID. + * + * Check whether all the mechanism types are in the list. + * + * The arguments should be a list of CKM_XXX mechanism types. The last argument + * should be GCK_INVALID. + * + * Return value: Whether the mechanism is in the list or not. + **/ +gboolean +gck_mechanisms_check (GArray *mechanisms, ...) +{ + gboolean found = TRUE; + va_list va; + gulong mech; + gsize i; + + g_return_val_if_fail (mechanisms != NULL, FALSE); + + va_start (va, mechanisms); + for (;;) { + mech = va_arg (va, gulong); + if (mech == GCK_INVALID) + break; + + found = FALSE; + for (i = 0; i < gck_mechanisms_length (mechanisms); ++i) { + if (gck_mechanisms_at (mechanisms, i) == mech) { + found = TRUE; + break; + } + } + + if (found == FALSE) + break; + + } + va_end (va); + + return found; +} + +/** + * gck_slot_equal: + * @slot1: (type Gck.Slot): a pointer to the first #GckSlot + * @slot2: (type Gck.Slot): a pointer to the second #GckSlot + * + * Checks equality of two slots. Two GckSlot objects can point to the same + * underlying PKCS\#11 slot. + * + * Return value: TRUE if slot1 and slot2 are equal. FALSE if either is not a GckSlot. + **/ +gboolean +gck_slot_equal (gconstpointer slot1, gconstpointer slot2) +{ + GckSlot *s1, *s2; + + if (slot1 == slot2) + return TRUE; + if (!GCK_IS_SLOT (slot1) || !GCK_IS_SLOT (slot2)) + return FALSE; + + s1 = GCK_SLOT (slot1); + s2 = GCK_SLOT (slot2); + + return s1->pv->handle == s2->pv->handle && + gck_module_equal (s1->pv->module, s2->pv->module); +} + +/** + * gck_slot_hash: + * @slot: (type Gck.Slot): a pointer to a #GckSlot + * + * Create a hash value for the GckSlot. + * + * This function is intended for easily hashing a GckSlot to add to + * a GHashTable or similar data structure. + * + * Return value: An integer that can be used as a hash value, or 0 if invalid. + **/ +guint +gck_slot_hash (gconstpointer slot) +{ + GckSlot *self; + + g_return_val_if_fail (GCK_IS_SLOT (slot), 0); + + self = GCK_SLOT (slot); + + return _gck_ulong_hash (&self->pv->handle) ^ + gck_module_hash (self->pv->module); +} + +/** + * gck_slot_from_handle: + * @module: The module that this slot is on. + * @slot_id: The raw PKCS\#11 handle or slot id of this slot. + * + * Create a new GckSlot object for a raw PKCS\#11 handle. + * + * Returns: (transfer full): The new GckSlot object. + **/ +GckSlot * +gck_slot_from_handle (GckModule *module, + gulong slot_id) +{ + return g_object_new (GCK_TYPE_SLOT, + "module", module, + "handle", slot_id, + NULL); +} + +/** + * gck_slot_get_handle: + * @self: The slot to get the handle of. + * + * Get the raw PKCS\#11 handle of a slot. + * + * Return value: the raw CK_SLOT_ID handle + **/ +gulong +gck_slot_get_handle (GckSlot *self) +{ + g_return_val_if_fail (GCK_IS_SLOT (self), (CK_SLOT_ID)-1); + return self->pv->handle; +} + +/** + * gck_slot_get_module: + * @self: The slot to get the module for. + * + * Get the module that this slot is on. + * + * Returns: (transfer full): The module, you must unreference this after + * you're done with it. + */ +GckModule * +gck_slot_get_module (GckSlot *self) +{ + g_return_val_if_fail (GCK_IS_SLOT (self), NULL); + g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); + return g_object_ref (self->pv->module); +} + +/** + * gck_slot_get_info: + * @self: The slot to get info for. + * + * Get the information for this slot. + * + * Returns: (transfer full): the slot information, when done, use gck_slot_info_free() + * to release it. + **/ +GckSlotInfo * +gck_slot_get_info (GckSlot *self) +{ + CK_SLOT_ID handle = (CK_SLOT_ID)-1; + GckModule *module = NULL; + CK_FUNCTION_LIST_PTR funcs; + GckSlotInfo *slotinfo; + CK_SLOT_INFO info; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SLOT (self), NULL); + + g_object_get (self, "module", &module, "handle", &handle, NULL); + g_return_val_if_fail (GCK_IS_MODULE (module), NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, NULL); + + memset (&info, 0, sizeof (info)); + rv = (funcs->C_GetSlotInfo) (handle, &info); + + g_object_unref (module); + + if (rv != CKR_OK) { + g_warning ("couldn't get slot info: %s", gck_message_from_rv (rv)); + return NULL; + } + + slotinfo = g_new0 (GckSlotInfo, 1); + slotinfo->slot_description = gck_string_from_chars (info.slotDescription, + sizeof (info.slotDescription)); + slotinfo->manufacturer_id = gck_string_from_chars (info.manufacturerID, + sizeof (info.manufacturerID)); + slotinfo->flags = info.flags; + slotinfo->hardware_version_major = info.hardwareVersion.major; + slotinfo->hardware_version_minor = info.hardwareVersion.minor; + slotinfo->firmware_version_major = info.firmwareVersion.major; + slotinfo->firmware_version_minor = info.firmwareVersion.minor; + + return slotinfo; +} + +GckTokenInfo* +_gck_token_info_from_pkcs11 (CK_TOKEN_INFO_PTR info) +{ + GckTokenInfo *token_info; + gchar *string; + struct tm tm; + + token_info = g_new0 (GckTokenInfo, 1); + token_info->label = gck_string_from_chars (info->label, sizeof (info->label)); + token_info->model = gck_string_from_chars (info->model, sizeof (info->model)); + token_info->manufacturer_id = gck_string_from_chars (info->manufacturerID, + sizeof (info->manufacturerID)); + token_info->serial_number = gck_string_from_chars (info->serialNumber, + sizeof (info->serialNumber)); + token_info->flags = info->flags; + token_info->max_session_count = info->ulMaxSessionCount; + token_info->session_count = info->ulSessionCount; + token_info->max_rw_session_count = info->ulMaxRwSessionCount; + token_info->rw_session_count = info->ulRwSessionCount; + token_info->max_pin_len = info->ulMaxPinLen; + token_info->min_pin_len = info->ulMinPinLen; + token_info->total_public_memory = info->ulTotalPublicMemory; + token_info->total_private_memory = info->ulTotalPrivateMemory; + token_info->free_private_memory = info->ulFreePrivateMemory; + token_info->free_public_memory = info->ulFreePublicMemory; + token_info->hardware_version_major = info->hardwareVersion.major; + token_info->hardware_version_minor = info->hardwareVersion.minor; + token_info->firmware_version_major = info->firmwareVersion.major; + token_info->firmware_version_minor = info->firmwareVersion.minor; + + /* Parse the time into seconds since epoch */ + if (info->flags & CKF_CLOCK_ON_TOKEN) { + string = g_strndup ((gchar*)info->utcTime, MIN (14, sizeof (info->utcTime))); + if (!strptime (string, "%Y%m%d%H%M%S", &tm)) + token_info->utc_time = -1; + else + token_info->utc_time = timegm (&tm); + g_free (string); + } else { + token_info->utc_time = -1; + } + + return token_info; +} + +void +_gck_token_info_to_pkcs11 (GckTokenInfo *token_info, CK_TOKEN_INFO_PTR info) +{ + gchar buffer[64]; + struct tm tm; + time_t tim; + gsize len; + + if (!gck_string_to_chars (info->label, + sizeof (info->label), + token_info->label)) + g_return_if_reached (); + if (!gck_string_to_chars (info->model, + sizeof (info->model), + token_info->model)) + g_return_if_reached (); + if (!gck_string_to_chars (info->manufacturerID, + sizeof (info->manufacturerID), + token_info->manufacturer_id)) + g_return_if_reached (); + if (!gck_string_to_chars (info->serialNumber, + sizeof (info->serialNumber), + token_info->serial_number)) + g_return_if_reached (); + + info->flags = token_info->flags; + info->ulMaxSessionCount = token_info->max_session_count; + info->ulSessionCount = token_info->session_count; + info->ulMaxRwSessionCount = token_info->max_rw_session_count; + info->ulRwSessionCount = token_info->rw_session_count; + info->ulMaxPinLen = token_info->max_pin_len; + info->ulMinPinLen = token_info->min_pin_len; + info->ulTotalPublicMemory = token_info->total_public_memory; + info->ulTotalPrivateMemory = token_info->total_private_memory; + info->ulFreePrivateMemory = token_info->free_private_memory; + info->ulFreePublicMemory = token_info->free_public_memory; + info->hardwareVersion.major = token_info->hardware_version_major; + info->hardwareVersion.minor = token_info->hardware_version_minor; + info->firmwareVersion.major = token_info->firmware_version_major; + info->firmwareVersion.minor = token_info->firmware_version_minor; + + /* Parse the time into seconds since epoch */ + if (token_info->flags & CKF_CLOCK_ON_TOKEN) { + tim = token_info->utc_time; + if (!gmtime_r (&tim, &tm)) + g_return_if_reached (); + len = strftime (buffer, sizeof (buffer), "%Y%m%d%H%M%S", &tm); + g_return_if_fail (len == sizeof (info->utcTime)); + memcpy (info->utcTime, buffer, sizeof (info->utcTime)); + } else { + memset (info->utcTime, 0, sizeof (info->utcTime)); + } +} + +/** + * gck_slot_get_token_info: + * @self: The slot to get info for. + * + * Get the token information for this slot. + * + * Returns: (transfer full): the token information; when done, use gck_token_info_free() + * to release it + **/ +GckTokenInfo * +gck_slot_get_token_info (GckSlot *self) +{ + CK_SLOT_ID handle = (CK_SLOT_ID)-1; + CK_FUNCTION_LIST_PTR funcs; + GckModule *module = NULL; + CK_TOKEN_INFO info; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SLOT (self), NULL); + + g_object_get (self, "module", &module, "handle", &handle, NULL); + g_return_val_if_fail (GCK_IS_MODULE (module), NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, NULL); + + memset (&info, 0, sizeof (info)); + rv = (funcs->C_GetTokenInfo) (handle, &info); + + g_object_unref (module); + + if (rv != CKR_OK) { + g_warning ("couldn't get slot info: %s", gck_message_from_rv (rv)); + return NULL; + } + + return _gck_token_info_from_pkcs11 (&info); +} + +/** + * gck_slot_get_mechanisms: + * @self: The slot to get mechanisms for. + * + * Get the available mechanisms for this slot. + * + * Returns: (transfer full) (element-type ulong): a list of the mechanisms + * for this slot, which should be freed with g_array_free () + **/ +GArray * +gck_slot_get_mechanisms (GckSlot *self) +{ + CK_SLOT_ID handle = (CK_SLOT_ID)-1; + CK_FUNCTION_LIST_PTR funcs; + GckModule *module = NULL; + CK_MECHANISM_TYPE_PTR mech_list = NULL; + CK_ULONG count, i; + GArray *result; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SLOT (self), NULL); + + g_object_get (self, "module", &module, "handle", &handle, NULL); + g_return_val_if_fail (GCK_IS_MODULE (module), NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, NULL); + + rv = (funcs->C_GetMechanismList) (handle, NULL, &count); + if (rv != CKR_OK) { + g_warning ("couldn't get mechanism count: %s", gck_message_from_rv (rv)); + count = 0; + } else { + mech_list = g_new (CK_MECHANISM_TYPE, count); + rv = (funcs->C_GetMechanismList) (handle, mech_list, &count); + if (rv != CKR_OK) { + g_warning ("couldn't get mechanism list: %s", gck_message_from_rv (rv)); + g_free (mech_list); + count = 0; + } + } + + g_object_unref (module); + + if (!count) + return NULL; + + result = g_array_new (FALSE, TRUE, sizeof (CK_MECHANISM_TYPE)); + for (i = 0; i < count; ++i) + g_array_append_val (result, mech_list[i]); + + g_free (mech_list); + return result; + +} + +/** + * gck_slot_get_mechanism_info: + * @self: The slot to get mechanism info from. + * @mech_type: The mechanisms type to get info for. + * + * Get information for the specified mechanism. + * + * Returns: (transfer full): the mechanism information, or NULL if failed; use + * gck_mechanism_info_free() when done with it + **/ +GckMechanismInfo* +gck_slot_get_mechanism_info (GckSlot *self, gulong mech_type) +{ + CK_SLOT_ID handle = (CK_SLOT_ID)-1; + CK_FUNCTION_LIST_PTR funcs; + GckMechanismInfo *mechinfo; + GckModule *module = NULL; + CK_MECHANISM_INFO info; + struct tm; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SLOT (self), NULL); + + g_object_get (self, "module", &module, "handle", &handle, NULL); + g_return_val_if_fail (GCK_IS_MODULE (module), NULL); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, NULL); + + memset (&info, 0, sizeof (info)); + rv = (funcs->C_GetMechanismInfo) (handle, mech_type, &info); + + g_object_unref (module); + + if (rv != CKR_OK) { + g_warning ("couldn't get mechanism info: %s", gck_message_from_rv (rv)); + return NULL; + } + + mechinfo = g_new0 (GckMechanismInfo, 1); + mechinfo->flags = info.flags; + mechinfo->max_key_size = info.ulMaxKeySize; + mechinfo->min_key_size = info.ulMinKeySize; + + return mechinfo; +} + +/** + * gck_slot_has_flags: + * @self: The GckSlot object. + * @flags: The flags to check. + * + * Check if the PKCS11 slot has the given flags. + * + * Returns: Whether one or more flags exist. + */ +gboolean +gck_slot_has_flags (GckSlot *self, gulong flags) +{ + CK_FUNCTION_LIST_PTR funcs; + GckModule *module = NULL; + CK_TOKEN_INFO info; + CK_SLOT_ID handle; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SLOT (self), FALSE); + + g_object_get (self, "module", &module, "handle", &handle, NULL); + g_return_val_if_fail (GCK_IS_MODULE (module), FALSE); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, FALSE); + + memset (&info, 0, sizeof (info)); + rv = (funcs->C_GetTokenInfo) (handle, &info); + + g_object_unref (module); + + if (rv != CKR_OK) { + g_warning ("couldn't get slot info: %s", gck_message_from_rv (rv)); + return FALSE; + } + + return (info.flags & flags) != 0; +} + +/** + * gck_slot_enumerate_objects: + * @self: a #GckSlot to enumerate objects on + * @match: attributes that the objects must match, or empty for all objects + * @options: options for opening a session + * + * Setup an enumerator for listing matching objects on the slot. + * + * If the @match #GckAttributes is floating, it is consumed. + * + * This call will not block but will return an enumerator immediately. + * + * Returns: (transfer full): a new enumerator + **/ +GckEnumerator * +gck_slot_enumerate_objects (GckSlot *self, + GckAttributes *match, + GckSessionOptions options) +{ + GList *slots = NULL; + GckEnumerator *enumerator; + + g_return_val_if_fail (GCK_IS_SLOT (self), NULL); + g_return_val_if_fail (match != NULL, NULL); + + slots = g_list_append (slots, self); + enumerator = gck_slots_enumerate_objects (slots, match, options); + g_list_free (slots); + + return enumerator; +} + +/** + * gck_slots_enumerate_objects: + * @slots: (element-type Gck.Slot): a list of #GckSlot to enumerate objects on. + * @match: attributes that the objects must match, or empty for all objects + * @options: options for opening a session + * + * Setup an enumerator for listing matching objects on the slots. + * + * If the @match #GckAttributes is floating, it is consumed. + * + * This call will not block but will return an enumerator immediately. + * + * Returns: (transfer full): a new enumerator + **/ +GckEnumerator* +gck_slots_enumerate_objects (GList *slots, + GckAttributes *match, + GckSessionOptions options) +{ + GckUriData *uri_data; + + g_return_val_if_fail (match != NULL, NULL); + + uri_data = gck_uri_data_new (); + uri_data->attributes = gck_attributes_ref_sink (match); + + return _gck_enumerator_new_for_slots (slots, options, uri_data); +} + + +/** + * gck_slot_open_session: + * @self: The slot ot open a session on. + * @options: The #GckSessionOptions to open a session with. + * @cancellable: An optional cancellation object, or %NULL. + * @error: A location to return an error, or %NULL. + * + * Open a session on the slot. If the 'auto reuse' setting is set, + * then this may be a recycled session with the same flags. + * + * This call may block for an indefinite period. + * + * Returns: (transfer full): a new session or %NULL if an error occurs + **/ +GckSession * +gck_slot_open_session (GckSlot *self, + GckSessionOptions options, + GCancellable *cancellable, + GError **error) +{ + return gck_slot_open_session_full (self, options, 0, NULL, NULL, cancellable, error); +} + +/** + * gck_slot_open_session_full: (skip) + * @self: The slot to open a session on. + * @options: The options to open the new session with. + * @pkcs11_flags: Additional raw PKCS\#11 flags. + * @app_data: Application data for notification callback. + * @notify: PKCS\#11 notification callback. + * @cancellable: Optional cancellation object, or NULL. + * @error: A location to return an error, or NULL. + * + * Open a session on the slot. If the 'auto reuse' setting is set, + * then this may be a recycled session with the same flags. + * + * This call may block for an indefinite period. + * + * Returns: (transfer full): a new session or %NULL if an error occurs + **/ +GckSession * +gck_slot_open_session_full (GckSlot *self, + GckSessionOptions options, + gulong pkcs11_flags, + gpointer app_data, + CK_NOTIFY notify, + GCancellable *cancellable, + GError **error) +{ + return g_initable_new (GCK_TYPE_SESSION, cancellable, error, + "options", options, + "slot", self, + "opening-flags", pkcs11_flags, + "app-data", app_data, + NULL); +} + +/** + * gck_slot_open_session_async: + * @self: The slot to open a session on. + * @options: The options to open the new session with. + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Open a session on the slot. If the 'auto reuse' setting is set, + * then this may be a recycled session with the same flags. + * + * This call will return immediately and complete asynchronously. + **/ +void +gck_slot_open_session_async (GckSlot *self, + GckSessionOptions options, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gck_slot_open_session_full_async (self, options, 0UL, NULL, NULL, cancellable, callback, user_data); +} + +static void +on_open_session_complete (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GError *error = NULL; + GObject *session; + + session = g_async_initable_new_finish (G_ASYNC_INITABLE (source), result, &error); + if (session != NULL) + g_simple_async_result_set_op_res_gpointer (res, session, g_object_unref); + else + g_simple_async_result_take_error (res, error); + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +/** + * gck_slot_open_session_full_async: (skip) + * @self: The slot to open a session on. + * @options: Options to open the new session with. + * @pkcs11_flags: Additional raw PKCS\#11 flags. + * @app_data: Application data for notification callback. + * @notify: PKCS\#11 notification callback. + * @cancellable: Optional cancellation object, or NULL. + * @callback: Called when the operation completes. + * @user_data: Data to pass to the callback. + * + * Open a session on the slot. If the 'auto reuse' setting is set, + * then this may be a recycled session with the same flags. + * + * This call will return immediately and complete asynchronously. + **/ +void +gck_slot_open_session_full_async (GckSlot *self, + GckSessionOptions options, + gulong pkcs11_flags, + gpointer app_data, + CK_NOTIFY notify, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + g_return_if_fail (GCK_IS_SLOT (self)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, + gck_slot_open_session_full_async); + + g_async_initable_new_async (GCK_TYPE_SESSION, G_PRIORITY_DEFAULT, + cancellable, on_open_session_complete, + g_object_ref (res), + "options", options, + "slot", self, + "opening-flags", pkcs11_flags, + "app-data", app_data, + NULL); + + g_object_unref (res); +} + +/** + * gck_slot_open_session_finish: + * @self: The slot to open a session on. + * @result: The result passed to the callback. + * @error: A location to return an error or NULL. + * + * Get the result of an open session operation. If the 'auto reuse' setting is set, + * then this may be a recycled session with the same flags. + * + * Returns: (transfer full): the new session or %NULL if an error occurs + */ +GckSession * +gck_slot_open_session_finish (GckSlot *self, GAsyncResult *result, GError **error) +{ + GSimpleAsyncResult *res; + + g_return_val_if_fail (GCK_IS_SLOT (self), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), + gck_slot_open_session_full_async), NULL); + + res = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (res, error)) + return NULL; + + return g_object_ref (g_simple_async_result_get_op_res_gpointer (res)); +} + +/** + * gck_slot_match: + * @self: the slot to match + * @uri: the uri to match against the slot + * + * Check whether the PKCS\#11 URI matches the slot + * + * Returns: whether the URI matches or not + */ +gboolean +gck_slot_match (GckSlot *self, + GckUriData *uri) +{ + GckModule *module; + GckTokenInfo *info; + gboolean match = TRUE; + + g_return_val_if_fail (GCK_IS_SLOT (self), FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + if (uri->any_unrecognized) + match = FALSE; + + if (match && uri->module_info) { + module = gck_slot_get_module (self); + match = gck_module_match (module, uri); + g_object_unref (module); + } + + if (match && uri->token_info) { + info = gck_slot_get_token_info (self); + match = _gck_token_info_match (uri->token_info, info); + gck_token_info_free (info); + } + + return match; +} diff --git a/gck/gck-test.c b/gck/gck-test.c new file mode 100644 index 0000000..0e14928 --- /dev/null +++ b/gck/gck-test.c @@ -0,0 +1,163 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gck-test.h" + +#include + +#include + +#include + +static const gchar* +defined_rv_to_string (CK_RV rv) +{ + #define GKM_X(rv) case rv: return #rv; + switch (rv) { + + /* These are not really errors, or not current */ + GKM_X (CKR_OK) + GKM_X (CKR_NO_EVENT) + GKM_X (CKR_FUNCTION_NOT_PARALLEL) + GKM_X (CKR_SESSION_PARALLEL_NOT_SUPPORTED) + GKM_X (CKR_CANCEL) + GKM_X (CKR_FUNCTION_CANCELED) + GKM_X (CKR_HOST_MEMORY) + GKM_X (CKR_SLOT_ID_INVALID) + GKM_X (CKR_GENERAL_ERROR) + GKM_X (CKR_FUNCTION_FAILED) + GKM_X (CKR_ARGUMENTS_BAD) + GKM_X (CKR_NEED_TO_CREATE_THREADS) + GKM_X (CKR_CANT_LOCK) + GKM_X (CKR_ATTRIBUTE_READ_ONLY) + GKM_X (CKR_ATTRIBUTE_SENSITIVE) + GKM_X (CKR_ATTRIBUTE_TYPE_INVALID) + GKM_X (CKR_ATTRIBUTE_VALUE_INVALID) + GKM_X (CKR_DATA_INVALID) + GKM_X (CKR_DATA_LEN_RANGE) + GKM_X (CKR_DEVICE_ERROR) + GKM_X (CKR_DEVICE_MEMORY) + GKM_X (CKR_DEVICE_REMOVED) + GKM_X (CKR_ENCRYPTED_DATA_INVALID) + GKM_X (CKR_ENCRYPTED_DATA_LEN_RANGE) + GKM_X (CKR_FUNCTION_NOT_SUPPORTED) + GKM_X (CKR_KEY_HANDLE_INVALID) + GKM_X (CKR_KEY_SIZE_RANGE) + GKM_X (CKR_KEY_TYPE_INCONSISTENT) + GKM_X (CKR_KEY_NOT_NEEDED) + GKM_X (CKR_KEY_CHANGED) + GKM_X (CKR_KEY_NEEDED) + GKM_X (CKR_KEY_INDIGESTIBLE) + GKM_X (CKR_KEY_FUNCTION_NOT_PERMITTED) + GKM_X (CKR_KEY_NOT_WRAPPABLE) + GKM_X (CKR_KEY_UNEXTRACTABLE) + GKM_X (CKR_MECHANISM_INVALID) + GKM_X (CKR_MECHANISM_PARAM_INVALID) + GKM_X (CKR_OBJECT_HANDLE_INVALID) + GKM_X (CKR_OPERATION_ACTIVE) + GKM_X (CKR_OPERATION_NOT_INITIALIZED) + GKM_X (CKR_PIN_INCORRECT) + GKM_X (CKR_PIN_INVALID) + GKM_X (CKR_PIN_LEN_RANGE) + GKM_X (CKR_PIN_EXPIRED) + GKM_X (CKR_PIN_LOCKED) + GKM_X (CKR_SESSION_CLOSED) + GKM_X (CKR_SESSION_COUNT) + GKM_X (CKR_SESSION_HANDLE_INVALID) + GKM_X (CKR_SESSION_READ_ONLY) + GKM_X (CKR_SESSION_EXISTS) + GKM_X (CKR_SESSION_READ_ONLY_EXISTS) + GKM_X (CKR_SESSION_READ_WRITE_SO_EXISTS) + GKM_X (CKR_SIGNATURE_INVALID) + GKM_X (CKR_SIGNATURE_LEN_RANGE) + GKM_X (CKR_TEMPLATE_INCOMPLETE) + GKM_X (CKR_TEMPLATE_INCONSISTENT) + GKM_X (CKR_TOKEN_NOT_PRESENT) + GKM_X (CKR_TOKEN_NOT_RECOGNIZED) + GKM_X (CKR_TOKEN_WRITE_PROTECTED) + GKM_X (CKR_UNWRAPPING_KEY_HANDLE_INVALID) + GKM_X (CKR_UNWRAPPING_KEY_SIZE_RANGE) + GKM_X (CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT) + GKM_X (CKR_USER_ALREADY_LOGGED_IN) + GKM_X (CKR_USER_NOT_LOGGED_IN) + GKM_X (CKR_USER_PIN_NOT_INITIALIZED) + GKM_X (CKR_USER_TYPE_INVALID) + GKM_X (CKR_USER_ANOTHER_ALREADY_LOGGED_IN) + GKM_X (CKR_USER_TOO_MANY_TYPES) + GKM_X (CKR_WRAPPED_KEY_INVALID) + GKM_X (CKR_WRAPPED_KEY_LEN_RANGE) + GKM_X (CKR_WRAPPING_KEY_HANDLE_INVALID) + GKM_X (CKR_WRAPPING_KEY_SIZE_RANGE) + GKM_X (CKR_WRAPPING_KEY_TYPE_INCONSISTENT) + GKM_X (CKR_RANDOM_SEED_NOT_SUPPORTED) + GKM_X (CKR_RANDOM_NO_RNG) + GKM_X (CKR_DOMAIN_PARAMS_INVALID) + GKM_X (CKR_BUFFER_TOO_SMALL) + GKM_X (CKR_SAVED_STATE_INVALID) + GKM_X (CKR_INFORMATION_SENSITIVE) + GKM_X (CKR_STATE_UNSAVEABLE) + GKM_X (CKR_CRYPTOKI_NOT_INITIALIZED) + GKM_X (CKR_CRYPTOKI_ALREADY_INITIALIZED) + GKM_X (CKR_MUTEX_BAD) + GKM_X (CKR_MUTEX_NOT_LOCKED) + GKM_X (CKR_FUNCTION_REJECTED) + default: + return NULL; + } + + #undef GKM_X +} + +static gchar* +rv_to_string (CK_RV rv) +{ + gchar *string = g_strdup (defined_rv_to_string (rv)); + if (string == NULL) + string = g_strdup_printf ("0x%08lx", (gulong)rv); + return string; +} + +void +gck_assertion_message_cmprv (const gchar *domain, const gchar *file, gint line, + const gchar *func, const gchar *expr, + CK_RV arg1, const gchar *cmp, CK_RV arg2) +{ + gchar *a1, *a2, *s; + a1 = rv_to_string (arg1); + a2 = rv_to_string (arg2); + s = g_strdup_printf ("assertion failed (%s): (%s %s %s)", expr, a1, cmp, a2); + g_free (a1); + g_free (a2); + g_assertion_message (domain, file, line, func, s); + g_free (s); +} + +void +gck_assertion_message_cmpulong (const gchar *domain, const gchar *file, gint line, + const gchar *func, const gchar *expr, + CK_ULONG arg1, const gchar *cmp, CK_ULONG arg2) +{ + char *s = NULL; + s = g_strdup_printf ("assertion failed (%s): (0x%08llx %s 0x%08llx)", expr, + (long long unsigned)arg1, cmp, (long long unsigned)arg2); + g_assertion_message (domain, file, line, func, s); + g_free (s); +} diff --git a/gck/gck-test.h b/gck/gck-test.h new file mode 100644 index 0000000..dfefbb0 --- /dev/null +++ b/gck/gck-test.h @@ -0,0 +1,62 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include + +#include "gck/gck.h" + +#include +#include "pkcs11i.h" + +#ifndef GCK_TEST_H +#define GCK_TEST_H + +#define gck_assert_cmprv(v1, cmp, v2) \ + do { CK_RV __v1 = (v1), __v2 = (v2); \ + if (__v1 cmp __v2) ; else \ + gck_assertion_message_cmprv (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #v1 " " #cmp " " #v2, __v1, #cmp, __v2); \ + } while (0) + +#define gck_assert_cmpulong(v1, cmp, v2) \ + do { CK_RV __v1 = (v1), __v2 = (v2); \ + if (__v1 cmp __v2) ; else \ + gck_assertion_message_cmpulong (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #v1 " " #cmp " " #v2, __v1, #cmp, __v2); \ + } while (0) + +void gck_assertion_message_cmprv (const gchar *domain, + const gchar *file, + int line, + const gchar *func, + const gchar *expr, + CK_RV arg1, + const gchar *cmp, + CK_RV arg2); + +void gck_assertion_message_cmpulong (const gchar *domain, + const gchar *file, + gint line, + const gchar *func, + const gchar *expr, + CK_ULONG arg1, + const gchar *cmp, + CK_ULONG arg2); + +#endif /* GCK_TEST_H */ diff --git a/gck/gck-uri.c b/gck/gck-uri.c new file mode 100644 index 0000000..b985114 --- /dev/null +++ b/gck/gck-uri.c @@ -0,0 +1,366 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck-uri.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2010, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck.h" +#include "gck-private.h" + +#include "gck/gck-marshal.h" + +#include + +#include + +#include +#include + +/** + * SECTION:gck-uri + * @title: PKCS11 URIs + * @short_description: Parsing and building PKCS\#11 URIs. + * + * PKCS\#11 URIs + * are a standard for referring to PKCS\#11 modules, tokens, or objects. What the + * PKCS\#11 URI refers to depends on the context in which it is used. + * + * A PKCS\#11 URI can always resolve to more than one object, token or module. A + * PKCS\#11 URI that refers to a token, would (when used in a context that expects + * objects) refer to all the token on that module. + * + * In most cases the parsing or building of URIs is handled elsewhere in the GCK + * library. For example to enumerate objects that match a PKCS\#11 URI use the + * gck_modules_enumerate_uri() function. + * + * To parse a PKCS\#11 URI use the gck_uri_parse() function passing in the type of + * context in which you're using the URI. To build a URI use the gck_uri_build() + * function. + **/ + +/** + * GckUriData: + * @any_unrecognized: whether any parts of the PKCS\#11 URI were unsupported or unrecognized. + * @module_info: information about the PKCS\#11 modules matching the URI. + * @token_info: information about the PKCS\#11 tokens matching the URI. + * @attributes: information about the PKCS\#11 objects matching the URI. + * + * Information about the contents of a PKCS\#11 URI. Various fields may be %NULL + * depending on the context that the URI was parsed for. + * + * Since PKCS\#11 URIs represent a set which results from the intersections of + * all of the URI parts, if @any_recognized is set to %TRUE then usually the URI + * should be treated as not matching anything. + */ + +/** + * GckUriFlags: + * @GCK_URI_FOR_MODULE: the URI will be used to match modules. + * @GCK_URI_FOR_TOKEN: the URI will be used to match tokens. + * @GCK_URI_FOR_OBJECT: the URI will be used to match objects. + * @GCK_URI_WITH_VERSION: the URI has specific version numbers for module and/or token + * @GCK_URI_FOR_ANY: parse all recognized components of the URI. + * + * Which parts of the PKCS\#11 URI will be parsed or formatted. These can be + * combined. + */ + +/** + * GCK_URI_FOR_MODULE_WITH_VERSION: + * + * The URI will match specific version of modules. To be used as a GckUriFlags argument. + */ + +/** + * GCK_URI_FOR_OBJECT_ON_TOKEN: + * + * The URI will match objects on a specific token. To be used as a GckUriFlags argument. + */ + +/** + * GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE: + * + * The token inserted into a device with a specific module. + */ + +/** + * GckUriError: + * @GCK_URI_BAD_SCHEME: invalid URI scheme + * @GCK_URI_BAD_ENCODING: bad URI encoding + * @GCK_URI_BAD_SYNTAX: bad URI syntax + * @GCK_URI_BAD_VERSION: bad URI version component + * @GCK_URI_NOT_FOUND: piece of the URI was not found + * + * Various error codes used with PKCS\#11 URIs + */ + +/** + * GCK_URI_ERROR: + * + * Error domain for URI errors. + */ + +/** + * GCK_URI_BAD_PREFIX: + * + * Use %GCK_URI_BAD_SCHEME instead. + * + * Deprecated: Since 3.2 + */ + +/** + * CKR_GCK_MODULE_PROBLEM: + * + * Use %GCK_ERROR_MODULE_PROBLEM instead. + * + * Deprecated: Since 3.4 + */ + +#define URI_PREFIX "pkcs11:" +#define N_URI_PREFIX 7 + +struct _GckUri { + gboolean any_unrecognized; + GckModuleInfo *module_info; + GckTokenInfo *token_info; + GckAttributes *attributes; +}; + +GQuark +gck_uri_get_error_quark (void) +{ + /* This is deprecated version */ + return gck_uri_get_error_quark (); +} + +GQuark +gck_uri_error_get_quark (void) +{ + static GQuark domain = 0; + static volatile gsize quark_inited = 0; + + if (g_once_init_enter (&quark_inited)) { + domain = g_quark_from_static_string ("gck-uri-error"); + g_once_init_leave (&quark_inited, 1); + } + + return domain; +} + +/** + * gck_uri_data_new: + * + * Allocate a new GckUriData structure. None of the fields + * will be set. + * + * Returns: (transfer full): a newly allocated GckUriData, free with + * gck_uri_data_free() + */ +GckUriData * +gck_uri_data_new (void) +{ + return g_slice_new0 (GckUriData); +} + +/** + * gck_uri_parse: + * @string: the URI to parse. + * @flags: the context in which the URI will be used. + * @error: a #GError, or %NULL. + * + * Parse a PKCS\#11 URI for use in a given context. + * + * The result will contain the fields that are relevant for + * the given context. See #GckUriData for more info. + * Other fields will be set to %NULL. + * + * Returns: (transfer full): a newly allocated #GckUriData; which should be + * freed with gck_uri_data_free() + */ +GckUriData* +gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error) +{ + GckUriData *uri_data = NULL; + GckBuilder builder; + CK_ATTRIBUTE_PTR attrs; + CK_ULONG i, n_attrs; + P11KitUri *p11_uri; + gint res; + + g_return_val_if_fail (string, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + p11_uri = p11_kit_uri_new (); + if (!p11_uri) + g_error ("failed to allocate P11KitUri"); + + res = p11_kit_uri_parse (string, flags, p11_uri); + if (res != P11_KIT_URI_OK) { + p11_kit_uri_free (p11_uri); + switch (res) { + case P11_KIT_URI_NO_MEMORY: + g_error ("failed to allocate memory in p11_kit_uri_parse()"); + break; + case P11_KIT_URI_BAD_ENCODING: + g_set_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING, + _("The URI has invalid encoding.")); + break; + case P11_KIT_URI_BAD_SCHEME: + g_set_error_literal (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME, + _("The URI does not have the “pkcs11” scheme.")); + break; + case P11_KIT_URI_BAD_SYNTAX: + g_set_error_literal (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX, + _("The URI has bad syntax.")); + break; + case P11_KIT_URI_BAD_VERSION: + g_set_error_literal (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX, + _("The URI has a bad version number.")); + break; + case P11_KIT_URI_NOT_FOUND: + g_assert_not_reached (); + break; + }; + return NULL; + } + + /* Convert it to a GckUri */ + uri_data = gck_uri_data_new (); + if (flags & GCK_URI_FOR_MODULE_WITH_VERSION) + uri_data->module_info = _gck_module_info_from_pkcs11 (p11_kit_uri_get_module_info (p11_uri)); + if (flags & GCK_URI_FOR_TOKEN) + uri_data->token_info = _gck_token_info_from_pkcs11 (p11_kit_uri_get_token_info (p11_uri)); + if (flags & GCK_URI_FOR_OBJECT) { + attrs = p11_kit_uri_get_attributes (p11_uri, &n_attrs); + gck_builder_init (&builder); + for (i = 0; i < n_attrs; ++i) + gck_builder_add_data (&builder, attrs[i].type, attrs[i].pValue, attrs[i].ulValueLen); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + } + uri_data->any_unrecognized = p11_kit_uri_any_unrecognized (p11_uri); + + p11_kit_uri_free (p11_uri); + return uri_data; +} + +/** + * gck_uri_build: + * @uri_data: the info to build the URI from. + * @flags: The context that the URI is for + * + * Build a PKCS\#11 URI. The various parts relevant to the flags + * specified will be used to build the URI. + * + * Return value: a newly allocated string containing a PKCS\#11 URI. + */ +gchar* +gck_uri_build (GckUriData *uri_data, GckUriFlags flags) +{ + const GckAttribute *attr; + P11KitUri *p11_uri = 0; + gchar *string; + int res; + guint i; + + g_return_val_if_fail (uri_data != NULL, NULL); + + p11_uri = p11_kit_uri_new (); + + if ((flags & GCK_URI_FOR_MODULE_WITH_VERSION) && uri_data->module_info) + _gck_module_info_to_pkcs11 (uri_data->module_info, + p11_kit_uri_get_module_info (p11_uri)); + if ((flags & GCK_URI_FOR_TOKEN) && uri_data->token_info) + _gck_token_info_to_pkcs11 (uri_data->token_info, + p11_kit_uri_get_token_info (p11_uri)); + if ((flags & GCK_URI_FOR_OBJECT) && uri_data->attributes) { + for (i = 0; i < gck_attributes_count (uri_data->attributes); ++i) { + attr = gck_attributes_at (uri_data->attributes, i); + res = p11_kit_uri_set_attribute (p11_uri, (CK_ATTRIBUTE_PTR)attr); + if (res == P11_KIT_URI_NO_MEMORY) + g_error ("failed to allocate memory in p11_kit_uri_set_attribute()"); + else if (res != P11_KIT_URI_NOT_FOUND && res != P11_KIT_URI_OK) + g_return_val_if_reached (NULL); + } + } + + res = p11_kit_uri_format (p11_uri, flags & GCK_URI_FOR_ANY, &string); + if (res == P11_KIT_URI_NO_MEMORY) + g_error ("failed to allocate memory in p11_kit_uri_format()"); + else if (res != P11_KIT_URI_OK) + g_return_val_if_reached (NULL); + + p11_kit_uri_free (p11_uri); + return string; +} + +GType +gck_uri_data_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GckUriData", + (GBoxedCopyFunc)gck_uri_data_copy, + (GBoxedFreeFunc)gck_uri_data_free); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gck_uri_data_copy: + * @uri_data: URI data to copy + * + * Copy a #GckUriData + * + * Returns: (transfer full): newly allocated copy of the uri data + */ +GckUriData * +gck_uri_data_copy (GckUriData *uri_data) +{ + GckUriData *copy; + + copy = g_memdup (uri_data, sizeof (GckUriData)); + copy->attributes = gck_attributes_ref (uri_data->attributes); + copy->module_info = gck_module_info_copy (copy->module_info); + copy->token_info = gck_token_info_copy (copy->token_info); + return copy; +} + +/** + * gck_uri_data_free: + * @uri_data: URI data to free. + * + * Free a #GckUriData. + */ +void +gck_uri_data_free (GckUriData *uri_data) +{ + if (uri_data) { + if (uri_data->attributes) + gck_attributes_unref (uri_data->attributes); + if (uri_data->module_info) + gck_module_info_free (uri_data->module_info); + if (uri_data->token_info) + gck_token_info_free (uri_data->token_info); + g_slice_free (GckUriData, uri_data); + } +} diff --git a/gck/gck-version.h b/gck/gck-version.h new file mode 100644 index 0000000..4675d18 --- /dev/null +++ b/gck/gck-version.h @@ -0,0 +1,44 @@ +/* + * gnome-keyring + * + * Copyright (C) 2013 Stef Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCK_VERSION_H__ +#define __GCK_VERSION_H__ + +#if !defined (__GCK_INSIDE_HEADER__) && !defined (GCK_COMPILATION) +#error "Only can be included directly." +#endif + +/* compile time version + */ +#define GCK_MAJOR_VERSION (3) +#define GCK_MINOR_VERSION (28) +#define GCK_MICRO_VERSION (0) + +/* check whether a Gcr version equal to or greater than + * major.minor.micro. + */ +#define GCK_CHECK_VERSION(major,minor,micro) \ + (GCK_MAJOR_VERSION > (major) || \ + (GCK_MAJOR_VERSION == (major) && GCK_MINOR_VERSION > (minor)) || \ + (GCK_MAJOR_VERSION == (major) && GCK_MINOR_VERSION == (minor) && \ + GCK_MICRO_VERSION >= (micro))) + +#endif /* __GCK_VERSION_H__ */ diff --git a/gck/gck-version.h.in b/gck/gck-version.h.in new file mode 100644 index 0000000..012e236 --- /dev/null +++ b/gck/gck-version.h.in @@ -0,0 +1,44 @@ +/* + * gnome-keyring + * + * Copyright (C) 2013 Stef Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCK_VERSION_H__ +#define __GCK_VERSION_H__ + +#if !defined (__GCK_INSIDE_HEADER__) && !defined (GCK_COMPILATION) +#error "Only can be included directly." +#endif + +/* compile time version + */ +#define GCK_MAJOR_VERSION (@GCR_MAJOR@) +#define GCK_MINOR_VERSION (@GCR_MINOR@) +#define GCK_MICRO_VERSION (@GCR_MICRO@) + +/* check whether a Gcr version equal to or greater than + * major.minor.micro. + */ +#define GCK_CHECK_VERSION(major,minor,micro) \ + (GCK_MAJOR_VERSION > (major) || \ + (GCK_MAJOR_VERSION == (major) && GCK_MINOR_VERSION > (minor)) || \ + (GCK_MAJOR_VERSION == (major) && GCK_MINOR_VERSION == (minor) && \ + GCK_MICRO_VERSION >= (micro))) + +#endif /* __GCK_VERSION_H__ */ diff --git a/gck/gck.h b/gck/gck.h new file mode 100644 index 0000000..851d6e4 --- /dev/null +++ b/gck/gck.h @@ -0,0 +1,1570 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gck.h - the GObject PKCS#11 wrapper library + + Copyright (C) 2008, Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef GCK_H +#define GCK_H + +#include +#include +#include + +#include + +#define __GCK_INSIDE_HEADER__ + +#include +#include + +G_BEGIN_DECLS + +/* + * To use this API, you need to be prepared for changes to the API, + * and add the C flag: -DGCK_API_SUBJECT_TO_CHANGE + */ + +#ifndef __GI_SCANNER__ +#ifndef GCK_API_SUBJECT_TO_CHANGE +#error "This API has not yet reached stability." +#endif +#endif + +#define GCK_VENDOR_CODE 0x47434B00 /* GCK */ + +/* An error code which results from a failure to load the PKCS11 module */ +typedef enum { + GCK_ERROR_MODULE_PROBLEM = (CKR_VENDOR_DEFINED | (GCK_VENDOR_CODE + 1)), +} GckError; + +#define GCK_ERROR (gck_error_get_quark ()) + +GQuark gck_error_get_quark (void) G_GNUC_CONST; + +#define GCK_TYPE_LIST (gck_list_get_boxed_type ()) + +GType gck_list_get_boxed_type (void) G_GNUC_CONST; + +GList* gck_list_ref_copy (GList *reflist); + +void gck_list_unref_free (GList *reflist); + +const gchar* gck_message_from_rv (gulong rv); + +gboolean gck_string_to_chars (guchar *data, + gsize max, + const gchar *string); + +gchar* gck_string_from_chars (const guchar *data, + gsize max); + +typedef gpointer (*GckAllocator) (gpointer data, gsize length); + +typedef enum { + GCK_SESSION_READ_ONLY = 0, + GCK_SESSION_READ_WRITE = 1 << 1, + GCK_SESSION_LOGIN_USER = 1 << 2, + GCK_SESSION_AUTHENTICATE = 1 << 3, +} GckSessionOptions; + +typedef struct _GckMechanism GckMechanism; + +struct _GckMechanism { + gulong type; + gconstpointer parameter; + gulong n_parameter; +}; + +typedef struct _GckAttribute GckAttribute; + +struct _GckAttribute { + gulong type; + guchar *value; + gulong length; +}; + +#define GCK_INVALID ((gulong)-1) + +gboolean gck_value_to_ulong (const guchar *value, + gsize length, + gulong *result); + +gboolean gck_value_to_boolean (const guchar *value, + gsize length, + gboolean *result); + +void gck_attribute_init (GckAttribute *attr, + gulong attr_type, + const guchar *value, + gsize length); + +void gck_attribute_init_invalid (GckAttribute *attr, + gulong attr_type); + +void gck_attribute_init_empty (GckAttribute *attr, + gulong attr_type); + +void gck_attribute_init_boolean (GckAttribute *attr, + gulong attr_type, + gboolean value); + +void gck_attribute_init_date (GckAttribute *attr, + gulong attr_type, + const GDate *value); + +void gck_attribute_init_ulong (GckAttribute *attr, + gulong attr_type, + gulong value); + +void gck_attribute_init_string (GckAttribute *attr, + gulong attr_type, + const gchar *value); + +void gck_attribute_init_copy (GckAttribute *dest, + const GckAttribute *src); + +#define GCK_TYPE_ATTRIBUTE (gck_attribute_get_type ()) + +GType gck_attribute_get_type (void) G_GNUC_CONST; + +GckAttribute* gck_attribute_new (gulong attr_type, + const guchar *value, + gsize length); + +GckAttribute* gck_attribute_new_invalid (gulong attr_type); + +GckAttribute* gck_attribute_new_empty (gulong attr_type); + +GckAttribute* gck_attribute_new_boolean (gulong attr_type, + gboolean value); + +GckAttribute* gck_attribute_new_date (gulong attr_type, + const GDate *value); + +GckAttribute* gck_attribute_new_ulong (gulong attr_type, + gulong value); + +GckAttribute* gck_attribute_new_string (gulong attr_type, + const gchar *value); + +gboolean gck_attribute_is_invalid (const GckAttribute *attr); + +gboolean gck_attribute_get_boolean (const GckAttribute *attr); + +gulong gck_attribute_get_ulong (const GckAttribute *attr); + +gchar* gck_attribute_get_string (const GckAttribute *attr); + +void gck_attribute_get_date (const GckAttribute *attr, + GDate* value); + +const guchar * gck_attribute_get_data (const GckAttribute *attr, + gsize *length); + +gboolean gck_attribute_equal (gconstpointer attr1, + gconstpointer attr2); + +guint gck_attribute_hash (gconstpointer attr); + +GckAttribute* gck_attribute_dup (const GckAttribute *attr); + +void gck_attribute_clear (GckAttribute *attr); + +void gck_attribute_free (gpointer attr); + +void gck_attribute_dump (const GckAttribute *attr); + +typedef struct _GckBuilder GckBuilder; + +struct _GckBuilder { + /*< private >*/ + gsize x[16]; +}; + +typedef enum { + GCK_BUILDER_NONE, + GCK_BUILDER_SECURE_MEMORY = 1, +} GckBuilderFlags; + +typedef struct _GckAttributes GckAttributes; + +GckBuilder * gck_builder_new (GckBuilderFlags flags); + +#define GCK_BUILDER_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } + +GckBuilder * gck_builder_ref (GckBuilder *builder); + +void gck_builder_unref (gpointer builder); + +void gck_builder_init (GckBuilder *builder); + +void gck_builder_init_full (GckBuilder *builder, + GckBuilderFlags flags); + +#define GCK_TYPE_BUILDER (gck_builder_get_type ()) + +GType gck_builder_get_type (void) G_GNUC_CONST; + +void gck_builder_take_data (GckBuilder *builder, + gulong attr_type, + guchar *value, + gsize length); + +void gck_builder_add_data (GckBuilder *builder, + gulong attr_type, + const guchar *value, + gsize length); + +void gck_builder_add_empty (GckBuilder *builder, + gulong attr_type); + +void gck_builder_add_invalid (GckBuilder *builder, + gulong attr_type); + +void gck_builder_add_ulong (GckBuilder *builder, + gulong attr_type, + gulong value); + +void gck_builder_add_boolean (GckBuilder *builder, + gulong attr_type, + gboolean value); + +void gck_builder_add_date (GckBuilder *builder, + gulong attr_type, + const GDate *value); + +void gck_builder_add_string (GckBuilder *builder, + gulong attr_type, + const gchar *value); + +void gck_builder_add_attribute (GckBuilder *builder, + const GckAttribute *attr); + +void gck_builder_add_all (GckBuilder *builder, + GckAttributes *attrs); + +void gck_builder_add_only (GckBuilder *builder, + GckAttributes *attrs, + gulong only_type, + ...); + +void gck_builder_add_onlyv (GckBuilder *builder, + GckAttributes *attrs, + const gulong *only_types, + guint n_only_types); + +void gck_builder_add_except (GckBuilder *builder, + GckAttributes *attrs, + gulong except_type, + ...); + +void gck_builder_add_exceptv (GckBuilder *builder, + GckAttributes *attrs, + const gulong *except_types, + guint n_except_types); + +void gck_builder_set_data (GckBuilder *builder, + gulong attr_type, + const guchar *value, + gsize length); + +void gck_builder_set_empty (GckBuilder *builder, + gulong attr_type); + +void gck_builder_set_invalid (GckBuilder *builder, + gulong attr_type); + +void gck_builder_set_ulong (GckBuilder *builder, + gulong attr_type, + gulong value); + +void gck_builder_set_boolean (GckBuilder *builder, + gulong attr_type, + gboolean value); + +void gck_builder_set_date (GckBuilder *builder, + gulong attr_type, + const GDate *value); + +void gck_builder_set_string (GckBuilder *builder, + gulong attr_type, + const gchar *value); + +void gck_builder_set_all (GckBuilder *builder, + GckAttributes *attrs); + +const GckAttribute * gck_builder_find (GckBuilder *builder, + gulong attr_type); + +gboolean gck_builder_find_boolean (GckBuilder *builder, + gulong attr_type, + gboolean *value); + +gboolean gck_builder_find_ulong (GckBuilder *builder, + gulong attr_type, + gulong *value); + +gboolean gck_builder_find_string (GckBuilder *builder, + gulong attr_type, + gchar **value); + +gboolean gck_builder_find_date (GckBuilder *builder, + gulong attr_type, + GDate *value); + +GckAttributes * gck_builder_steal (GckBuilder *builder); + +GckAttributes * gck_builder_end (GckBuilder *builder); + +GckBuilder * gck_builder_copy (GckBuilder *builder); + +void gck_builder_clear (GckBuilder *builder); + +#define GCK_TYPE_ATTRIBUTES (gck_attributes_get_boxed_type ()) + +GType gck_attributes_get_type (void) G_GNUC_CONST; + +GckAttributes * gck_attributes_new (gulong reserved); + +GckAttributes * gck_attributes_new_empty (gulong first_type, + ...); + +const GckAttribute * gck_attributes_at (GckAttributes *attrs, + guint index); + +const GckAttribute * gck_attributes_find (GckAttributes *attrs, + gulong attr_type); + +gboolean gck_attributes_find_boolean (GckAttributes *attrs, + gulong attr_type, + gboolean *value); + +gboolean gck_attributes_find_ulong (GckAttributes *attrs, + gulong attr_type, + gulong *value); + +gboolean gck_attributes_find_string (GckAttributes *attrs, + gulong attr_type, + gchar **value); + +gboolean gck_attributes_find_date (GckAttributes *attrs, + gulong attr_type, + GDate *value); + +gulong gck_attributes_count (GckAttributes *attrs); + +GckAttributes * gck_attributes_ref (GckAttributes *attrs); + +GckAttributes * gck_attributes_ref_sink (GckAttributes *attrs); + +void gck_attributes_unref (gpointer attrs); + +gboolean gck_attributes_contains (GckAttributes *attrs, + const GckAttribute *match); + +void gck_attributes_dump (GckAttributes *attrs); + +gchar * gck_attributes_to_string (GckAttributes *attrs); + +/* ------------------------------------------------------------------------- + * FORWARDS + */ +typedef struct _GckSlot GckSlot; +typedef struct _GckModule GckModule; +typedef struct _GckSession GckSession; +typedef struct _GckObject GckObject; +typedef struct _GckObjectCache GckObjectCache; +typedef struct _GckEnumerator GckEnumerator; +typedef struct _GckUriData GckUriData; + +/* ------------------------------------------------------------------------- + * MODULE + */ + +typedef struct _GckModuleInfo GckModuleInfo; + +struct _GckModuleInfo { + guint8 pkcs11_version_major; + guint8 pkcs11_version_minor; + + gchar *manufacturer_id; + gulong flags; + + gchar *library_description; + guint8 library_version_major; + guint8 library_version_minor; +}; + +#define GCK_TYPE_MODULE_INFO (gck_module_info_get_type ()) + +GType gck_module_info_get_type (void) G_GNUC_CONST; + +GckModuleInfo * gck_module_info_copy (GckModuleInfo *module_info); + +void gck_module_info_free (GckModuleInfo *module_info); + +#define GCK_TYPE_MODULE (gck_module_get_type()) +#define GCK_MODULE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_MODULE, GckModule)) +#define GCK_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_MODULE, GckModule)) +#define GCK_IS_MODULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_MODULE)) +#define GCK_IS_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_MODULE)) +#define GCK_MODULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_MODULE, GckModuleClass)) + +typedef struct _GckModuleClass GckModuleClass; +typedef struct _GckModulePrivate GckModulePrivate; + +struct _GckModule { + GObject parent; + + /*< private >*/ + GckModulePrivate *pv; + gpointer reserved[4]; +}; + +struct _GckModuleClass { + GObjectClass parent; + + gboolean (*authenticate_slot) (GckModule *self, GckSlot *slot, gchar *label, gchar **password); + + gboolean (*authenticate_object) (GckModule *self, GckObject *object, gchar *label, gchar **password); + + /*< private >*/ + gpointer reserved[8]; +}; + +GType gck_module_get_type (void) G_GNUC_CONST; + +GckModule* gck_module_new (CK_FUNCTION_LIST_PTR funcs); + +GckModule* gck_module_initialize (const gchar *path, + GCancellable *cancellable, + GError **error); + +void gck_module_initialize_async (const gchar *path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckModule * gck_module_initialize_finish (GAsyncResult *result, + GError **error); + +gboolean gck_module_equal (gconstpointer module1, + gconstpointer module2); + +guint gck_module_hash (gconstpointer module); + +gboolean gck_module_match (GckModule *self, + GckUriData *uri); + +const gchar* gck_module_get_path (GckModule *self); + +CK_FUNCTION_LIST_PTR gck_module_get_functions (GckModule *self); + +GckModuleInfo* gck_module_get_info (GckModule *self); + +GList* gck_module_get_slots (GckModule *self, + gboolean token_present); + +GList* gck_modules_initialize_registered (GCancellable *cancellable, + GError **error); + +void gck_modules_initialize_registered_async (GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GList * gck_modules_initialize_registered_finish (GAsyncResult *result, + GError **error); + +GList* gck_modules_get_slots (GList *modules, + gboolean token_present); + +GckEnumerator* gck_modules_enumerate_objects (GList *modules, + GckAttributes *attrs, + GckSessionOptions session_options); + +GckSlot* gck_modules_token_for_uri (GList *modules, + const gchar *uri, + GError **error); + +GList * gck_modules_tokens_for_uri (GList *modules, + const gchar *uri, + GError **error); + +GckObject* gck_modules_object_for_uri (GList *modules, + const gchar *uri, + GckSessionOptions session_options, + GError **error); + +GList* gck_modules_objects_for_uri (GList *modules, + const gchar *uri, + GckSessionOptions session_options, + GError **error); + +GckEnumerator* gck_modules_enumerate_uri (GList *modules, + const gchar *uri, + GckSessionOptions session_options, + GError **error); + + +/* ------------------------------------------------------------------------ + * ENUMERATOR + */ + +#define GCK_TYPE_ENUMERATOR (gck_enumerator_get_type()) +#define GCK_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_ENUMERATOR, GckEnumerator)) +#define GCK_ENUMERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_ENUMERATOR, GckEnumerator)) +#define GCK_IS_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_ENUMERATOR)) +#define GCK_IS_ENUMERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_ENUMERATOR)) +#define GCK_ENUMERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_ENUMERATOR, GckEnumeratorClass)) + +typedef struct _GckEnumeratorClass GckEnumeratorClass; +typedef struct _GckEnumeratorPrivate GckEnumeratorPrivate; + +struct _GckEnumerator { + GObject parent; + + /*< private >*/ + GckEnumeratorPrivate *pv; + gpointer reserved[2]; +}; + +struct _GckEnumeratorClass { + GObjectClass parent; + + /*< private >*/ + gpointer reserved[2]; +}; + +GType gck_enumerator_get_type (void) G_GNUC_CONST; + +GTlsInteraction * gck_enumerator_get_interaction (GckEnumerator *self); + +void gck_enumerator_set_interaction (GckEnumerator *self, + GTlsInteraction *interaction); + +GType gck_enumerator_get_object_type (GckEnumerator *self); + +void gck_enumerator_set_object_type (GckEnumerator *self, + GType object_type); + +void gck_enumerator_set_object_type_full (GckEnumerator *self, + GType object_type, + const gulong *attr_types, + gint attr_count); + +GckEnumerator * gck_enumerator_get_chained (GckEnumerator *self); + +void gck_enumerator_set_chained (GckEnumerator *self, + GckEnumerator *chained); + +GckObject * gck_enumerator_next (GckEnumerator *self, + GCancellable *cancellable, + GError **error); + +GList* gck_enumerator_next_n (GckEnumerator *self, + gint max_objects, + GCancellable *cancellable, + GError **error); + +void gck_enumerator_next_async (GckEnumerator *self, + gint max_objects, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GList* gck_enumerator_next_finish (GckEnumerator *self, + GAsyncResult *result, + GError **error); + +/* ------------------------------------------------------------------------ + * SLOT + */ + +typedef struct _GckSlotInfo GckSlotInfo; + +struct _GckSlotInfo { + gchar *slot_description; + gchar *manufacturer_id; + gulong flags; + guint8 hardware_version_major; + guint8 hardware_version_minor; + guint8 firmware_version_major; + guint8 firmware_version_minor; +}; + +#define GCK_TYPE_SLOT_INFO (gck_slot_info_get_type ()) + +GType gck_slot_info_get_type (void) G_GNUC_CONST; + +GckSlotInfo * gck_slot_info_copy (GckSlotInfo *slot_info); + +void gck_slot_info_free (GckSlotInfo *slot_info); + +typedef struct _GckTokenInfo GckTokenInfo; + +struct _GckTokenInfo { + gchar *label; + gchar *manufacturer_id; + gchar *model; + gchar *serial_number; + gulong flags; + glong max_session_count; + glong session_count; + glong max_rw_session_count; + glong rw_session_count; + glong max_pin_len; + glong min_pin_len; + glong total_public_memory; + glong free_public_memory; + glong total_private_memory; + glong free_private_memory; + guint8 hardware_version_major; + guint8 hardware_version_minor; + guint8 firmware_version_major; + guint8 firmware_version_minor; + gint64 utc_time; +}; + +#define GCK_TYPE_TOKEN_INFO (gck_token_info_get_type ()) + +GType gck_token_info_get_type (void) G_GNUC_CONST; + +GckTokenInfo * gck_token_info_copy (GckTokenInfo *token_info); + +void gck_token_info_free (GckTokenInfo *token_info); + +typedef struct _GckMechanismInfo GckMechanismInfo; + +struct _GckMechanismInfo { + gulong min_key_size; + gulong max_key_size; + gulong flags; +}; + +#define GCK_TYPE_MECHANISM_INFO (gck_mechanism_info_get_type ()) + +GType gck_mechanism_info_get_type (void) G_GNUC_CONST; + +GckMechanismInfo * gck_mechanism_info_copy (GckMechanismInfo *mech_info); + +void gck_mechanism_info_free (GckMechanismInfo *mech_info); + +#define gck_mechanisms_length(a) ((a)->len) + +#define gck_mechanisms_at(a, i) (g_array_index (a, CK_MECHANISM_TYPE, i)) + +gboolean gck_mechanisms_check (GArray *mechanisms, + ...); + +#define GCK_TYPE_SLOT (gck_slot_get_type()) +#define GCK_SLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_SLOT, GckSlot)) +#define GCK_SLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_SLOT, GckSlot)) +#define GCK_IS_SLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_SLOT)) +#define GCK_IS_SLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_SLOT)) +#define GCK_SLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SLOT, GckSlotClass)) + +typedef struct _GckSlotClass GckSlotClass; +typedef struct _GckSlotPrivate GckSlotPrivate; + +struct _GckSlot { + GObject parent; + + /*< private >*/ + GckSlotPrivate *pv; + gpointer reserved[4]; +}; + +struct _GckSlotClass { + GObjectClass parent; + + /*< private >*/ + gpointer reserved[9]; +}; + +GType gck_slot_get_type (void) G_GNUC_CONST; + +gboolean gck_slot_equal (gconstpointer slot1, + gconstpointer slot2); + +guint gck_slot_hash (gconstpointer slot); + +gboolean gck_slot_match (GckSlot *self, + GckUriData *uri); + +GckSlot* gck_slot_from_handle (GckModule *module, + gulong slot_id); + +GckModule* gck_slot_get_module (GckSlot *self); + +gulong gck_slot_get_handle (GckSlot *self); + +GckSlotInfo* gck_slot_get_info (GckSlot *self); + +GckTokenInfo* gck_slot_get_token_info (GckSlot *self); + +GArray * gck_slot_get_mechanisms (GckSlot *self); + +GckMechanismInfo* gck_slot_get_mechanism_info (GckSlot *self, + gulong mech_type); + +gboolean gck_slot_has_flags (GckSlot *self, + gulong flags); + +GckSession* gck_slot_open_session (GckSlot *self, + GckSessionOptions options, + GCancellable *cancellable, + GError **error); + +GckSession* gck_slot_open_session_full (GckSlot *self, + GckSessionOptions options, + gulong pkcs11_flags, + gpointer app_data, + CK_NOTIFY notify, + GCancellable *cancellable, + GError **error); + +void gck_slot_open_session_async (GckSlot *self, + GckSessionOptions options, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +void gck_slot_open_session_full_async (GckSlot *self, + GckSessionOptions options, + gulong pkcs11_flags, + gpointer app_data, + CK_NOTIFY notify, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckSession* gck_slot_open_session_finish (GckSlot *self, + GAsyncResult *result, + GError **error); + +GckEnumerator * gck_slot_enumerate_objects (GckSlot *self, + GckAttributes *match, + GckSessionOptions options); + +GckEnumerator* gck_slots_enumerate_objects (GList *slots, + GckAttributes *match, + GckSessionOptions options); + +/* ------------------------------------------------------------------------ + * SESSION + */ + +typedef struct _GckSessionInfo GckSessionInfo; + +struct _GckSessionInfo { + gulong slot_id; + gulong state; + gulong flags; + gulong device_error; +}; + +#define GCK_TYPE_SESSION_INFO (gck_session_info_get_type ()) + +GType gck_session_info_get_type (void) G_GNUC_CONST; + +GckSessionInfo * gck_session_info_copy (GckSessionInfo *session_info); + +void gck_session_info_free (GckSessionInfo *session_info); + +#define GCK_TYPE_SESSION (gck_session_get_type()) +#define GCK_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_SESSION, GckSession)) +#define GCK_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_SESSION, GckSession)) +#define GCK_IS_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_SESSION)) +#define GCK_IS_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_SESSION)) +#define GCK_SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SESSION, GckSessionClass)) + +typedef struct _GckSessionClass GckSessionClass; +typedef struct _GckSessionPrivate GckSessionPrivate; + +struct _GckSession { + GObject parent; + + /*< private >*/ + GckSessionPrivate *pv; + gpointer reserved[4]; +}; + +struct _GckSessionClass { + GObjectClass parent; + + gboolean (*discard_handle) (GckSession *session, CK_SESSION_HANDLE handle); + + /*< private >*/ + gpointer reserved[8]; +}; + +GType gck_session_get_type (void) G_GNUC_CONST; + +GckSession * gck_session_from_handle (GckSlot *slot, + gulong session_handle, + GckSessionOptions options); + +GckModule* gck_session_get_module (GckSession *self); + +GckSlot* gck_session_get_slot (GckSession *self); + +gulong gck_session_get_handle (GckSession *self); + +GckSessionInfo* gck_session_get_info (GckSession *self); + +gulong gck_session_get_state (GckSession *self); + +GckSessionOptions gck_session_get_options (GckSession *self); + +GTlsInteraction * gck_session_get_interaction (GckSession *self); + +void gck_session_set_interaction (GckSession *self, + GTlsInteraction *interaction); + +GckSession * gck_session_open (GckSlot *slot, + GckSessionOptions options, + GTlsInteraction *interaction, + GCancellable *cancellable, + GError **error); + +void gck_session_open_async (GckSlot *slot, + GckSessionOptions options, + GTlsInteraction *interaction, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckSession * gck_session_open_finish (GAsyncResult *result, + GError **error); + +gboolean gck_session_init_pin (GckSession *self, + const guchar *pin, + gsize n_pin, + GCancellable *cancellable, + GError **error); + +void gck_session_init_pin_async (GckSession *self, + const guchar *pin, + gsize n_pin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_session_init_pin_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +gboolean gck_session_set_pin (GckSession *self, + const guchar *old_pin, + gsize n_old_pin, + const guchar *new_pin, + gsize n_new_pin, + GCancellable *cancellable, + GError **error); + +void gck_session_set_pin_async (GckSession *self, + const guchar *old_pin, + gsize n_old_pin, + const guchar *new_pin, + gsize n_new_pin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_session_set_pin_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +gboolean gck_session_login (GckSession *self, + gulong user_type, + const guchar *pin, + gsize n_pin, + GCancellable *cancellable, + GError **error); + +void gck_session_login_async (GckSession *self, + gulong user_type, + const guchar *pin, + gsize n_pin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_session_login_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +gboolean gck_session_login_interactive (GckSession *self, + gulong user_type, + GTlsInteraction *interaction, + GCancellable *cancellable, + GError **error); + +void gck_session_login_interactive_async (GckSession *self, + gulong user_type, + GTlsInteraction *interaction, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_session_login_interactive_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +gboolean gck_session_logout (GckSession *self, + GCancellable *cancellable, + GError **error); + +void gck_session_logout_async (GckSession *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_session_logout_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +GckObject* gck_session_create_object (GckSession *self, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error); + +void gck_session_create_object_async (GckSession *self, + GckAttributes *attrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckObject* gck_session_create_object_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +GList* gck_session_find_objects (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + GError **error); + +void gck_session_find_objects_async (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GList* gck_session_find_objects_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +gulong * gck_session_find_handles (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + gulong *n_handles, + GError **error); + +void gck_session_find_handles_async (GckSession *self, + GckAttributes *match, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gulong * gck_session_find_handles_finish (GckSession *self, + GAsyncResult *result, + gulong *n_handles, + GError **error); + +GckEnumerator * gck_session_enumerate_objects (GckSession *self, + GckAttributes *match); + +gboolean gck_session_generate_key_pair (GckSession *self, + gulong mech_type, + GckAttributes *public_attrs, + GckAttributes *private_attrs, + GckObject **public_key, + GckObject **private_key, + GCancellable *cancellable, + GError **error); + +gboolean gck_session_generate_key_pair_full (GckSession *self, + GckMechanism *mechanism, + GckAttributes *public_attrs, + GckAttributes *private_attrs, + GckObject **public_key, + GckObject **private_key, + GCancellable *cancellable, + GError **error); + +void gck_session_generate_key_pair_async (GckSession *self, + GckMechanism *mechanism, + GckAttributes *public_attrs, + GckAttributes *private_attrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_session_generate_key_pair_finish (GckSession *self, + GAsyncResult *result, + GckObject **public_key, + GckObject **private_key, + GError **error); + +guchar* gck_session_encrypt (GckSession *self, + GckObject *key, + gulong mech_type, + const guchar *input, + gsize n_input, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +guchar* gck_session_encrypt_full (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +void gck_session_encrypt_async (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +guchar* gck_session_encrypt_finish (GckSession *self, + GAsyncResult *result, + gsize *n_result, + GError **error); + +guchar* gck_session_decrypt (GckSession *self, + GckObject *key, + gulong mech_type, + const guchar *input, + gsize n_input, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +guchar* gck_session_decrypt_full (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +void gck_session_decrypt_async (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +guchar* gck_session_decrypt_finish (GckSession *self, + GAsyncResult *result, + gsize *n_result, + GError **error); + +guchar* gck_session_sign (GckSession *self, + GckObject *key, + gulong mech_type, + const guchar *input, + gsize n_input, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +guchar* gck_session_sign_full (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +void gck_session_sign_async (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +guchar* gck_session_sign_finish (GckSession *self, + GAsyncResult *result, + gsize *n_result, + GError **error); + +gboolean gck_session_verify (GckSession *self, + GckObject *key, + gulong mech_type, + const guchar *input, + gsize n_input, + const guchar *signature, + gsize n_signature, + GCancellable *cancellable, + GError **error); + +gboolean gck_session_verify_full (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + const guchar *signature, + gsize n_signature, + GCancellable *cancellable, + GError **error); + +void gck_session_verify_async (GckSession *self, + GckObject *key, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + const guchar *signature, + gsize n_signature, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_session_verify_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +guchar * gck_session_wrap_key (GckSession *self, + GckObject *wrapper, + gulong mech_type, + GckObject *wrapped, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +guchar * gck_session_wrap_key_full (GckSession *self, + GckObject *wrapper, + GckMechanism *mechanism, + GckObject *wrapped, + gsize *n_result, + GCancellable *cancellable, + GError **error); + +void gck_session_wrap_key_async (GckSession *self, + GckObject *wrapper, + GckMechanism *mechanism, + GckObject *wrapped, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +guchar * gck_session_wrap_key_finish (GckSession *self, + GAsyncResult *result, + gsize *n_result, + GError **error); + +GckObject* gck_session_unwrap_key (GckSession *self, + GckObject *wrapper, + gulong mech_type, + const guchar *input, + gsize n_input, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error); + +GckObject* gck_session_unwrap_key_full (GckSession *self, + GckObject *wrapper, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error); + +void gck_session_unwrap_key_async (GckSession *self, + GckObject *wrapper, + GckMechanism *mechanism, + const guchar *input, + gsize n_input, + GckAttributes *attrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckObject* gck_session_unwrap_key_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +GckObject* gck_session_derive_key (GckSession *self, + GckObject *base, + gulong mech_type, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error); + +GckObject* gck_session_derive_key_full (GckSession *self, + GckObject *base, + GckMechanism *mechanism, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error); + +void gck_session_derive_key_async (GckSession *self, + GckObject *base, + GckMechanism *mechanism, + GckAttributes *attrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckObject* gck_session_derive_key_finish (GckSession *self, + GAsyncResult *result, + GError **error); + +/* ------------------------------------------------------------------------ + * OBJECT + */ + +#define GCK_TYPE_OBJECT (gck_object_get_type()) +#define GCK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_OBJECT, GckObject)) +#define GCK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_OBJECT, GckObjectClass)) +#define GCK_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_OBJECT)) +#define GCK_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_OBJECT)) +#define GCK_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_OBJECT, GckObjectClass)) + +typedef struct _GckObjectClass GckObjectClass; +typedef struct _GckObjectPrivate GckObjectPrivate; + +struct _GckObject { + GObject parent; + + /*< private >*/ + GckObjectPrivate *pv; + gpointer reserved[4]; +}; + +struct _GckObjectClass { + GObjectClass parent; + + /*< private >*/ + gpointer reserved[8]; +}; + +GType gck_object_get_type (void) G_GNUC_CONST; + +GckObject * gck_object_from_handle (GckSession *session, + gulong object_handle); + +GList* gck_objects_from_handle_array (GckSession *session, + gulong *object_handles, + gulong n_object_handles); + +gboolean gck_object_equal (gconstpointer object1, + gconstpointer object2); + +guint gck_object_hash (gconstpointer object); + +GckModule* gck_object_get_module (GckObject *self); + +gulong gck_object_get_handle (GckObject *self); + +GckSession* gck_object_get_session (GckObject *self); + +gboolean gck_object_destroy (GckObject *self, + GCancellable *cancellable, + GError **error); + +void gck_object_destroy_async (GckObject *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_object_destroy_finish (GckObject *self, + GAsyncResult *result, + GError **error); + +gboolean gck_object_set (GckObject *self, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error); + +void gck_object_set_async (GckObject *self, + GckAttributes *attrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_object_set_finish (GckObject *self, + GAsyncResult *result, + GError **error); + +GckAttributes* gck_object_get (GckObject *self, + GCancellable *cancellable, + GError **error, + ...); + +GckAttributes* gck_object_get_full (GckObject *self, + const gulong *attr_types, + guint n_attr_types, + GCancellable *cancellable, + GError **error); + +void gck_object_get_async (GckObject *self, + const gulong *attr_types, + guint n_attr_types, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckAttributes* gck_object_get_finish (GckObject *self, + GAsyncResult *result, + GError **error); + +guchar * gck_object_get_data (GckObject *self, + gulong attr_type, + GCancellable *cancellable, + gsize *n_data, + GError **error); + +guchar * gck_object_get_data_full (GckObject *self, + gulong attr_type, + GckAllocator allocator, + GCancellable *cancellable, + gsize *n_data, + GError **error); + +void gck_object_get_data_async (GckObject *self, + gulong attr_type, + GckAllocator allocator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +guchar * gck_object_get_data_finish (GckObject *self, + GAsyncResult *result, + gsize *n_data, + GError **error); + +gboolean gck_object_set_template (GckObject *self, + gulong attr_type, + GckAttributes *attrs, + GCancellable *cancellable, + GError **error); + +void gck_object_set_template_async (GckObject *self, + gulong attr_type, + GckAttributes *attrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_object_set_template_finish (GckObject *self, + GAsyncResult *result, + GError **error); + +GckAttributes* gck_object_get_template (GckObject *self, + gulong attr_type, + GCancellable *cancellable, + GError **error); + +void gck_object_get_template_async (GckObject *self, + gulong attr_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckAttributes* gck_object_get_template_finish (GckObject *self, + GAsyncResult *result, + GError **error); + +/* ------------------------------------------------------------------------ + * OBJECT ATTRIBUTES + */ + +#define GCK_TYPE_OBJECT_CACHE (gck_object_cache_get_type ()) +#define GCK_OBJECT_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_OBJECT_CACHE, GckObjectCache)) +#define GCK_IS_OBJECT_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_OBJECT_CACHE)) +#define GCK_OBJECT_CACHE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCK_TYPE_OBJECT_CACHE, GckObjectCacheIface)) + +typedef struct _GckObjectCacheIface GckObjectCacheIface; + +struct _GckObjectCacheIface { + GTypeInterface interface; + + const gulong * default_types; + gint n_default_types; + + void (* fill) (GckObjectCache *object, + GckAttributes *attrs); + + /*< private >*/ + gpointer reserved[6]; +}; + +GType gck_object_cache_get_type (void) G_GNUC_CONST; + +GckAttributes * gck_object_cache_get_attributes (GckObjectCache *object); + +void gck_object_cache_set_attributes (GckObjectCache *object, + GckAttributes *attrs); + +void gck_object_cache_fill (GckObjectCache *object, + GckAttributes *attrs); + +gboolean gck_object_cache_update (GckObjectCache *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GError **error); + +void gck_object_cache_update_async (GckObjectCache *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gck_object_cache_update_finish (GckObjectCache *object, + GAsyncResult *result, + GError **error); + +GckAttributes * gck_object_cache_lookup (GckObject *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GError **error); + +void gck_object_cache_lookup_async (GckObject *object, + const gulong *attr_types, + gint n_attr_types, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GckAttributes * gck_object_cache_lookup_finish (GckObject *object, + GAsyncResult *result, + GError **error); + +/* ------------------------------------------------------------------------ + * PASSWORD + */ + +#define GCK_TYPE_PASSWORD (gck_password_get_type ()) +#define GCK_PASSWORD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_PASSWORD, GckPassword)) +#define GCK_PASSWORD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCK_TYPE_PASSWORD, GckPassword)) +#define GCK_IS_PASSWORD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_PASSWORD)) +#define GCK_IS_PASSWORD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCK_TYPE_PASSWORD)) +#define GCK_PASSWORD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCK_TYPE_PASSWORD, GckPasswordClass)) + +typedef struct _GckPassword GckPassword; +typedef struct _GckPasswordClass GckPasswordClass; +typedef struct _GckPasswordPrivate GckPasswordPrivate; + +struct _GckPassword { + GTlsPassword parent; + + /*< private >*/ + GckPasswordPrivate *pv; + gpointer reserved[4]; +}; + +struct _GckPasswordClass { + GTlsPasswordClass parent; + + /*< private >*/ + gpointer reserved[4]; +}; + +GType gck_password_get_type (void) G_GNUC_CONST; + +GckModule * gck_password_get_module (GckPassword *self); + +GckSlot * gck_password_get_token (GckPassword *self); + +GckObject * gck_password_get_key (GckPassword *self); + +/* ---------------------------------------------------------------------------- + * URI + */ + +typedef enum { + GCK_URI_BAD_SCHEME = 1, + GCK_URI_BAD_ENCODING, + GCK_URI_BAD_SYNTAX, + GCK_URI_BAD_VERSION, + GCK_URI_NOT_FOUND +} GckUriError; + +/* WARNING: Don't modify these without syncing with p11-kit */ +typedef enum { + GCK_URI_FOR_OBJECT = (1 << 1), + GCK_URI_FOR_TOKEN = (1 << 2), + GCK_URI_FOR_MODULE = (1 << 3), + GCK_URI_WITH_VERSION = (1 << 4), + GCK_URI_FOR_ANY = 0x0000FFFF, +} GckUriFlags; + +#define GCK_URI_FOR_MODULE_WITH_VERSION (GCK_URI_WITH_VERSION | GCK_URI_FOR_MODULE) + +#define GCK_URI_FOR_OBJECT_ON_TOKEN (GCK_URI_FOR_OBJECT | GCK_URI_FOR_TOKEN) + +#define GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE (GCK_URI_FOR_OBJECT_ON_TOKEN | GCK_URI_FOR_MODULE) + +struct _GckUriData { + gboolean any_unrecognized; + GckModuleInfo *module_info; + GckTokenInfo *token_info; + GckAttributes *attributes; + + /*< private >*/ + gpointer dummy[4]; +}; + +#define GCK_URI_ERROR (gck_uri_error_get_quark ()) + +GQuark gck_uri_error_get_quark (void) G_GNUC_CONST; + +GckUriData* gck_uri_data_new (void); + +gchar* gck_uri_build (GckUriData *uri_data, + GckUriFlags flags); + +GckUriData* gck_uri_parse (const gchar *string, + GckUriFlags flags, + GError **error); + +#define GCK_URI_DATA_TYPE (gck_uri_data_get_type ()) + +GType gck_uri_data_get_type (void) G_GNUC_CONST; + +GckUriData * gck_uri_data_copy (GckUriData *uri_data); + +void gck_uri_data_free (GckUriData *uri_data); + +G_END_DECLS + +#include "gck-deprecated.h" + +#undef __GCK_INSIDE_HEADER__ + +#endif /* GCK_H */ diff --git a/gck/gck.pc.in b/gck/gck.pc.in new file mode 100644 index 0000000..4a46409 --- /dev/null +++ b/gck/gck.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +datarootdir=@datarootdir@ +datadir=@datadir@ +sysconfdir=@sysconfdir@ + +Name: gck-@GCK_MAJOR@ +Description: GObject bindings for PKCS#11 +Version: @VERSION@ +Requires: glib-2.0 gobject-2.0 gio-2.0 p11-kit-1 +Libs: -L${libdir} -lgck-@GCK_MAJOR@ +Cflags: -I${includedir}/gck-@GCK_MAJOR@ diff --git a/gck/gck.symbols b/gck/gck.symbols new file mode 100644 index 0000000..ae784c9 --- /dev/null +++ b/gck/gck.symbols @@ -0,0 +1,308 @@ +/* This file lists all exported symbols. It is used to guarantee that we + * only consciously change our ABI. + */ + +gck_attribute_clear +gck_attribute_dump +gck_attribute_dup +gck_attribute_equal +gck_attribute_free +gck_attribute_hash +gck_attribute_get_boolean +gck_attribute_get_data +gck_attribute_get_date +gck_attribute_get_string +gck_attribute_get_type +gck_attribute_get_ulong +gck_attribute_init +gck_attribute_init_boolean +gck_attribute_init_copy +gck_attribute_init_date +gck_attribute_init_empty +gck_attribute_init_invalid +gck_attribute_init_string +gck_attribute_init_ulong +gck_attribute_is_invalid +gck_attribute_new +gck_attribute_new_boolean +gck_attribute_new_date +gck_attribute_new_empty +gck_attribute_new_invalid +gck_attribute_new_string +gck_attribute_new_ulong +gck_attributes_add +gck_attributes_add_all +gck_attributes_add_boolean +gck_attributes_add_data +gck_attributes_add_date +gck_attributes_add_empty +gck_attributes_add_invalid +gck_attributes_add_string +gck_attributes_add_ulong +gck_attributes_at +gck_attributes_contains +gck_attributes_count +gck_attributes_dump +gck_attributes_dup +gck_attributes_find +gck_attributes_find_boolean +gck_attributes_find_date +gck_attributes_find_string +gck_attributes_find_ulong +gck_attributes_get_boxed_type +gck_attributes_get_type +gck_attributes_new +gck_attributes_new_empty +gck_attributes_new_full +gck_attributes_ref +gck_attributes_ref_sink +gck_attributes_set +gck_attributes_set_all +gck_attributes_set_boolean +gck_attributes_set_date +gck_attributes_set_string +gck_attributes_set_ulong +gck_attributes_to_string +gck_attributes_unref +gck_builder_add_all +gck_builder_add_attribute +gck_builder_add_boolean +gck_builder_add_data +gck_builder_add_date +gck_builder_add_empty +gck_builder_add_except +gck_builder_add_exceptv +gck_builder_add_invalid +gck_builder_add_only +gck_builder_add_onlyv +gck_builder_add_string +gck_builder_add_ulong +gck_builder_clear +gck_builder_copy +gck_builder_end +gck_builder_find +gck_builder_find_boolean +gck_builder_find_date +gck_builder_find_string +gck_builder_find_ulong +gck_builder_flags_get_type +gck_builder_get_type +gck_builder_init +gck_builder_init_full +gck_builder_new +gck_builder_ref +gck_builder_set_all +gck_builder_set_boolean +gck_builder_set_data +gck_builder_set_date +gck_builder_set_empty +gck_builder_set_invalid +gck_builder_set_string +gck_builder_set_ulong +gck_builder_steal +gck_builder_take_data +gck_builder_unref +gck_enumerator_get_chained +gck_enumerator_get_interaction +gck_enumerator_get_object_type +gck_enumerator_get_type +gck_enumerator_next +gck_enumerator_next_async +gck_enumerator_next_finish +gck_enumerator_next_n +gck_enumerator_set_chained +gck_enumerator_set_interaction +gck_enumerator_set_object_type +gck_enumerator_set_object_type_full +gck_error_get_quark +gck_error_get_type +gck_get_error_quark +gck_list_ref_copy +gck_list_unref_free +gck_list_get_boxed_type +gck_mechanism_info_copy +gck_mechanism_info_free +gck_mechanism_info_get_type +gck_mechanisms_check +gck_message_from_rv +gck_module_equal +gck_module_get_functions +gck_module_get_info +gck_module_get_path +gck_module_get_slots +gck_module_get_type +gck_module_hash +gck_module_info_copy +gck_module_info_free +gck_module_info_get_type +gck_module_initialize +gck_module_initialize_async +gck_module_initialize_finish +gck_module_match +gck_module_new +gck_modules_enumerate_objects +gck_modules_enumerate_uri +gck_modules_get_slots +gck_modules_initialize_registered +gck_modules_initialize_registered_async +gck_modules_initialize_registered_finish +gck_modules_object_for_uri +gck_modules_objects_for_uri +gck_modules_token_for_uri +gck_modules_tokens_for_uri +gck_object_cache_fill +gck_object_cache_get_attributes +gck_object_cache_get_type +gck_object_cache_lookup +gck_object_cache_lookup_async +gck_object_cache_lookup_finish +gck_object_cache_set_attributes +gck_object_cache_update +gck_object_cache_update_async +gck_object_cache_update_finish +gck_object_destroy +gck_object_destroy_async +gck_object_destroy_finish +gck_object_equal +gck_object_from_handle +gck_object_get +gck_object_get_async +gck_object_get_data +gck_object_get_data_async +gck_object_get_data_finish +gck_object_get_data_full +gck_object_get_finish +gck_object_get_full +gck_object_get_handle +gck_object_get_module +gck_object_get_session +gck_object_get_template +gck_object_get_template_async +gck_object_get_template_finish +gck_object_get_type +gck_object_hash +gck_object_set +gck_object_set_async +gck_object_set_finish +gck_object_set_template +gck_object_set_template_async +gck_object_set_template_finish +gck_objects_from_handle_array +gck_password_get_key +gck_password_get_module +gck_password_get_token +gck_password_get_type +gck_session_create_object +gck_session_create_object_async +gck_session_create_object_finish +gck_session_decrypt +gck_session_decrypt_async +gck_session_decrypt_finish +gck_session_decrypt_full +gck_session_derive_key +gck_session_derive_key_async +gck_session_derive_key_finish +gck_session_derive_key_full +gck_session_encrypt +gck_session_encrypt_async +gck_session_encrypt_finish +gck_session_encrypt_full +gck_session_enumerate_objects +gck_session_find_handles +gck_session_find_handles_async +gck_session_find_handles_finish +gck_session_find_objects +gck_session_find_objects_async +gck_session_find_objects_finish +gck_session_from_handle +gck_session_generate_key_pair +gck_session_generate_key_pair_async +gck_session_generate_key_pair_finish +gck_session_generate_key_pair_full +gck_session_get_handle +gck_session_get_info +gck_session_get_interaction +gck_session_get_module +gck_session_get_options +gck_session_get_slot +gck_session_get_state +gck_session_get_type +gck_session_info_copy +gck_session_info_free +gck_session_info_get_type +gck_session_init_pin +gck_session_init_pin_async +gck_session_init_pin_finish +gck_session_login +gck_session_login_async +gck_session_login_finish +gck_session_login_interactive +gck_session_login_interactive_async +gck_session_login_interactive_finish +gck_session_logout +gck_session_logout_async +gck_session_logout_finish +gck_session_open +gck_session_open_async +gck_session_open_finish +gck_session_options_get_type +gck_session_set_interaction +gck_session_set_pin +gck_session_set_pin_async +gck_session_set_pin_finish +gck_session_sign +gck_session_sign_async +gck_session_sign_finish +gck_session_sign_full +gck_session_unwrap_key +gck_session_unwrap_key_async +gck_session_unwrap_key_finish +gck_session_unwrap_key_full +gck_session_verify +gck_session_verify_async +gck_session_verify_finish +gck_session_verify_full +gck_session_wrap_key +gck_session_wrap_key_async +gck_session_wrap_key_finish +gck_session_wrap_key_full +gck_slot_enumerate_objects +gck_slot_equal +gck_slot_from_handle +gck_slot_get_handle +gck_slot_get_info +gck_slot_get_mechanism_info +gck_slot_get_mechanisms +gck_slot_get_module +gck_slot_get_token_info +gck_slot_get_type +gck_slot_has_flags +gck_slot_hash +gck_slot_info_copy +gck_slot_info_free +gck_slot_info_get_type +gck_slot_match +gck_slot_open_session +gck_slot_open_session_async +gck_slot_open_session_finish +gck_slot_open_session_full +gck_slot_open_session_full_async +gck_slots_enumerate_objects +gck_string_from_chars +gck_string_to_chars +gck_token_info_copy +gck_token_info_free +gck_token_info_get_type +gck_uri_build +gck_uri_data_copy +gck_uri_data_free +gck_uri_data_get_type +gck_uri_data_new +gck_uri_error_get_quark +gck_uri_error_get_type +gck_uri_flags_get_type +gck_uri_get_error_quark +gck_uri_parse +gck_value_to_boolean +gck_value_to_ulong +SECMEM_pool_data_v1_0 diff --git a/gck/mock-test-module.c b/gck/mock-test-module.c new file mode 100644 index 0000000..7d6ba2c --- /dev/null +++ b/gck/mock-test-module.c @@ -0,0 +1,10 @@ +#include "config.h" + +#include "gck-mock.h" +#include + +CK_RV +C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list) +{ + return gck_mock_C_GetFunctionList (list); +} diff --git a/gck/pkcs11-trust-assertions.h b/gck/pkcs11-trust-assertions.h new file mode 100644 index 0000000..ed8bb6b --- /dev/null +++ b/gck/pkcs11-trust-assertions.h @@ -0,0 +1,56 @@ +/* + * pkcs11x.h + * Copyright 2010 Collabora, Ltd + * + * 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. + */ + +/* + * The latest version of this file is at: + * + * git://thewalter.net/git/pkcs11-trust-assertions + * + * or viewable on the web at: + * + * http://thewalter.net/git/cgit.cgi/pkcs11-trust-assertions/tree/pkcs11-trust-assertions.h + * + */ + +#ifndef PKCS11_TRUST_ASSERTIONS_H +#define PKCS11_TRUST_ASSERTIONS_H + +#include + +#define CKA_XDG (CKA_VENDOR_DEFINED | 0x58444700UL /* XDG0 */ ) +#define CKO_XDG (CKA_VENDOR_DEFINED | 0x58444700UL /* XDG0 */ ) + +/* ------------------------------------------------------------------- + * TRUST ASSERTIONS + */ + +#define CKO_X_TRUST_ASSERTION (CKO_XDG + 100) + +#define CKA_X_ASSERTION_TYPE (CKA_XDG + 1) + +#define CKA_X_CERTIFICATE_VALUE (CKA_XDG + 2) + +#define CKA_X_PURPOSE (CKA_XDG + 3) + +#define CKA_X_PEER (CKA_XDG + 4) + +typedef CK_ULONG CK_X_ASSERTION_TYPE; + +#define CKT_X_UNTRUSTED_CERTIFICATE 1UL + +#define CKT_X_PINNED_CERTIFICATE 2UL + +#define CKT_X_ANCHORED_CERTIFICATE 3UL + +#endif /* PKCS11_TRUST_ASSERTIONS_H */ diff --git a/gck/pkcs11.h b/gck/pkcs11.h new file mode 100644 index 0000000..7d28057 --- /dev/null +++ b/gck/pkcs11.h @@ -0,0 +1,3 @@ +#warning "gck/pkcs11.h is deprecated. Use p11-kit/pkcs11.h instead." + +#include diff --git a/gck/pkcs11.vapi b/gck/pkcs11.vapi new file mode 100644 index 0000000..7e879ee --- /dev/null +++ b/gck/pkcs11.vapi @@ -0,0 +1,48 @@ +[CCode (cheader_filename = "p11-kit/pkcs11.h")] +namespace CKA +{ + public const ulong LABEL; + public const ulong VALUE; + public const ulong ID; + public const ulong CLASS; + public const ulong CERTIFICATE_CATEGORY; + public const ulong MODIFIABLE; + public const ulong MODULUS_BITS; + public const ulong KEY_TYPE; + public const ulong TOKEN; +} + +[CCode (cheader_filename = "p11-kit/pkcs11.h")] +namespace CKS +{ + public const ulong RW_USER_FUNCTIONS; + public const ulong RO_USER_FUNCTIONS; + public const ulong RW_SO_FUNCTIONS; +} + +[CCode (cheader_filename = "p11-kit/pkcs11.h")] +namespace CKF +{ + public const ulong WRITE_PROTECTED; + public const ulong LOGIN_REQUIRED; + public const ulong USER_PIN_INITIALIZED; +} + +[CCode (cheader_filename = "p11-kit/pkcs11.h")] +namespace CKO +{ + public const ulong CERTIFICATE; + public const ulong PRIVATE_KEY; +} + +[CCode (cheader_filename = "p11-kit/pkcs11.h")] +namespace CKU +{ + public const ulong USER; +} + +[CCode (cheader_filename = "p11-kit/pkcs11.h")] +namespace CKR +{ + public const ulong OBJECT_HANDLE_INVALID; +} diff --git a/gck/pkcs11i.h b/gck/pkcs11i.h new file mode 100644 index 0000000..14291d7 --- /dev/null +++ b/gck/pkcs11i.h @@ -0,0 +1,140 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* pkcs11i.h - GNOME internal definitions to PKCS#11 + + Copyright (C) 2008, Stef Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef PKCS11I_H +#define PKCS11I_H + +#include + +#define CKA_GNOME (CKA_VENDOR_DEFINED | 0x474E4D45UL /* GNME */ ) +#define CKO_GNOME (CKO_VENDOR_DEFINED | 0x474E4D45UL /* GNME */ ) +#define CKR_GNOME (CKR_VENDOR_DEFINED | 0x474E4D45UL /* GNME */ ) +#define CKM_GNOME (CKR_VENDOR_DEFINED | 0x474E4D45UL /* GNME */ ) +#define CKK_GNOME (CKR_VENDOR_DEFINED | 0x474E4D45UL /* GNME */ ) + +/* ------------------------------------------------------------------- + * OBJECT UNIQUE IDENTIFIER + */ + +/* A string unique among all objects on a given machine */ +#define CKA_GNOME_UNIQUE (CKA_GNOME + 350) + +/* ------------------------------------------------------------------- + */ + +#define CKA_GNOME_TRANSIENT (CKA_GNOME + 201) + +/* Signifies that nobody is logged in */ +#define CKU_NONE G_MAXULONG + +#define CK_GNOME_MAX_SLOT (0x000000FFUL) +#define CK_GNOME_MAX_HANDLE (((CK_ULONG)-1UL) >> 10) + +/* ------------------------------------------------------------------- + * OBJECT HASH + */ + +#define CKA_GNOME_INTERNAL_SHA1 (CKA_GNOME + 1000) + + +/* ------------------------------------------------------------------- + * APPLICATION + */ + +/* Flag for CK_INFO when applications are supported */ +#define CKF_G_APPLICATIONS 0x40000000UL + +/* Call C_OpenSession with this when passing CK_G_APPLICATION */ +#define CKF_G_APPLICATION_SESSION 0x40000000UL + +typedef CK_ULONG CK_G_APPLICATION_ID; + +typedef struct CK_G_APPLICATION { + CK_VOID_PTR applicationData; + CK_G_APPLICATION_ID applicationId; +} CK_G_APPLICATION; + +typedef CK_G_APPLICATION* CK_G_APPLICATION_PTR; + +#define CKR_G_APPLICATION_ID_INVALID (CKR_GNOME + 10) + + +/* ------------------------------------------------------------------- + * SECRETS + */ + +#define CKO_G_COLLECTION (CKO_GNOME + 110) + +#define CKK_G_SECRET_ITEM (CKK_GNOME + 101) + +#define CKO_G_SEARCH (CKO_GNOME + 111) + +#define CKA_G_LOCKED (CKA_GNOME + 210) + +#define CKA_G_CREATED (CKA_GNOME + 211) + +#define CKA_G_MODIFIED (CKA_GNOME + 212) + +#define CKA_G_FIELDS (CKA_GNOME + 213) + +#define CKA_G_COLLECTION (CKA_GNOME + 214) + +#define CKA_G_MATCHED (CKA_GNOME + 215) + +#define CKA_G_SCHEMA (CKA_GNOME + 216) + +#define CKA_G_LOGIN_COLLECTION (CKA_GNOME + 218) + +/* ------------------------------------------------------------------- + * MECHANISMS + */ + +/* Used for wrapping and unwrapping as null */ +#define CKM_G_NULL (CKM_GNOME + 100) + +#define CKM_G_HKDF_SHA256_DERIVE (CKM_GNOME + 101) + +#define CKK_G_NULL (CKK_GNOME + 100) + +/* ------------------------------------------------------------------- + * AUTO DESTRUCT + */ + +#define CKA_G_DESTRUCT_IDLE (CKA_GNOME + 190) + +#define CKA_G_DESTRUCT_AFTER (CKA_GNOME + 191) + +#define CKA_G_DESTRUCT_USES (CKA_GNOME + 192) + +/* ------------------------------------------------------------------- + * CREDENTIAL + */ + +#define CKO_G_CREDENTIAL (CKO_GNOME + 100) + +#define CKA_G_OBJECT (CKA_GNOME + 202) + +#define CKA_G_CREDENTIAL (CKA_GNOME + 204) + +#define CKA_G_CREDENTIAL_TEMPLATE (CKA_GNOME + 205) + +#endif /* PKCS11I_H */ diff --git a/gck/pkcs11n.h b/gck/pkcs11n.h new file mode 100644 index 0000000..612a11e --- /dev/null +++ b/gck/pkcs11n.h @@ -0,0 +1,221 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Netscape security libraries. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1994-2000 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Dr Stephen Henson + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef _PKCS11N_H_ +#define _PKCS11N_H_ + +#ifdef DEBUG +static const char CKT_CVS_ID[] = "@(#) $RCSfile: pkcs11n.h,v $ $Revision: 1.15 $ $Date: 2005/09/28 17:12:17 $"; +#endif /* DEBUG */ + +/* + * pkcs11n.h + * + * This file contains the NSS-specific type definitions for Cryptoki + * (PKCS#11). + */ + +/* + * NSSCK_VENDOR_NETSCAPE + * + * Cryptoki reserves the high half of all the number spaces for + * vendor-defined use. I'd like to keep all of our Netscape- + * specific values together, but not in the oh-so-obvious + * 0x80000001, 0x80000002, etc. area. So I've picked an offset, + * and constructed values for the beginnings of our spaces. + * + * Note that some "historical" Netscape values don't fall within + * this range. + */ +#define NSSCK_VENDOR_NETSCAPE 0x4E534350 /* NSCP */ + +/* + * Netscape-defined object classes + * + */ +#define CKO_NETSCAPE (CKO_VENDOR_DEFINED|NSSCK_VENDOR_NETSCAPE) + +#define CKO_NETSCAPE_CRL (CKO_NETSCAPE + 1) +#define CKO_NETSCAPE_SMIME (CKO_NETSCAPE + 2) +#define CKO_NETSCAPE_TRUST (CKO_NETSCAPE + 3) +#define CKO_NETSCAPE_BUILTIN_ROOT_LIST (CKO_NETSCAPE + 4) +#define CKO_NETSCAPE_NEWSLOT (CKO_NETSCAPE + 5) +#define CKO_NETSCAPE_DELSLOT (CKO_NETSCAPE + 6) + +/* + * Netscape-defined key types + * + */ +#define CKK_NETSCAPE (CKK_VENDOR_DEFINED|NSSCK_VENDOR_NETSCAPE) + +#define CKK_NETSCAPE_PKCS8 (CKK_NETSCAPE + 1) +/* + * Netscape-defined certificate types + * + */ +#define CKC_NETSCAPE (CKC_VENDOR_DEFINED|NSSCK_VENDOR_NETSCAPE) + +/* + * Netscape-defined object attributes + * + */ +#define CKA_NETSCAPE (CKA_VENDOR_DEFINED|NSSCK_VENDOR_NETSCAPE) + +#define CKA_NETSCAPE_URL (CKA_NETSCAPE + 1) +#define CKA_NETSCAPE_EMAIL (CKA_NETSCAPE + 2) +#define CKA_NETSCAPE_SMIME_INFO (CKA_NETSCAPE + 3) +#define CKA_NETSCAPE_SMIME_TIMESTAMP (CKA_NETSCAPE + 4) +#define CKA_NETSCAPE_PKCS8_SALT (CKA_NETSCAPE + 5) +#define CKA_NETSCAPE_PASSWORD_CHECK (CKA_NETSCAPE + 6) +#define CKA_NETSCAPE_EXPIRES (CKA_NETSCAPE + 7) +#define CKA_NETSCAPE_KRL (CKA_NETSCAPE + 8) + +#define CKA_NETSCAPE_PQG_COUNTER (CKA_NETSCAPE + 20) +#define CKA_NETSCAPE_PQG_SEED (CKA_NETSCAPE + 21) +#define CKA_NETSCAPE_PQG_H (CKA_NETSCAPE + 22) +#define CKA_NETSCAPE_PQG_SEED_BITS (CKA_NETSCAPE + 23) +#define CKA_NETSCAPE_MODULE_SPEC (CKA_NETSCAPE + 24) + +/* + * Trust attributes: + * + * If trust goes standard, these probably will too. So I'll + * put them all in one place. + */ + +#define CKA_TRUST (CKA_NETSCAPE + 0x2000) + +/* "Usage" key information */ +#define CKA_TRUST_DIGITAL_SIGNATURE (CKA_TRUST + 1) +#define CKA_TRUST_NON_REPUDIATION (CKA_TRUST + 2) +#define CKA_TRUST_KEY_ENCIPHERMENT (CKA_TRUST + 3) +#define CKA_TRUST_DATA_ENCIPHERMENT (CKA_TRUST + 4) +#define CKA_TRUST_KEY_AGREEMENT (CKA_TRUST + 5) +#define CKA_TRUST_KEY_CERT_SIGN (CKA_TRUST + 6) +#define CKA_TRUST_CRL_SIGN (CKA_TRUST + 7) + +/* "Purpose" trust information */ +#define CKA_TRUST_SERVER_AUTH (CKA_TRUST + 8) +#define CKA_TRUST_CLIENT_AUTH (CKA_TRUST + 9) +#define CKA_TRUST_CODE_SIGNING (CKA_TRUST + 10) +#define CKA_TRUST_EMAIL_PROTECTION (CKA_TRUST + 11) +#define CKA_TRUST_IPSEC_END_SYSTEM (CKA_TRUST + 12) +#define CKA_TRUST_IPSEC_TUNNEL (CKA_TRUST + 13) +#define CKA_TRUST_IPSEC_USER (CKA_TRUST + 14) +#define CKA_TRUST_TIME_STAMPING (CKA_TRUST + 15) +#define CKA_TRUST_STEP_UP_APPROVED (CKA_TRUST + 16) + +#define CKA_CERT_SHA1_HASH (CKA_TRUST + 100) +#define CKA_CERT_MD5_HASH (CKA_TRUST + 101) + +/* Netscape trust stuff */ +/* XXX fgmr new ones here-- step-up, etc. */ + +/* HISTORICAL: define used to pass in the database key for DSA private keys */ +#define CKA_NETSCAPE_DB 0xD5A0DB00L +#define CKA_NETSCAPE_TRUST 0x80000001L + +/* + * Netscape-defined crypto mechanisms + * + */ +#define CKM_NETSCAPE (CKM_VENDOR_DEFINED|NSSCK_VENDOR_NETSCAPE) + +#define CKM_NETSCAPE_AES_KEY_WRAP (CKM_NETSCAPE + 1) +#define CKM_NETSCAPE_AES_KEY_WRAP_PAD (CKM_NETSCAPE + 2) + +/* + * HISTORICAL: + * Do not attempt to use these. They are only used by NETSCAPE's internal + * PKCS #11 interface. Most of these are place holders for other mechanism + * and will change in the future. + */ +#define CKM_NETSCAPE_PBE_SHA1_DES_CBC 0x80000002L +#define CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC 0x80000003L +#define CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC 0x80000004L +#define CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC 0x80000005L +#define CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4 0x80000006L +#define CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4 0x80000007L +#define CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC 0x80000008L +#define CKM_NETSCAPE_PBE_SHA1_HMAC_KEY_GEN 0x80000009L +#define CKM_NETSCAPE_PBE_MD5_HMAC_KEY_GEN 0x8000000aL +#define CKM_NETSCAPE_PBE_MD2_HMAC_KEY_GEN 0x8000000bL + +#define CKM_TLS_PRF_GENERAL 0x80000373L + +/* + * Netscape-defined return values + * + */ +#define CKR_NETSCAPE (CKM_VENDOR_DEFINED|NSSCK_VENDOR_NETSCAPE) + +#define CKR_NETSCAPE_CERTDB_FAILED (CKR_NETSCAPE + 1) +#define CKR_NETSCAPE_KEYDB_FAILED (CKR_NETSCAPE + 2) + +/* + * Trust info + * + * This isn't part of the Cryptoki standard (yet), so I'm putting + * all the definitions here. Some of this would move to nssckt.h + * if trust info were made part of the standard. In view of this + * possibility, I'm putting my (Netscape) values in the netscape + * vendor space, like everything else. + */ + +typedef CK_ULONG CK_TRUST; + +/* The following trust types are defined: */ +#define CKT_VENDOR_DEFINED 0x80000000 + +#define CKT_NETSCAPE (CKT_VENDOR_DEFINED|NSSCK_VENDOR_NETSCAPE) + +/* If trust goes standard, these'll probably drop out of vendor space. */ +#define CKT_NETSCAPE_TRUSTED (CKT_NETSCAPE + 1) +#define CKT_NETSCAPE_TRUSTED_DELEGATOR (CKT_NETSCAPE + 2) +#define CKT_NETSCAPE_UNTRUSTED (CKT_NETSCAPE + 3) +#define CKT_NETSCAPE_MUST_VERIFY (CKT_NETSCAPE + 4) +#define CKT_NETSCAPE_TRUST_UNKNOWN (CKT_NETSCAPE + 5) /* default */ + +/* + * These may well remain Netscape-specific; I'm only using them + * to cache resolution data. + */ +#define CKT_NETSCAPE_VALID (CKT_NETSCAPE + 10) +#define CKT_NETSCAPE_VALID_DELEGATOR (CKT_NETSCAPE + 11) + + +#endif /* _PKCS11N_H_ */ diff --git a/gck/pkcs11x.h b/gck/pkcs11x.h new file mode 100644 index 0000000..a0dcee7 --- /dev/null +++ b/gck/pkcs11x.h @@ -0,0 +1,44 @@ +/* pkcs11x.h + Copyright 2010 Collabora Ltd + + 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. */ + + +#ifndef PKCS11X_H +#define PKCS11X_H + +#include + +#define CKA_XDG (CKA_VENDOR_DEFINED | 0x58444700UL /* XDG0 */ ) +#define CKO_XDG (CKA_VENDOR_DEFINED | 0x58444700UL /* XDG0 */ ) + +/* ------------------------------------------------------------------- + * TRUST ASSERTIONS + */ + +#define CKO_X_TRUST_ASSERTION (CKO_XDG + 100) + +#define CKA_X_ASSERTION_TYPE (CKA_XDG + 1) + +#define CKA_X_CERTIFICATE_VALUE (CKA_XDG + 2) + +#define CKA_X_PURPOSE (CKA_XDG + 3) + +#define CKA_X_PEER (CKA_XDG + 4) + +typedef CK_ULONG CK_X_ASSERTION_TYPE; + +#define CKT_X_DISTRUSTED_CERTIFICATE 1UL + +#define CKT_X_PINNED_CERTIFICATE 2UL + +#define CKT_X_ANCHORED_CERTIFICATE 3UL + +#endif /* PKCS11X_H */ diff --git a/gck/test-gck-attributes.c b/gck/test-gck-attributes.c new file mode 100644 index 0000000..c216ad1 --- /dev/null +++ b/gck/test-gck-attributes.c @@ -0,0 +1,1358 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-attributes.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include +#include + +#include "egg/egg-secure-memory.h" + +#include "gck/gck.h" +#include "gck/gck-test.h" + +EGG_SECURE_DECLARE (test_gck_attributes); + +#define ATTR_TYPE 55 +#define ATTR_DATA (const guchar *)"TEST DATA" +#define N_ATTR_DATA ((gsize)9) + +static void +test_init_memory (void) +{ + GckAttribute attr; + + g_assert (sizeof (attr) == sizeof (CK_ATTRIBUTE)); + + gck_attribute_init (&attr, ATTR_TYPE, (const guchar *)ATTR_DATA, N_ATTR_DATA); + g_assert (attr.type == ATTR_TYPE); + g_assert (attr.length == N_ATTR_DATA); + g_assert (memcmp (attr.value, ATTR_DATA, attr.length) == 0); + + gck_attribute_clear (&attr); +} + +static void +test_init_boolean (void) +{ + GckAttribute attr; + + gck_attribute_init_boolean (&attr, ATTR_TYPE, TRUE); + g_assert (attr.type == ATTR_TYPE); + g_assert (attr.length == sizeof (CK_BBOOL)); + g_assert (*((CK_BBOOL*)attr.value) == CK_TRUE); + + gck_attribute_clear (&attr); +} + +static void +test_init_date (void) +{ + GckAttribute attr; + CK_DATE ck_date; + GDate *date; + + date = g_date_new_dmy(05, 06, 1960); + memcpy (ck_date.year, "1960", 4); + memcpy (ck_date.month, "06", 2); + memcpy (ck_date.day, "05", 2); + gck_attribute_init_date (&attr, ATTR_TYPE, date); + g_date_free (date); + g_assert (attr.type == ATTR_TYPE); + g_assert (attr.length == sizeof (CK_DATE)); + g_assert (memcmp (attr.value, &ck_date, attr.length) == 0); + + gck_attribute_clear (&attr); +} + +static void +test_init_ulong (void) +{ + GckAttribute attr; + + gck_attribute_init_ulong (&attr, ATTR_TYPE, 88); + g_assert (attr.type == ATTR_TYPE); + g_assert (attr.length == sizeof (CK_ULONG)); + g_assert (*((CK_ULONG*)attr.value) == 88); + + gck_attribute_clear (&attr); +} + +static void +test_init_string (void) +{ + GckAttribute attr; + + gck_attribute_init_string (&attr, ATTR_TYPE, "a test string"); + g_assert (attr.type == ATTR_TYPE); + g_assert (attr.length == strlen ("a test string")); + g_assert (memcmp (attr.value, "a test string", attr.length) == 0); + + gck_attribute_clear (&attr); +} + +static void +test_init_invalid (void) +{ + GckAttribute attr; + + gck_attribute_init_invalid (&attr, ATTR_TYPE); + g_assert (attr.type == ATTR_TYPE); + g_assert (attr.length == (gulong)-1); + g_assert (attr.value == NULL); + + g_assert (gck_attribute_is_invalid (&attr)); + gck_attribute_clear (&attr); +} + +static void +test_init_empty (void) +{ + GckAttribute attr; + + gck_attribute_init_empty (&attr, ATTR_TYPE); + g_assert (attr.type == ATTR_TYPE); + g_assert (attr.length == 0); + g_assert (attr.value == NULL); + + gck_attribute_clear (&attr); +} + +static void +test_new_memory (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new (ATTR_TYPE, ATTR_DATA, N_ATTR_DATA); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == N_ATTR_DATA); + g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + + gck_attribute_free (attr); +} + +static void +test_new_boolean (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new_boolean (ATTR_TYPE, TRUE); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert (*((CK_BBOOL*)attr->value) == CK_TRUE); + + gck_attribute_free (attr); +} + +static void +test_new_date (void) +{ + GckAttribute *attr; + CK_DATE ck_date; + GDate *date; + + date = g_date_new_dmy(05, 06, 1800); + memcpy (ck_date.year, "1800", 4); + memcpy (ck_date.month, "06", 2); + memcpy (ck_date.day, "05", 2); + attr = gck_attribute_new_date (ATTR_TYPE, date); + g_date_free (date); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_DATE)); + g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + + gck_attribute_free (attr); +} + +static void +test_new_ulong (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new_ulong (ATTR_TYPE, 88); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_ULONG)); + g_assert (*((CK_ULONG*)attr->value) == 88); + + gck_attribute_free (attr); +} + + +static void +test_new_string (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new_string (ATTR_TYPE, "a test string"); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == strlen ("a test string")); + g_assert (memcmp (attr->value, "a test string", attr->length) == 0); + + gck_attribute_free (attr); +} + +static void +test_new_invalid (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new_invalid (ATTR_TYPE); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == (gulong)-1); + g_assert (attr->value == NULL); + + g_assert (gck_attribute_is_invalid (attr)); + + gck_attribute_free (attr); +} + +static void +test_new_empty (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new_empty (ATTR_TYPE); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == 0); + g_assert (attr->value == NULL); + + gck_attribute_free (attr); +} + +static void +test_get_boolean (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new_boolean (ATTR_TYPE, TRUE); + g_assert (gck_attribute_get_boolean (attr) == TRUE); + gck_attribute_free (attr); +} + +static void +test_get_date (void) +{ + GckAttribute *attr; + CK_DATE ck_date; + GDate date, date2; + + g_date_set_dmy(&date, 05, 06, 1800); + memcpy (ck_date.year, "1800", 4); + memcpy (ck_date.month, "06", 2); + memcpy (ck_date.day, "05", 2); + attr = gck_attribute_new_date (ATTR_TYPE, &date); + gck_attribute_get_date (attr, &date2); + g_assert (g_date_compare (&date, &date2) == 0); + gck_attribute_free (attr); +} + +static void +test_get_ulong (void) +{ + GckAttribute *attr; + + attr = gck_attribute_new_ulong (ATTR_TYPE, 88); + g_assert (gck_attribute_get_ulong (attr) == 88); + gck_attribute_free (attr); +} + +static void +test_get_string (void) +{ + GckAttribute *attr; + gchar *value; + + attr = gck_attribute_new_string (ATTR_TYPE, "a test string"); + value = gck_attribute_get_string (attr); + g_assert (strcmp ("a test string", value) == 0); + g_free (value); + gck_attribute_free (attr); + + /* Should be able to store null strings */ + attr = gck_attribute_new_string (ATTR_TYPE, NULL); + value = gck_attribute_get_string (attr); + g_assert (value == NULL); + gck_attribute_free (attr); +} + +static void +test_dup_attribute (void) +{ + GckAttribute attr, *dup; + + gck_attribute_init_ulong (&attr, ATTR_TYPE, 88); + dup = gck_attribute_dup (&attr); + gck_attribute_clear (&attr); + g_assert (gck_attribute_get_ulong (dup) == 88); + g_assert (dup->type == ATTR_TYPE); + gck_attribute_free (dup); + + /* Should be able to dup null */ + dup = gck_attribute_dup (NULL); + g_assert (dup == NULL); +} + +static void +test_copy_attribute (void) +{ + GckAttribute attr, copy; + + gck_attribute_init_ulong (&attr, ATTR_TYPE, 88); + gck_attribute_init_copy (©, &attr); + gck_attribute_clear (&attr); + g_assert (gck_attribute_get_ulong (©) == 88); + g_assert (copy.type == ATTR_TYPE); + gck_attribute_clear (©); +} + +static void +builder_add_fixtures (GckBuilder *builder, + guint seed) +{ + GDate *date = g_date_new_dmy (11 + seed, 12, 2008); + gck_builder_add_boolean (builder, 0UL, (TRUE + seed) % 2); + gck_builder_add_ulong (builder, 101UL, 888 + seed); + gck_builder_add_string (builder, 202UL, "string"); + gck_builder_add_date (builder, 303UL, date); + g_date_free (date); + gck_builder_add_data (builder, 404UL, (const guchar *)ATTR_DATA, N_ATTR_DATA); + gck_builder_add_invalid (builder, 505UL); + gck_builder_add_empty (builder, 606UL); +} + +static void +test_builder_blank (void) +{ + GckBuilder builder; + + gck_builder_init (&builder); + g_assert (gck_builder_find (&builder, 88) == NULL); + gck_builder_clear (&builder); +} + +static void +test_build_data (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + + gck_builder_add_data (&builder, ATTR_TYPE, (const guchar *)"Hello", 5); + attr = gck_builder_find (&builder, ATTR_TYPE); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == 5); + g_assert (memcmp (attr->value, "Hello", attr->length) == 0); + + gck_builder_set_data (&builder, ATTR_TYPE, (const guchar *)ATTR_DATA, N_ATTR_DATA); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == N_ATTR_DATA); + g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == N_ATTR_DATA); + g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + + gck_attributes_unref (attrs); +} + +static void +test_build_data_invalid (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + + gck_builder_add_data (&builder, ATTR_TYPE, NULL, GCK_INVALID); + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + + g_assert (attr->type == ATTR_TYPE); + g_assert (gck_attribute_is_invalid (attr)); + + gck_attributes_unref (attrs); +} + +static void +test_build_data_secure (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + guchar *memory; + + memory = egg_secure_strdup ("password"); + gck_builder_add_data (&builder, ATTR_TYPE, memory, 8); + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == 8); + g_assert (memcmp (attr->value, "password", attr->length) == 0); + g_assert (egg_secure_check (attr->value) == TRUE); + + egg_secure_free (memory); + gck_attributes_unref (attrs); +} + +static void +test_build_take (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + guchar *memory; + + memory = g_memdup (ATTR_DATA, N_ATTR_DATA); + gck_builder_take_data (&builder, ATTR_TYPE, memory, N_ATTR_DATA); + attrs = gck_builder_end (&builder); + + attr = gck_attributes_at (attrs, 0); + + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == N_ATTR_DATA); + g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + + gck_attributes_unref (attrs); +} + +static void +test_build_take_invalid (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + gpointer memory; + + /* This memory should be freed */ + memory = g_strdup ("BLAH"); + gck_builder_take_data (&builder, ATTR_TYPE, memory, GCK_INVALID); + + /* This memory should be freed */ + memory = egg_secure_strdup ("BLAH"); + gck_builder_take_data (&builder, ATTR_TYPE, memory, GCK_INVALID); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + + g_assert (attr->type == ATTR_TYPE); + g_assert (gck_attribute_is_invalid (attr)); + + gck_attributes_unref (attrs); +} + +static void +test_build_take_secure (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + guchar *memory; + + memory = egg_secure_strdup ("password"); + gck_builder_take_data (&builder, ATTR_TYPE, memory, 8); + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == 8); + g_assert (memcmp (attr->value, "password", attr->length) == 0); + g_assert (egg_secure_check (attr->value) == TRUE); + + gck_attributes_unref (attrs); +} + + +static void +test_value_to_boolean (void) +{ + CK_BBOOL data = CK_TRUE; + gboolean result = FALSE; + + if (!gck_value_to_boolean (&data, sizeof (data), &result)) + g_assert_not_reached (); + + g_assert (result == TRUE); + + if (!gck_value_to_boolean (&data, sizeof (data), NULL)) + g_assert_not_reached (); + + /* Should fail */ + if (gck_value_to_boolean (&data, 0, NULL)) + g_assert_not_reached (); + if (gck_value_to_boolean (&data, 2, NULL)) + g_assert_not_reached (); + if (gck_value_to_boolean (&data, (CK_ULONG)-1, NULL)) + g_assert_not_reached (); +} + +static void +test_value_to_ulong (void) +{ + CK_ULONG data = 34343; + gulong result = 0; + + if (!gck_value_to_ulong ((const guchar *)&data, sizeof (data), &result)) + g_assert_not_reached (); + + g_assert (result == 34343); + + if (!gck_value_to_ulong ((const guchar *)&data, sizeof (data), NULL)) + g_assert_not_reached (); + + /* Should fail */ + if (gck_value_to_ulong ((const guchar *)&data, 0, NULL)) + g_assert_not_reached (); + if (gck_value_to_ulong ((const guchar *)&data, 2, NULL)) + g_assert_not_reached (); + if (gck_value_to_ulong ((const guchar *)&data, (CK_ULONG)-1, NULL)) + g_assert_not_reached (); +} + +static void +test_build_boolean (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + gboolean value; + + g_assert (gck_builder_find_boolean (&builder, 5, &value) == FALSE); + + gck_builder_add_boolean (&builder, ATTR_TYPE, FALSE); + + gck_builder_set_invalid (&builder, 5); + g_assert (gck_builder_find_boolean (&builder, 5, &value) == FALSE); + gck_builder_set_boolean (&builder, 5, TRUE); + + attr = gck_builder_find (&builder, ATTR_TYPE); + g_assert (attr != NULL); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert (*((CK_BBOOL*)attr->value) == CK_FALSE); + if (!gck_builder_find_boolean (&builder, ATTR_TYPE, &value)) + g_assert_not_reached (); + g_assert (value == FALSE); + + gck_builder_set_boolean (&builder, ATTR_TYPE, TRUE); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert (*((CK_BBOOL*)attr->value) == CK_TRUE); + if (!gck_builder_find_boolean (&builder, ATTR_TYPE, &value)) + g_assert_not_reached (); + g_assert (value == TRUE); + + if (!gck_builder_find_boolean (&builder, 5, &value)) + g_assert_not_reached (); + g_assert (value == TRUE); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr != NULL); + + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert (*((CK_BBOOL*)attr->value) == CK_TRUE); + + if (!gck_attributes_find_boolean (attrs, ATTR_TYPE, &value)) + g_assert_not_reached (); + g_assert (value == TRUE); + + g_assert (gck_attribute_get_boolean (attr) == TRUE); + + g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); + gck_attributes_unref (attrs); +} + +static void +test_build_date (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + CK_DATE ck_date; + GDate *date, date2; + + g_assert (gck_builder_find_date (&builder, 5, &date2) == FALSE); + + date = g_date_new_dmy(8, 8, 1960); + memcpy (ck_date.year, "1960", 4); + memcpy (ck_date.month, "08", 2); + memcpy (ck_date.day, "08", 2); + + gck_builder_add_date (&builder, ATTR_TYPE, date); + + gck_builder_set_invalid (&builder, 5); + g_assert (gck_builder_find_date (&builder, 5, &date2) == FALSE); + attr = gck_builder_find (&builder, 5); + gck_attribute_get_date (attr, &date2); + g_assert_cmpint (date2.day, ==, 0); + g_assert_cmpint (date2.month, ==, 0); + g_assert_cmpint (date2.year, ==, 0); + + gck_builder_set_date (&builder, 5, date); + + attr = gck_builder_find (&builder, ATTR_TYPE); + g_assert (attr != NULL); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_DATE)); + g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + if (!gck_builder_find_date (&builder, ATTR_TYPE, &date2)) + g_assert_not_reached (); + g_assert (g_date_compare (date, &date2) == 0); + + if (!gck_builder_find_date (&builder, 5, &date2)) + g_assert_not_reached (); + g_assert (g_date_compare (date, &date2) == 0); + + g_date_free (date); + + date = g_date_new_dmy(05, 06, 1960); + memcpy (ck_date.year, "1960", 4); + memcpy (ck_date.month, "06", 2); + memcpy (ck_date.day, "05", 2); + gck_builder_set_date (&builder, ATTR_TYPE, date); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_DATE)); + g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + if (!gck_builder_find_date (&builder, ATTR_TYPE, &date2)) + g_assert_not_reached (); + g_assert (g_date_compare (date, &date2) == 0); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr != NULL); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_DATE)); + g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + + gck_attribute_get_date (attr, &date2); + g_assert (g_date_compare (date, &date2) == 0); + + g_date_free (date); + + g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); + gck_attributes_unref (attrs); +} + +static void +test_build_ulong (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + gulong value; + + g_assert (gck_builder_find_ulong (&builder, 5, &value) == FALSE); + + gck_builder_add_ulong (&builder, ATTR_TYPE, 99); + + gck_builder_set_invalid (&builder, 5); + g_assert (gck_builder_find_ulong (&builder, 5, &value) == FALSE); + gck_builder_set_ulong (&builder, 5, 292); + + attr = gck_builder_find (&builder, ATTR_TYPE); + g_assert (attr != NULL); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_ULONG)); + g_assert (*((CK_ULONG*)attr->value) == 99); + if (!gck_builder_find_ulong (&builder, ATTR_TYPE, &value)) + g_assert_not_reached (); + g_assert (value == 99); + + gck_builder_set_ulong (&builder, ATTR_TYPE, 88); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_ULONG)); + g_assert (*((CK_ULONG*)attr->value) == 88); + if (!gck_builder_find_ulong (&builder, ATTR_TYPE, &value)) + g_assert_not_reached (); + g_assert (value == 88); + + if (!gck_builder_find_ulong (&builder, 5, &value)) + g_assert_not_reached (); + g_assert (value == 292); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr != NULL); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == sizeof (CK_ULONG)); + g_assert (*((CK_ULONG*)attr->value) == 88); + + if (!gck_attributes_find_ulong (attrs, ATTR_TYPE, &value)) + g_assert_not_reached (); + g_assert (value == 88); + g_assert (gck_attribute_get_ulong (attr) == 88); + + g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); + gck_attributes_unref (attrs); +} + +static void +test_build_string (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + gchar *value; + + g_assert (gck_builder_find_string (&builder, 5, &value) == FALSE); + + gck_builder_add_string (&builder, ATTR_TYPE, "My my"); + + gck_builder_set_invalid (&builder, 5); + g_assert (gck_builder_find_string (&builder, 5, &value) == FALSE); + gck_builder_set_string (&builder, 5, "Hello"); + + attr = gck_builder_find (&builder, ATTR_TYPE); + g_assert (attr != NULL); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == strlen ("My my")); + g_assert (memcmp (attr->value, "My my", attr->length) == 0); + + if (!gck_builder_find_string (&builder, 5, &value)) + g_assert_not_reached (); + g_assert_cmpstr (value, ==, "Hello"); + g_free (value); + + gck_builder_set_string (&builder, ATTR_TYPE, "a test string"); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == strlen ("a test string")); + g_assert (memcmp (attr->value, "a test string", attr->length) == 0); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr != NULL); + + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == strlen ("a test string")); + g_assert (memcmp (attr->value, "a test string", attr->length) == 0); + + if (!gck_attributes_find_string (attrs, ATTR_TYPE, &value)) + g_assert_not_reached (); + g_assert_cmpstr ("a test string", ==, value); + g_free (value); + + value = gck_attribute_get_string (attr); + g_assert_cmpstr ("a test string", ==, value); + g_free (value); + + g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); + gck_attributes_unref (attrs); +} + +static void +test_build_string_null (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + gchar *value; + + gck_builder_add_string (&builder, ATTR_TYPE, NULL); + + g_assert (gck_builder_find_string (&builder, ATTR_TYPE, &value) == FALSE); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr->value == NULL); + g_assert (attr->length == 0); + + value = gck_attribute_get_string (attr); + g_assert (value == NULL); + + gck_attributes_unref (attrs); +} + +static void +test_build_invalid (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + + gck_builder_add_invalid (&builder, ATTR_TYPE); + gck_builder_set_invalid (&builder, ATTR_TYPE); + gck_builder_set_invalid (&builder, 5); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == (gulong)-1); + g_assert (attr->value == NULL); + + g_assert (gck_attribute_is_invalid (attr)); + + g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); + gck_attributes_unref (attrs); +} + +static void +test_build_empty (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + + gck_builder_add_empty (&builder, ATTR_TYPE); + gck_builder_set_empty (&builder, ATTR_TYPE); + gck_builder_set_empty (&builder, 5); + + attr = gck_builder_find (&builder, 5); + g_assert (attr->type == 5); + g_assert (attr->length == 0); + g_assert (attr->value == NULL); + + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + g_assert (attr->type == ATTR_TYPE); + g_assert (attr->length == 0); + g_assert (attr->value == NULL); + + g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); + gck_attributes_unref (attrs); +} + +static void +test_builder_secure (void) +{ + GckAttributes *attrs; + GckBuilder builder; + const GckAttribute *attr; + + gck_builder_init_full (&builder, GCK_BUILDER_SECURE_MEMORY); + + gck_builder_add_boolean (&builder, 88, TRUE); + attrs = gck_builder_end (&builder); + attr = gck_attributes_at (attrs, 0); + + g_assert (egg_secure_check (attr->value)); + + gck_attributes_unref (attrs); +} + +static void +test_builder_copy (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + GckBuilder *copy; + const GckAttribute *attr; + + gck_builder_add_ulong (&builder, ATTR_TYPE, 88); + copy = gck_builder_copy (&builder); + gck_builder_clear (&builder); + + attrs = gck_builder_end (copy); + gck_builder_unref (copy); + + attr = gck_attributes_at (attrs, 0); + g_assert (gck_attribute_get_ulong (attr) == 88); + g_assert (attr->type == ATTR_TYPE); + + /* Should be able to copy null */ + copy = gck_builder_copy (NULL); + g_assert (copy == NULL); + + gck_attributes_unref (attrs); +} + +static void +test_builder_refs (void) +{ + GckBuilder *builder, *two; + gulong check; + + builder = gck_builder_new (GCK_BUILDER_NONE); + gck_builder_add_ulong (builder, 88, 99); + + two = gck_builder_ref (builder); + + g_assert (builder == two); + + if (!gck_builder_find_ulong (builder, 88, &check)) + g_assert_not_reached (); + g_assert (check == 99); + + gck_builder_unref (builder); + + if (!gck_builder_find_ulong (two, 88, &check)) + g_assert_not_reached (); + g_assert (check == 99); + + gck_builder_unref (two); +} + +static void +test_builder_boxed (void) +{ + GckBuilder *builder, *two; + gulong check; + + builder = gck_builder_new (GCK_BUILDER_NONE); + gck_builder_add_ulong (builder, 88, 99); + + two = g_boxed_copy (GCK_TYPE_BUILDER, builder); + + g_assert (builder == two); + + if (!gck_builder_find_ulong (builder, 88, &check)) + g_assert_not_reached (); + g_assert (check == 99); + + g_boxed_free (GCK_TYPE_BUILDER, builder); + + if (!gck_builder_find_ulong (two, 88, &check)) + g_assert_not_reached (); + g_assert (check == 99); + + gck_builder_unref (two); +} + +static void +test_builder_add_attr (void) +{ + GckBuilder bone = GCK_BUILDER_INIT; + GckBuilder btwo = GCK_BUILDER_INIT; + const GckAttribute *aone, *atwo; + GckAttributes *aones, *atwos; + gchar *value; + + gck_builder_add_string (&bone, ATTR_TYPE, "blah"); + aones = gck_builder_end (&bone); + aone = gck_attributes_at (aones, 0); + + gck_builder_add_all (&btwo, aones); + atwos = gck_builder_end (&btwo); + atwo = gck_attributes_at (atwos, 0); + + /* Should be equal, and also share the values */ + gck_attribute_equal (aone, atwo); + g_assert (aone->value == atwo->value); + + gck_attributes_unref (aones); + + value = gck_attribute_get_string (atwo); + g_assert_cmpstr (value, ==, "blah"); + g_free (value); + + gck_attributes_unref (atwos); +} + +static void +test_attribute_hash (void) +{ + guchar *data = (guchar *)"extra attribute"; + GckAttribute one = { CKA_LABEL, (guchar *)"yay", 3 }; + GckAttribute null = { CKA_LABEL, (guchar *)NULL, 3 }; + GckAttribute zero = { CKA_LABEL, (guchar *)NULL, 0 }; + GckAttribute two = { CKA_VALUE, (guchar *)"yay", 3 }; + GckAttribute other = { CKA_VALUE, data, 5 }; + GckAttribute overflow = { CKA_VALUE, data, 5 }; + GckAttribute content = { CKA_VALUE, (guchar *)"conte", 5 }; + guint hash; + + hash = gck_attribute_hash (&one); + g_assert_cmpuint (hash, !=, 0); + + g_assert_cmpuint (gck_attribute_hash (&one), ==, hash); + g_assert_cmpuint (gck_attribute_hash (&two), !=, hash); + g_assert_cmpuint (gck_attribute_hash (&other), !=, hash); + g_assert_cmpuint (gck_attribute_hash (&overflow), !=, hash); + g_assert_cmpuint (gck_attribute_hash (&null), !=, hash); + g_assert_cmpuint (gck_attribute_hash (&zero), !=, hash); + g_assert_cmpuint (gck_attribute_hash (&content), !=, hash); +} + +static void +test_attributes_refs (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + + attrs = gck_builder_end (&builder); + g_assert (attrs != NULL); + g_assert (gck_attributes_count (attrs) == 0); + + g_assert (gck_attributes_ref (attrs) == attrs); + gck_attributes_unref (attrs); + + gck_attributes_unref (attrs); + + /* Can unref NULL */ + gck_attributes_unref (NULL); +} + +static void +test_attributes_contents (GckAttributes *attrs, + gboolean extras, + gint count) +{ + const GckAttribute *attr; + gchar *value; + GDate date, *check; + + g_assert (attrs != NULL); + if (count < 0) + count = extras ? 7 : 5; + g_assert_cmpuint (gck_attributes_count (attrs), ==, count); + + attr = gck_attributes_at (attrs, 0); + g_assert (attr->type == 0); + g_assert (gck_attribute_get_boolean (attr) == TRUE); + + attr = gck_attributes_at (attrs, 1); + g_assert (attr->type == 101); + gck_assert_cmpulong (gck_attribute_get_ulong (attr), ==, 888); + + attr = gck_attributes_at (attrs, 2); + g_assert (attr->type == 202); + value = gck_attribute_get_string (attr); + g_assert (strcmp (value, "string") == 0); + g_free (value); + + attr = gck_attributes_at (attrs, 3); + g_assert (attr->type == 303); + check = g_date_new_dmy (11, 12, 2008); + gck_attribute_get_date (attr, &date); + g_assert (g_date_compare (&date, check) == 0); + g_date_free (check); + + attr = gck_attributes_at (attrs, 4); + g_assert (attr->type == 404); + g_assert (attr->length == N_ATTR_DATA); + g_assert (memcmp (attr->value, ATTR_DATA, N_ATTR_DATA) == 0); + + if (!extras) + return; + + attr = gck_attributes_at (attrs, 5); + g_assert (attr->type == 505); + g_assert (attr->length == (gulong)-1); + g_assert (attr->value == NULL); + g_assert (gck_attribute_is_invalid (attr)); + + attr = gck_attributes_at (attrs, 6); + g_assert (attr->type == 606); + g_assert (attr->length == 0); + g_assert (attr->value == NULL); +} + +static void +test_attributes_new_empty (void) +{ + GckAttributes *attrs; + const GckAttribute *attr; + + attrs = gck_attributes_new_empty (GCK_INVALID); + g_assert_cmpuint (gck_attributes_count (attrs), ==, 0); + gck_attributes_unref (attrs); + + attrs = gck_attributes_new_empty (CKA_ID, CKA_LABEL, GCK_INVALID); + g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); + attr = gck_attributes_at (attrs, 0); + g_assert (attr->type == CKA_ID); + g_assert (attr->length == 0); + g_assert (attr->value == NULL); + attr = gck_attributes_at (attrs, 1); + g_assert (attr->type == CKA_LABEL); + g_assert (attr->length == 0); + g_assert (attr->value == NULL); + gck_attributes_unref (attrs); +} + +static void +test_attributes_empty (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + const GckAttribute *attr; + guint i; + + gck_builder_add_empty (&builder, 101UL); + gck_builder_add_empty (&builder, 202UL); + gck_builder_add_empty (&builder, 303UL); + gck_builder_add_empty (&builder, 404UL); + attrs = gck_builder_end (&builder); + + g_assert_cmpuint (gck_attributes_count (attrs), ==, 4); + for (i = 0; i < gck_attributes_count (attrs); ++i) { + attr = gck_attributes_at (attrs, i); + g_assert (attr->type == ((i + 1) * 100) + i + 1); + g_assert (attr->value == NULL); + g_assert (attr->length == 0); + } + + gck_attributes_unref (attrs); +} + +static void +test_builder_add_from (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckBuilder two = GCK_BUILDER_INIT; + GckAttributes *attrs; + guint i; + + builder_add_fixtures (&builder, 0); + attrs = gck_builder_end (&builder); + + for (i = 0; i < gck_attributes_count (attrs); i++) + gck_builder_add_attribute (&two, gck_attributes_at (attrs, i)); + + gck_attributes_unref (attrs); + attrs = gck_builder_end (&two); + + test_attributes_contents (attrs, TRUE, -1); + gck_attributes_unref (attrs); +} + + +static void +test_builder_add_all (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckBuilder two = GCK_BUILDER_INIT; + GckAttributes *attrs; + + builder_add_fixtures (&builder, 0); + attrs = gck_builder_end (&builder); + + gck_builder_add_all (&two, attrs); + gck_attributes_unref (attrs); + attrs = gck_builder_end (&two); + + test_attributes_contents (attrs, TRUE, -1); + gck_attributes_unref (attrs); +} + +static void +test_builder_set_all (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckBuilder two = GCK_BUILDER_INIT; + GckAttributes *attrs; + + builder_add_fixtures (&builder, 5); + builder_add_fixtures (&two, 0); + attrs = gck_builder_end (&two); + gck_builder_set_all (&builder, attrs); + gck_attributes_unref (attrs); + attrs = gck_builder_end (&builder); + + test_attributes_contents (attrs, TRUE, -1); + gck_attributes_unref (attrs); +} + + +static void +test_builder_set_blank (void) +{ + GckBuilder builder; + gboolean value; + + gck_builder_init (&builder); + gck_builder_set_boolean (&builder, 5, TRUE); + if (!gck_builder_find_boolean (&builder, 5, &value)) + g_assert_not_reached (); + g_assert (value == TRUE); + gck_builder_clear (&builder); +} + +static void +test_builder_add_only (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckBuilder two = GCK_BUILDER_INIT; + GckAttributes *attrs; + + builder_add_fixtures (&builder, 0); + attrs = gck_builder_end (&builder); + + gck_builder_add_only (&two, attrs, 0UL, 202UL, 404UL, 606UL, GCK_INVALID); + gck_attributes_unref (attrs); + attrs = gck_builder_end (&two); + + g_assert (gck_attributes_find (attrs, 0UL) != NULL); + g_assert (gck_attributes_find (attrs, 202UL) != NULL); + g_assert (gck_attributes_find (attrs, 404UL) != NULL); + g_assert (gck_attributes_find (attrs, 606UL) != NULL); + + g_assert (gck_attributes_find (attrs, 101UL) == NULL); + g_assert (gck_attributes_find (attrs, 303UL) == NULL); + g_assert (gck_attributes_find (attrs, 505UL) == NULL); + + gck_attributes_unref (attrs); +} + +static void +test_builder_add_except (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckBuilder two = GCK_BUILDER_INIT; + GckAttributes *attrs; + + builder_add_fixtures (&builder, 0); + attrs = gck_builder_end (&builder); + + gck_builder_add_except (&two, attrs, 0UL, 202UL, 404UL, 606UL, GCK_INVALID); + gck_attributes_unref (attrs); + attrs = gck_builder_end (&two); + + g_assert (gck_attributes_find (attrs, 0UL) == NULL); + g_assert (gck_attributes_find (attrs, 202UL) == NULL); + g_assert (gck_attributes_find (attrs, 404UL) == NULL); + g_assert (gck_attributes_find (attrs, 606UL) == NULL); + + g_assert (gck_attributes_find (attrs, 101UL) != NULL); + g_assert (gck_attributes_find (attrs, 303UL) != NULL); + g_assert (gck_attributes_find (attrs, 505UL) != NULL); + + gck_attributes_unref (attrs); +} + +static void +test_builder_add_only_and_except (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckBuilder two = GCK_BUILDER_INIT; + GckAttributes *attrs; + + builder_add_fixtures (&builder, 0); + attrs = gck_builder_end (&builder); + + gck_builder_add_only (&two, attrs, 0UL, 101UL, 202UL, 303UL, GCK_INVALID); + gck_builder_add_except (&two, attrs, 0UL, 101UL, 202UL, 303UL, GCK_INVALID); + gck_attributes_unref (attrs); + attrs = gck_builder_end (&two); + + test_attributes_contents (attrs, TRUE, -1); + gck_attributes_unref (attrs); +} + +static void +test_find_attributes (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GDate check, *date = g_date_new_dmy (13, 12, 2008); + GckAttributes *attrs; + const GckAttribute *attr; + gboolean bvalue, ret; + gulong uvalue; + gchar *svalue; + + gck_builder_add_boolean (&builder, 0UL, TRUE); + gck_builder_add_ulong (&builder, 101UL, 888UL); + gck_builder_add_string (&builder, 202UL, "string"); + gck_builder_add_date (&builder, 303UL, date); + gck_builder_add_data (&builder, 404UL, (const guchar *)ATTR_DATA, N_ATTR_DATA); + attrs = gck_builder_end (&builder); + + attr = gck_attributes_find (attrs, 404); + g_assert (attr != NULL); + g_assert (attr->length == N_ATTR_DATA); + g_assert (memcmp (attr->value, ATTR_DATA, N_ATTR_DATA) == 0); + + ret = gck_attributes_find_boolean (attrs, 0UL, &bvalue); + g_assert (ret == TRUE); + g_assert (bvalue == TRUE); + + ret = gck_attributes_find_ulong (attrs, 101UL, &uvalue); + g_assert (ret == TRUE); + g_assert (uvalue == 888); + + ret = gck_attributes_find_string (attrs, 202UL, &svalue); + g_assert (ret == TRUE); + g_assert (svalue != NULL); + g_assert (strcmp (svalue, "string") == 0); + g_free (svalue); + + ret = gck_attributes_find_date (attrs, 303UL, &check); + g_assert (ret == TRUE); + g_assert (g_date_compare (date, &check) == 0); + + gck_attributes_unref (attrs); + g_date_free (date); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gck/value/to_boolean", test_value_to_boolean); + g_test_add_func ("/gck/value/to_ulong", test_value_to_ulong); + g_test_add_func ("/gck/attribute/init_memory", test_init_memory); + g_test_add_func ("/gck/attribute/init_boolean", test_init_boolean); + g_test_add_func ("/gck/attribute/init_date", test_init_date); + g_test_add_func ("/gck/attribute/init_ulong", test_init_ulong); + g_test_add_func ("/gck/attribute/init_string", test_init_string); + g_test_add_func ("/gck/attribute/init_invalid", test_init_invalid); + g_test_add_func ("/gck/attribute/init_empty", test_init_empty); + g_test_add_func ("/gck/attribute/new_memory", test_new_memory); + g_test_add_func ("/gck/attribute/new_boolean", test_new_boolean); + g_test_add_func ("/gck/attribute/new_date", test_new_date); + g_test_add_func ("/gck/attribute/new_ulong", test_new_ulong); + g_test_add_func ("/gck/attribute/new_string", test_new_string); + g_test_add_func ("/gck/attribute/new_invalid", test_new_invalid); + g_test_add_func ("/gck/attribute/new_empty", test_new_empty); + g_test_add_func ("/gck/attribute/get_boolean", test_get_boolean); + g_test_add_func ("/gck/attribute/get_date", test_get_date); + g_test_add_func ("/gck/attribute/get_ulong", test_get_ulong); + g_test_add_func ("/gck/attribute/get_string", test_get_string); + g_test_add_func ("/gck/attribute/dup_attribute", test_dup_attribute); + g_test_add_func ("/gck/attribute/copy_attribute", test_copy_attribute); + g_test_add_func ("/gck/attribute/hash", test_attribute_hash); + g_test_add_func ("/gck/builder/blank", test_builder_blank); + g_test_add_func ("/gck/builder/data", test_build_data); + g_test_add_func ("/gck/builder/data-invalid", test_build_data_invalid); + g_test_add_func ("/gck/builder/data-secure", test_build_data_secure); + g_test_add_func ("/gck/builder/take", test_build_take); + g_test_add_func ("/gck/builder/take-invalid", test_build_take_invalid); + g_test_add_func ("/gck/builder/take-secure", test_build_take_secure); + g_test_add_func ("/gck/builder/boolean", test_build_boolean); + g_test_add_func ("/gck/builder/date", test_build_date); + g_test_add_func ("/gck/builder/ulong", test_build_ulong); + g_test_add_func ("/gck/builder/string", test_build_string); + g_test_add_func ("/gck/builder/string-null", test_build_string_null); + g_test_add_func ("/gck/builder/invalid", test_build_invalid); + g_test_add_func ("/gck/builder/empty", test_build_empty); + g_test_add_func ("/gck/builder/secure", test_builder_secure); + g_test_add_func ("/gck/builder/copy", test_builder_copy); + g_test_add_func ("/gck/builder/refs", test_builder_refs); + g_test_add_func ("/gck/builder/boxed", test_builder_boxed); + g_test_add_func ("/gck/builder/add-attr", test_builder_add_attr); + g_test_add_func ("/gck/builder/add-all", test_builder_add_all); + g_test_add_func ("/gck/builder/add-from", test_builder_add_from); + g_test_add_func ("/gck/builder/add-only", test_builder_add_only); + g_test_add_func ("/gck/builder/add-except", test_builder_add_except); + g_test_add_func ("/gck/builder/add-only-and-except", test_builder_add_only_and_except); + g_test_add_func ("/gck/builder/set-all", test_builder_set_all); + g_test_add_func ("/gck/builder/set-blank", test_builder_set_blank); + g_test_add_func ("/gck/attributes/refs", test_attributes_refs); + g_test_add_func ("/gck/attributes/new-empty", test_attributes_new_empty); + g_test_add_func ("/gck/attributes/empty", test_attributes_empty); + g_test_add_func ("/gck/attributes/find_attributes", test_find_attributes); + + return g_test_run (); +} diff --git a/gck/test-gck-crypto.c b/gck/test-gck-crypto.c new file mode 100644 index 0000000..0cb3e2b --- /dev/null +++ b/gck/test-gck-crypto.c @@ -0,0 +1,672 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-crypto.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck/gck.h" +#include "gck/gck-mock.h" +#include "gck/gck-test.h" + +#include "egg/egg-testing.h" + +#include + +#include +#include +#include +#include + +typedef struct { + GckModule *module; + GckSession *session; + GckSession *session_with_auth; +} Test; + +static gboolean +on_discard_handle_ignore (GckSession *self, CK_OBJECT_HANDLE handle, gpointer unused) +{ + /* Don't close the handle for this session, since it's a duplicate */ + return TRUE; +} + +static void +setup (Test *test, gconstpointer unused) +{ + GError *err = NULL; + GList *slots; + GckSlot *slot; + + /* Successful load */ + test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_MODULE (test->module)); + g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); + + slots = gck_module_get_slots (test->module, TRUE); + g_assert (slots != NULL); + + test->session = gck_slot_open_session (slots->data, 0, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (test->session)); + g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session); + + slot = gck_session_get_slot (test->session); + g_assert (slot); + + test->session_with_auth = gck_session_from_handle (slot, gck_session_get_handle (test->session), GCK_SESSION_AUTHENTICATE); + g_signal_connect (test->session_with_auth, "discard-handle", G_CALLBACK (on_discard_handle_ignore), NULL); + g_assert (test->session_with_auth); + g_object_add_weak_pointer (G_OBJECT (test->session_with_auth), (gpointer *)&test->session_with_auth); + + g_object_unref (slot); + gck_list_unref_free (slots); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->session); + g_object_unref (test->module); + g_object_unref (test->session_with_auth); + + g_assert (test->session == NULL); + g_assert (test->session_with_auth == NULL); + g_assert (test->module == NULL); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static GckObject* +find_key (GckSession *session, CK_ATTRIBUTE_TYPE method, CK_MECHANISM_TYPE mech) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GList *objects, *l; + GckObject *object = NULL; + CK_MECHANISM_TYPE_PTR mechs; + gboolean match; + gsize n_mechs; + + gck_builder_add_boolean (&builder, method, TRUE); + objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL); + g_assert (objects); + + for (l = objects; l; l = g_list_next (l)) { + if (mech) { + mechs = (gulong *)gck_object_get_data (l->data, CKA_ALLOWED_MECHANISMS, + NULL, &n_mechs, NULL); + g_assert (mechs); + g_assert (n_mechs == sizeof (CK_MECHANISM_TYPE)); + + /* We know all of them only have one allowed mech */ + match = (*mechs != mech); + g_free (mechs); + + if (match) + continue; + } + object = l->data; + g_object_ref (object); + break; + } + + gck_list_unref_free (objects); + return object; +} + +static GckObject* +find_key_with_value (GckSession *session, const gchar *value) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GList *objects; + GckObject *object; + + gck_builder_add_string (&builder, CKA_VALUE, value); + objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL); + g_assert (objects); + + object = g_object_ref (objects->data); + gck_list_unref_free (objects); + return object; +} + +static void +check_key_with_value (GckSession *session, GckObject *key, CK_OBJECT_CLASS klass, const gchar *value) +{ + GckAttributes *attrs; + const GckAttribute *attr; + gulong check; + + attrs = gck_object_get (key, NULL, NULL, CKA_CLASS, CKA_VALUE, GCK_INVALID); + g_assert (attrs); + + if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &check)) + g_assert_not_reached (); + g_assert (check == klass); + + attr = gck_attributes_find (attrs, CKA_VALUE); + g_assert (attr); + g_assert (!gck_attribute_is_invalid (attr)); + egg_assert_cmpsize (attr->length, ==, strlen (value)); + g_assert (memcmp (attr->value, value, attr->length) == 0); + + gck_attributes_unref (attrs); +} + +static gboolean +authenticate_object (GckSlot *module, GckObject *object, gchar *label, gchar **password) +{ + g_assert (GCK_IS_MODULE (module)); + g_assert (GCK_IS_OBJECT (object)); + g_assert (password); + g_assert (!*password); + + *password = g_strdup ("booo"); + return TRUE; +} + +static void +test_encrypt (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_CAPITALIZE, NULL, 0 }; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *key; + guchar *output; + gsize n_output; + + /* Find the right key */ + key = find_key (test->session, CKA_ENCRYPT, CKM_MOCK_CAPITALIZE); + g_assert (key); + + /* Simple one */ + output = gck_session_encrypt (test->session, key, CKM_MOCK_CAPITALIZE, (const guchar*)"blah blah", 10, &n_output, NULL, &error); + g_assert_no_error (error); + g_assert (output); + g_assert (n_output == 10); + g_assert_cmpstr ((gchar*)output, ==, "BLAH BLAH"); + g_free (output); + + /* Asynchronous one */ + gck_session_encrypt_async (test->session, key, &mech, (const guchar*)"second chance", 14, NULL, fetch_async_result, &result); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + output = gck_session_encrypt_finish (test->session, result, &n_output, &error); + g_assert_no_error (error); + g_assert (output); + g_assert (n_output == 14); + g_assert_cmpstr ((gchar*)output, ==, "SECOND CHANCE"); + g_free (output); + + g_object_unref (result); + g_object_unref (key); +} + +static void +test_decrypt (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_CAPITALIZE, NULL, 0 }; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *key; + guchar *output; + gsize n_output; + + /* Find the right key */ + key = find_key (test->session, CKA_DECRYPT, CKM_MOCK_CAPITALIZE); + g_assert (key); + + /* Simple one */ + output = gck_session_decrypt (test->session, key, CKM_MOCK_CAPITALIZE, (const guchar*)"FRY???", 7, &n_output, NULL, &error); + g_assert_no_error (error); + g_assert (output); + g_assert (n_output == 7); + g_assert_cmpstr ((gchar*)output, ==, "fry???"); + g_free (output); + + /* Asynchronous one */ + gck_session_decrypt_async (test->session, key, &mech, (const guchar*)"FAT CHANCE", 11, NULL, fetch_async_result, &result); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + output = gck_session_decrypt_finish (test->session, result, &n_output, &error); + g_assert_no_error (error); + g_assert (output); + g_assert (n_output == 11); + g_assert_cmpstr ((gchar*)output, ==, "fat chance"); + g_free (output); + + g_object_unref (result); + g_object_unref (key); +} + +static void +test_login_context_specific (Test *test, gconstpointer unused) +{ + /* The test module won't let us sign without doing a login, check that */ + + GError *error = NULL; + GckObject *key; + guchar *output; + gsize n_output; + + /* Find the right key */ + key = find_key (test->session, CKA_SIGN, CKM_MOCK_PREFIX); + g_assert (GCK_IS_OBJECT (key)); + g_object_add_weak_pointer (G_OBJECT (key), (gpointer *)&key); + + /* Simple one */ + output = gck_session_sign (test->session, key, CKM_MOCK_PREFIX, (const guchar*)"TV Monster", 11, &n_output, NULL, &error); + g_assert_error (error, GCK_ERROR, CKR_USER_NOT_LOGGED_IN); + g_assert (output == NULL); + g_error_free (error); + + g_object_unref (key); + g_assert (key == NULL); +} + +static void +test_sign (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_PREFIX, (guchar *)"my-prefix:", 10 }; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *key; + guchar *output; + gsize n_output; + + /* Enable auto-login on this test->session, see previous test */ + g_signal_connect (test->module, "authenticate-object", G_CALLBACK (authenticate_object), NULL); + + /* Find the right key */ + key = find_key (test->session_with_auth, CKA_SIGN, CKM_MOCK_PREFIX); + g_assert (key); + + /* Simple one */ + output = gck_session_sign (test->session_with_auth, key, CKM_MOCK_PREFIX, (const guchar*)"Labarbara", 10, &n_output, NULL, &error); + g_assert_no_error (error); + g_assert (output); + g_assert_cmpuint (n_output, ==, 24); + g_assert_cmpstr ((gchar*)output, ==, "signed-prefix:Labarbara"); + g_free (output); + + /* Asynchronous one */ + gck_session_sign_async (test->session_with_auth, key, &mech, (const guchar*)"Conrad", 7, NULL, fetch_async_result, &result); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + output = gck_session_sign_finish (test->session_with_auth, result, &n_output, &error); + g_assert_no_error (error); + g_assert (output); + g_assert_cmpuint (n_output, ==, 17); + g_assert_cmpstr ((gchar*)output, ==, "my-prefix:Conrad"); + g_free (output); + + g_object_unref (result); + g_object_unref (key); +} + +static void +test_verify (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_PREFIX, (guchar *)"my-prefix:", 10 }; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *key; + gboolean ret; + + /* Enable auto-login on this session, shouldn't be needed */ + g_signal_connect (test->module, "authenticate-object", G_CALLBACK (authenticate_object), NULL); + + /* Find the right key */ + key = find_key (test->session, CKA_VERIFY, CKM_MOCK_PREFIX); + g_assert (GCK_IS_OBJECT (key)); + g_object_add_weak_pointer (G_OBJECT (key), (gpointer *)&key); + + /* Simple one */ + ret = gck_session_verify (test->session, key, CKM_MOCK_PREFIX, (const guchar*)"Labarbara", 10, + (const guchar*)"signed-prefix:Labarbara", 24, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + + /* Failure one */ + ret = gck_session_verify_full (test->session, key, &mech, (const guchar*)"Labarbara", 10, + (const guchar*)"my-prefix:Loborboro", 20, NULL, &error); + g_assert (error != NULL); + g_assert (!ret); + g_clear_error (&error); + + /* Asynchronous one */ + gck_session_verify_async (test->session, key, &mech, (const guchar*)"Labarbara", 10, + (const guchar*)"my-prefix:Labarbara", 20, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + ret = gck_session_verify_finish (test->session, result, &error); + g_assert_no_error (error); + g_assert (ret); + g_object_unref (result); + + /* Asynchronous failure */ + result = NULL; + gck_session_verify_async (test->session, key, &mech, (const guchar*)"Labarbara", 10, + (const guchar*)"my-prefix:Labarxoro", 20, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + ret = gck_session_verify_finish (test->session, result, &error); + g_assert (error != NULL); + g_assert (!ret); + g_clear_error (&error); + g_object_unref (result); + + g_object_unref (key); + g_assert (key == NULL); +} + +static void +test_generate_key_pair (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_GENERATE, (guchar *)"generate", 9 }; + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *pub_attrs, *prv_attrs; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *pub_key, *prv_key; + gboolean ret; + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); + pub_attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); + prv_attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + /* Full One*/ + ret = gck_session_generate_key_pair_full (test->session, &mech, pub_attrs, prv_attrs, + &pub_key, &prv_key, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_object_unref (pub_key); + g_object_unref (prv_key); + + /* Failure one */ + mech.type = 0; + pub_key = prv_key = NULL; + ret = gck_session_generate_key_pair_full (test->session, &mech, pub_attrs, prv_attrs, + &pub_key, &prv_key, NULL, &error); + g_assert (error != NULL); + g_assert (!ret); + g_clear_error (&error); + g_assert (pub_key == NULL); + g_assert (prv_key == NULL); + + /* Asynchronous one */ + mech.type = CKM_MOCK_GENERATE; + gck_session_generate_key_pair_async (test->session, &mech, pub_attrs, prv_attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + ret = gck_session_generate_key_pair_finish (test->session, result, &pub_key, &prv_key, &error); + g_assert_no_error (error); + g_assert (ret); + g_object_unref (result); + g_object_unref (pub_key); + g_object_unref (prv_key); + + /* Asynchronous failure */ + result = NULL; + mech.type = 0; + pub_key = prv_key = NULL; + gck_session_generate_key_pair_async (test->session, &mech, pub_attrs, prv_attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + ret = gck_session_generate_key_pair_finish (test->session, result, &pub_key, &prv_key, &error); + g_assert (error != NULL); + g_assert (!ret); + g_clear_error (&error); + g_object_unref (result); + g_assert (pub_key == NULL); + g_assert (prv_key == NULL); + + gck_attributes_unref (pub_attrs); + gck_attributes_unref (prv_attrs); +} + +static void +test_wrap_key (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_WRAP, (guchar *)"wrap", 4 }; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *wrapper, *wrapped; + gpointer output; + gsize n_output; + + wrapper = find_key (test->session, CKA_WRAP, 0); + wrapped = find_key_with_value (test->session, "value"); + + /* Simple One */ + output = gck_session_wrap_key (test->session, wrapper, CKM_MOCK_WRAP, wrapped, &n_output, NULL, &error); + g_assert_no_error (error); + g_assert (output); + egg_assert_cmpsize (n_output, ==, 5); + g_assert (memcmp (output, "value", 5) == 0); + g_free (output); + + /* Full One*/ + output = gck_session_wrap_key_full (test->session, wrapper, &mech, wrapped, &n_output, NULL, &error); + g_assert_no_error (error); + g_assert (output); + egg_assert_cmpsize (n_output, ==, 5); + g_assert (memcmp (output, "value", 5) == 0); + g_free (output); + + /* Failure one */ + mech.type = 0; + n_output = 0; + output = gck_session_wrap_key_full (test->session, wrapper, &mech, wrapped, &n_output, NULL, &error); + g_assert (error != NULL); + g_assert (!output); + g_clear_error (&error); + egg_assert_cmpsize (n_output, ==, 0); + + /* Asynchronous one */ + mech.type = CKM_MOCK_WRAP; + gck_session_wrap_key_async (test->session, wrapper, &mech, wrapped, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + output = gck_session_wrap_key_finish (test->session, result, &n_output, &error); + g_assert_no_error (error); + g_assert (output); + egg_assert_cmpsize (n_output, ==, 5); + g_assert (memcmp (output, "value", 5) == 0); + g_object_unref (result); + g_free (output); + + /* Asynchronous failure */ + result = NULL; + mech.type = 0; + n_output = 0; + gck_session_wrap_key_async (test->session, wrapper, &mech, wrapped, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + output = gck_session_wrap_key_finish (test->session, result, &n_output, &error); + g_assert (error != NULL); + g_assert (!output); + g_clear_error (&error); + egg_assert_cmpsize (n_output, ==, 0); + g_object_unref (result); + + g_object_unref (wrapper); + g_object_unref (wrapped); +} + +static void +test_unwrap_key (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_WRAP, (guchar *)"wrap", 4 }; + GckBuilder builder = GCK_BUILDER_INIT; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *wrapper, *unwrapped; + GckAttributes *attrs; + + wrapper = find_key (test->session, CKA_UNWRAP, 0); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY); + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + /* Full One*/ + unwrapped = gck_session_unwrap_key_full (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, &error); + g_assert_no_error (error); + g_assert (GCK_IS_OBJECT (unwrapped)); + check_key_with_value (test->session, unwrapped, CKO_SECRET_KEY, "special"); + g_object_unref (unwrapped); + + /* Failure one */ + mech.type = 0; + unwrapped = gck_session_unwrap_key_full (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, &error); + g_assert (error != NULL); + g_assert (!unwrapped); + g_clear_error (&error); + + /* Asynchronous one */ + mech.type = CKM_MOCK_WRAP; + gck_session_unwrap_key_async (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + unwrapped = gck_session_unwrap_key_finish (test->session, result, &error); + g_assert_no_error (error); + g_assert (GCK_IS_OBJECT (unwrapped)); + check_key_with_value (test->session, unwrapped, CKO_SECRET_KEY, "special"); + g_object_unref (unwrapped); + g_object_unref (result); + + /* Asynchronous failure */ + result = NULL; + mech.type = 0; + gck_session_unwrap_key_async (test->session, wrapper, &mech, (const guchar *)"special", 6, attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + unwrapped = gck_session_unwrap_key_finish (test->session, result, &error); + g_assert (error != NULL); + g_assert (!unwrapped); + g_clear_error (&error); + g_object_unref (result); + + g_object_unref (wrapper); + gck_attributes_unref (attrs); +} + +static void +test_derive_key (Test *test, gconstpointer unused) +{ + GckMechanism mech = { CKM_MOCK_DERIVE, (guchar *)"derive", 6 }; + GckBuilder builder = GCK_BUILDER_INIT; + GError *error = NULL; + GAsyncResult *result = NULL; + GckObject *wrapper, *derived; + GckAttributes *attrs; + + wrapper = find_key (test->session, CKA_DERIVE, 0); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY); + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + /* Full One*/ + derived = gck_session_derive_key_full (test->session, wrapper, &mech, attrs, NULL, &error); + g_assert_no_error (error); + g_assert (GCK_IS_OBJECT (derived)); + check_key_with_value (test->session, derived, CKO_SECRET_KEY, "derived"); + g_object_unref (derived); + + /* Failure one */ + mech.type = 0; + derived = gck_session_derive_key_full (test->session, wrapper, &mech, attrs, NULL, &error); + g_assert (error != NULL); + g_assert (!derived); + g_clear_error (&error); + + /* Asynchronous one */ + mech.type = CKM_MOCK_DERIVE; + gck_session_derive_key_async (test->session, wrapper, &mech, attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + derived = gck_session_derive_key_finish (test->session, result, &error); + g_assert_no_error (error); + g_assert (GCK_IS_OBJECT (derived)); + check_key_with_value (test->session, derived, CKO_SECRET_KEY, "derived"); + g_object_unref (derived); + g_object_unref (result); + + /* Asynchronous failure */ + result = NULL; + mech.type = 0; + gck_session_derive_key_async (test->session, wrapper, &mech, attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + derived = gck_session_derive_key_finish (test->session, result, &error); + g_assert (error != NULL); + g_assert (!derived); + g_clear_error (&error); + g_object_unref (result); + + g_object_unref (wrapper); + gck_attributes_unref (attrs); +} + +static void +null_log_handler (const gchar *log_domain, GLogLevelFlags log_level, + const gchar *message, gpointer user_data) +{ + +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_set_prgname ("test-gck-crypto"); + + /* Suppress these messages in tests */ + g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, + null_log_handler, NULL); + + g_test_add ("/gck/crypto/encrypt", Test, NULL, setup, test_encrypt, teardown); + g_test_add ("/gck/crypto/decrypt", Test, NULL, setup, test_decrypt, teardown); + g_test_add ("/gck/crypto/login_context_specific", Test, NULL, setup, test_login_context_specific, teardown); + g_test_add ("/gck/crypto/sign", Test, NULL, setup, test_sign, teardown); + g_test_add ("/gck/crypto/verify", Test, NULL, setup, test_verify, teardown); + g_test_add ("/gck/crypto/generate_key_pair", Test, NULL, setup, test_generate_key_pair, teardown); + g_test_add ("/gck/crypto/wrap_key", Test, NULL, setup, test_wrap_key, teardown); + g_test_add ("/gck/crypto/unwrap_key", Test, NULL, setup, test_unwrap_key, teardown); + g_test_add ("/gck/crypto/derive_key", Test, NULL, setup, test_derive_key, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gck/test-gck-enumerator.c b/gck/test-gck-enumerator.c new file mode 100644 index 0000000..13ea19f --- /dev/null +++ b/gck/test-gck-enumerator.c @@ -0,0 +1,629 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-enumerator.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck/gck.h" +#include "gck/gck-mock.h" +#include "gck/gck-private.h" +#include "gck/gck-test.h" + +#include "egg/egg-testing.h" +#include "egg/mock-interaction.h" + +#include + +#include +#include +#include +#include + +typedef struct { + GList *modules; + GckModule *module; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GError *err = NULL; + + /* Successful load */ + test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_MODULE (test->module)); + g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); + + test->modules = g_list_append (NULL, g_object_ref (test->module)); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + gck_list_unref_free (test->modules); + + g_object_unref (test->module); + g_assert (test->module == NULL); + + g_thread_pool_stop_unused_threads (); +} + +static void +test_create (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GType object_type; + GckEnumerator *en; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + g_object_get (en, "object-type", &object_type, NULL); + g_assert (object_type == GCK_TYPE_OBJECT); + + g_object_unref (en); +} + +static void +test_create_slots (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GckEnumerator *en; + GList *slots; + + uri_data = gck_uri_data_new (); + slots = gck_module_get_slots (test->module, FALSE); + en = _gck_enumerator_new_for_slots (slots, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + g_object_unref (en); + gck_list_unref_free (slots); +} + +static void +test_next (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GckObject *obj; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + obj = gck_enumerator_next (en, NULL, &error); + g_assert (GCK_IS_OBJECT (obj)); + + g_object_unref (obj); + g_object_unref (en); +} + +static void +test_next_slots (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GList *slots = NULL; + GckEnumerator *en; + GckObject *obj; + + uri_data = gck_uri_data_new (); + slots = gck_module_get_slots (test->module, FALSE); + en = _gck_enumerator_new_for_slots (slots, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + obj = gck_enumerator_next (en, NULL, &error); + g_assert (GCK_IS_OBJECT (obj)); + + g_object_unref (obj); + g_object_unref (en); + gck_list_unref_free (slots); +} + +static void +test_next_and_resume (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GckObject *obj, *obj2; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + obj = gck_enumerator_next (en, NULL, &error); + g_assert_no_error (error); + g_assert (GCK_IS_OBJECT (obj)); + + obj2 = gck_enumerator_next (en, NULL, &error); + g_assert_no_error (error); + g_assert (GCK_IS_OBJECT (obj2)); + + g_assert (!gck_object_equal (obj, obj2)); + + g_object_unref (obj); + g_object_unref (obj2); + g_object_unref (en); +} + +static void +test_next_n (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GList *objects, *l; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + objects = gck_enumerator_next_n (en, -1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (objects), ==, 5); + for (l = objects; l; l = g_list_next (l)) + g_assert (GCK_IS_OBJECT (l->data)); + + gck_list_unref_free (objects); + g_object_unref (en); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_next_async (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GAsyncResult *result = NULL; + GError *error = NULL; + GckEnumerator *en; + GList *objects, *l; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + gck_enumerator_next_async (en, -1, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + + objects = gck_enumerator_next_finish (en, result, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (objects), ==, 5); + for (l = objects; l; l = g_list_next (l)) + g_assert (GCK_IS_OBJECT (l->data)); + + g_object_unref (result); + gck_list_unref_free (objects); + g_object_unref (en); +} + + +static void +test_enumerate_session (Test *test, + gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckEnumerator *en; + GError *error = NULL; + GckSession *session; + GckObject *obj; + GList *slots; + + slots = gck_module_get_slots (test->module, FALSE); + g_assert (slots != NULL && GCK_IS_SLOT (slots->data)); + + session = gck_session_open (slots->data, 0, NULL, NULL, &error); + g_assert_no_error (error); + + en = gck_session_enumerate_objects (session, gck_builder_end (&builder)); + g_assert (GCK_IS_ENUMERATOR (en)); + + obj = gck_enumerator_next (en, NULL, &error); + g_assert (GCK_IS_OBJECT (obj)); + + g_object_unref (obj); + g_object_unref (en); + g_object_unref (session); + gck_list_unref_free (slots); +} + +static void +test_attribute_match (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GList *objects; + + uri_data = gck_uri_data_new (); + gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key"); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + objects = gck_enumerator_next_n (en, -1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (objects), ==, 1); + g_assert (GCK_IS_OBJECT (objects->data)); + + gck_list_unref_free (objects); + g_object_unref (en); +} + +static void +test_authenticate_interaction (Test *test, + gconstpointer unused) +{ + GTlsInteraction *interaction; + GTlsInteraction *check; + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GckObject *obj; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en); + + interaction = mock_interaction_new ("booo"); + g_object_add_weak_pointer (G_OBJECT (interaction), (gpointer *)&interaction); + g_object_set (en, "interaction", interaction, NULL); + + check = NULL; + g_object_get (en, "interaction", &check, NULL); + g_assert (interaction == check); + g_object_unref (interaction); + g_object_unref (check); + + obj = gck_enumerator_next (en, NULL, &error); + g_assert (GCK_IS_OBJECT (obj)); + g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj); + + g_object_unref (obj); + g_object_unref (en); + + g_assert (en == NULL); + g_assert (obj == NULL); + g_assert (interaction == NULL); +} + +static gboolean +on_authenticate_token (GckModule *module, + GckSlot *slot, + gchar *label, + gchar **password, + gpointer unused) +{ + g_assert (unused == GUINT_TO_POINTER (35)); + g_assert (password != NULL); + g_assert (*password == NULL); + g_assert (GCK_IS_MODULE (module)); + g_assert (GCK_IS_SLOT (slot)); + + *password = g_strdup ("booo"); + return TRUE; +} + +static void +test_authenticate_compat (Test *test, + gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GckObject *obj; + gulong sig; + + sig = g_signal_connect (test->modules->data, "authenticate-slot", + G_CALLBACK (on_authenticate_token), GUINT_TO_POINTER (35)); + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en); + + obj = gck_enumerator_next (en, NULL, &error); + g_assert (GCK_IS_OBJECT (obj)); + g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj); + + g_object_unref (obj); + g_object_unref (en); + + g_signal_handler_disconnect (test->modules->data, sig); + + g_assert (obj == NULL); + g_assert (en == NULL); +} + +static void +test_token_match (Test *test, gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GList *objects; + + uri_data = gck_uri_data_new (); + uri_data->token_info = g_new0 (GckTokenInfo, 1); + uri_data->token_info->label = g_strdup ("Invalid token name"); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_assert (GCK_IS_ENUMERATOR (en)); + + objects = gck_enumerator_next_n (en, -1, NULL, &error); + g_assert_cmpint (g_list_length (objects), ==, 0); + g_assert (error == NULL); + + gck_list_unref_free (objects); + g_object_unref (en); +} + +enum { + PROP_0, + PROP_ATTRIBUTES, +}; + +static const gulong mock_attribute_types[] = { + CKA_CLASS, + CKA_ID, + CKA_LABEL, +}; + +typedef struct { + GckObject parent; + GckAttributes *attrs; +} MockObject; + +typedef struct { + GckObjectClass parent; +} MockObjectClass; + +GType mock_object_get_type (void) G_GNUC_CONST; +static void mock_object_cache_init (GckObjectCacheIface *iface); + +#define MOCK_TYPE_OBJECT (mock_object_get_type()) +#define MOCK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), MOCK_TYPE_OBJECT, MockObject)) +#define MOCK_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), MOCK_TYPE_OBJECT)) + +G_DEFINE_TYPE_WITH_CODE (MockObject, mock_object, GCK_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCK_TYPE_OBJECT_CACHE, + mock_object_cache_init); +); + +static void +mock_object_init (MockObject *self) +{ + +} + +static void +mock_object_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MockObject *self = (MockObject *)obj; + + switch (prop_id) { + case PROP_ATTRIBUTES: + g_value_set_boxed (value, self->attrs); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +mock_object_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MockObject *self = (MockObject *)obj; + + switch (prop_id) { + case PROP_ATTRIBUTES: + g_assert (self->attrs == NULL); + self->attrs = g_value_dup_boxed (value); + g_assert (self->attrs != NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +mock_object_finalize (GObject *obj) +{ + MockObject *self = (MockObject *)obj; + gck_attributes_unref (self->attrs); + G_OBJECT_CLASS (mock_object_parent_class)->finalize (obj); +} + +static void +mock_object_class_init (MockObjectClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = mock_object_get_property; + gobject_class->set_property = mock_object_set_property; + gobject_class->finalize = mock_object_finalize; + + g_object_class_override_property (gobject_class, PROP_ATTRIBUTES, "attributes"); +} + +static void +mock_object_fill (GckObjectCache *object, + GckAttributes *attrs) +{ + GckBuilder builder = GCK_BUILDER_INIT; + MockObject *self = MOCK_OBJECT (object); + + gck_builder_add_all (&builder, self->attrs); + gck_builder_set_all (&builder, attrs); + + gck_attributes_unref (self->attrs); + self->attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static void +mock_object_cache_init (GckObjectCacheIface *iface) +{ + iface->default_types = mock_attribute_types; + iface->n_default_types = G_N_ELEMENTS (mock_attribute_types); + iface->fill = mock_object_fill; +} + +static void +test_attribute_get (Test *test, + gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + GList *objects, *l; + MockObject *mock; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_object_set (en, "object-type", mock_object_get_type (), NULL); + + objects = gck_enumerator_next_n (en, -1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (objects), ==, 5); + + for (l = objects; l != NULL; l = g_list_next (l)) { + mock = l->data; + g_assert (G_TYPE_CHECK_INSTANCE_TYPE (mock, mock_object_get_type ())); + g_assert (mock->attrs != NULL); + } + + gck_list_unref_free (objects); + g_object_unref (en); +} + +static void +test_attribute_get_one_at_a_time (Test *test, + gconstpointer unused) +{ + GckUriData *uri_data; + GError *error = NULL; + GckEnumerator *en; + MockObject *mock; + GckObject *object; + + uri_data = gck_uri_data_new (); + en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + g_object_set (en, "object-type", mock_object_get_type (), NULL); + + for (;;) { + object = gck_enumerator_next (en, NULL, &error); + g_assert_no_error (error); + if (object == NULL) + break; + + g_assert (G_TYPE_CHECK_INSTANCE_TYPE (object, mock_object_get_type ())); + mock = (MockObject *)object; + g_assert (mock->attrs != NULL); + g_object_unref (object); + } + + g_object_unref (en); +} + +static void +test_chained (Test *test, + gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckEnumerator *one; + GckEnumerator *two; + GckEnumerator *three; + GckUriData *uri_data; + GError *error = NULL; + GList *objects; + + uri_data = gck_uri_data_new (); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + one = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + + uri_data = gck_uri_data_new (); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + two = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + gck_enumerator_set_chained (one, two); + + uri_data = gck_uri_data_new (); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + three = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); + gck_enumerator_set_chained (two, three); + + g_object_unref (two); + g_object_unref (three); + + objects = gck_enumerator_next_n (one, -1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (objects), ==, 5); + + gck_list_unref_free (objects); + g_object_unref (one); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_set_prgname ("test-gck-enumerator"); + + g_test_add ("/gck/enumerator/create", Test, NULL, setup, test_create, teardown); + g_test_add ("/gck/enumerator/create_slots", Test, NULL, setup, test_create_slots, teardown); + g_test_add ("/gck/enumerator/next", Test, NULL, setup, test_next, teardown); + g_test_add ("/gck/enumerator/next_slots", Test, NULL, setup, test_next_slots, teardown); + g_test_add ("/gck/enumerator/next_and_resume", Test, NULL, setup, test_next_and_resume, teardown); + g_test_add ("/gck/enumerator/next_n", Test, NULL, setup, test_next_n, teardown); + g_test_add ("/gck/enumerator/next_async", Test, NULL, setup, test_next_async, teardown); + g_test_add ("/gck/enumerator/session", Test, NULL, setup, test_enumerate_session, teardown); + g_test_add ("/gck/enumerator/authenticate-interaction", Test, NULL, setup, test_authenticate_interaction, teardown); + g_test_add ("/gck/enumerator/authenticate-compat", Test, NULL, setup, test_authenticate_compat, teardown); + g_test_add ("/gck/enumerator/attribute_match", Test, NULL, setup, test_attribute_match, teardown); + g_test_add ("/gck/enumerator/token_match", Test, NULL, setup, test_token_match, teardown); + g_test_add ("/gck/enumerator/attribute_get", Test, NULL, setup, test_attribute_get, teardown); + g_test_add ("/gck/enumerator/attribute_get_one_at_a_time", Test, NULL, setup, test_attribute_get_one_at_a_time, teardown); + g_test_add ("/gck/enumerator/chained", Test, NULL, setup, test_chained, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gck/test-gck-module.c b/gck/test-gck-module.c new file mode 100644 index 0000000..1b33355 --- /dev/null +++ b/gck/test-gck-module.c @@ -0,0 +1,176 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-module.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include +#include +#include + +#include "egg/egg-testing.h" + +#include "gck/gck.h" +#include "gck/gck-test.h" + +typedef struct { + GckModule *module; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GError *err = NULL; + + /* Successful load */ + test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err); + g_assert_no_error (err); + g_assert (test->module); + g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->module); + g_assert (test->module == NULL); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_initialize_async (void) +{ + GckModule *module; + GAsyncResult *result; + GError *error = NULL; + + /* Shouldn't be able to load modules */ + gck_module_initialize_async (BUILDDIR "/.libs/libmock-test-module.so", + NULL, fetch_async_result, &result); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + module = gck_module_initialize_finish (result, &error); + g_assert_no_error (error); + g_assert (GCK_IS_MODULE (module)); + + g_object_unref (result); + g_object_unref (module); +} + + +static void +test_invalid_modules (Test *test, gconstpointer unused) +{ + GckModule *invalid; + GError *error = NULL; + + /* Shouldn't be able to load modules */ + invalid = gck_module_initialize ("blah-blah-non-existant", NULL, &error); + g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM); + g_assert (invalid == NULL); + + g_clear_error (&error); + + /* Shouldn't be able to load any file successfully */ + invalid = gck_module_initialize ("/usr/lib/libm.so", NULL, &error); + g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM); + g_assert (invalid == NULL); + + g_clear_error (&error); +} + +static void +test_module_equals_hash (Test *test, gconstpointer unused) +{ + GckModule *other; + GObject *obj; + guint hash; + + hash = gck_module_hash (test->module); + g_assert (hash != 0); + + g_assert (gck_module_equal (test->module, test->module)); + + other = gck_module_new (gck_module_get_functions (test->module)); + obj = g_object_new (G_TYPE_OBJECT, NULL); + + g_assert (gck_module_equal (test->module, other)); + + /* TODO: Could do with another test for inequality */ + g_assert (!gck_module_equal (test->module, obj)); + + g_object_unref (other); + g_object_unref (obj); +} + +static void +test_module_props (Test *test, gconstpointer unused) +{ + gchar *path; + + g_object_get (test->module, "path", &path, NULL); + g_assert (path != NULL && "no module-path"); + g_assert (strcmp (BUILDDIR "/.libs/libmock-test-module.so", path) == 0 && "module path wrong"); + g_free (path); +} + +static void +test_module_info (Test *test, gconstpointer unused) +{ + GckModuleInfo *info; + + info = gck_module_get_info (test->module); + g_assert (info != NULL && "no module info"); + + g_assert (info->pkcs11_version_major == CRYPTOKI_VERSION_MAJOR && "wrong major version"); + g_assert (info->pkcs11_version_minor == CRYPTOKI_VERSION_MINOR && "wrong minor version"); + g_assert (strcmp ("TEST MANUFACTURER", info->manufacturer_id) == 0); + g_assert (strcmp ("TEST LIBRARY", info->library_description) == 0); + g_assert (0 == info->flags); + g_assert (45 == info->library_version_major); + g_assert (145 == info->library_version_minor); + + gck_module_info_free (info); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gck/module/initialize_async", test_initialize_async); + g_test_add ("/gck/module/invalid_modules", Test, NULL, setup, test_invalid_modules, teardown); + g_test_add ("/gck/module/module_equals_hash", Test, NULL, setup, test_module_equals_hash, teardown); + g_test_add ("/gck/module/module_props", Test, NULL, setup, test_module_props, teardown); + g_test_add ("/gck/module/module_info", Test, NULL, setup, test_module_info, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gck/test-gck-modules.c b/gck/test-gck-modules.c new file mode 100644 index 0000000..015c571 --- /dev/null +++ b/gck/test-gck-modules.c @@ -0,0 +1,206 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-modules.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck/gck.h" +#include "gck/gck-mock.h" +#include "gck/gck-private.h" +#include "gck/gck-test.h" + +#include "egg/egg-testing.h" + +#include + +#include +#include +#include +#include + +typedef struct { + GList *modules; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GckModule *module; + GError *err = NULL; + + /* Successful load */ + module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_MODULE (module)); + + test->modules = g_list_append (NULL, module); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + gck_list_unref_free (test->modules); + test->modules = NULL; +} + +static void +test_enumerate_objects (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GError *error = NULL; + GckEnumerator *en; + GList *objects; + + gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key"); + en = gck_modules_enumerate_objects (test->modules, gck_builder_end (&builder), 0); + g_assert (GCK_IS_ENUMERATOR (en)); + + objects = gck_enumerator_next_n (en, -1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (objects), ==, 1); + g_assert (GCK_IS_OBJECT (objects->data)); + + gck_list_unref_free (objects); + g_object_unref (en); +} + + +static void +test_token_for_uri (Test *test, gconstpointer unused) +{ + GckSlot *slot; + GError *error = NULL; + + slot = gck_modules_token_for_uri (test->modules, "pkcs11:token=TEST%20LABEL", &error); + g_assert (GCK_IS_SLOT (slot)); + + g_object_unref (slot); +} + +static void +test_token_for_uri_not_found (Test *test, gconstpointer unused) +{ + GckSlot *slot; + GError *error = NULL; + + slot = gck_modules_token_for_uri (test->modules, "pkcs11:token=UNKNOWN", &error); + g_assert (slot == NULL); + g_assert (error == NULL); +} + +static void +test_token_for_uri_error (Test *test, gconstpointer unused) +{ + GckSlot *slot; + GError *error = NULL; + + slot = gck_modules_token_for_uri (test->modules, "http://invalid.uri", &error); + g_assert (slot == NULL); + g_assert (error != NULL); + g_assert (g_error_matches (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX)); + g_error_free (error); +} + +static void +test_object_for_uri (Test *test, gconstpointer unused) +{ + GckObject *object; + GError *error = NULL; + + object = gck_modules_object_for_uri (test->modules, "pkcs11:object=Public%20Capitalize%20Key;objecttype=public", 0, &error); + g_assert (GCK_IS_OBJECT (object)); + g_object_unref (object); +} + +static void +test_object_for_uri_not_found (Test *test, gconstpointer unused) +{ + GckObject *object; + GError *error = NULL; + + object = gck_modules_object_for_uri (test->modules, "pkcs11:object=Unknown%20Label", 0, &error); + g_assert (object == NULL); + g_assert (error == NULL); +} + +static void +test_object_for_uri_error (Test *test, gconstpointer unused) +{ + GckObject *object; + GError *error = NULL; + + object = gck_modules_object_for_uri (test->modules, "http://invalid.uri", 0, &error); + g_assert (object == NULL); + g_assert (error != NULL); + g_assert (g_error_matches (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX)); + g_error_free (error); +} + +static void +test_objects_for_uri (Test *test, gconstpointer unused) +{ + GList *objects; + GError *error = NULL; + + objects = gck_modules_objects_for_uri (test->modules, "pkcs11:token=TEST%20LABEL", 0, &error); + g_assert (objects); + g_assert (!error); + g_assert_cmpint (g_list_length (objects), ==, 5); + + gck_list_unref_free (objects); +} + +static void +test_enumerate_uri (Test *test, gconstpointer unused) +{ + GckEnumerator *en; + GList *objects; + GError *error = NULL; + + en = gck_modules_enumerate_uri (test->modules, "pkcs11:token=TEST%20LABEL", 0, &error); + g_assert (GCK_IS_ENUMERATOR (en)); + g_assert (!error); + + objects = gck_enumerator_next_n (en, -1, NULL, &error); + g_assert_cmpint (g_list_length (objects), ==, 5); + g_assert (!error); + + g_object_unref (en); + gck_list_unref_free (objects); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gck/modules/enumerate_objects", Test, NULL, setup, test_enumerate_objects, teardown); + g_test_add ("/gck/modules/token_for_uri", Test, NULL, setup, test_token_for_uri, teardown); + g_test_add ("/gck/modules/token_for_uri_not_found", Test, NULL, setup, test_token_for_uri_not_found, teardown); + g_test_add ("/gck/modules/token_for_uri_error", Test, NULL, setup, test_token_for_uri_error, teardown); + g_test_add ("/gck/modules/object_for_uri", Test, NULL, setup, test_object_for_uri, teardown); + g_test_add ("/gck/modules/object_for_uri_not_found", Test, NULL, setup, test_object_for_uri_not_found, teardown); + g_test_add ("/gck/modules/object_for_uri_error", Test, NULL, setup, test_object_for_uri_error, teardown); + g_test_add ("/gck/modules/objects_for_uri", Test, NULL, setup, test_objects_for_uri, teardown); + g_test_add ("/gck/modules/enumerate_uri", Test, NULL, setup, test_enumerate_uri, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gck/test-gck-object.c b/gck/test-gck-object.c new file mode 100644 index 0000000..3f782eb --- /dev/null +++ b/gck/test-gck-object.c @@ -0,0 +1,412 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-object.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck/gck.h" +#include "gck/gck-mock.h" +#include "gck/gck-test.h" + +#include "egg/egg-testing.h" + +#include + +#include +#include +#include +#include + +typedef struct { + GckModule *module; + GckSlot *slot; + GckSession *session; + GckObject *object; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GError *err = NULL; + GList *slots; + + /* Successful load */ + test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_MODULE (test->module)); + + slots = gck_module_get_slots (test->module, TRUE); + g_assert (slots != NULL); + + test->slot = GCK_SLOT (slots->data); + g_object_ref (test->slot); + gck_list_unref_free (slots); + + test->session = gck_slot_open_session (test->slot, 0, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (test->session)); + + /* Our module always exports a token object with this */ + test->object = gck_object_from_handle (test->session, 2); + g_assert (test->object != NULL); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->object); + g_object_unref (test->session); + g_object_unref (test->slot); + g_object_unref (test->module); +} + +static void +test_object_props (Test *test, gconstpointer unused) +{ + GckSession *sess; + GckModule *mod; + CK_OBJECT_HANDLE handle; + g_object_get (test->object, "session", &sess, "module", &mod, "handle", &handle, NULL); + g_assert (test->session == sess); + g_object_unref (sess); + g_assert (test->module == mod); + g_object_unref (mod); + g_assert (handle == 2); +} + +static void +test_object_equals_hash (Test *test, gconstpointer unused) +{ + GckSlot *other_slot; + GckSession *other_session; + GckObject *other_object; + GObject *obj; + GError *err = NULL; + guint hash; + + hash = gck_object_hash (test->object); + g_assert (hash != 0); + + g_assert (gck_object_equal (test->object, test->object)); + + other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", GCK_MOCK_SLOT_TWO_ID, NULL); + other_session = gck_slot_open_session (other_slot, 0, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (other_session)); + other_object = gck_object_from_handle (other_session, gck_object_get_handle (test->object)); + g_assert (!gck_object_equal (test->object, other_object)); + g_object_unref (other_slot); + g_object_unref (other_session); + g_object_unref (other_object); + + obj = g_object_new (G_TYPE_OBJECT, NULL); + g_assert (!gck_object_equal (test->object, obj)); + g_object_unref (obj); + + other_object = gck_object_from_handle (test->session, 383838); + g_assert (!gck_object_equal (test->object, other_object)); + g_object_unref (other_object); + + other_object = gck_object_from_handle (test->session, gck_object_get_handle (test->object)); + g_assert (gck_object_equal (test->object, other_object)); + g_object_unref (other_object); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_create_object (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GAsyncResult *result = NULL; + GckAttributes *attrs; + GckObject *object; + CK_OBJECT_HANDLE last_handle; + GError *err = NULL; + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL"); + gck_builder_add_boolean (&builder, CKA_TOKEN, CK_FALSE); + gck_builder_add_data (&builder, CKA_VALUE, (const guchar *)"BLAH", 4); + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + object = gck_session_create_object (test->session, attrs, NULL, &err); + g_assert (GCK_IS_OBJECT (object)); + g_assert_no_error (err); + + last_handle = gck_object_get_handle (object); + g_object_unref (object); + + /* Using async */ + gck_session_create_object_async (test->session, attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + object = gck_session_create_object_finish (test->session, result, &err); + g_object_unref (result); + g_assert_no_error (err); + g_assert (GCK_IS_OBJECT (object)); + + g_assert (last_handle != gck_object_get_handle (object)); + g_object_unref (object); + + gck_attributes_unref (attrs); +} + +static void +test_destroy_object (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GAsyncResult *result = NULL; + GckAttributes *attrs; + GckObject *object; + GError *err = NULL; + gboolean ret; + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + gck_builder_add_string (&builder, CKA_LABEL, "TEST OBJECT"); + gck_builder_add_boolean (&builder, CKA_TOKEN, CK_TRUE); + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + /* Using simple */ + object = gck_session_create_object (test->session, attrs, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_OBJECT (object)); + + ret = gck_object_destroy (object, NULL, &err); + g_assert_no_error (err); + g_assert (ret); + g_object_unref (object); + + /* Using async */ + object = gck_session_create_object (test->session, attrs, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_OBJECT (object)); + + /* Using async */ + gck_object_destroy_async (object, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + ret = gck_object_destroy_finish (object, result, &err); + g_object_unref (result); + g_assert_no_error (err); + g_assert (ret); + g_object_unref (object); + + gck_attributes_unref (attrs); +} + +static void +test_get_attributes (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GckAttributes *attrs; + gulong attr_types[2]; + GError *err = NULL; + gulong klass; + gchar *value = NULL; + + attr_types[0] = CKA_CLASS; + attr_types[1] = CKA_LABEL; + + /* Simple */ + attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID); + g_assert_no_error (err); + if (attrs != NULL) { + g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); + g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); + g_free (value); value = NULL; + } + gck_attributes_unref (attrs); + + /* Full */ + attrs = gck_object_get_full (test->object, attr_types, G_N_ELEMENTS (attr_types), NULL, &err); + g_assert_no_error (err); + g_assert (attrs); + g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); + g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); + g_free (value); value = NULL; + gck_attributes_unref (attrs); + + /* Async */ + gck_object_get_async (test->object, attr_types, G_N_ELEMENTS (attr_types), NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + attrs = gck_object_get_finish (test->object, result, &err); + g_object_unref (result); + g_assert_no_error (err); + g_assert (attrs); + g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); + g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); + g_free (value); value = NULL; + gck_attributes_unref (attrs); +} + +static void +test_get_data_attribute (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + CK_OBJECT_CLASS_PTR klass; + gsize n_data; + GError *err = NULL; + + /* Simple */ + klass = (gulong *)gck_object_get_data (test->object, CKA_CLASS, NULL, &n_data, &err); + g_assert_no_error (err); + g_assert (klass); + g_assert (n_data == sizeof (CK_OBJECT_CLASS)); + g_assert (*klass == CKO_DATA); + g_free (klass); + + /* Full */ + klass = (gulong *)gck_object_get_data_full (test->object, CKA_CLASS, NULL, NULL, &n_data, &err); + g_assert_no_error (err); + g_assert (klass); + g_assert (n_data == sizeof (CK_OBJECT_CLASS)); + g_assert (*klass == CKO_DATA); + g_free (klass); + + /* Async */ + gck_object_get_data_async (test->object, CKA_CLASS, NULL, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + klass = (gulong *)gck_object_get_data_finish (test->object, result, &n_data, &err); + g_object_unref (result); + g_assert_no_error (err); + g_assert (klass); + g_assert (n_data == sizeof (CK_OBJECT_CLASS)); + g_assert (*klass == CKO_DATA); + g_free (klass); + +} + +static void +test_set_attributes (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GAsyncResult *result = NULL; + GckAttributes *attrs; + GError *err = NULL; + gulong klass; + gchar *value = NULL; + gboolean ret; + + gck_builder_add_ulong (&builder, CKA_CLASS, 6); + gck_builder_add_string (&builder, CKA_LABEL, "CHANGE TWO"); + + /* Full */ + ret = gck_object_set (test->object, gck_builder_end (&builder), NULL, &err); + g_assert_no_error (err); + g_assert (ret); + attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID); + g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == 6); + g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "CHANGE TWO") == 0); + g_free (value); value = NULL; + gck_attributes_unref (attrs); + + gck_builder_add_ulong (&builder, CKA_CLASS, 7); + gck_builder_add_string (&builder, CKA_LABEL, "CHANGE THREE"); + + /* Async */ + gck_object_set_async (test->object, gck_builder_end (&builder), NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + ret = gck_object_set_finish (test->object, result, &err); + g_object_unref (result); + g_assert_no_error (err); + g_assert (ret); + attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID); + g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == 7); + g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "CHANGE THREE") == 0); + g_free (value); value = NULL; + gck_attributes_unref (attrs); +} + +static void +test_find_objects (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GAsyncResult *result = NULL; + GList *objects; + GckObject *testobj; + GError *err = NULL; + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + gck_builder_add_string (&builder, CKA_LABEL, "UNIQUE LABEL"); + testobj = gck_session_create_object (test->session, gck_builder_end (&builder), NULL, &err); + g_object_unref (testobj); + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + gck_builder_add_string (&builder, CKA_LABEL, "OTHER LABEL"); + testobj = gck_session_create_object (test->session, gck_builder_end (&builder), NULL, &err); + g_object_unref (testobj); + + /* Simple, "TEST LABEL" */ + gck_builder_add_string (&builder, CKA_LABEL, "UNIQUE LABEL"); + objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err); + g_assert_no_error (err); + g_assert (g_list_length (objects) == 1); + gck_list_unref_free (objects); + + /* Full, All */ + objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err); + g_assert_no_error (err); + g_assert (g_list_length (objects) > 1); + gck_list_unref_free (objects); + + /* Async, None */ + gck_builder_add_string (&builder, CKA_LABEL, "blah blah"); + gck_session_find_objects_async (test->session, gck_builder_end (&builder), NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + objects = gck_session_find_objects_finish (test->session, result, &err); + g_object_unref (result); + g_assert (objects == NULL); + gck_list_unref_free (objects); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gck/object/object_props", Test, NULL, setup, test_object_props, teardown); + g_test_add ("/gck/object/object_equals_hash", Test, NULL, setup, test_object_equals_hash, teardown); + g_test_add ("/gck/object/create_object", Test, NULL, setup, test_create_object, teardown); + g_test_add ("/gck/object/destroy_object", Test, NULL, setup, test_destroy_object, teardown); + g_test_add ("/gck/object/get_attributes", Test, NULL, setup, test_get_attributes, teardown); + g_test_add ("/gck/object/get_data_attribute", Test, NULL, setup, test_get_data_attribute, teardown); + g_test_add ("/gck/object/set_attributes", Test, NULL, setup, test_set_attributes, teardown); + g_test_add ("/gck/object/find_objects", Test, NULL, setup, test_find_objects, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gck/test-gck-session.c b/gck/test-gck-session.c new file mode 100644 index 0000000..6cd4c97 --- /dev/null +++ b/gck/test-gck-session.c @@ -0,0 +1,519 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-session.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck/gck.h" +#include "gck/gck-test.h" + +#include "egg/egg-testing.h" +#include "egg/mock-interaction.h" + +#include + +#include +#include +#include +#include + +typedef struct { + GckModule *module; + GckSlot *slot; + GckSession *session; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GError *err = NULL; + GList *slots; + + /* Successful load */ + test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_MODULE (test->module)); + g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); + + slots = gck_module_get_slots (test->module, TRUE); + g_assert (slots != NULL); + + test->slot = GCK_SLOT (slots->data); + g_object_ref (test->slot); + gck_list_unref_free (slots); + g_object_add_weak_pointer (G_OBJECT (test->slot), (gpointer *)&test->slot); + + test->session = gck_slot_open_session (test->slot, 0, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (test->session)); + g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->session); + g_object_unref (test->slot); + g_object_unref (test->module); + + g_assert (test->session == NULL); + g_assert (test->slot == NULL); + g_assert (test->module == NULL); +} + +static void +test_session_props (Test *test, gconstpointer unused) +{ + GckModule *mod; + GckSlot *sl; + gulong handle; + + g_object_get (test->session, "module", &mod, "handle", &handle, "slot", &sl, NULL); + g_assert (mod == test->module); + g_assert (sl == test->slot); + g_object_unref (mod); + g_object_unref (sl); + + g_assert (handle != 0); + g_assert (gck_session_get_handle (test->session) == handle); +} + +static void +test_session_info (Test *test, gconstpointer unused) +{ + GckSessionInfo *info; + + info = gck_session_get_info (test->session); + g_assert (info != NULL && "no session info"); + + g_assert (info->slot_id == gck_slot_get_handle (test->slot)); + g_assert ((info->flags & CKF_SERIAL_SESSION) == CKF_SERIAL_SESSION); + g_assert (info->device_error == 1414); + gck_session_info_free (info); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_open_close_session (Test *test, gconstpointer unused) +{ + GckSession *sess; + GAsyncResult *result = NULL; + GError *err = NULL; + + sess = gck_slot_open_session (test->slot, 0, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (sess)); + + g_object_unref (sess); + + /* Test opening async */ + gck_slot_open_session_async (test->slot, 0, NULL, fetch_async_result, &result); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + g_object_add_weak_pointer (G_OBJECT (result), (gpointer *)&result); + sess = gck_slot_open_session_finish (test->slot, result, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (sess)); + g_object_add_weak_pointer (G_OBJECT (sess), (gpointer *)&sess); + + g_object_unref (result); + g_assert (result == NULL); + + g_object_unref (sess); + g_assert (sess == NULL); +} + +static void +test_session_initable (Test *test, + gconstpointer unused) +{ + GckSession *sess; + GAsyncResult *result = NULL; + GError *err = NULL; + + sess = gck_session_open (test->slot, 0, NULL, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (sess)); + + g_object_unref (sess); + + /* Test opening async */ + gck_session_open_async (test->slot, 0, NULL, NULL, fetch_async_result, &result); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + sess = gck_session_open_finish (result, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (sess)); + + g_object_unref (result); + g_object_unref (sess); +} + +static void +test_session_already (Test *test, + gconstpointer unused) +{ + CK_FUNCTION_LIST_PTR funcs; + gulong handle; + GckSession *session; + GAsyncResult *result = NULL; + GError *error = NULL; + GObject *source; + CK_RV rv; + + funcs = gck_module_get_functions (test->module); + g_assert (funcs != NULL); + + rv = funcs->C_OpenSession (gck_slot_get_handle (test->slot), CKF_SERIAL_SESSION, + NULL, NULL, &handle); + gck_assert_cmprv (rv, ==, CKR_OK); + g_assert (handle != 0); + + session = g_initable_new (GCK_TYPE_SESSION, NULL, &error, + "slot", test->slot, + "handle", handle, + NULL); + + g_assert_no_error (error); + g_assert (GCK_IS_SESSION (session)); + gck_assert_cmpulong (handle, ==, gck_session_get_handle (session)); + g_object_unref (session); + + rv = funcs->C_OpenSession (gck_slot_get_handle (test->slot), CKF_SERIAL_SESSION, + NULL, NULL, &handle); + gck_assert_cmprv (rv, ==, CKR_OK); + g_assert (handle != 0); + + /* Test opening async */ + g_async_initable_new_async (GCK_TYPE_SESSION, G_PRIORITY_DEFAULT, NULL, + fetch_async_result, &result, + "slot", test->slot, + "handle", handle, + NULL); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + source = g_async_result_get_source_object (result); + session = GCK_SESSION (g_async_initable_new_finish (G_ASYNC_INITABLE (source), result, &error)); + g_object_unref (source); + g_assert_no_error (error); + g_assert (GCK_IS_SESSION (session)); + gck_assert_cmpulong (handle, ==, gck_session_get_handle (session)); + + g_object_unref (result); + g_object_unref (session); +} + +static void +test_open_interaction (Test *test, + gconstpointer unused) +{ + GckSession *sess; + GAsyncResult *result = NULL; + GError *err = NULL; + GTlsInteraction *interaction; + + interaction = mock_interaction_new ("booo"); + + sess = gck_session_open (test->slot, GCK_SESSION_LOGIN_USER, interaction, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (sess)); + + g_object_unref (sess); + + /* Test opening async */ + gck_session_open_async (test->slot, GCK_SESSION_LOGIN_USER, interaction, NULL, fetch_async_result, &result); + + egg_test_wait_until (500); + g_assert (result != NULL); + + /* Get the result */ + sess = gck_session_open_finish (result, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (sess)); + + g_object_unref (interaction); + g_object_unref (result); + g_object_unref (sess); + +} + +static void +test_init_set_pin (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GError *err = NULL; + gboolean ret; + + /* init pin */ + ret = gck_session_init_pin (test->session, (guchar*)"booo", 4, NULL, &err); + g_assert_no_error (err); + g_assert (ret); + + /* set pin */ + ret = gck_session_set_pin (test->session, (guchar*)"booo", 4, (guchar*)"tooo", 4, NULL, &err); + g_assert_no_error (err); + g_assert (ret); + + /* init pin async */ + gck_session_init_pin_async (test->session, (guchar*)"booo", 4, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + ret = gck_session_init_pin_finish (test->session, result, &err); + g_assert_no_error (err); + g_assert (ret); + g_object_unref (result); + result = NULL; + + /* set pin async */ + gck_session_set_pin_async (test->session, (guchar*)"booo", 4, (guchar*)"tooo", 4, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + ret = gck_session_set_pin_finish (test->session, result, &err); + g_assert_no_error (err); + g_assert (ret); + g_object_unref (result); + result = NULL; +} + +static void +test_login_logout (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GError *err = NULL; + gboolean ret; + gulong state; + + /* login/logout */ + ret = gck_session_login (test->session, CKU_USER, (guchar*)"booo", 4, NULL, &err); + g_assert_no_error (err); + g_assert (ret); + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS); + + ret = gck_session_logout (test->session, NULL, &err); + g_assert_no_error (err); + g_assert (ret); + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); + + /* login async */ + gck_session_login_async (test->session, CKU_USER, (guchar*)"booo", 4, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + ret = gck_session_login_finish (test->session, result, &err); + g_assert_no_error (err); + g_assert (ret); + + g_object_unref (result); + result = NULL; + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS); + + /* logout async */ + gck_session_logout_async (test->session, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + ret = gck_session_logout_finish (test->session, result, &err); + g_assert_no_error (err); + g_assert (ret); + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); + + g_object_unref (result); + result = NULL; +} + +static void +test_login_interactive (Test *test, + gconstpointer unused) +{ + GAsyncResult *result = NULL; + GError *error = NULL; + gboolean ret; + gulong state; + GTlsInteraction *interaction; + + interaction = mock_interaction_new ("booo"); + + /* login/logout */ + ret = gck_session_login_interactive (test->session, CKU_USER, interaction, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS); + + ret = gck_session_logout (test->session, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); + + /* login async */ + gck_session_login_interactive_async (test->session, CKU_USER, interaction, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + + ret = gck_session_login_interactive_finish (test->session, result, &error); + g_assert_no_error (error); + g_assert (ret); + + g_object_unref (result); + result = NULL; + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS); + + ret = gck_session_logout (test->session, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + + state = gck_session_get_state (test->session); + gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); + + g_object_unref (interaction); +} + +static gboolean +authenticate_token (GckModule *module, GckSlot *slot, gchar *label, gchar **password, gpointer unused) +{ + g_assert (unused == GUINT_TO_POINTER (35)); + g_assert (password != NULL); + g_assert (*password == NULL); + g_assert (GCK_IS_MODULE (module)); + g_assert (GCK_IS_SLOT (slot)); + + *password = g_strdup ("booo"); + return TRUE; +} + +static void +test_auto_login (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckObject *object; + GckSession *new_session; + GAsyncResult *result = NULL; + GError *err = NULL; + GckAttributes *attrs; + gboolean ret; + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + gck_builder_add_string (&builder, CKA_LABEL, "TEST OBJECT"); + gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE); + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + /* Try to do something that requires a login */ + object = gck_session_create_object (test->session, attrs, NULL, &err); + g_assert (!object); + g_assert (err && err->code == CKR_USER_NOT_LOGGED_IN); + g_clear_error (&err); + + /* Setup for auto login */ + g_signal_connect (test->module, "authenticate-slot", G_CALLBACK (authenticate_token), GUINT_TO_POINTER (35)); + new_session = gck_slot_open_session (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (new_session)); + + /* Try again to do something that requires a login */ + object = gck_session_create_object (new_session, attrs, NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_OBJECT (object)); + g_object_unref (object); + + /* We should now be logged in, try to log out */ + ret = gck_session_logout (new_session, NULL, &err); + g_assert_no_error (err); + g_assert (ret); + + g_object_unref (new_session); + + /* Now try the same thing, but asyncronously */ + gck_slot_open_session_async (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + new_session = gck_slot_open_session_finish (test->slot, result, &err); + g_assert_no_error (err); + g_assert (GCK_IS_SESSION (new_session)); + g_object_unref (result); + + result = NULL; + gck_session_create_object_async (new_session, attrs, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result != NULL); + object = gck_session_create_object_finish (new_session, result, &err); + g_assert_no_error (err); + g_assert (GCK_IS_OBJECT (object)); + g_object_unref (result); + g_object_unref (object); + + /* We should now be logged in, try to log out */ + ret = gck_session_logout (new_session, NULL, &err); + g_assert_no_error (err); + g_assert (ret); + + gck_attributes_unref (attrs); + g_object_unref (new_session); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_set_prgname ("test-gck-session"); + + g_test_add ("/gck/session/session_props", Test, NULL, setup, test_session_props, teardown); + g_test_add ("/gck/session/session_info", Test, NULL, setup, test_session_info, teardown); + g_test_add ("/gck/session/open_close_session", Test, NULL, setup, test_open_close_session, teardown); + g_test_add ("/gck/session/open_initable", Test, NULL, setup, test_session_initable, teardown); + g_test_add ("/gck/session/open_already", Test, NULL, setup, test_session_already, teardown); + g_test_add ("/gck/session/open_interaction", Test, NULL, setup, test_open_interaction, teardown); + g_test_add ("/gck/session/init_set_pin", Test, NULL, setup, test_init_set_pin, teardown); + g_test_add ("/gck/session/login_logout", Test, NULL, setup, test_login_logout, teardown); + g_test_add ("/gck/session/login_interactive", Test, NULL, setup, test_login_interactive, teardown); + g_test_add ("/gck/session/auto_login", Test, NULL, setup, test_auto_login, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gck/test-gck-slot.c b/gck/test-gck-slot.c new file mode 100644 index 0000000..b8bcecf --- /dev/null +++ b/gck/test-gck-slot.c @@ -0,0 +1,255 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-slot.c - the GObject PKCS#11 wrapper library + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include +#include +#include + +#include "gck/gck.h" +#include "gck/gck-private.h" +#include "gck/gck-test.h" + +typedef struct { + GckModule *module; + GckSlot *slot; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GError *err = NULL; + GList *slots; + + /* Successful load */ + test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err); + g_assert_no_error (err); + g_assert (GCK_IS_MODULE (test->module)); + + slots = gck_module_get_slots (test->module, TRUE); + g_assert (slots != NULL); + + test->slot = GCK_SLOT (slots->data); + g_object_ref (test->slot); + gck_list_unref_free (slots); + +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->slot); + g_object_unref (test->module); +} + +static void +test_slot_info (Test *test, gconstpointer unused) +{ + GckSlotInfo *info; + GckTokenInfo *token; + GList *slots, *l; + + slots = gck_module_get_slots (test->module, FALSE); + g_assert (2 == g_list_length (slots) && "wrong number of slots returned"); + g_assert (GCK_IS_SLOT (slots->data) && "missing slot one"); + g_assert (GCK_IS_SLOT (slots->next->data) && "missing slot two"); + + for (l = slots; l; l = g_list_next (l)) { + info = gck_slot_get_info (GCK_SLOT (l->data)); + g_assert (info != NULL && "no slot info"); + + g_assert (strcmp("TEST MANUFACTURER", info->manufacturer_id) == 0); + g_assert (strcmp("TEST SLOT", info->slot_description) == 0); + g_assert (55 == info->hardware_version_major); + g_assert (155 == info->hardware_version_minor); + g_assert (65 == info->firmware_version_major); + g_assert (165 == info->firmware_version_minor); + + if (info->flags & CKF_TOKEN_PRESENT) { + token = gck_slot_get_token_info (test->slot); + g_assert (token != NULL && "no token info"); + + g_assert (strcmp ("TEST MANUFACTURER", token->manufacturer_id) == 0); + g_assert (strcmp ("TEST LABEL", token->label) == 0); + g_assert (strcmp ("TEST MODEL", token->model) == 0); + g_assert (strcmp ("TEST SERIAL", token->serial_number) == 0); + g_assert (1 == token->max_session_count); + g_assert (2 == token->session_count); + g_assert (3 == token->max_rw_session_count); + g_assert (4 == token->rw_session_count); + g_assert (5 == token->max_pin_len); + g_assert (6 == token->min_pin_len); + g_assert (7 == token->total_public_memory); + g_assert (8 == token->free_public_memory); + g_assert (9 == token->total_private_memory); + g_assert (10 == token->free_private_memory); + g_assert (75 == token->hardware_version_major); + g_assert (175 == token->hardware_version_minor); + g_assert (85 == token->firmware_version_major); + g_assert (185 == token->firmware_version_minor); + g_assert (927623999 == token->utc_time); + + gck_token_info_free (token); + } + + gck_slot_info_free (info); + } + + gck_list_unref_free (slots); +} + +static void +test_slot_props (Test *test, gconstpointer unused) +{ + GckModule *mod; + CK_SLOT_ID slot_id; + + g_object_get (test->slot, "module", &mod, "handle", &slot_id, NULL); + g_assert (mod == test->module); + g_assert (slot_id == 52); + + g_object_unref (mod); +} + +static void +test_slot_equals_hash (Test *test, gconstpointer unused) +{ + GckModule *other_mod; + GckSlot *other_slot; + GObject *obj; + guint hash; + + hash = gck_slot_hash (test->slot); + g_assert (hash != 0); + + g_assert (gck_slot_equal (test->slot, test->slot)); + + other_mod = gck_module_new (gck_module_get_functions (test->module)); + other_slot = g_object_new (GCK_TYPE_SLOT, "module", other_mod, "handle", gck_slot_get_handle (test->slot), NULL); + g_assert (gck_slot_equal (test->slot, other_slot)); + g_object_unref (other_mod); + g_object_unref (other_slot); + + obj = g_object_new (G_TYPE_OBJECT, NULL); + g_assert (!gck_slot_equal (test->slot, obj)); + g_object_unref (obj); + + other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", 8909, NULL); + g_assert (!gck_slot_equal (test->slot, other_slot)); + g_object_unref (other_slot); +} + +static void +test_slot_mechanisms (Test *test, gconstpointer unused) +{ + GArray *mechs; + GckMechanismInfo *info; + guint i; + + mechs = gck_slot_get_mechanisms (test->slot); + g_assert (2 == gck_mechanisms_length (mechs) && "wrong number of mech types returned"); + + for (i = 0; i < gck_mechanisms_length (mechs); ++i) { + + info = gck_slot_get_mechanism_info (test->slot, gck_mechanisms_at (mechs, i)); + g_assert (info != NULL && "no mech info returned"); + + gck_mechanism_info_free (info); + } + + gck_mechanisms_free (mechs); +} + +static void +test_token_info_match_null (Test *test, gconstpointer unused) +{ + GckTokenInfo *match; + GckTokenInfo *token; + gboolean ret; + + token = gck_slot_get_token_info (test->slot); + match = g_new0 (GckTokenInfo, 1); + + /* Should match, since no fields are set */ + ret = _gck_token_info_match (match, token); + g_assert (ret); + + gck_token_info_free (match); + gck_token_info_free (token); +} + +static void +test_token_info_match_label (Test *test, gconstpointer unused) +{ + GckTokenInfo *match; + GckTokenInfo *token; + gboolean ret; + + token = gck_slot_get_token_info (test->slot); + match = g_new0 (GckTokenInfo, 1); + + /* Should match since the label and serial are matching */ + match->label = g_strdup (token->label); + match->serial_number = g_strdup (token->serial_number); + ret = _gck_token_info_match (match, token); + g_assert (ret); + + gck_token_info_free (match); + gck_token_info_free (token); +} + +static void +test_token_info_match_different (Test *test, gconstpointer unused) +{ + GckTokenInfo *match; + GckTokenInfo *token; + gboolean ret; + + token = gck_slot_get_token_info (test->slot); + match = g_new0 (GckTokenInfo, 1); + + /* Should not match since serial is different */ + match->label = g_strdup (token->label); + match->serial_number = g_strdup ("393939393939393"); + ret = _gck_token_info_match (match, token); + g_assert (!ret); + + gck_token_info_free (match); + gck_token_info_free (token); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gck/slot/slot_info", Test, NULL, setup, test_slot_info, teardown); + g_test_add ("/gck/slot/slot_props", Test, NULL, setup, test_slot_props, teardown); + g_test_add ("/gck/slot/slot_equals_hash", Test, NULL, setup, test_slot_equals_hash, teardown); + g_test_add ("/gck/slot/slot_mechanisms", Test, NULL, setup, test_slot_mechanisms, teardown); + g_test_add ("/gck/slot/token_info_match_null", Test, NULL, setup, test_token_info_match_null, teardown); + g_test_add ("/gck/slot/token_info_match_label", Test, NULL, setup, test_token_info_match_label, teardown); + g_test_add ("/gck/slot/token_info_match_different", Test, NULL, setup, test_token_info_match_different, teardown); + + return g_test_run (); +} diff --git a/gck/test-gck-uri.c b/gck/test-gck-uri.c new file mode 100644 index 0000000..17ccc66 --- /dev/null +++ b/gck/test-gck-uri.c @@ -0,0 +1,560 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-gck-uri.c: Test routines for PKCS#11 URIs + + Copyright (C) 2011, Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gck/gck.h" +#include "gck/gck-private.h" +#include "gck/gck-test.h" + +#include + +#include +#include + +static void +test_parse (void) +{ + GError *error = NULL; + GckUriData *uri_data; + + uri_data = gck_uri_parse ("pkcs11:", GCK_URI_FOR_MODULE, &error); + g_assert (uri_data != NULL); + g_assert_no_error (error); + + g_assert (uri_data->attributes == NULL); + g_assert (uri_data->token_info == NULL); + + g_assert (uri_data->module_info != NULL); + g_assert (uri_data->module_info->library_description == NULL); + g_assert (uri_data->module_info->manufacturer_id == NULL); + + gck_uri_data_free (uri_data); +} + +static void +test_parse_bad_scheme (void) +{ + GError *error = NULL; + GckUriData *uri_data; + + uri_data = gck_uri_parse ("http:\\example.com\test", GCK_URI_FOR_ANY, &error); + g_assert (uri_data == NULL); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX); + g_error_free (error); +} + +static void +test_parse_with_label (void) +{ + GError *error = NULL; + GckUriData *uri_data; + gchar *value; + + uri_data = gck_uri_parse ("pkcs11:object=Test%20Label", GCK_URI_FOR_ANY, &error); + g_assert (uri_data != NULL); + g_assert (uri_data->attributes != NULL); + + if (!gck_attributes_find_string (uri_data->attributes, CKA_LABEL, &value)) + g_assert_not_reached (); + + g_assert_cmpstr (value, ==, "Test Label"); + g_free (value); + + gck_uri_data_free (uri_data); +} + +static void +test_parse_with_label_and_klass (void) +{ + GError *error = NULL; + GckUriData *uri_data; + gchar *value; + gulong klass; + + uri_data = gck_uri_parse ("pkcs11:object=Test%20Label;objecttype=cert", GCK_URI_FOR_ANY, &error); + g_assert (uri_data); + g_assert (uri_data->attributes); + + if (!gck_attributes_find_string (uri_data->attributes, CKA_LABEL, &value)) + g_assert_not_reached (); + + if (!gck_attributes_find_ulong (uri_data->attributes, CKA_CLASS, &klass)) + g_assert_not_reached (); + + g_assert_cmpstr (value, ==, "Test Label"); + g_assert (klass == CKO_CERTIFICATE); + g_free (value); + + gck_uri_data_free (uri_data); +} + +static void +test_parse_with_id (void) +{ + GError *error = NULL; + const GckAttribute *attr; + GckUriData *uri_data; + + uri_data = gck_uri_parse ("pkcs11:id=%54%45%53%54%00", GCK_URI_FOR_OBJECT, &error); + g_assert (uri_data != NULL); + g_assert (uri_data->attributes != NULL); + + attr = gck_attributes_find (uri_data->attributes, CKA_ID); + g_assert (attr); + g_assert (attr->value); + g_assert (attr->length == 5); + g_assert (memcmp (attr->value, "TEST", 5) == 0); + + gck_uri_data_free (uri_data); +} + +static void +test_parse_with_bad_string_encoding (void) +{ + GError *error = NULL; + GckUriData *uri_data; + + uri_data = gck_uri_parse ("pkcs11:object=Test%", GCK_URI_FOR_OBJECT, &error); + g_assert (uri_data == NULL); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); + g_error_free (error); +} + +static void +test_parse_with_bad_binary_encoding (void) +{ + GError *error = NULL; + GckUriData *uri_data; + uri_data = gck_uri_parse ("pkcs11:id=%%", GCK_URI_FOR_ANY, &error); + g_assert (!uri_data); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); + g_error_free (error); +} + +static void +test_parse_with_token (void) +{ + GError *error = NULL; + GckUriData *uri_data = NULL; + + uri_data = gck_uri_parse ("pkcs11:token=Token%20Label;serial=3333;model=Deluxe;manufacturer=Me", + GCK_URI_FOR_TOKEN, &error); + + g_assert (uri_data); + g_assert (uri_data->token_info); + g_assert_cmpstr (uri_data->token_info->label, ==, "Token Label"); + g_assert_cmpstr (uri_data->token_info->serial_number, ==, "3333"); + g_assert_cmpstr (uri_data->token_info->model, ==, "Deluxe"); + g_assert_cmpstr (uri_data->token_info->manufacturer_id, ==, "Me"); + gck_uri_data_free (uri_data); +} + +static void +test_parse_with_token_bad_encoding (void) +{ + GError *error = NULL; + GckUriData *uri_data; + + uri_data = gck_uri_parse ("pkcs11:token=Token%", GCK_URI_FOR_TOKEN, &error); + g_assert (!uri_data); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); + g_error_free (error); +} + +static void +test_parse_with_bad_syntax (void) +{ + GError *error = NULL; + GckUriData *uri_data; + + uri_data = gck_uri_parse ("pkcs11:token", GCK_URI_FOR_ANY, &error); + g_assert (uri_data == NULL); + g_assert (g_error_matches (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX)); + g_error_free (error); +} + +static void +test_parse_with_library (void) +{ + GError *error = NULL; + GckUriData *uri_data = NULL; + + uri_data = gck_uri_parse ("pkcs11:library-description=The%20Library;library-manufacturer=Me", + GCK_URI_FOR_MODULE, &error); + + g_assert (uri_data); + g_assert (uri_data->module_info); + g_assert_cmpstr (uri_data->module_info->manufacturer_id, ==, "Me"); + g_assert_cmpstr (uri_data->module_info->library_description, ==, "The Library"); + gck_uri_data_free (uri_data); +} + +static void +test_parse_with_library_bad_encoding (void) +{ + GError *error = NULL; + GckUriData *uri_data; + + uri_data = gck_uri_parse ("pkcs11:library-description=Library%", GCK_URI_FOR_MODULE, &error); + g_assert (!uri_data); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); + g_error_free (error); +} + +static void +test_build_empty (void) +{ + GckUriData uri_data; + gchar *uri; + + memset (&uri_data, 0, sizeof (uri_data)); + uri = gck_uri_build (&uri_data, 0); + g_assert_cmpstr (uri, ==, "pkcs11:"); + g_free (uri); +} + +static void +test_build_with_token_info (void) +{ + gchar *uri = NULL; + GckUriData uri_data; + GckUriData *check; + + memset (&uri_data, 0, sizeof (uri_data)); + uri_data.token_info = g_new0 (GckTokenInfo, 1); + uri_data.token_info->label = g_strdup ("The Label"); + uri_data.token_info->serial_number = g_strdup ("44444"); + uri_data.token_info->manufacturer_id = g_strdup ("Me"); + uri_data.token_info->model = g_strdup ("Deluxe"); + + uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); + g_assert (uri); + + check = gck_uri_parse (uri, GCK_URI_FOR_TOKEN, NULL); + g_assert (check); + g_assert (check->token_info); + + g_assert (_gck_token_info_match (uri_data.token_info, check->token_info)); + + gck_token_info_free (uri_data.token_info); + gck_uri_data_free (check); + + g_assert (g_str_has_prefix (uri, "pkcs11:")); + g_assert (strstr (uri, "token=The%20Label")); + g_assert (strstr (uri, "serial=44444")); + g_assert (strstr (uri, "manufacturer=Me")); + g_assert (strstr (uri, "model=Deluxe")); + + g_free (uri); +} + +static void +test_build_with_token_null_info (void) +{ + gchar *uri = NULL; + GckUriData uri_data; + + memset (&uri_data, 0, sizeof (uri_data)); + uri_data.token_info = g_new0 (GckTokenInfo, 1); + uri_data.token_info->label = g_strdup ("The Label"); + + uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); + g_assert (uri); + + g_assert (g_str_has_prefix (uri, "pkcs11:")); + g_assert (strstr (uri, "token=The%20Label")); + g_assert (!strstr (uri, "serial=")); + + gck_token_info_free (uri_data.token_info); + g_free (uri); +} + +static void +test_build_with_token_empty_info (void) +{ + gchar *uri = NULL; + GckUriData uri_data; + + memset (&uri_data, 0, sizeof (uri_data)); + uri_data.token_info = g_new0 (GckTokenInfo, 1); + uri_data.token_info->label = g_strdup ("The Label"); + uri_data.token_info->serial_number = g_strdup (""); + + uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); + g_assert (uri); + + g_assert (g_str_has_prefix (uri, "pkcs11:")); + g_assert (strstr (uri, "token=The%20Label")); + g_assert (strstr (uri, "serial=")); + + gck_token_info_free (uri_data.token_info); + g_free (uri); +} + +static void +test_build_with_attributes (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + gchar *uri = NULL; + GckUriData uri_data; + GckUriData *check; + gchar *string; + gulong value; + const GckAttribute *attr; + + memset (&uri_data, 0, sizeof (uri_data)); + gck_builder_add_string (&builder, CKA_LABEL, "The Label"); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); + gck_builder_add_data (&builder, CKA_ID, (const guchar *)"TEST", 5); + uri_data.attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + + uri = gck_uri_build (&uri_data, GCK_URI_FOR_OBJECT); + g_assert (uri); + + gck_attributes_unref (uri_data.attributes); + + check = gck_uri_parse (uri, GCK_URI_FOR_ANY, NULL); + g_assert (check); + g_assert (check->attributes); + + if (!gck_attributes_find_string (check->attributes, CKA_LABEL, &string)) + g_assert_not_reached (); + g_assert_cmpstr (string, ==, "The Label"); + g_free (string); + + if (!gck_attributes_find_ulong (check->attributes, CKA_CLASS, &value)) + g_assert_not_reached (); + g_assert (value == CKO_DATA); + + attr = gck_attributes_find (check->attributes, CKA_ID); + g_assert (attr); + g_assert (attr->length == 5); + g_assert (memcmp (attr->value, "TEST", 5) == 0); + + gck_uri_data_free (check); + + g_assert (g_str_has_prefix (uri, "pkcs11:")); + g_assert (strstr (uri, "object=The%20Label")); + g_assert (strstr (uri, "object-type=data") || strstr (uri, "type=data")); + g_assert (strstr (uri, "id=%54%45%53%54%00") || strstr (uri, "id=TEST%00")); + + g_free (uri); +} + +static void +test_parse_private_key (void) +{ + GckUriData *uri_data; + GError *error = NULL; + gulong klass; + + uri_data = gck_uri_parse ("pkcs11:objecttype=private", GCK_URI_FOR_OBJECT, &error); + g_assert (uri_data); + g_assert_no_error (error); + + g_assert (uri_data->attributes); + if (!gck_attributes_find_ulong (uri_data->attributes, CKA_CLASS, &klass)) + g_assert_not_reached (); + gck_assert_cmpulong (klass, ==, CKO_PRIVATE_KEY); + + gck_uri_data_free (uri_data); +} + +static void +test_parse_secret_key (void) +{ + GckUriData *uri_data; + GError *error = NULL; + gulong klass; + + uri_data = gck_uri_parse ("pkcs11:objecttype=secretkey", GCK_URI_FOR_OBJECT, &error); + g_assert (uri_data); + g_assert_no_error (error); + + g_assert (uri_data->attributes); + if (!gck_attributes_find_ulong (uri_data->attributes, CKA_CLASS, &klass)) + g_assert_not_reached (); + gck_assert_cmpulong (klass, ==, CKO_SECRET_KEY); + + gck_uri_data_free (uri_data); +} + + +static void +test_parse_unknown_objecttype (void) +{ + GckUriData *uri_data; + GError *error = NULL; + gulong klass; + + uri_data = gck_uri_parse ("pkcs11:objecttype=unknown", GCK_URI_FOR_OBJECT, &error); + g_assert (uri_data); + g_assert_no_error (error); + + g_assert (uri_data->attributes); + g_assert (uri_data->any_unrecognized == TRUE); + if (gck_attributes_find_ulong (uri_data->attributes, CKA_CLASS, &klass)) + g_assert_not_reached (); + + gck_uri_data_free (uri_data); +} + +static void +test_build_objecttype_cert (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckUriData *uri_data; + gchar *uri; + + uri_data = gck_uri_data_new (); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + + uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + g_assert (uri); + g_assert (strstr (uri, "object-type=cert") || strstr (uri, "type=cert")); + + gck_uri_data_free (uri_data); + g_free (uri); +} + +static void +test_build_objecttype_private (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckUriData *uri_data; + gchar *uri; + + uri_data = gck_uri_data_new (); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + + uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + g_assert (uri); + g_assert (strstr (uri, "object-type=private") || strstr (uri, "type=private")); + + gck_uri_data_free (uri_data); + g_free (uri); +} + +static void +test_build_objecttype_public (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckUriData *uri_data; + gchar *uri; + + uri_data = gck_uri_data_new (); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + + uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + g_assert (uri); + g_assert (strstr (uri, "object-type=public") || strstr (uri, "type=public")); + + gck_uri_data_free (uri_data); + g_free (uri); +} + +static void +test_build_objecttype_secret (void) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckUriData *uri_data; + gchar *uri; + + uri_data = gck_uri_data_new (); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY); + uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + + uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + g_assert (uri); + g_assert (strstr (uri, "object-type=secret-key") || strstr (uri, "type=secret-key")); + + gck_uri_data_free (uri_data); + g_free (uri); +} + +static void +test_build_with_library (void) +{ + GckUriData *uri_data; + gchar *uri; + + uri_data = gck_uri_data_new (); + uri_data->module_info = g_new0 (GckModuleInfo, 1); + uri_data->module_info->library_description = g_strdup ("The Description"); + + uri = gck_uri_build (uri_data, GCK_URI_FOR_MODULE); + g_assert (uri); + g_assert (strstr (uri, "library-description=The%20Description")); + + gck_uri_data_free (uri_data); + g_free (uri); +} + + +static void +null_log_handler (const gchar *log_domain, GLogLevelFlags log_level, + const gchar *message, gpointer user_data) +{ + +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + /* Suppress these messages in tests */ + g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, + null_log_handler, NULL); + + g_test_add_func ("/gck/uri/parse", test_parse); + g_test_add_func ("/gck/uri/parse_bad_scheme", test_parse_bad_scheme); + g_test_add_func ("/gck/uri/parse_with_label", test_parse_with_label); + g_test_add_func ("/gck/uri/parse_with_label_and_klass", test_parse_with_label_and_klass); + g_test_add_func ("/gck/uri/parse_with_id", test_parse_with_id); + g_test_add_func ("/gck/uri/parse_with_bad_string_encoding", test_parse_with_bad_string_encoding); + g_test_add_func ("/gck/uri/parse_with_bad_binary_encoding", test_parse_with_bad_binary_encoding); + g_test_add_func ("/gck/uri/parse_with_token", test_parse_with_token); + g_test_add_func ("/gck/uri/parse_with_token_bad_encoding", test_parse_with_token_bad_encoding); + g_test_add_func ("/gck/uri/parse_with_bad_syntax", test_parse_with_bad_syntax); + g_test_add_func ("/gck/uri/parse_with_library", test_parse_with_library); + g_test_add_func ("/gck/uri/parse_with_library_bad_encoding", test_parse_with_library_bad_encoding); + g_test_add_func ("/gck/uri/build_empty", test_build_empty); + g_test_add_func ("/gck/uri/build_with_token_info", test_build_with_token_info); + g_test_add_func ("/gck/uri/build_with_token_null_info", test_build_with_token_null_info); + g_test_add_func ("/gck/uri/build_with_token_empty_info", test_build_with_token_empty_info); + g_test_add_func ("/gck/uri/build_with_attributes", test_build_with_attributes); + g_test_add_func ("/gck/uri/parse_private_key", test_parse_private_key); + g_test_add_func ("/gck/uri/parse_secret_key", test_parse_secret_key); + g_test_add_func ("/gck/uri/parse_unknown_objecttype", test_parse_unknown_objecttype); + g_test_add_func ("/gck/uri/build_objecttype_cert", test_build_objecttype_cert); + g_test_add_func ("/gck/uri/build_objecttype_private", test_build_objecttype_private); + g_test_add_func ("/gck/uri/build_objecttype_public", test_build_objecttype_public); + g_test_add_func ("/gck/uri/build_objecttype_secret", test_build_objecttype_secret); + g_test_add_func ("/gck/uri/build_with_library", test_build_with_library); + + return g_test_run (); +} diff --git a/gcr/Gcr-3.metadata b/gcr/Gcr-3.metadata new file mode 100644 index 0000000..3eee7e5 --- /dev/null +++ b/gcr/Gcr-3.metadata @@ -0,0 +1,10 @@ +// Metadata file for Vala API generation. +// See https://live.gnome.org/Vala/UpstreamGuide for more information + +Certificate + .label nullable=true + .markup nullable=true + .subject nullable=true + .issuer nullable=true +Comparable + .memcmp skip=false diff --git a/gcr/Makefile.am b/gcr/Makefile.am new file mode 100644 index 0000000..692875b --- /dev/null +++ b/gcr/Makefile.am @@ -0,0 +1,423 @@ +# included in top-level Makefile.am + +gcr_incdir = $(includedir)/gcr-@GCR_MAJOR@/gcr + +gcr_HEADER_FILES = \ + gcr/gcr-base.h \ + gcr/gcr-certificate.h \ + gcr/gcr-certificate-chain.h \ + gcr/gcr-certificate-request.h \ + gcr/gcr-collection.h \ + gcr/gcr-column.h \ + gcr/gcr-comparable.h \ + gcr/gcr-deprecated-base.h \ + gcr/gcr-fingerprint.h \ + gcr/gcr-filter-collection.h \ + gcr/gcr-icons.h \ + gcr/gcr-importer.h \ + gcr/gcr-import-interaction.h \ + gcr/gcr-library.h \ + gcr/gcr-mock-prompter.h \ + gcr/gcr-parser.h \ + gcr/gcr-pkcs11-certificate.h \ + gcr/gcr-prompt.h \ + gcr/gcr-secret-exchange.h \ + gcr/gcr-secure-memory.h \ + gcr/gcr-simple-certificate.h \ + gcr/gcr-simple-collection.h \ + gcr/gcr-ssh-askpass.h \ + gcr/gcr-system-prompt.h \ + gcr/gcr-system-prompter.h \ + gcr/gcr-trust.h \ + gcr/gcr-types.h \ + gcr/gcr-union-collection.h \ + gcr/gcr-unlock-options.h \ + gcr/gcr-version.h + +gcr_inc_HEADERS = \ + $(gcr_HEADER_FILES) \ + gcr/gcr-enum-types-base.h + +if WITH_GTK +gcr_inc_HEADERS += gcr/gcr.h +endif + +lib_LTLIBRARIES += \ + libgcr-base-@GCR_MAJOR@.la + +gcr_BUILT_SOURCES = \ + gcr/gcr-marshal.c gcr/gcr-marshal.h \ + gcr/gcr-enum-types-base.c gcr/gcr-enum-types-base.h \ + gcr/gcr-oids.c gcr/gcr-oids.h \ + gcr/gcr-dbus-generated.c gcr/gcr-dbus-generated.h + +BUILT_SOURCES += $(gcr_BUILT_SOURCES) + +gcr_PUBLIC_FILES = \ + gcr/gcr-base.h \ + gcr/gcr-certificate.c gcr/gcr-certificate.h \ + gcr/gcr-certificate-chain.c gcr/gcr-certificate-chain.h \ + gcr/gcr-certificate-request.c gcr/gcr-certificate-request.h \ + gcr/gcr-collection.c gcr/gcr-collection.h \ + gcr/gcr-column.h \ + gcr/gcr-comparable.c gcr/gcr-comparable.h \ + gcr/gcr-filter-collection.c gcr/gcr-filter-collection.h \ + gcr/gcr-fingerprint.c gcr/gcr-fingerprint.h \ + gcr/gcr-icons.c gcr/gcr-icons.h \ + gcr/gcr-importer.c gcr/gcr-importer.h \ + gcr/gcr-import-interaction.c gcr/gcr-import-interaction.h \ + gcr/gcr-library.c gcr/gcr-library.h \ + gcr/gcr-mock-prompter.c gcr/gcr-mock-prompter.h \ + gcr/gcr-parser.c gcr/gcr-parser.h \ + gcr/gcr-pkcs11-certificate.c gcr/gcr-pkcs11-certificate.h \ + gcr/gcr-prompt.c gcr/gcr-prompt.h \ + gcr/gcr-secret-exchange.c gcr/gcr-secret-exchange.h \ + gcr/gcr-secure-memory.c gcr/gcr-secure-memory.h \ + gcr/gcr-simple-certificate.c gcr/gcr-simple-certificate.h \ + gcr/gcr-simple-collection.c gcr/gcr-simple-collection.h \ + gcr/gcr-ssh-askpass.c gcr/gcr-ssh-askpass.h \ + gcr/gcr-system-prompt.c gcr/gcr-system-prompt.h \ + gcr/gcr-system-prompter.c gcr/gcr-system-prompter.h \ + gcr/gcr-types.h \ + gcr/gcr-union-collection.c gcr/gcr-union-collection.h \ + gcr/gcr-unlock-options.h \ + gcr/gcr-version.h \ + $(NULL) + +gcr_PRIVATE_FILES = \ + gcr/gcr-callback-output-stream.c gcr/gcr-callback-output-stream.h \ + gcr/gcr-certificate-extensions.c gcr/gcr-certificate-extensions.h \ + gcr/gcr-column.c \ + gcr/gcr-dbus-constants.h \ + gcr/gcr-deprecated-base.h \ + gcr/gcr-gnupg-collection.c gcr/gcr-gnupg-collection.h \ + gcr/gcr-gnupg-importer.c gcr/gcr-gnupg-importer.h \ + gcr/gcr-gnupg-key.c gcr/gcr-gnupg-key.h \ + gcr/gcr-gnupg-process.c gcr/gcr-gnupg-process.h \ + gcr/gcr-gnupg-records.c gcr/gcr-gnupg-records.h \ + gcr/gcr-gnupg-util.c gcr/gcr-gnupg-util.h \ + gcr/gcr-internal.h \ + gcr/gcr-key-mechanisms.h gcr/gcr-key-mechanisms.c \ + gcr/gcr-memory-icon.c gcr/gcr-memory-icon.h \ + gcr/gcr-openpgp.c gcr/gcr-openpgp.h \ + gcr/gcr-openssh.c gcr/gcr-openssh.h \ + gcr/gcr-pkcs11-importer.c gcr/gcr-pkcs11-importer.h \ + gcr/gcr-record.c gcr/gcr-record.h \ + gcr/gcr-single-collection.c gcr/gcr-single-collection.h \ + gcr/gcr-subject-public-key.c gcr/gcr-subject-public-key.h \ + gcr/gcr-trust.c gcr/gcr-trust.h \ + gcr/gcr-util.c gcr/gcr-util.h \ + $(NULL) + +libgcr_base_@GCR_MAJOR@_la_SOURCES = \ + $(gcr_PUBLIC_FILES) \ + $(gcr_PRIVATE_FILES) \ + $(NULL) + +nodist_libgcr_base_@GCR_MAJOR@_la_SOURCES = \ + $(gcr_BUILT_SOURCES) + +libgcr_base_@GCR_MAJOR@_la_CFLAGS = \ + $(LIBGCRYPT_CFLAGS) \ + $(P11_KIT_CFLAGS) \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DP11_KIT_API_SUBJECT_TO_CHANGE \ + -DGCR_COMPILATION \ + -DG_LOG_DOMAIN=\"Gcr\" + +libgcr_base_@GCR_MAJOR@_la_LDFLAGS = \ + -version-info $(GCR_LT_RELEASE) \ + -no-undefined \ + -export-symbols-regex '^_gcr_.*|^gcr_.*|^SECMEM_.*' + +libgcr_base_@GCR_MAJOR@_la_LIBADD = \ + libegg.la \ + libgck-@GCK_MAJOR@.la \ + $(GLIB_LIBS) \ + $(LIBGCRYPT_LIBS) \ + $(P11_KIT_LIBS) + +gcr/gcr-marshal.h: gcr/gcr-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=_gcr_marshal > $@ + +gcr/gcr-marshal.c: gcr/gcr-marshal.list $(GLIB_GENMARSHAL) + $(AM_V_GEN) ( echo "#include \"gcr/gcr-marshal.h\"" > $@ && \ + $(GLIB_GENMARSHAL) $< --body --prefix=_gcr_marshal >> $@ ) + +gcr/gcr-enum-types-base.h: $(ENUM_TEMPLATE_H) $(gcr_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ +gcr/gcr-enum-types-base.c: $(ENUM_TEMPLATE_C) $(gcr_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +gcr/gcr-oids.c: gcr/gcr-oids.list gcr/gcr-mkoids + $(AM_V_GEN) sh $(srcdir)/gcr/gcr-mkoids -p GCR -c gcr/gcr-oids.c -h gcr/gcr-oids.h $(srcdir)/gcr/gcr-oids.list + +gcr/gcr-oids.h: gcr/gcr-oids.c + +DBUS_XML_DEFINITIONS = \ + gcr/org.gnome.keyring.Prompter.xml + +gcr/gcr-dbus-generated.c: $(DBUS_XML_DEFINITIONS) + $(AM_V_GEN) $(GDBUS_CODEGEN) --interface-prefix org.gnome.keyring.internal. \ + --generate-c-code gcr/gcr-dbus-generated --c-namespace GcrDBus $^ + $(AM_V_GEN) sed -e 's/gcr_dbus/_gcr_dbus/g' \ + gcr/gcr-dbus-generated.c > gcr/gcr-dbus-generated.c.tmp && \ + mv gcr/gcr-dbus-generated.c.tmp gcr/gcr-dbus-generated.c + $(AM_V_GEN) sed -e 's/gcr_dbus/_gcr_dbus/g' \ + gcr/gcr-dbus-generated.h > gcr/gcr-dbus-generated.h.tmp && \ + mv gcr/gcr-dbus-generated.h.tmp gcr/gcr-dbus-generated.h + +gcr/gcr-dbus-generated.h: gcr/gcr-dbus-generated.c + +libexec_PROGRAMS += gcr-ssh-askpass + +gcr_ssh_askpass_SOURCES = gcr/gcr-ssh-askpass.c + +gcr_ssh_askpass_CFLAGS = \ + -DGCR_SSH_ASKPASS_TOOL \ + -DGCR_COMPILATION \ + $(GLIB_CFLAGS) + +gcr_ssh_askpass_LDADD = \ + libegg.la \ + $(GLIB_LIBS) + +pkgconfig_DATA += \ + gcr-base-$(GCR_MAJOR).pc + +gcr-base-$(GCR_MAJOR).pc: gcr/gcr-base.pc + $(AM_V_GEN) cp gcr/gcr-base.pc gcr-base-$(GCR_MAJOR).pc + +service_in_files = \ + gcr/org.gnome.keyring.SystemPrompter.service.in \ + gcr/org.gnome.keyring.PrivatePrompter.service.in +servicedir = $(DBUS_SERVICES_DIR) +service_DATA = $(service_in_files:.service.in=.service) + +EXTRA_DIST += \ + gcr/gcr-base.pc.in \ + gcr/gcr-marshal.list \ + gcr/gcr-oids.list \ + gcr/gcr-mkoids \ + $(DBUS_XML_DEFINITIONS) \ + gcr/gcr-base.symbols \ + $(service_in_files) \ + gcr/gcr-version.h.in + +CLEANFILES += \ + $(service_DATA) \ + gcr-base-actual.abi \ + gcr-base-expected.abi \ + Gcr-3.broken.gir + +if HAVE_INTROSPECTION + +INTROSPECTION_GIRS += Gcr-@GCR_MAJOR@.broken.gir + +Gcr-@GCR_MAJOR@.gir: Gcr-@GCR_MAJOR@.broken.gir $(FIX_GIR) + +Gcr-@GCR_MAJOR@.broken.gir: libgcr-base-@GCR_MAJOR@.la Gck-@GCK_MAJOR@.gir + +Gcr_@GCR_MAJOR@_broken_gir_PACKAGES = p11-kit-1 +Gcr_@GCR_MAJOR@_broken_gir_EXPORT_PACKAGES = gcr-base-@GCR_MAJOR@ +Gcr_@GCR_MAJOR@_broken_gir_INCLUDES = GLib-2.0 GObject-2.0 +Gcr_@GCR_MAJOR@_broken_gir_LIBS = libgcr-base-@GCR_MAJOR@.la +Gcr_@GCR_MAJOR@_broken_gir_CFLAGS = -I$(top_srcdir) -I$(top_builddir) \ + -DGCR_COMPILATION -DGCR_API_SUBJECT_TO_CHANGE +Gcr_@GCR_MAJOR@_broken_gir_FILES = $(gcr_PUBLIC_FILES) +Gcr_@GCR_MAJOR@_broken_gir_SCANNERFLAGS = \ + --add-include-path=$(top_builddir)/gck \ + --include-uninstalled=$(builddir)/Gck-@GCK_MAJOR@.gir \ + --c-include "gcr/gcr-base.h" \ + --identifier-prefix Gcr \ + --nsversion @GCR_MAJOR@ + +gir_DATA += Gcr-@GCR_MAJOR@.gir + +if ENABLE_VAPIGEN + +gcr-@GCR_MAJOR@.vapi: Gcr-@GCR_MAJOR@.gir gcr/Gcr-@GCR_MAJOR@.metadata gcr-@GCR_MAJOR@.deps gck-@GCK_MAJOR@.vapi + +VAPIGEN_VAPIS += gcr-@GCR_MAJOR@.vapi + +gcr_@GCR_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 gck-@GCK_MAJOR@ +gcr_@GCR_MAJOR@_vapi_METADATADIRS = $(srcdir)/gcr +gcr_@GCR_MAJOR@_vapi_VAPIDIRS = $(builddir) +gcr_@GCR_MAJOR@_vapi_GIRDIRS = $(builddir) +gcr_@GCR_MAJOR@_vapi_FILES = Gcr-@GCR_MAJOR@.gir + +gcr-$(GCR_MAJOR).deps: Makefile.am + $(AM_V_GEN) echo $(gcr_@GCR_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ + +EXTRA_DIST += \ + gcr/Gcr-@GCR_MAJOR@.metadata + +endif # ENABLE_VAPIGEN + +endif # HAVE_INTROSPECTON + +# ---------------------------------------------------------------- + +gcr-base-expected.abi: gcr/gcr-base.symbols + $(AM_V_GEN) cpp -P $< | sort > $@ + +gcr-base-actual.abi: $(builddir)/.libs/libgcr-base-@GCR_MAJOR@.so + $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ + cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end|_gcr_)' | sort > $@ + +check-gcr-symbols: gcr-base-expected.abi gcr-base-actual.abi + $(AM_V_GEN) diff -U0 --ignore-blank-lines gcr-base-expected.abi gcr-base-actual.abi || \ + (echo "check-symbols: Symbols have CHANGED. Fix gcr-base.symbols"; exit 1) + +gcr_CFLAGS = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DSRCDIR="\"@abs_srcdir@\"" \ + -DGCR_API_SUBJECT_TO_CHANGE \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DGCR_COMPILATION \ + $(GLIB_CFLAGS) \ + $(LIBGCRYPT_CFLAGS) \ + $(P11_KIT_CFLAGS) + +gcr_LIBS = \ + libgcr-base-@GCR_MAJOR@.la \ + libegg.la \ + libgck-testable.la \ + $(GLIB_LIBS) \ + $(LIBGCRYPT_LIBS) \ + $(P11_KIT_LIBS) + +gcr_TESTS = \ + test-util \ + test-filter-collection \ + test-secret-exchange \ + test-simple-certificate \ + test-certificate \ + test-certificate-chain \ + test-subject-public-key \ + test-fingerprint \ + test-pkcs11-certificate \ + test-openpgp \ + test-openssh \ + test-secure-memory \ + test-trust \ + test-parser \ + test-record \ + test-memory-icon \ + test-gnupg-key \ + test-gnupg-collection \ + test-gnupg-process \ + test-system-prompt \ + test-ssh-askpass + +test_certificate_SOURCES = gcr/test-certificate.c +test_certificate_CFLAGS = $(gcr_CFLAGS) +test_certificate_LDADD = $(gcr_LIBS) + +test_certificate_chain_SOURCES = gcr/test-certificate-chain.c +test_certificate_chain_CFLAGS = $(gcr_CFLAGS) +test_certificate_chain_LDADD = $(gcr_LIBS) + +test_filter_collection_SOURCES = gcr/test-filter-collection.c +test_filter_collection_CFLAGS = $(gcr_CFLAGS) +test_filter_collection_LDADD = $(gcr_LIBS) + +test_fingerprint_SOURCES = gcr/test-fingerprint.c +test_fingerprint_CFLAGS = $(gcr_CFLAGS) +test_fingerprint_LDADD = $(gcr_LIBS) + +test_gnupg_collection_SOURCES = gcr/test-gnupg-collection.c +test_gnupg_collection_CFLAGS = $(gcr_CFLAGS) +test_gnupg_collection_LDADD = $(gcr_LIBS) + +test_gnupg_key_SOURCES = gcr/test-gnupg-key.c +test_gnupg_key_CFLAGS = $(gcr_CFLAGS) +test_gnupg_key_LDADD = $(gcr_LIBS) + +test_gnupg_process_SOURCES = gcr/test-gnupg-process.c +test_gnupg_process_CFLAGS = $(gcr_CFLAGS) +test_gnupg_process_LDADD = $(gcr_LIBS) + +test_memory_icon_SOURCES = gcr/test-memory-icon.c +test_memory_icon_CFLAGS = $(gcr_CFLAGS) +test_memory_icon_LDADD = $(gcr_LIBS) + +test_openpgp_SOURCES = gcr/test-openpgp.c +test_openpgp_CFLAGS = $(gcr_CFLAGS) +test_openpgp_LDADD = $(gcr_LIBS) + +test_openssh_SOURCES = gcr/test-openssh.c +test_openssh_CFLAGS = $(gcr_CFLAGS) +test_openssh_LDADD = $(gcr_LIBS) + +test_parser_SOURCES = gcr/test-parser.c +test_parser_CFLAGS = $(gcr_CFLAGS) +test_parser_LDADD = $(gcr_LIBS) + +test_pkcs11_certificate_SOURCES = gcr/test-pkcs11-certificate.c +test_pkcs11_certificate_CFLAGS = $(gcr_CFLAGS) +test_pkcs11_certificate_LDADD = $(gcr_LIBS) + +test_record_SOURCES = gcr/test-record.c +test_record_CFLAGS = $(gcr_CFLAGS) +test_record_LDADD = $(gcr_LIBS) + +test_secret_exchange_SOURCES = gcr/test-secret-exchange.c +test_secret_exchange_CFLAGS = $(gcr_CFLAGS) +test_secret_exchange_LDADD = $(gcr_LIBS) + +test_secure_memory_SOURCES = gcr/test-secure-memory.c +test_secure_memory_CFLAGS = $(gcr_CFLAGS) +test_secure_memory_LDADD = $(gcr_LIBS) + +test_simple_certificate_SOURCES = gcr/test-simple-certificate.c +test_simple_certificate_CFLAGS = $(gcr_CFLAGS) +test_simple_certificate_LDADD = $(gcr_LIBS) + +test_ssh_askpass_SOURCES = gcr/test-ssh-askpass.c +test_ssh_askpass_CFLAGS = $(gcr_CFLAGS) +test_ssh_askpass_LDADD = libegg-test.la $(gcr_LIBS) + +test_subject_public_key_SOURCES = gcr/test-subject-public-key.c +test_subject_public_key_CFLAGS = $(gcr_CFLAGS) +test_subject_public_key_LDADD = $(gcr_LIBS) + +test_system_prompt_SOURCES = gcr/test-system-prompt.c +test_system_prompt_CFLAGS = $(gcr_CFLAGS) +test_system_prompt_LDADD = $(gcr_LIBS) + +test_trust_SOURCES = gcr/test-trust.c +test_trust_CFLAGS = $(gcr_CFLAGS) +test_trust_LDADD = $(gcr_LIBS) + +test_util_SOURCES = gcr/test-util.c +test_util_CFLAGS = $(gcr_CFLAGS) +test_util_LDADD = $(gcr_LIBS) + +check_PROGRAMS += $(gcr_TESTS) +TESTS += $(gcr_TESTS) + +EXTRA_DIST += \ + gcr/fixtures + +# ------------------------------------------------------------------ + +noinst_PROGRAMS += \ + frob-openpgp \ + frob-certificate-request \ + frob-parser + +frob_certificate_request_SOURCES = \ + gcr/frob-certificate-request.c \ + gcr/console-interaction.c gcr/console-interaction.h +frob_certificate_request_CFLAGS = $(gcr_CFLAGS) +frob_certificate_request_LDADD = $(gcr_LIBS) + +frob_openpgp_SOURCES = gcr/frob-openpgp.c +frob_openpgp_CFLAGS = $(gcr_CFLAGS) +frob_openpgp_LDADD = $(gcr_LIBS) + +frob_parser_SOURCES = gcr/frob-parser.c +frob_parser_CFLAGS = $(gcr_CFLAGS) +frob_parser_LDADD = $(gcr_LIBS) diff --git a/gcr/console-interaction.c b/gcr/console-interaction.c new file mode 100644 index 0000000..bc3b7dc --- /dev/null +++ b/gcr/console-interaction.c @@ -0,0 +1,175 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include +#include + +#ifdef G_OS_WIN32 +#include +#include +#endif + +#include "console-interaction.h" + +#include + +/* + * WARNING: This is not the example you're looking for [slow hand wave]. This + * is not industrial strength, it's just for testing. It uses embarassing + * functions like getpass() and does lazy things with threads. + */ + +#define TYPE_CONSOLE_INTERACTION (console_interaction_get_type ()) +#define CONSOLE_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_CONSOLE_INTERACTION, ConsoleInteraction)) +#define CONSOLE_INTERACTION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), TYPE_CONSOLE_INTERACTION, ConsoleInteractionClass)) +#define IS_CONSOLE_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_CONSOLE_INTERACTION)) +#define IS_CONSOLE_INTERACTION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_CONSOLE_INTERACTION)) +#define CONSOLE_INTERACTION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_CONSOLE_INTERACTION, ConsoleInteractionClass)) + +typedef struct _ConsoleInteraction ConsoleInteraction; +typedef struct _ConsoleInteractionClass ConsoleInteractionClass; + +struct _ConsoleInteraction +{ + GTlsInteraction parent_instance; +}; + +struct _ConsoleInteractionClass +{ + GTlsInteractionClass parent_class; +}; + +GType console_interaction_get_type (void) G_GNUC_CONST; + +G_DEFINE_TYPE (ConsoleInteraction, console_interaction, G_TYPE_TLS_INTERACTION); + +#ifdef G_OS_WIN32 +/* win32 doesn't have getpass() */ +static gchar * +getpass (const gchar *prompt) +{ + static gchar buf[BUFSIZ]; + gint i; + + g_printf ("%s", prompt); + fflush (stdout); + + for (i = 0; i < BUFSIZ - 1; ++i) + { + buf[i] = _getch (); + if (buf[i] == '\r') + break; + } + buf[i] = '\0'; + + g_printf ("\n"); + + return &buf[0]; +} +#endif + +static GTlsInteractionResult +console_interaction_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + const gchar *value; + gchar *prompt; + + prompt = g_strdup_printf ("Password \"%s\"': ", g_tls_password_get_description (password)); + value = getpass (prompt); + g_free (prompt); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return G_TLS_INTERACTION_FAILED; + + g_tls_password_set_value (password, (guchar *)value, -1); + return G_TLS_INTERACTION_HANDLED; +} + +static void +ask_password_with_getpass (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GTlsPassword *password; + GError *error = NULL; + + password = g_simple_async_result_get_op_res_gpointer (res); + console_interaction_ask_password (G_TLS_INTERACTION (object), password, + cancellable, &error); + if (error != NULL) + g_simple_async_result_take_error (res, error); +} + +static void +console_interaction_ask_password_async (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (interaction), callback, user_data, + console_interaction_ask_password); + g_simple_async_result_set_op_res_gpointer (res, g_object_ref (password), g_object_unref); + g_simple_async_result_run_in_thread (res, ask_password_with_getpass, + G_PRIORITY_DEFAULT, cancellable); + g_object_unref (res); +} + +static GTlsInteractionResult +console_interaction_ask_password_finish (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (interaction), + console_interaction_ask_password), G_TLS_INTERACTION_FAILED); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return G_TLS_INTERACTION_FAILED; + + return G_TLS_INTERACTION_HANDLED; +} + +static void +console_interaction_init (ConsoleInteraction *interaction) +{ + +} + +static void +console_interaction_class_init (ConsoleInteractionClass *klass) +{ + GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass); + interaction_class->ask_password = console_interaction_ask_password; + interaction_class->ask_password_async = console_interaction_ask_password_async; + interaction_class->ask_password_finish = console_interaction_ask_password_finish; +} + +GTlsInteraction * +console_interaction_new (void) +{ + return g_object_new (TYPE_CONSOLE_INTERACTION, NULL); +} diff --git a/gcr/console-interaction.h b/gcr/console-interaction.h new file mode 100644 index 0000000..ffd0f0f --- /dev/null +++ b/gcr/console-interaction.h @@ -0,0 +1,32 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __CONSOLE_INTERACTION_H__ +#define __CONSOLE_INTERACTION_H__ + +#include + +G_BEGIN_DECLS + +GTlsInteraction * console_interaction_new (void); + +G_END_DECLS + +#endif /* __G_TLS_CONSOLE_INTERACTION_H__ */ diff --git a/gcr/fixtures/RSA_Root_Certificate_1.pem b/gcr/fixtures/RSA_Root_Certificate_1.pem new file mode 100644 index 0000000..f6cdfcd --- /dev/null +++ b/gcr/fixtures/RSA_Root_Certificate_1.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f +NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM +MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 +t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b +e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu +PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- diff --git a/gcr/fixtures/RSA_Security_1024_v3.pem b/gcr/fixtures/RSA_Security_1024_v3.pem new file mode 100644 index 0000000..94e0ad1 --- /dev/null +++ b/gcr/fixtures/RSA_Security_1024_v3.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx +NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY +rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt +bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME +GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N +AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy +HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 +am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B +qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- diff --git a/gcr/fixtures/RSA_Security_2048_v3.pem b/gcr/fixtures/RSA_Security_2048_v3.pem new file mode 100644 index 0000000..86c907e --- /dev/null +++ b/gcr/fixtures/RSA_Security_2048_v3.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 +MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 +RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E +0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J +6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq +s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD +uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw +YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW +gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 +/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V +EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g +EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq +aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk +llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- diff --git a/gcr/fixtures/Thawte_Personal_Basic_CA.pem b/gcr/fixtures/Thawte_Personal_Basic_CA.pem new file mode 100644 index 0000000..22c2a8d --- /dev/null +++ b/gcr/fixtures/Thawte_Personal_Basic_CA.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl +cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp +Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow +gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV +BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm +BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV +BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ +cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK +P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ +fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j +kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB +gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 +B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- diff --git a/gcr/fixtures/Thawte_Personal_Freemail_CA.pem b/gcr/fixtures/Thawte_Personal_Freemail_CA.pem new file mode 100644 index 0000000..565a4be --- /dev/null +++ b/gcr/fixtures/Thawte_Personal_Freemail_CA.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl +cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m +cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz +NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx +EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp +bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG +SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N +j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef +QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY +x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC +neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr +5PjRzneigQ== +-----END CERTIFICATE----- diff --git a/gcr/fixtures/Thawte_Personal_Premium_CA.pem b/gcr/fixtures/Thawte_Personal_Premium_CA.pem new file mode 100644 index 0000000..688c3ae --- /dev/null +++ b/gcr/fixtures/Thawte_Personal_Premium_CA.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl +cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy +ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 +NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw +EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n +MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw +IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 +DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 +7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j +Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq +W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx +eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 +KzGJ +-----END CERTIFICATE----- diff --git a/gcr/fixtures/Thawte_Premium_Server_CA.pem b/gcr/fixtures/Thawte_Premium_Server_CA.pem new file mode 100644 index 0000000..aa37cfc --- /dev/null +++ b/gcr/fixtures/Thawte_Premium_Server_CA.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl +IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 +OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ +BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg +Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 +DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI +NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL +lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN +9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ +a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU +Qg== +-----END CERTIFICATE----- diff --git a/gcr/fixtures/Thawte_Server_CA.pem b/gcr/fixtures/Thawte_Server_CA.pem new file mode 100644 index 0000000..ac4e25b --- /dev/null +++ b/gcr/fixtures/Thawte_Server_CA.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl +IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG +A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw +ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ +VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz +QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I +/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC +6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX +TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD +TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni +TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- diff --git a/gcr/fixtures/Thawte_Time_Stamping_CA.pem b/gcr/fixtures/Thawte_Time_Stamping_CA.pem new file mode 100644 index 0000000..fecbd15 --- /dev/null +++ b/gcr/fixtures/Thawte_Time_Stamping_CA.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls +bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj +YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw +MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT +BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x +HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 +WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR +5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 +X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK +0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 +zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ +SdM= +-----END CERTIFICATE----- diff --git a/gcr/fixtures/base64-rsa-2048.spkac b/gcr/fixtures/base64-rsa-2048.spkac new file mode 100644 index 0000000..e1a3286 --- /dev/null +++ b/gcr/fixtures/base64-rsa-2048.spkac @@ -0,0 +1 @@ +SPKAC=MIICTDCCATQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCximUa27OhNYvidD/G6Y9iNZ8Zf4Q5Hs04CLNFfUhhhBXcC8BtkKrBrvXg+fCggPKSeubShlyOV7iKM5csNfEn4BC/z+AllnRvfZPCIcn/VMhT+iRNBtDP/P2A6wNcF2sNuGnTh/gpK2TBYEtA8zd/YD7vJIIGKcr9a3uzuC7Pg9s2xC7tfY+Lg1jgM1GPZ0T7iF1EA/4CqUDJQYvKFR/rbO6y43NsokwU6lDFNYqClu/vixQ/wp2S0sIPEg01LA39x2K/BXowGRhIKQYstNAjjiM8YzIg6+V4CR5uIgpof67eBdiLJqQhZQUSZuIQkyhkg8kwkZg2Ob9uxekoLG3JAgMBAAEWDE15IGNoYWxsZW5nZTANBgkqhkiG9w0BAQQFAAOCAQEAaovLKwXqvpz0M3QvLisqadPJ7zKHc267waOjvuOhgzFCa1VmlbaS5FgBf06EBluPHu23wy66NVSz/JGgm2HGwCAkD0JDziZUGtSDfQdEkIKgynJXaGQA3upBwCwJ8KT24sLF3Sv1OFKrMLWjWg3LJualnP/GBsPDd4P2uPyaVgilJCGBqxAMcPwB1SzFMD+LnRALY0o+MdvwR35X160biP5vGxUL6c9MQs9obQNQEv3wZHb+u+rMr9szoRUHga5Mt1ncG3o1bzP81U5cUGQ+GQoBAH3kImmyUX7xLBqMxq+BFjC4cqU1/dAtqeUeKdNLYs4Qt7D4PvVrYOLBhvb70Q== diff --git a/gcr/fixtures/ca-certificates.crt b/gcr/fixtures/ca-certificates.crt new file mode 100644 index 0000000..c30335f --- /dev/null +++ b/gcr/fixtures/ca-certificates.crt @@ -0,0 +1,2560 @@ +-----BEGIN CERTIFICATE----- +MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx +EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h +bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy +YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp +Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy +MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG +A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt +YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD +VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA +isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj +Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 +QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt +bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR +yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID +AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 +cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f +BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj +cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 +U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl +YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos +SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ +t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u +mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb +K+9A46sd33oqK8n8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF +BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz +aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC +QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry +dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw +CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x +FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS +b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC +AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK +pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV +6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc +OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV +jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 +cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C +AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k +qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT +ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg +TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm +/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx +fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ +TzFxiNmIf1Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC +VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB +bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw +MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB +T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg +SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI +zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt +fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs +trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr +5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc +LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ +XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM +eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 +CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf +WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT +LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz +vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw +X7A5KGgOc90lmt4S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC +VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB +bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw +MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB +T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg +SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs +RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs +i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg +/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ +2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 +ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X ++Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml +J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo +Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ +Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex +MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 +cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF +ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY +vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ +drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la +5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks +mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 +O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD +062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 +xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL +Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 +dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h +bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B +ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 +c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 +k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 +ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 +B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez +eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 +aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB +3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 +xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv +cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ +KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R +xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT +K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 +n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx +REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O +hgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw +HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze +xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI +gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O +M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc +sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 +mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG +9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU +tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx +IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 +MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 +tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL +/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV +g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 +tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe +Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF +MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ +A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c ++OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 +P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX +C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R +s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 +BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf +d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB +jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG +A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu +G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj +PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY +GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 +NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx +My3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v +dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT +AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg +VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek +n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk +IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z +sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t +UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R ++Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES +a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 +lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw +ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh +bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh +lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 +5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF +Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA +wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw +dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l +cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X +DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp +Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa +xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl +GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n +BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx +VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE +mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu +JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 +9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA +A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM +IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI +dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j +8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l +cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X +DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp +Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN +t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ +DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x +uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE +18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr +kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD +bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX +uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu +Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 +W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 +ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn +AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL +M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf +tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR +Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R ++FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr ++CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM +nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt +d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI +WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ +ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y +3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz +2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG +EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 +MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx +MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV +BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ +QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h +Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR +QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP +wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 +pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT +Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC +AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud +EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA +A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT +I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ +oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 +G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYT +AlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl +cnR1bSBDQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJ +BgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNV +BAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AM6xwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYV +M42sLQnFdvkrOYCJ5JdLkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/Ox +LjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE +7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/KUz/iDsaW +VhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu +/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESS +bLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQaTOs9qmdvLdTN +/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvgGrZg +FCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqT +E5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYV +IZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFB +IENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIz +MTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENB +IExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSO +vkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wk +wLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfH +dr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf04 +9vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULi +mAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3m +NWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W +8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwu +Y29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG +9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHC +v8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdV +CYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAV +GI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to +51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2Vj +dXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4 +MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIg +TWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2Rv +IENBIExpbWl0ZWQxJDAiBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2 +aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBxM4KK0HDr +c4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP9nQ95IDC ++DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8 +j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWC +iIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtG +Cd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz6YiO/O1R65Nx +Tq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4EFgQU +PNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNo +dHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiF +Gv45jN5bBAS0VPmjZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXG +De+X3EyrEeFryzHRbPtIgKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsF +Vy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfU +a7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6s +Cx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1 +c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0y +ODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVy +IE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9k +byBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNl +cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhT +WvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh73TkVvFVI +xO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9 +C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/ +oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW1O24zG71++IsWL1/ +T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7kUlcsutT6vif +R4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1UdDgQW +BBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2 +hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2Vy +dmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdT +mw7pSqBYaWcOrp32pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+C +l5EfKNsYEYwq5GWDVxISjBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/g +hhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVF +wL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOj +GM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG +EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw +DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw +MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy +ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB +AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR +EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth +zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 +dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E +YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg +U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx +MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 +pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV +HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 +DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA +sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 +w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp +MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM +YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv +LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx +ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE +CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp +Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx +FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp +Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U +q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF +koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh +TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd +lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn +7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ +LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV +WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX +8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 +6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT +F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG +EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw +DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 +MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy +ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB +AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB +w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e +ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd +55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E +YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg +U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw +OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s +NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV +HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 +DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb +dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih +w6ID +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp +MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM +YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv +LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy +MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE +CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp +Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx +FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp +Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 +ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 +/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 +MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih +YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv +bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog +WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 +HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV +6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 +PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 +sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB +X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT +HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 +c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy +MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 +Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y +cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp +ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU +rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB +3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y +NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E +gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw +PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 +Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD +AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW +BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA +O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L +a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l +TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf +Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz +dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF +bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg +aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg +MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l +dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G +CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw +tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK +wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI +XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD +AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu +dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy +MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 +IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw +NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc +/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV +HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq +hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv +yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp +bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ +bIkz8OwVDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf +MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT +HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 +c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy +MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 +Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y +cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg +RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 +QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC +DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj +/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP +KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd +enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB +0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ +FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh +fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU +KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho +wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 ++z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 +6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE +BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 +cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs +aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp +bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa +MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV +BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw +LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 +cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL +ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv +x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV +iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 +iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw +ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff +SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE +CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 +cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD +VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D +bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx +MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW +/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG +A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ +OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU +ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE +PHayXOw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE +BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 +cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE +AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 +dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh +Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow +OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 +VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN +iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk +mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT +MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY +pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs +aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM +aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo +dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi +gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE +FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 +B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn +CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx +xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 +rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG +EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 +cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 +MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx +LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 +eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R +FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO +/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv +K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp +MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt +MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw +HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w +GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB +AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u +FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 +aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 +MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT +E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl +IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy +td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR +OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC +AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w +HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o +oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf +2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa +z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 +pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 +aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN +MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh +eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu +ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe +k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 +/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW +HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG +SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 +MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq +R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm +JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 +tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr +tWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm +YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 +MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg +U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et +MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF +7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD +pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM +HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp +MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT +ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw +HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w +GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB +AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt +y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw +FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy +dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg +R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 +MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD +VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT +GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 +ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn +ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F +LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 +46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq +81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d +XIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw +FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy +dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw +CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD +ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K +DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw +KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID +AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD ++fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv +U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e +6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz +dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE +AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH +CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC +GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 +csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj +Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe +JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB +o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 +qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq +hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe +R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV +Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot +2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX +xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL +MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV +BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 +ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw +FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw +GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR +4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc +71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 +bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK +OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW +ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ +UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC +AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd +PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT +2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD +NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg +Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx +MTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFowggESMQswCQYDVQQGEwJFUzES +MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV +BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp +BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs +BgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5 +BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJ +ZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzc +uh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb +adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp +bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg +Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg +Q0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN +AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH +AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt +YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmlj +YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt +FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3Js +MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +dm9jYXRpb25DTEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgB +hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p +cHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UxLmNybDAvBggrBgEFBQcB +AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1ur +xUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTG +Kbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9U +kE6tsSU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx +MTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFowggESMQswCQYDVQQGEwJFUzES +MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV +BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp +BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs +BgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49N +zjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBx +RiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLn +ev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj +mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp +bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg +Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg +Q0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN +AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH +AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt +YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmlj +YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt +FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3Js +MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +dm9jYXRpb25DTEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgB +hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p +cHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UzLmNybDAvBggrBgEFBQcB +AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc +4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1 +/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkO +E7LFRVA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN +MDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG +A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr +MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv +MC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2md +d81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1 +e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/ +2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 +3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC +YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu +dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz +QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT +IENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI +KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE +BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBD +ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB +hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB +U0VBMS5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmV2b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAW +Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRt +bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBo +dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINm +yq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV +7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N4 +1lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN +MDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG +A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr +MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv +MC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uG +BiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4 +Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2 +YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 +2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC +YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu +dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz +QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT +IENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI +KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE +BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBD +ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB +hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB +U0VBMy5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmV2b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAW +Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRt +bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBo +dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB +/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF +8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/ +RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlw +cy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEyMjcwMDUzNThaMIIBHDELMAkG +A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs +b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl +cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw +OTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVkIENBcyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1h +aWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQg +vJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB +hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQT +y2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8w +HQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC +AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQG +EwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx +LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu +bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0 +NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p +cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRk +MGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggr +BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK +KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBz +QG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglg +hkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3 +Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5p +cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYt +aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/ +MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +bmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYo +aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCg +LoYsaHR0cDovL3d3d2JhY2suaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNBQy5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hA +K+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3Jag +vPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjM +Wb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIw +EAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE +ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVz +MRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBz +QG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1ow +gaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcT +CUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UE +CxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEe +MBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3 +PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU +3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzh +PvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lYJN7GO9HgQmm4 +7mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2/iU9 +4aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58 +GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu +aXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1MTIyNzAxMTAxOFowggEeMQsw +CQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJj +ZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZp +Y2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEIt +NjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBUaW1lc3RhbXBp +bmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lw +c0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLju +VqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 +Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6 +KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAw +ggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC +AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkG +A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs +b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl +cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw +OTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5n +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA +bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsG +A1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF +BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGC +NwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5l +czBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwW +Gmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFo +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcu +Y3JsMEUGCWCGSAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAy +L3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUW +M2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu +Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9wb2xpY3lUaW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAz +hjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBp +bmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9p +cHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYB +BQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEA +ZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWha +sl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I3pGW7hdb +rqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG +EwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNa +Fw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9W +YWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1 +lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+D +isPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj18 +2d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Sp +x2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZ +yH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkop +igPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYI +KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFk +aXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlh +bmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBw +YXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRp +ZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmlj +YXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMu +Ym0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYw +gaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3Wdv +OXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10 +buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe +/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6 +isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQ +NiOKSnQ2+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f +NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM +MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 +t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b +e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu +PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx +NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY +rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt +bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME +GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N +AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy +HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 +am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B +qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 +MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 +RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E +0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J +6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq +s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD +uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw +YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW +gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 +/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V +EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g +EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq +aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk +llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK +UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0 +eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMw +OTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1 +c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RD +QTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8 +V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpx +xpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmz +iX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6 +tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819 +uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/L +TX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZ +aNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq +/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94 +nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNn +PaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfci +oU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG +STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENB +MB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMC +RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue ++H887dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mX +y47vPxVnqIJyY1MPQYx9EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNY +wBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JF +hfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF6452F/NM8Ec +yonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW +1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB +/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuXZfsSZ9gqXLar +5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxVyhbM +p6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2 +nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2y +Ix4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG +STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENB +MB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMC +RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE ++hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gX +GM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQ +TiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwK +noG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1 +P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURr +BGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB +/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXL +rNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCd +jdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr4 +50kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkeja +nZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJOTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQD +Ex1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIz +NDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVT +dGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRl +cmxhbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAmNK1URF6gaYUmHFtvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rF +DBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02PjLwYdjeFnejKScfST5gTCaI+ +Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGcaC1Hoi6Ce +UJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7l +r7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4Zl +kuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGO +MAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDwwOgYIKwYBBQUH +AgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9vdC1w +b2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg +0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVF +IGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0 +C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBp +IzlWYGeQiy52OfsRiJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYV +wSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT +AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD +VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 +b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB +MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe +Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE +RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE +ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y +a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp +MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk +qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO +gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 +zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w +DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W +LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR +T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac +ASZ4smZHcFFk +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT +AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD +VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 +b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB +MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe +Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE +RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE +ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y +a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp +MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ +GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn +v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA +o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w +DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 +iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC +GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS +CdS7kjXvD9s0 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQG +EwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50 +ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTda +MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNV +BAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4Nr +XceO+YQwzho7+vvOi20jxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaq +HF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5 +Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc5IogCSEW +Vmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8n +mHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwID +AQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBY +oFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0w +GwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JMMTAr +BgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8w +HQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKs +LtB9KOy282A4aW8+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7T +mHnaCB4Mb7j4Fifvwm899qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE +64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQ +V0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQG +EwJESzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0w +MzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQww +CgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSj +hFuHnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8 +z3sM8W9Hpg1DTeLpHTk0zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJH +hNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvViGjaXbXqzRowwYCDdlCqT9HU +3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBdedObaE+3p +Hx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTw +tyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYB +BQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBvc2l0b3J5MIGd +BggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBmcmEg +ZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEG +A1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERD +MRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0Q +BCQwIoAPMjAwMzAyMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0j +BBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4S +GSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDAN +BgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBu +o7E4A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjND +fZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8Aqt +FxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoBmbgGglGBTvH1tJFUuSN6 +AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1AoLbrIyi +gfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2Lq +L19iUw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl +cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp +Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow +gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV +BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm +BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV +BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ +cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK +P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ +fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j +kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB +gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 +B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl +cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m +cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz +NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx +EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp +bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG +SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N +j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef +QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY +x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC +neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr +5PjRzneigQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl +cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy +ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 +NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw +EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n +MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw +IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 +DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 +7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j +Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq +W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx +eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 +KzGJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl +IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 +OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ +BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg +Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 +DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI +NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL +lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN +9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ +a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU +Qg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl +IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG +A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw +ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ +VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz +QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I +/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC +6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX +TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD +TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni +TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls +bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj +YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw +MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT +BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x +HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 +WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR +5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 +X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK +0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 +zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ +SdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF +ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU +Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 +ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT +AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT +RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz +dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh +dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV +hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb +GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ +NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 +xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv +/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i +gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf +8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 +LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh +i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq +f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf +hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP +NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ +FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis +H8SE +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUF +ADCBkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVU +TiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2 +MzBaMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNh +bHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMS +VVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+O +GQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrr +U0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrL +Z9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykqlXvY8qdOD1R8 +oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv33i+ +Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4Gr +MIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v +Y3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUE +IzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHc +rpY6CiM+iVnJowftGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuM +FrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1 ++XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdO +jtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jF +VkwPDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUF +ADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVU +Ti1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAe +Fw05OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJV +UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93 +d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGll +bnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxq +mNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqk +kqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+us +obNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNp +saguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZU +Ot4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJ +hkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEF +BQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rk +MPxTbyUkxsrt4jFcKw7u7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK +2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/ +bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJR +warVNZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf +6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQ +jvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUF +ADCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVU +Ti1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5 +MTgxOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH +Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 +b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNV +BAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZ +FvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6N +q9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEH +OG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNdoI6yqqr2jmmI +BsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjfPe58 +BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhb +AgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWG +M2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3 +YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0o +XnWO6y1n7k57K9cM//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjA +bPLPSbtNk28GpgoiskliCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59 +Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4f +Fm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchq +J/kniCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0q +UZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUF +ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVU +Ti1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4 +NDAzNlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y +azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQD +ExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r55 +96Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc +/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2 +yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+pKvEHDHd17bR +5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7RwvC +bNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEA +AaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0 +cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNy +bDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXF +wfNfLEzIR1pp6ujwNTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T +7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85 +dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U ++CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCA +GKCGhU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2o +Ps0AH8g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw +8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m ++FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN +dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V +YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so +gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc +65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ +b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn +wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 +OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ +oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE +CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 +noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B +9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg +1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM +P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P +/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj +t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq +0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 +Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c +PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr +bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i +P/68DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR +ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j +Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh +JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P +oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh +v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ +BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf +xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM +DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 +SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV +OBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC57V56Ondfzl86UvzNZPdxtW9qlsZZklWUXS9bLsER +6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQDalbBgyzhb1upVFAkSsYuekyh +WzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4S8co5GYjhFHvRreT2IEz +y+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF +BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud +EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMX +fH8C6dX3i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4 +KY2kpXeH9fErJq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z +6k/BEVmXarIrE7HarZehs7GgIFvKMquNzxPwHynD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL +Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM +JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE +erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC +JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob +K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg +MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 +Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV +BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g +LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g +VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla +MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 +BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf +rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z +Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN +BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ +7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x +RnInjBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE +CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg +VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG +A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx +NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg +SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE +CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 +c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 +1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT +2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT +AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ +HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC +YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh +ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE +p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B +MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab +5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX +p/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAy +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDQymMxYX9ENHwFfQs9apDLeUt3Cj9LxyPlwGItfpx+ +PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDiWr3I3bR45qVCkwhnAcAgTddc +9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ/wtVqxXd+5rBuR10DbKM +RF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF +BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud +EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUE +nPMmm+M5bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1Vs +WJsswrQ0LHozQsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+ +It3jl6jhvCJDwt1N2/aBnpIUnjkPE1TegtjAXjSN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL +Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q +RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In +zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a +/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM +EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw +TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk +uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM +XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX +wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV +j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U +bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo +1KpYoJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 +R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo +vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg +TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V +k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ +OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my +/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA +Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S +GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb +o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh +/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDx5AgOg7t140jluNum8Lmr6Txix141W9ACVBHYydFW +uXZLuat65s269gwE1n7WsAplrE454/H3LaMlOe+wi8++2wxdbnD0B81w9zrA +PjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4KC8/BdsEIb/hRWb+PLeC +7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCTBCBggr +BgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVyaXNp +Z24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw +KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJ +BgNVHRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNj +wKke8tCLMzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJU +LBMK03cjzzf8Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnE +KMLL/J6oia5bPY4S6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 +8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK +QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX +xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI +L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt +ImRPT8qAkbYp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl +S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC +KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc +VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL +MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD +Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr +IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK +vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP +QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP +mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr +9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu +MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE +BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD +VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb +MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O +LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs +iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC +sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw +4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr +l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 +g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEF +BQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5 +LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4x +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6 +Ly93d3cudmVyaXNpZ24uY29tL1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJl +IFNlcnZlciBPQ1NQIFJlc3BvbmRlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8oXiMM+6f9L452psPTUepjyDoS0S9 +zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSuzOLDB4Nqo3IQASdiIqY1Jjkt +ns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnXOZXYHTWewr2zXcEMSx8C +AwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYDVQQDEwhPQ1NQIDEt +NDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlzaWduLmNvbS9S +U0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwkwQgYI +KwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZlcmlz +aWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB +MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEw +CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBT +ZpxJky4xoAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+ +TtvOzLqGuBjOsRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8Y +dZqfFzP9qSa44+LewqjEWop/mNYHBmvMVp6GcM7U7w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF +ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww +OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 +OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh +dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD +EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 +fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ +RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB +CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG +A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz +Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 +cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG +CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp +c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 +DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn +Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n +tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC +VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h +bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN +MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN +MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl +cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ +DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ +XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl +Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm +7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa +xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e +QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO +qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG +SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp +NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL +axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt +Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 +ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF +ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz +YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT +E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 +MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE +CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa +BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh +28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 +rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 +q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF +Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 +lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC +AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht +cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI +xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ +hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG +A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 +aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx +BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh +dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW +HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R +9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 +fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f +HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm +iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg +B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB +/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR +MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl +IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k +YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj +YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 +eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT +VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj +dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 +dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww +HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 +w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B +AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z +dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 +beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ +XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d +UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py +05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG +EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg +Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy +MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV +BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow +GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 +SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 +o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V +cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k +bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 +tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC +AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB +TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp +YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz +IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 +ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u +IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl +VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t +L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU +ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD +VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub +2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir +ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax +6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl +pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE +/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA +AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH +0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG +EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG +A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 +aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx +BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh +dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 +Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw +ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV +m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb +hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu +6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX +LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g +BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH +AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u +ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 +YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj +aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 +cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl +eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t +L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD +AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl +ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS +VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx +MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa +j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV +HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq +hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 +ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 +Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 +KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi +aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep +9w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF +ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS +b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w +bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 +IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt +ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw +CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK +Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU +vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL +O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe +rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 +S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV +HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD +kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v +cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj +cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo +ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv +bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l +bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu +IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 +d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s +MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN +GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF +BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 +3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt +NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 +UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM +m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y +mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw +OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu +ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h +gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K +5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy +9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE +gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 +eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs +YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp +aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp +dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb +sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB +FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W ++sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 +uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf +tXncwKJrMiE3lvgOOBITRzcahirLer4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa +Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g +eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND +IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu +QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui +me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm +RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ +OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G +O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF +BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI +KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh +c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw +HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX +hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV +Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw +6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF +6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e +Pr3WHV1wA7EY6oT4zBx+2gT9XBTB +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE +ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE +AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT +aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl +KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX +GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj +93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ +P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow +ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g +ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN +W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB +IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB +ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA +ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb +MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv +J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW +pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J +HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln +bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo +VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs +Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI +iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD +VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 +oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey +LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF +BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi +UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg +T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 +b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS +C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw +CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt +iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M +eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 +iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp +ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv +hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg +U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN +MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G +A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD +ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts +YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO +4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF +KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL +/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw +EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 +dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh +My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB +BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g +IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 +IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 +dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM +GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ +MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq +bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ +xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU +upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk +GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug +5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma +M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ +HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW +Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 +JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x +W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE +82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx +UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan +ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 +2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV +tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue +Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA +iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE +OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db +w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC +3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM +ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 +7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG +dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF +JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz +1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw +OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu +ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks +ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX +REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D +CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU +YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP +l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 +MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz +dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg +Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg +Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt +L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN +AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI +cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 +CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW +ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB +KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX +DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 +IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg +U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd +uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v +LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c +ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w +bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM +MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH +AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr +YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC +ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf +MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO +Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB +vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGFTCCBX6gAwIBAgIBEDANBgkqhkiG9w0BAQUFADCBvjELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE +ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z +dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq +hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDYwODE2MjA0NjUy +WhcNMTYwODEzMjA0NjUyWjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh +bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g +dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKSG9zdG1hc3RlcjEeMBwGA1UE +AxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZob3N0bWFz +dGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +uTlCOrOYvCe0Qszlz90rVIQkS2UDa7R+qCTkRE5ipKC+3OZXGgv2EOYk/IOuCE3D +8+tlTAl8MwvmwOHgL0GWnjoluR95narhNiV9Px8xyL2Z8kctwrWXbEii0Ot48VcN +IQMDW5GK8Ww5puMKZr8+bXF2HFzkt8gwaCtrojcF4fLGcm3//bR13CKWbOzacANZ +gAi00pD70ppjJU/uNVOe5HX6x/Id+50G6jwasanEzhteYJdbbHaMqrL4J6XbTwgJ +ZciB0ifOZkwTBvQiRJpTkTWPyn/HptMbJGOwwiNbcgtWV7QVLW1GB3HYVum47Zwp +XcXVM4Fs4XLwfx1Ti87LGdAJJYDS5K1F2prHKW5MsmFLJg61Nd6dZPRDLJLaOPEq +0Jxa1NdfDjJ8rXOIcuLRAozjBui23vUhfOW9z4kpVIg+c+ylV2Oh/7f+fO731P7E +AqsTFmiU7svcvkm2OKslolpnQ+pqGFLM4laQE/Q0kjogm7LiOpRssBW/ZfZ7pPLZ +Ru0/AXrgKwQIM8mLazwlD3wHKPRElhIkxSv4qZ95zgJo6ky/7BpzZ/OAlz3BICbN +WQhW/MBQVFiC6ivhjDq3AzgyykLShB0eIMRN0SBfTy3/aNfIJbqLmTNookXPoSP7 ++mg5OVzVBvDv5ZskWSl8kJB1DzJbN+DOr/i8V3Ugl90CAwEAAaOCAZ0wggGZMB0G +A1UdDgQWBBTON+buqfoMXkWdtvObUS11tnY77DCB6wYDVR0jBIHjMIHggBQHrehB +HX+91r8bgXo/jEuI3gTS+qGBxKSBwTCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEg +MB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEW +Fmhvc3RtYXN0ZXJAc3BpLWluYy5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zARBglg +hkgBhvhCAQEEBAMCAQYwCQYDVR0SBAIwADArBglghkgBhvhCAQ0EHhYcVGlueUNB +IEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAhBgNVHREEGjAYgRZob3N0bWFzdGVyQHNw +aS1pbmMub3JnMAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQA5HQcqwPE/ +RaN8cb8H1G34rkvSEsj4l8UIivMFEWIKnF3SQT8KVcD7j/eJuhMazwRlTs8Rnu6V +/uTC10w7SS6gELwDqAzR4PiXTzfkW8OJemyQn6JWXKfq2pR1n4fvwEn7htjeNS69 +iFKlFXyE9j2jhGaps1CKHfe1YX0MuwO4Jw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE +ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z +dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq +hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 +WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh +bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g +dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE +AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt +YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 +rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL +VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 +I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV +HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ +vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ +bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl +IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe +BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW +iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms +1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= +-----END CERTIFICATE----- diff --git a/gcr/fixtures/cacert.org.cer b/gcr/fixtures/cacert.org.cer new file mode 100644 index 0000000..719b0ff Binary files /dev/null and b/gcr/fixtures/cacert.org.cer differ diff --git a/gcr/fixtures/cacert.org.pem b/gcr/fixtures/cacert.org.pem new file mode 100644 index 0000000..e7dfc82 --- /dev/null +++ b/gcr/fixtures/cacert.org.pem @@ -0,0 +1,41 @@ +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- diff --git a/gcr/fixtures/cert-ecc521.pem b/gcr/fixtures/cert-ecc521.pem new file mode 100644 index 0000000..3fc1778 --- /dev/null +++ b/gcr/fixtures/cert-ecc521.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDJDCCAsmgAwIBAgIBBzAKBggqhkjOPQQDAjB9MQswCQYDVQQGEwJCRTEPMA0G +A1UEChMGR251VExTMSUwIwYDVQQLExxHbnVUTFMgY2VydGlmaWNhdGUgYXV0aG9y +aXR5MQ8wDQYDVQQIEwZMZXV2ZW4xJTAjBgNVBAMTHEdudVRMUyBjZXJ0aWZpY2F0 +ZSBhdXRob3JpdHkwIhgPMjAxMjA5MDEwOTIyMjRaGA8yMDE5MTAwNTA5MjIyNFow +gbgxCzAJBgNVBAYTAkdSMRIwEAYDVQQKEwlLb2tvIGluYy4xFzAVBgNVBAsTDnNs +ZWVwaW5nIGRlcHQuMQ8wDQYDVQQIEwZBdHRpa2kxFTATBgNVBAMTDENpbmR5IExh +dXBlcjEXMBUGCgmSJomT8ixkAQETB2NsYXVwZXIxDDAKBgNVBAwTA0RyLjEPMA0G +A1UEQRMGamFja2FsMRwwGgYJKoZIhvcNAQkBFg1ub25lQG5vbmUub3JnMIGbMBAG +ByqGSM49AgEGBSuBBAAjA4GGAAQAoapA9bLQHQiI8V2mIzs9sq80VR4FBB0TBOSx +GqBOE3FSzHAejQkIKc/1pW0v0wKvapYMq/RrfhPJxPkjTPtztUsAkU//9E0/aoEW +VC6Rqf+VX3wIhe7+RS8JXdBh9SM0+Z9MCRUiM8K9qPMtpNgB2ks7T5BGFHSMlNKm +uLW1agWPy5CjgbYwgbMwDAYDVR0TAQH/BAIwADA9BgNVHREENjA0ggx3d3cubm9u +ZS5vcmeCE3d3dy5tb3JldGhhbm9uZS5vcmeCCWxvY2FsaG9zdIcEwKgBATATBgNV +HSUEDDAKBggrBgEFBQcDATAPBgNVHQ8BAf8EBQMDB4AAMB0GA1UdDgQWBBTagKMW +kYyqTJk/RRjg++gqz6xX6zAfBgNVHSMEGDAWgBTwtIH+mBK/tSi5ZEADy8wfZk4o +AzAKBggqhkjOPQQDAgNJADBGAiEAoj/ZB98cG/FaA7VVU+R6+TT3icF+De61rfim +R43VMlUCIQCXjG9gRp0x+/8vCRL0/nr0a32SRPruKVDqbHnNiWchsg== +-----END CERTIFICATE----- diff --git a/gcr/fixtures/cert-ecc521.pub b/gcr/fixtures/cert-ecc521.pub new file mode 100644 index 0000000..3357575 --- /dev/null +++ b/gcr/fixtures/cert-ecc521.pub @@ -0,0 +1,7 @@ +-----BEGIN PUBLIC KEY----- +MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAoapA9bLQHQiI8V2mIzs9sq80VR4F +BB0TBOSxGqBOE3FSzHAejQkIKc/1pW0v0wKvapYMq/RrfhPJxPkjTPtztUsAkU// +9E0/aoEWVC6Rqf+VX3wIhe7+RS8JXdBh9SM0+Z9MCRUiM8K9qPMtpNgB2ks7T5BG +FHSMlNKmuLW1agWPy5A= +-----END PUBLIC KEY----- + diff --git a/gcr/fixtures/client.crt b/gcr/fixtures/client.crt new file mode 100644 index 0000000..a4bc2fc Binary files /dev/null and b/gcr/fixtures/client.crt differ diff --git a/gcr/fixtures/client.key b/gcr/fixtures/client.key new file mode 100644 index 0000000..206f527 --- /dev/null +++ b/gcr/fixtures/client.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAwSA0Mz92De30Mc0A/P9vzstLERoqGhnwBw0HKbcsQ50KdcYS +cp/Rv2WRPlxpe7kYAzzhqFMInufv1FU2uoYozuNsF1Jf5lR+SolA+E5cPb7SeJhC +Jwf3afPvyTGaOVuLO93d8zUGU74L/741Z/YQCE5FUCO8msc2iQmnc9M1EnVZa14d +5T0/B8aZYcpVzUiC9EUwfTzrTghnNfkJzEiD9vnqDbsDsIE+H8o7+opMMsUU0ZzV +PZqy9j8/f4943rL6V4UdK0JO7tEGL+XiFzNl2fCrcEZPqaeMQ3vBq7azukDTrtJe +KY06RiLl+DCykweLx8laZjIHKlSZAFHPB+bvsQIDAQABAoIBAQCQUI1RYnHIdPFO +qZ+8bvDQ+g8tR30ApjM8QZsBrDRyjg579bhhWVY2jSJdFFdqseTkvoDt9KZzgGQy +Kj9MYOZru3xRbSfmiWsaLbiUFJJPPaIvpa+BVS2oSjX8BYn2pJbF9MRfclc5CsIS +qMNl3XUbj8mx2hKdIpJ5EvLD1adKE4Se6peqSZAmEHONNCsrMrQ0GSQqV3viInJr +tc3kp3HcPffSROWqmc6jAJ77Cs3ApgJavL5RGjx30Kd+dKVq4PXZ+IhWM8dOSput +wcyxEosiP/W2g0rDgNW2mGOVOwa/D5SnOolicHifdV7idjwLAjkyYgvmBMNSsECj +yKBkE0gxAoGBAN8iHMumyvriHuj9bSLZ1bcyYFz7jIwUxpHTT7VqN/j/Y1BoBIBy +ZZLDGMa+ID/brpRHzJQAKSNtbFQ0S1HTSKcFud5OWE8Rp3pQJU+sdeO3pCMWAD1z +Q4ggF07JjTSSnK+4fcXgEN9P2OdfXy7Rj3HFpSahql55Kp5udoUdzUVFAoGBAN2S +krlcEuqsEYjqsCJw5pctIwPMvCM51JgirrdETwSGquMklSrobH0PHMlR67gsA/9I +UGShT0LL4UWYpBn/4xLrLbua5aHIBfQQZp9K6jDZddWS+EFL5JkO/Up4/qM6fUbH +CuweVv1gd6i2Ti35K60mgx6MqVunaB1k8Q9P3Pl9AoGALSVtxha9Qv21W1bLWh3R +C/v5W1baHQ2nD6I9omsXYB3sLjydjI+Y1ZT70lptk/4S2JWeYuOVb0GYhYD/LFMf +hAu4i642V+kuhaTpp7ExOR3S6/ZrngNQSp6TmLFXDKgNY9BkQkEPqN8y971oOMTV +zSM8QxC6s9q4MM4Q1OYuvjECgYEAsO2V1AW95T45Ukd1FktpFlaomyQlJ0vKgyFO +unEFV+vhETfpFTY7SzGCHxAXVh1vo62u5Gwayo/a9qQIhepa/IRnJGNv8luyxU1D +ZPeBQjija0PMkPd1NvNNNuafDuBpoNbX1ev0MqeRZVsN2pAZXE5gbUiNA+8NqEsu +Yre3EFECgYEA13rXE76zZgsefx+2spjqJDUWEmTDd1460xTtxCCgL9dy4rW5bgwo +MvINphSUXOwSkn8Oja/IvpN28zSj9W/ci5wU52P5w4blkBmuj8UoCjP2FN1b1OBa +86mkwVsCYUyyI2apuwrHP77yeb8jXZb+reqSns3hU+HyO/nUTVmnews= +-----END RSA PRIVATE KEY----- diff --git a/gcr/fixtures/client.pem b/gcr/fixtures/client.pem new file mode 100644 index 0000000..04bc8ac --- /dev/null +++ b/gcr/fixtures/client.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC3DCCAkUCAQkwDQYJKoZIhvcNAQEFBQAwgYYxEzARBgoJkiaJk/IsZAEZFgND +T00xFzAVBgoJkiaJk/IsZAEZFgdFWEFNUExFMR4wHAYDVQQLExVDZXJ0aWZpY2F0 +ZSBBdXRob3JpdHkxFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMR0wGwYJKoZIhvcN +AQkBFg5jYUBleGFtcGxlLmNvbTAeFw0xMTAxMTgwNjA0MTFaFw0yMTAxMTUwNjA0 +MTFaMGIxEzARBgoJkiaJk/IsZAEZFgNDT00xFzAVBgoJkiaJk/IsZAEZFgdFWEFN +UExFMQ8wDQYDVQQDEwZDbGllbnQxITAfBgkqhkiG9w0BCQEWEmNsaWVudEBleGFt +cGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMEgNDM/dg3t +9DHNAPz/b87LSxEaKhoZ8AcNBym3LEOdCnXGEnKf0b9lkT5caXu5GAM84ahTCJ7n +79RVNrqGKM7jbBdSX+ZUfkqJQPhOXD2+0niYQicH92nz78kxmjlbizvd3fM1BlO+ +C/++NWf2EAhORVAjvJrHNokJp3PTNRJ1WWteHeU9PwfGmWHKVc1IgvRFMH08604I +ZzX5CcxIg/b56g27A7CBPh/KO/qKTDLFFNGc1T2asvY/P3+PeN6y+leFHStCTu7R +Bi/l4hczZdnwq3BGT6mnjEN7wau2s7pA067SXimNOkYi5fgwspMHi8fJWmYyBypU +mQBRzwfm77ECAwEAATANBgkqhkiG9w0BAQUFAAOBgQA3LuElj2QB9wQvmIxk2Jmb +IPP2/WS8dwPoCv/N3+6nTx8yRsrILf4QsnEbbsxoYO5jW4r9Kt8m8B/M7YgnBDE9 +zlm7JbXKZf2isSm5TyT627Ymzxrzs5d+7o2eS7SN1DB6PyvRh2ye7EMbyEYD8ULi +itDUkYkssNCVivYwVvJoMg== +-----END CERTIFICATE----- diff --git a/gcr/fixtures/client.spk b/gcr/fixtures/client.spk new file mode 100644 index 0000000..09ab6b9 Binary files /dev/null and b/gcr/fixtures/client.spk differ diff --git a/gcr/fixtures/collabora-ca.cer b/gcr/fixtures/collabora-ca.cer new file mode 100644 index 0000000..2842c69 Binary files /dev/null and b/gcr/fixtures/collabora-ca.cer differ diff --git a/gcr/fixtures/der-certificate-dsa.cer b/gcr/fixtures/der-certificate-dsa.cer new file mode 100755 index 0000000..024f3c1 Binary files /dev/null and b/gcr/fixtures/der-certificate-dsa.cer differ diff --git a/gcr/fixtures/der-certificate.crt b/gcr/fixtures/der-certificate.crt new file mode 100644 index 0000000..56fa849 Binary files /dev/null and b/gcr/fixtures/der-certificate.crt differ diff --git a/gcr/fixtures/der-dsa-1024.key b/gcr/fixtures/der-dsa-1024.key new file mode 100644 index 0000000..61af525 Binary files /dev/null and b/gcr/fixtures/der-dsa-1024.key differ diff --git a/gcr/fixtures/der-ec-256.key b/gcr/fixtures/der-ec-256.key new file mode 100644 index 0000000..6486af6 Binary files /dev/null and b/gcr/fixtures/der-ec-256.key differ diff --git a/gcr/fixtures/der-key-PBE-MD5-DES.p8 b/gcr/fixtures/der-key-PBE-MD5-DES.p8 new file mode 100644 index 0000000..71b7d61 Binary files /dev/null and b/gcr/fixtures/der-key-PBE-MD5-DES.p8 differ diff --git a/gcr/fixtures/der-key-PBE-SHA1-3DES.p8 b/gcr/fixtures/der-key-PBE-SHA1-3DES.p8 new file mode 100644 index 0000000..1c37fe1 Binary files /dev/null and b/gcr/fixtures/der-key-PBE-SHA1-3DES.p8 differ diff --git a/gcr/fixtures/der-key-PBE-SHA1-DES.p8 b/gcr/fixtures/der-key-PBE-SHA1-DES.p8 new file mode 100644 index 0000000..9989613 Binary files /dev/null and b/gcr/fixtures/der-key-PBE-SHA1-DES.p8 differ diff --git a/gcr/fixtures/der-key-PBE-SHA1-RC2-40.p8 b/gcr/fixtures/der-key-PBE-SHA1-RC2-40.p8 new file mode 100644 index 0000000..820926c Binary files /dev/null and b/gcr/fixtures/der-key-PBE-SHA1-RC2-40.p8 differ diff --git a/gcr/fixtures/der-key-PBE-SHA1-RC4-128.p8 b/gcr/fixtures/der-key-PBE-SHA1-RC4-128.p8 new file mode 100644 index 0000000..2888450 Binary files /dev/null and b/gcr/fixtures/der-key-PBE-SHA1-RC4-128.p8 differ diff --git a/gcr/fixtures/der-key-dsa.p8 b/gcr/fixtures/der-key-dsa.p8 new file mode 100644 index 0000000..8b61684 Binary files /dev/null and b/gcr/fixtures/der-key-dsa.p8 differ diff --git a/gcr/fixtures/der-key-encrypted-pkcs5.p8 b/gcr/fixtures/der-key-encrypted-pkcs5.p8 new file mode 100644 index 0000000..68c6b4a Binary files /dev/null and b/gcr/fixtures/der-key-encrypted-pkcs5.p8 differ diff --git a/gcr/fixtures/der-key-v2-des.p8 b/gcr/fixtures/der-key-v2-des.p8 new file mode 100644 index 0000000..4cd8034 Binary files /dev/null and b/gcr/fixtures/der-key-v2-des.p8 differ diff --git a/gcr/fixtures/der-key-v2-des3.p8 b/gcr/fixtures/der-key-v2-des3.p8 new file mode 100644 index 0000000..9e2999c Binary files /dev/null and b/gcr/fixtures/der-key-v2-des3.p8 differ diff --git a/gcr/fixtures/der-key.p8 b/gcr/fixtures/der-key.p8 new file mode 100644 index 0000000..1650563 Binary files /dev/null and b/gcr/fixtures/der-key.p8 differ diff --git a/gcr/fixtures/der-rsa-1024.key b/gcr/fixtures/der-rsa-1024.key new file mode 100644 index 0000000..878fda5 Binary files /dev/null and b/gcr/fixtures/der-rsa-1024.key differ diff --git a/gcr/fixtures/der-rsa-2048.p10 b/gcr/fixtures/der-rsa-2048.p10 new file mode 100644 index 0000000..6355622 Binary files /dev/null and b/gcr/fixtures/der-rsa-2048.p10 differ diff --git a/gcr/fixtures/der-rsa-2048.spkac b/gcr/fixtures/der-rsa-2048.spkac new file mode 100644 index 0000000..f3b3781 Binary files /dev/null and b/gcr/fixtures/der-rsa-2048.spkac differ diff --git a/gcr/fixtures/dhansak-collabora.cer b/gcr/fixtures/dhansak-collabora.cer new file mode 100644 index 0000000..c411e7d Binary files /dev/null and b/gcr/fixtures/dhansak-collabora.cer differ diff --git a/gcr/fixtures/ecc-strong.crt b/gcr/fixtures/ecc-strong.crt new file mode 100644 index 0000000..7c61572 Binary files /dev/null and b/gcr/fixtures/ecc-strong.crt differ diff --git a/gcr/fixtures/ecc-strong.key b/gcr/fixtures/ecc-strong.key new file mode 100644 index 0000000..6395df3 Binary files /dev/null and b/gcr/fixtures/ecc-strong.key differ diff --git a/gcr/fixtures/ecc-strong.spk b/gcr/fixtures/ecc-strong.spk new file mode 100644 index 0000000..5a495d8 Binary files /dev/null and b/gcr/fixtures/ecc-strong.spk differ diff --git a/gcr/fixtures/ecc256.pem b/gcr/fixtures/ecc256.pem new file mode 100644 index 0000000..75a2cfa --- /dev/null +++ b/gcr/fixtures/ecc256.pem @@ -0,0 +1,37 @@ +Public Key Info: + Public Key Algorithm: EC + Key Security Level: High + +curve: SECP256R1 +private key: + 00:fd:2b:00:80:f3:36:5f:11:32:65:e3:8d:30:33: + 3b:47:f5:ce:f8:13:e5:4c:c2:cf:fd:e8:05:6a:ca: + c9:41:b1: +x: + 3c:15:6f:1d:48:3e:64:59:13:2c:6d:04:1a:38:0d: + 30:5c:e4:3f:55:cb:d9:17:15:46:72:71:92:c1:f8: + c6:33: +y: + 3d:04:2e:c8:c1:0f:c0:50:04:7b:9f:c9:48:b5:40: + fa:6f:93:82:59:61:5e:72:57:cb:83:06:bd:cc:82: + 94:c1: + +Public Key ID: AC:FA:47:67:C6:1B:41:79:12:57:F7:AC:05:C1:50:E2:8E:D0:0E:5B +Public key's random art: ++--[ EC 256]----+ +| .o+==..| +| .+o...+.| +| o.Eo. +| +| . *.o o | +| S.o.. . | +| .. * | +| .. + o | +| . . . | +| .... | ++-----------------+ + +-----BEGIN EC PRIVATE KEY----- +MHgCAQEEIQD9KwCA8zZfETJl440wMztH9c74E+VMws/96AVqyslBsaAKBggqhkjO +PQMBB6FEA0IABDwVbx1IPmRZEyxtBBo4DTBc5D9Vy9kXFUZycZLB+MYzPQQuyMEP +wFAEe5/JSLVA+m+TgllhXnJXy4MGvcyClME= +-----END EC PRIVATE KEY----- diff --git a/gcr/fixtures/email.p12 b/gcr/fixtures/email.p12 new file mode 100644 index 0000000..d45d0f8 Binary files /dev/null and b/gcr/fixtures/email.p12 differ diff --git a/gcr/fixtures/generic-dsa.crt b/gcr/fixtures/generic-dsa.crt new file mode 100644 index 0000000..5658a20 Binary files /dev/null and b/gcr/fixtures/generic-dsa.crt differ diff --git a/gcr/fixtures/generic-dsa.key b/gcr/fixtures/generic-dsa.key new file mode 100644 index 0000000..cdd7ca5 --- /dev/null +++ b/gcr/fixtures/generic-dsa.key @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQCdLeaVVA8HNMKFr0UUQe/bj6mJvO+I67hxn/KzCWnMjw9h6vtu +TI06OI4XXmEHCVdUxykTkp1NSaTanoV8seEbJyyUgFQFBVaFOE8xDHp5RZghAKpd +XFP2Yn8wj8y2VYSOveFKXj9ySj9A38nbG8mF0imBXNg/nL/EPCynR7JBVwIVAM1D +KUetENlaaH+QeAO3IwcENMSZAoGBAJFujxH2WB5bU+sjjePwBTRev6qtYzPAXPd+ +srC747afIasS0Q/+pE0Q40bjdGNipf3fs5Cq8s0tYTYeNzAqUej1X5YI7TP+uJyR +L7QdD06pg1BbdaAzSxnnGjf2b25IvPRdxgy1XetgOmT+qA8nXeLROgTLNOQqxG83 +ymuMi/w7AoGAfXLlo8mCQgAGy7y32k/2Onv8LXAL5hcQUEM7WQhHkU2QaXgh7sqm +Ol4vvM97YZi5JIlR0wjP7+dZiJJnYSY5PMaGpAIk7hLGsPbJW6TnozAXwCPli1Xu +ocubvrDWjZ/zSesnO3siGPCIuP97IqVbBKGQG/vJUwFL0ewb/+FUa78CFHgQdcw2 +4vVlnuMrqdmrfXMvzbrw +-----END DSA PRIVATE KEY----- diff --git a/gcr/fixtures/generic-dsa.pem b/gcr/fixtures/generic-dsa.pem new file mode 100644 index 0000000..0d81ef2 --- /dev/null +++ b/gcr/fixtures/generic-dsa.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDkjCCAvugAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBhjETMBEGCgmSJomT8ixk +ARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUxHjAcBgNVBAsTFUNlcnRp +ZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5jb20xHTAbBgkq +hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTA3MTIyMDE4NDc0N1oXDTA4MDEx +OTE4NDc0N1owbDETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUGCgmSJomT8ixkARkW +B0VYQU1QTEUxFDASBgNVBAMTC0dlbmVyaWMgRFNBMSYwJAYJKoZIhvcNAQkBFhdn +ZW5lcmljLWRzYUBleGFtcGxlLmNvbTCCAbcwggEsBgcqhkjOOAQBMIIBHwKBgQCd +LeaVVA8HNMKFr0UUQe/bj6mJvO+I67hxn/KzCWnMjw9h6vtuTI06OI4XXmEHCVdU +xykTkp1NSaTanoV8seEbJyyUgFQFBVaFOE8xDHp5RZghAKpdXFP2Yn8wj8y2VYSO +veFKXj9ySj9A38nbG8mF0imBXNg/nL/EPCynR7JBVwIVAM1DKUetENlaaH+QeAO3 +IwcENMSZAoGBAJFujxH2WB5bU+sjjePwBTRev6qtYzPAXPd+srC747afIasS0Q/+ +pE0Q40bjdGNipf3fs5Cq8s0tYTYeNzAqUej1X5YI7TP+uJyRL7QdD06pg1BbdaAz +SxnnGjf2b25IvPRdxgy1XetgOmT+qA8nXeLROgTLNOQqxG83ymuMi/w7A4GEAAKB +gH1y5aPJgkIABsu8t9pP9jp7/C1wC+YXEFBDO1kIR5FNkGl4Ie7KpjpeL7zPe2GY +uSSJUdMIz+/nWYiSZ2EmOTzGhqQCJO4SxrD2yVuk56MwF8Aj5YtV7qHLm76w1o2f +80nrJzt7IhjwiLj/eyKlWwShkBv7yVMBS9HsG//hVGu/oxAwDjAMBgNVHRMBAf8E +AjAAMA0GCSqGSIb3DQEBBQUAA4GBAPRyHCHjWKKVHZ7wSJQOS/Ve8e4DWFiuP9J8 +X4/sXEg59yWjScy9EovZVj5iELZI6OqUArvwVV6w6tewK0BAed4UGp+TyTHjPuJG +WGxBm2AhtZUlYmpHQ+gA+E9weeFNQWP1QOATmFQ+r18eNH0rUONnR3G0XUYQTgd1 +LgEYxM4t +-----END CERTIFICATE----- diff --git a/gcr/fixtures/generic-dsa.spk b/gcr/fixtures/generic-dsa.spk new file mode 100644 index 0000000..161391c Binary files /dev/null and b/gcr/fixtures/generic-dsa.spk differ diff --git a/gcr/fixtures/gnupg-homedir/gpg.conf b/gcr/fixtures/gnupg-homedir/gpg.conf new file mode 100644 index 0000000..e1479ae --- /dev/null +++ b/gcr/fixtures/gnupg-homedir/gpg.conf @@ -0,0 +1 @@ +no-auto-check-trustdb diff --git a/gcr/fixtures/gnupg-homedir/pubring.gpg b/gcr/fixtures/gnupg-homedir/pubring.gpg new file mode 100644 index 0000000..10b1372 Binary files /dev/null and b/gcr/fixtures/gnupg-homedir/pubring.gpg differ diff --git a/gcr/fixtures/gnupg-homedir/secring.gpg b/gcr/fixtures/gnupg-homedir/secring.gpg new file mode 100644 index 0000000..4a21e26 Binary files /dev/null and b/gcr/fixtures/gnupg-homedir/secring.gpg differ diff --git a/gcr/fixtures/gnupg-homedir/trustdb.gpg b/gcr/fixtures/gnupg-homedir/trustdb.gpg new file mode 100644 index 0000000..3824098 Binary files /dev/null and b/gcr/fixtures/gnupg-homedir/trustdb.gpg differ diff --git a/gcr/fixtures/gnupg-mock/mock-arguments-environ b/gcr/fixtures/gnupg-mock/mock-arguments-environ new file mode 100755 index 0000000..5282a2f --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-arguments-environ @@ -0,0 +1,22 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +while getopts '1:2:' arg; do + case $arg in + 1) + echo $OPTARG + ;; + 2) + echo $OPTARG + ;; + *) + echo "invalid argument: $arg" + exit 2 + ;; + esac +done + +echo -n $ENVIRON1 >&2 +echo $ENVIRON2 >&2 diff --git a/gcr/fixtures/gnupg-mock/mock-echo b/gcr/fixtures/gnupg-mock/mock-echo new file mode 100755 index 0000000..7c4e251 --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-echo @@ -0,0 +1,8 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +while read line; do + echo "$line" +done diff --git a/gcr/fixtures/gnupg-mock/mock-fail-exit b/gcr/fixtures/gnupg-mock/mock-fail-exit new file mode 100755 index 0000000..4d5634b --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-fail-exit @@ -0,0 +1,6 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +exit $1 diff --git a/gcr/fixtures/gnupg-mock/mock-fail-signal b/gcr/fixtures/gnupg-mock/mock-fail-signal new file mode 100755 index 0000000..decf8a4 --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-fail-signal @@ -0,0 +1,8 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +echo $1 > /tmp/xxx +kill -s $1 $$ +sleep 5 diff --git a/gcr/fixtures/gnupg-mock/mock-simple-error b/gcr/fixtures/gnupg-mock/mock-simple-error new file mode 100755 index 0000000..30bb6a9 --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-simple-error @@ -0,0 +1,9 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +echo -n "line 1: " >&2 +echo "more line 1" >&2 +echo "line 2" >&2 +echo "line 3" >&2 \ No newline at end of file diff --git a/gcr/fixtures/gnupg-mock/mock-simple-output b/gcr/fixtures/gnupg-mock/mock-simple-output new file mode 100755 index 0000000..0d145fc --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-simple-output @@ -0,0 +1,8 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +echo -n "simple-" +echo -n "outp" +echo "ut" \ No newline at end of file diff --git a/gcr/fixtures/gnupg-mock/mock-status-and-attribute b/gcr/fixtures/gnupg-mock/mock-status-and-attribute new file mode 100755 index 0000000..abf8607 --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-status-and-attribute @@ -0,0 +1,34 @@ +#!/bin/bash + +# This script is used with test-gnupg-process +# Needs to be run with /bin/bash in order to handle two digit +# file descriptor redirects + +set -euf + +SFD= +AFD= + +# Not real 'long' option parsing, but good enough for this +while [ $# -gt 1 ]; do + if [ "$1" = --status-fd ]; then + SFD=$2 + shift + elif [ "$1" = --attribute-fd ]; then + AFD=$2 + shift + fi + shift +done + +# No FD passed :( +if [ -z "$AFD" ]; then + exit 22 +fi +if [ -z "$SFD" ]; then + exit 23 +fi + +echo -n "1lc923g4laoeurc23rc2" >&$AFD +echo "[GNUPG:] SCHEMA one two three four " >&$SFD +echo -n "41lcg2r23c4gr3" >&$AFD diff --git a/gcr/fixtures/gnupg-mock/mock-status-and-output b/gcr/fixtures/gnupg-mock/mock-status-and-output new file mode 100755 index 0000000..0fd544b --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-status-and-output @@ -0,0 +1,24 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +FD= + +# Not real 'long' option parsing, but good enough for this +while [ $# -gt 1 ]; do + if [ "$1" = --status-fd ]; then + FD=$2 + shift + fi + shift +done + +# No FD passed :( +if [ -z "$FD" ]; then + exit 22 +fi + +echo "Here's some output" +echo "[GNUPG:] SCHEMA one two three four " >&$FD +echo "More output" diff --git a/gcr/fixtures/gnupg-mock/mock-with-homedir b/gcr/fixtures/gnupg-mock/mock-with-homedir new file mode 100755 index 0000000..c537e03 --- /dev/null +++ b/gcr/fixtures/gnupg-mock/mock-with-homedir @@ -0,0 +1,22 @@ +#!/bin/sh + +# This script is used with test-gnupg-process +set -euf + +HOMEDIR= + +# Not real 'long' option parsing, but good enough for this +while [ $# -gt 1 ]; do + if [ "$1" = --homedir ]; then + HOMEDIR=$2 + shift + fi + shift +done + +# No homedir passed :( +if [ -z "$HOMEDIR" ]; then + exit 22 +fi + +echo "DIR: $HOMEDIR" diff --git a/gcr/fixtures/jabber-server.cer b/gcr/fixtures/jabber-server.cer new file mode 100644 index 0000000..086b3ae Binary files /dev/null and b/gcr/fixtures/jabber-server.cer differ diff --git a/gcr/fixtures/openssh_keys.pub b/gcr/fixtures/openssh_keys.pub new file mode 100644 index 0000000..00d294b --- /dev/null +++ b/gcr/fixtures/openssh_keys.pub @@ -0,0 +1,2 @@ +ssh-dss AAAAB3NzaC1kc3MAAACBAL4z+ad0ZJYzMOQuGp00UJ+AijKhrPVUEYLcxBmFQonb/KIlLSWJua4Rl9DB4tDj30Y9c/oApqC4n+FIYlUZMSnxmpvcLF6aeXOiHHPvm0EDYjjyVubyYQWI7CROrrzSc+x++ha3TuJEvF3PlKlZmTKKVYEkZNjwFqYysGyPxPalAAAAFQDtDSEF9Gvnv5fQtSbbsp7j78uVBwAAAIAtNpAg/Mbd/E2241enedB9AxAbJWZ5QYnoPe6/zx5dOmU7+qz8mG6tgvF8F7IgXPabuAKslzTDGS3zgaEhWicDS3CIYik2UR8hXdxfovIEqZKZe7u02FCEoXYCEiFUAdzDGzjI7PswgtEJWWNqKeNis3HmDDha9lMkqz/3fLZGXwAAAIEAiaRPYKZDMoJG+aVZ5A3R/m2gl+mYE2MsjPKXuBKcrZ6ItA9BMe4G/An0/+E3A+DuoGxdeNNMF8U9Dy2N8Sch/Ngtg2E/FBo5geljWobJXd1jxmPtF2WAliYJXDdIt6RBVPGL9H/KSjDmBMsVd42wxVJywawzypklVZjSUuWuBMI= dsa-key@example.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCs8z2y0cCPYRAPkq8tAt6FC/kdfnR/p8B2ZoY0oiLNt7kQEwJfexgwLqTxWYd2fSDUSSDPrsqAxZAwLLS/eF04kXiJO2VfqAWFpTLNToERHpFF1yZQe26ELTlNNfna7LqfCRvpNDwu6AqndsT3eFt7DWvBDXbbEiTLW21Z2OFAAH/J2iCFn4c0a8Myf7IaMYcy5GG3mpk39kEO4aNV/67U7kfooek24ObwD0vlXzlsi5VZIUFOIUi0UdkNEMCtUWpfkZ1STUlmwp9HVM7xb7/9PESQKDnZdxpB09S9cIjdpDecpDlMDDEbEUECM1PIas3ndhB7gAN1i2JsPHTcXZ1 rsa-key@example.com diff --git a/gcr/fixtures/pem-dsa-1024.key b/gcr/fixtures/pem-dsa-1024.key new file mode 100644 index 0000000..ccb1e7b --- /dev/null +++ b/gcr/fixtures/pem-dsa-1024.key @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQCQ7Atgc1g5x1Tq+PZLsD/DU5jWl3K/rlQAed6i06Yfr/snYwoD +igGj0M1ioQdFpXSifstGL08IhbecYbvpVKYKKWaK1Uu6XAenL9ixEFJJZwsznfLF +nmSkcGTvzwtyNsXHLNVc6zKRdDC+yaAD1OSE+6qE15Vxs41rWslbtz4/ewIVAPoh +ShOFwhv+uq2rJAokMMYH1WJxAoGALeBXUfXa7pfz1DxUWVo+lKCAco8MZsmK6+1X +YvarFVgC2DWerR3h7DakWfvu6kjlm55qjLT1KVk2s8yIGl2VfHM5F14s/+DzDTcR +5DDbZkjC60dKoQpKMpdFBTH/LHxpUSIMnURra2sPACYuHr6zzIYUdqpRjMVVyav5 +5fOQI/wCgYBUc0RR23nU7t8LvOvUO7bLt7hYRgO5VwgAdd0xjrWwJm1LINxe/zdr +38TqKYOx9/AqOe1MYZ7WhxJyn/87fGlq3RttdI9WpLS+xcQ4XlKEI6O4iuZebVUA ++Xg556SGJVmCGJw7T6jZQzjHbw5cr8mjCh7XKLufIJHVlOMlCgnqAAIVAIdvhPcJ +1REI37DL+h8cVpwJxBPs +-----END DSA PRIVATE KEY----- diff --git a/gcr/fixtures/pem-pkcs8.key b/gcr/fixtures/pem-pkcs8.key new file mode 100644 index 0000000..1f0d5ed --- /dev/null +++ b/gcr/fixtures/pem-pkcs8.key @@ -0,0 +1,17 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIf4lXzcHXqAICAggA +MBQGCCqGSIb3DQMHBAhV8iKHmoUJDQSCAoDK4fY/dfIzOof1QlYV8mhr0OmhaIAe +aaDz4rER6+OGwq7WQ32ErmHBiJRI8oQRrxy4oHTXx8TR+JxQT1io9V9jjXZCS8HT +Ek0J69pgjPdIUnlZYV1GdJUJq7tWxTKJJFr1tsB0XzgugQLYcui4ikrZ6rHE9PVh +SXFIEbns42xHIvtQ/j3c6ScS63UNpSsKe5pWRNgHUHpjSGPAaZogOdMfStmj3tdN +nIH3mjIM8uisN9nyPV42aziZi5mO9F5JHlNp1H5pDAUWOKkKoXw27MgXnxvSkLAX +HSgpPuK5ejqXu4nkciwHnr4eULV0biwqpmYEWxC4aNuog/t3DoL1gkC74J07jjUU +3gZwxjKsAWfIKnNURsHlBAcYClug5ZWs9ru/4sc27bNV9qRKbHcgGD+nzfTXxZZ2 +BG5eSBVpYT2Jzdkpw8puSHwNW5mQcuY4E+ZEERFsW8q1raPSgYVk5rM8TiVdTD5x +UwQG7ADidVSVTR5KGV8wmonbuDu9b61GgU7VBslEK9Lsd92FO0/u09FF6DgCcICD +yRJ0nM0o9S9FI1lqKoxAdgWyFwrKkBVZ05IDHw+jS6r7D/2irYetPJmVO/dvi87r +aaLvyvzU3nz4LiWHmSl2AgDanjDcxtjGoWR2cc+J0v3r/+VEOctrc5EuAnlhl9Yj +kFcfZDfqthCNb49qNGDgQMGrKTt+Dvrka/ZZxXBN3v96L3K4O32j9c97sZ8LEFaI +RHl91Mx2okjrT9q2+Gef2UR9XEzuFEBRBqxktltlrIQIncn6Xx/TjEvIhf2Dgo4W +isaAwTazyZrzATTWR1JS6Hdm7Eb/nCEHAFmVUbQm0d5BDfKmnRsNaaZK +-----END ENCRYPTED PRIVATE KEY----- diff --git a/gcr/fixtures/pem-rsa-2048.req b/gcr/fixtures/pem-rsa-2048.req new file mode 100644 index 0000000..71bd130 --- /dev/null +++ b/gcr/fixtures/pem-rsa-2048.req @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICpTCCAY0CAQAwYDETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUGCgmSJomT8ixk +ARkWB0VYQU1QTEUxDjAMBgNVBAMTBWVtYWlsMSAwHgYJKoZIhvcNAQkBFhFlbWFp +bEBleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALGK +ZRrbs6E1i+J0P8bpj2I1nxl/hDkezTgIs0V9SGGEFdwLwG2QqsGu9eD58KCA8pJ6 +5tKGXI5XuIozlyw18SfgEL/P4CWWdG99k8Ihyf9UyFP6JE0G0M/8/YDrA1wXaw24 +adOH+CkrZMFgS0DzN39gPu8kggYpyv1re7O4Ls+D2zbELu19j4uDWOAzUY9nRPuI +XUQD/gKpQMlBi8oVH+ts7rLjc2yiTBTqUMU1ioKW7++LFD/CnZLSwg8SDTUsDf3H +Yr8FejAZGEgpBiy00COOIzxjMiDr5XgJHm4iCmh/rt4F2IsmpCFlBRJm4hCTKGSD +yTCRmDY5v27F6SgsbckCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IBAQB312vpA1P4 +Jb35YVmNBtLlUL8OlBLj6hr48NBjkRigHSBeUiKMgUFjbWmTSK1DRddD6hZFTjBm +S1yquCXxh+JMXi957NVHVk8w3fS1ySFpOxXMmZCjT5edgae7VTDBveDBQfAVtTP+ +02VUhdnwZGQAH7mBM8Ml9iHB5rcgS5BsMexu0YH3p7Qi5DBHeVo6CqbguST1Wczm +Faql7m329stKQHf1nCOsSroLWb4qugtZ9rxpQJVIqOxVPxP3tBK1GQg/nM/VwI0l +jMZ8lpn7J77XEYgb+Q642RoXxV8PRLtG4GKeZ13/5LssAsTvS4EkzuhxD+bPAcYu +WXklJECG6mpw +-----END CERTIFICATE REQUEST----- diff --git a/gcr/fixtures/pem-rsa-enc.key b/gcr/fixtures/pem-rsa-enc.key new file mode 100644 index 0000000..65439fe --- /dev/null +++ b/gcr/fixtures/pem-rsa-enc.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,24522D4CE5F5CD7B + +2H/8j0HYUya7LWEUxpgjp/LVcCX7yZB7SoREdoJdcqJEBUMWVxU/2OfVB8EZupmy +7YHcnn5v1JwwtmAXAtqM9JGlvNWaRr1m4zDrhJn1fY3tu8YGtMR49IOZmOUBK+X+ +IxWAwaFDqLntuGZZnAmRJtgFVYVABEs5yM9zgoCGDaU4WMK3caD7Jnw8jH5m0nqQ +XiQ1y1dHxFJmAgG0b5h2z7zjQTmmXd3IhXqSqsE/9ryruCCYa0Z7aAN5oAmO89I9 +gOyy3J4h76mTNFfF5btV4Jllwd4LkgGOmm69UxAyUTGzwYJ5gxgB3xFzGBwpVlcu +72PrQCrjZqZ6rj6cTPGUYzcyMtEw3Xd6mFhApqJpVRZwNWUAMMJwHl2oWwKcIxfV +y+OftRX6kc+cunrxCkl9aKuHDoJPEq+/Uh+AEXqir+942Vull0WPyuWUjaPKR1xJ +poYsNfHRWq+klKCggQQL6jwuVbDLhbaXfgaNBQO1XMracgfmnO1PQPw8JSQ5iOkm +Ybt2oHAEnrEWxZGn1PfRq6Z8HAbBlQpfmG7SMJZdQjlndKA6GR+tN5krKfpj6uak +0eklm0Nb0YcDzJ3qqHXxIimK3Kh/WRZ1hVTnX4mS9u3HNQMo5Ov6z8OQN+Q45ffi +ZDFkVwUTEJ+iwmCG7XnxX0v8Bv5LZmAnPu95KQTp4Ds0AZ6Sp+RqxvhnCO25cgWj ++N5jHGzsDk9/Jw7rAHz8pnl3sziNBWdAk5ASPA28HCQQo5peWnWajM3Pk98+/wHY +blTh7gw77gTake6hpiegnhNUXwGm6BXEqmyu7mPW0z5XFRb9W7bpog== +-----END RSA PRIVATE KEY----- diff --git a/gcr/fixtures/pem-with-attributes.req b/gcr/fixtures/pem-with-attributes.req new file mode 100644 index 0000000..bcbe8f5 --- /dev/null +++ b/gcr/fixtures/pem-with-attributes.req @@ -0,0 +1,64 @@ +Certificate Request: + Data: + Version: 0 (0x0) + Subject: CN=test.example.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c9:45:f5:a6:a6:f6:d1:96:1a:4d:1b:2b:18:a7: + ba:69:4e:90:3b:64:9d:14:71:9a:38:0d:fe:66:89: + cd:c6:34:05:c0:c9:2a:02:22:5f:3e:c9:10:c2:df: + e8:c8:a5:d9:78:20:6a:81:ad:80:b0:16:a2:d1:6b: + e9:ed:2f:95:69:c2:52:2b:db:76:48:00:c9:56:44: + fa:a7:f4:64:a6:7b:08:58:14:b6:2d:3c:c3:6a:80: + 3e:25:48:a8:52:2a:a0:ff:fc:4a:5e:01:05:f8:c3: + 58:db:26:58:8f:42:85:f0:7a:e8:8d:cd:28:a8:c7: + 24:cd:65:6d:26:86:88:f0:8b:ab:a2:58:8b:fc:91: + 45:66:49:03:79:44:f3:d9:d6:0b:49:6c:e6:d2:25: + 83:0c:1e:1f:61:e4:b8:53:ab:c7:8a:58:a6:c1:ce: + a4:04:b4:3f:36:48:d5:02:50:85:b3:2c:4c:af:f7: + 88:85:be:f1:cf:32:db:cd:52:23:90:71:2b:ad:04: + be:18:be:7d:67:4d:0b:bc:d6:92:82:ae:a4:27:98: + f1:72:cc:16:f2:5d:f3:78:fa:76:0d:c5:13:88:a5: + 87:02:3e:41:a2:a2:36:b9:90:07:4f:53:b9:9c:17: + 05:65:9b:da:6d:f4:62:ab:3d:05:7a:8a:fe:e3:c3: + 1e:31 + Exponent: 65537 (0x10001) + Attributes: + Requested Extensions: + X509v3 Subject Alternative Name: + DNS:test.example.com, DNS:other.example.com + Signature Algorithm: sha1WithRSAEncryption + b9:97:4a:53:7e:0f:14:46:ae:d7:6f:fc:1a:33:b1:40:c7:ae: + 64:06:c8:2d:b5:5a:a0:e8:bf:8e:af:92:e1:7d:ad:3c:6b:c0: + c6:d2:cb:c4:98:e7:2c:fa:d6:d5:ee:77:dc:5e:99:9d:33:23: + d0:f7:61:30:ef:86:00:b3:08:4a:24:ce:5a:86:8d:91:95:84: + bc:4b:16:33:46:1e:92:3f:7a:fb:f0:f2:27:c3:07:e3:b0:b6: + 1c:a4:88:ef:69:69:9f:16:fd:4c:79:46:63:f9:84:8a:a7:16: + 8d:80:ee:a5:a8:54:a2:a4:0b:4b:0b:a7:38:a3:e9:d5:14:0f: + 0c:1a:5d:25:93:fa:6e:29:95:71:30:90:ca:15:a2:41:2d:e0: + 97:0b:36:b2:4c:36:66:16:24:3d:26:c0:26:6a:c8:10:57:ca: + 79:b1:b7:ae:e4:95:38:b9:75:66:09:3b:40:31:87:7f:6d:73: + 1f:ee:18:b3:de:c8:9c:11:78:00:eb:56:63:5d:f8:a3:58:aa: + 44:d1:94:50:46:ff:19:77:7e:85:f8:7c:ba:a4:b9:25:3c:8a: + ba:19:c1:10:bc:b6:43:af:ad:60:76:2d:cd:5d:ef:86:4a:1d: + b0:0a:91:8a:20:98:cd:c8:9e:43:d5:7c:9c:a9:e2:8b:f3:86: + fe:a4:00:1a +-----BEGIN CERTIFICATE REQUEST----- +MIICoTCCAYkCAQAwGzEZMBcGA1UEAxMQdGVzdC5leGFtcGxlLmNvbTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMlF9aam9tGWGk0bKxinumlOkDtknRRx +mjgN/maJzcY0BcDJKgIiXz7JEMLf6Mil2XggaoGtgLAWotFr6e0vlWnCUivbdkgA +yVZE+qf0ZKZ7CFgUti08w2qAPiVIqFIqoP/8Sl4BBfjDWNsmWI9ChfB66I3NKKjH +JM1lbSaGiPCLq6JYi/yRRWZJA3lE89nWC0ls5tIlgwweH2HkuFOrx4pYpsHOpAS0 +PzZI1QJQhbMsTK/3iIW+8c8y281SI5BxK60Evhi+fWdNC7zWkoKupCeY8XLMFvJd +83j6dg3FE4ilhwI+QaKiNrmQB09TuZwXBWWb2m30Yqs9BXqK/uPDHjECAwEAAaBB +MD8GCSqGSIb3DQEJDjEyMDAwLgYDVR0RBCcwJYIQdGVzdC5leGFtcGxlLmNvbYIR +b3RoZXIuZXhhbXBsZS5jb20wDQYJKoZIhvcNAQEFBQADggEBALmXSlN+DxRGrtdv +/BozsUDHrmQGyC21WqDov46vkuF9rTxrwMbSy8SY5yz61tXud9xemZ0zI9D3YTDv +hgCzCEokzlqGjZGVhLxLFjNGHpI/evvw8ifDB+OwthykiO9paZ8W/Ux5RmP5hIqn +Fo2A7qWoVKKkC0sLpzij6dUUDwwaXSWT+m4plXEwkMoVokEt4JcLNrJMNmYWJD0m +wCZqyBBXynmxt67klTi5dWYJO0Axh39tcx/uGLPeyJwReADrVmNd+KNYqkTRlFBG +/xl3foX4fLqkuSU8iroZwRC8tkOvrWB2Lc1d74ZKHbAKkYogmM3InkPVfJyp4ovz +hv6kABo= +-----END CERTIFICATE REQUEST----- diff --git a/gcr/fixtures/personal.p12 b/gcr/fixtures/personal.p12 new file mode 100644 index 0000000..7ae3d05 Binary files /dev/null and b/gcr/fixtures/personal.p12 differ diff --git a/gcr/fixtures/prompt-tests/multiple.prompt b/gcr/fixtures/prompt-tests/multiple.prompt new file mode 100644 index 0000000..5f02425 --- /dev/null +++ b/gcr/fixtures/prompt-tests/multiple.prompt @@ -0,0 +1,33 @@ +[three] +type = password +title = Unlock Keyring +message = Enter password for keyring 'sean' to unlock +description = An application wants access to the keyring 'sean', but it is locked +choice-label = Always unlock this keyring whenever I'm logged in. +password-new = false +continue-label = Go +cancel-label = Stop + +[one] +type = password +title = The title +message = The message +description = Description +choice-label = +warning = Make sure you have a good good password + +[two] +type = password +title = New Password +message = Enter a new password here +description = This is a test of the new password prompt +password-new = true +choice-label = + +[four] +type = confirm +title = Question +message = A nice question here +description = This is why you really should be asking this question +warning = +choice-label = diff --git a/gcr/fixtures/prompt-tests/password-choice.prompt b/gcr/fixtures/prompt-tests/password-choice.prompt new file mode 100644 index 0000000..5dfc676 --- /dev/null +++ b/gcr/fixtures/prompt-tests/password-choice.prompt @@ -0,0 +1,8 @@ +[prompt] +type = password +title = Unlock Keyring +message = Enter password for keyring 'xxx' to unlock +description = An application wants to use a password in 'xxx', but it is locked +choice-label = Always unlock this keyring whenever logged in. +password-new = false +continue-label = Unlock diff --git a/gcr/fixtures/pubring.gpg b/gcr/fixtures/pubring.gpg new file mode 100644 index 0000000..10b1372 Binary files /dev/null and b/gcr/fixtures/pubring.gpg differ diff --git a/gcr/fixtures/secring.gpg b/gcr/fixtures/secring.gpg new file mode 100644 index 0000000..4a21e26 Binary files /dev/null and b/gcr/fixtures/secring.gpg differ diff --git a/gcr/fixtures/startcom-ca.cer b/gcr/fixtures/startcom-ca.cer new file mode 100644 index 0000000..b60dea2 Binary files /dev/null and b/gcr/fixtures/startcom-ca.cer differ diff --git a/gcr/fixtures/startcom-intermediate.cer b/gcr/fixtures/startcom-intermediate.cer new file mode 100644 index 0000000..a27a7df Binary files /dev/null and b/gcr/fixtures/startcom-intermediate.cer differ diff --git a/gcr/fixtures/test-x509-swiss.p7b b/gcr/fixtures/test-x509-swiss.p7b new file mode 100755 index 0000000..d45b9e0 Binary files /dev/null and b/gcr/fixtures/test-x509-swiss.p7b differ diff --git a/gcr/fixtures/unclient.p12 b/gcr/fixtures/unclient.p12 new file mode 100644 index 0000000..321b447 Binary files /dev/null and b/gcr/fixtures/unclient.p12 differ diff --git a/gcr/fixtures/usr0052-firefox.p12 b/gcr/fixtures/usr0052-firefox.p12 new file mode 100644 index 0000000..eff8c1e Binary files /dev/null and b/gcr/fixtures/usr0052-firefox.p12 differ diff --git a/gcr/fixtures/werner-koch.asc b/gcr/fixtures/werner-koch.asc new file mode 100644 index 0000000..eb70c97 --- /dev/null +++ b/gcr/fixtures/werner-koch.asc @@ -0,0 +1,71 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.11 (GNU/Linux) + +mQGiBDWiHh4RBAD+l0rg5p9rW4M3sKvmeyzhs2mDxhRKDTVVUnTwpMIR2kIA9pT4 +3No/coPajDvhZTaDM/vSz25IZDZWJ7gEu86RpoEdtr/eK8GuDcgsWvFs5+YpCDwW +G2dx39ME7DN+SRvEE1xUm4E9G2Nnd2UNtLgg82wgi/ZK4Ih9CYDyo0a9awCgisn3 +RvZ/MREJmQq1+SjJgDx+c2sEAOEnxGYisqIKcOTdPOTTie7o7x+nem2uac7uOW68 +N+wRWxhGPIxsOdueMIa7U94Wg/Ydn4f2WngJpBvKNaHYmW8j1Q5zvZXXpIWRXSvy +TR641BceGHNdYiR/PiDBJsGQ3ac7n7pwhV4qex3IViRDJWz5Dzr88x+Oju63KtxY +urUIBACi7d1rUlHr4ok7iBRlWHYXU2hpUIQ8C+UOE1XXT+HB7mZLSRONQnWMyXnq +bAAW+EUUX2xpb54CevAg4eOilt0es8GZMmU6c0wdUsnMWWqOKHBFFlDIvyI27aZ9 +quf0yvby63kFCanQKc0QnqGXQKzuXbFqBYW2UQrYgjXji8rd8bQnV2VybmVyIEtv +Y2ggKGdudXBnIHNpZykgPGRkOWpuQGdudS5vcmc+iGEEExECACECF4AFCQ4Uh/0F +AkG8aF4GCwkIBwMCAxUCAwMWAgECHgEACgkQaLeriVdUjc0EkwCfTXfXdqDS2COs +ZRm0OUphuY0h4x4AnRSlWyPGnKUFxKOw8TwwCSLsdvZHmQGiBDbtSOkRBACURhKn +GIFyXIeX61GAY9hJA5FgG4UalV55ohdz4whBgDzDGLE3XYlO8HCn4ggKilll6MOw +Y0yZeg6PEU9Y3SqTzpQSV6qj2M7MgcS8xOpi6bNCu0iyZUik0KklUXMdI8e/CVmB +pQJT9CofbD1dsP6z4dC6z3jil0+5Wbfw6yIXzwCgy/7Fagq5mN0H760/JEiiXILS +1n0D/3H26lTaxo1vGput9Td1FQN7Vn6YDP0/To5ipsOODROV3zyUwF5QleY+8zTF +JA3qD5KxRfA726WELOF1mB6Mw44UdkPniOoGdMH5oSx6qnNnlVZBBu3U+e1qfQwL +QjHu0WX4Z2q00DKpWLThGv7Loh5NKi6OfTbMhfHoevCAzQnmA/wKc6J8GqthENTh +KXxZaei3Ep0t+PlBmbUzuAYCXZhI6/0KyD6emyQ7LYIaPv9qEfMkMLhxicG0v/AA +wOCBRKS3bkqc6wAYaO0bjUHJvem3HkWPux82t83+6YPyRnVjm/mwt0uEyKSvt7Md +2DVrO3lEcKRkRHiYuf0nonPhl5Rs5bQaV2VybmVyIEtvY2ggPHdrQGdudXBnLm9y +Zz6IawQTEQIAIwIXgAIZAQUJE2uL/wUCQllAcgULBwoDAgMVAgMDFgIBAh4BABIH +ZUdQRwABAQkQXeJJllsDWKI6xwCfV3paxYsk7KQmrtOUxNmZb004OQoAn3uq9imO +pgxqsXhXaLfz5IqZu5O7tBxXZXJuZXIgS29jaCA8d2tAZzEwY29kZS5jb20+iGME +ExECACMCGwMCHgECF4AFCRNri/8FAkJZQHoFCwcKAwIDFQIDAxYCAQAKCRBd4kmW +WwNYouXsAJ9nbkvbiJZvNlzwBL98x7YB+u9fsgCfXE6vHv6DJk7Eh9CY+Gcdn6kC +G8i0C1dlcm5lciBLb2NoiGMEExECABsFAjbtSOoFCQzJfIADCwoDAxUDAgMWAgEC +F4AAEgkQXeJJllsDWKIHZUdQRwABAbXWAJ9SCW0ieOpL7AY6vF+OIaMmw2ZW1gCg +kto0eWfgpjAuVg6jXqR1wHt2pQO0HVdlcm5lciBLb2NoIDx3ZXJuZXJAZnNmZS5v +cmc+iGMEExECACMCGwMFCRNri/8CHgECF4AFAkJZQHoFCwcKAwIDFQIDAxYCAQAK +CRBd4kmWWwNYovxpAJ0ftTtETxhK8aKfIok/+43wNbQASwCfSFCPuVKTNHpv4JJ7 +9feDCtfxxLG5AaIEQF3aTxEEAP9SgfIbIPL6BQ1nqoblsTYoiwWPL48uBZPjkDfy +8XsVR5V9aRQlggC4x4/MD3Ip5AUgReI7PcHnp4m3vcVLXPl+/7i7hAwd84iKzgN8 +I8VW0EevflcNm7nbWEnpjaGxJWFbhSLI1DmqnafoU8nZgGp2QoE+flgGDd559C3S +iHRTAKDbqgS3EDhTbwfS+bAhW5Xi8/2CPwP9HueeuW9M/cyt8UvliLsj2eYMEIy7 +CeSLO13XfnqCjcnHK+b59/ADd99dpMaq3gKj7Aj1RIsRV2qWDJpDNXVxP7Cy+Fzx +elQsytPQOV8H8AkB+RgmSyfxlNRUkC3sQU6jR9IwmPD4iB5fp/SqUpn++77TAArX +qsfHbmlnwcuU1EAD/i7CEhxLBYS1N77hwxL8DWCqjpi+1PKG+6dc0BQFIU3uUhbz +LGfqEobUDhveqgtlsvoEZ/lR8RgMv/uOjXEgiATQyTEa7s3M2vjXlpLjXjzklma3 +Lqmcam3dEf/5OR02yZif6hPU/x8f/VQle0kKNKdOCV1+dlo8aJH2UIZRRIvtiJcE +GBECAA8CGwIFCQcbVgAFAkR1rB0AUkcgBBkRAgAGBQJEdawTAAoJEGB4TpQBClft +2RMAn1XiL/bC9hByZInCJTaCd8WS8kYCAKCfpAWwLIxkfwAeD/RI+2p00nQfvAkQ +XeJJllsDWKKx7QCguc4/HiEs64Ey5p6Yihy67X8E0YsAnRXMFdXVP7ww8uldljPi +D1TgyurpuQELBEBd2ykBCADRKFS0lZw/2MawS97P3nVyt2FF9XWb8si7T9Jgl+NR +F93uqUOIC15s3u5SVPcwdIhoG04wYKHTLKhyBAjFp4azfLmiIBDDp37DY3SAtJT6 +TsgULR+yFkXbRvuIOU5N/0WxzrK6JJwlFVEyaPX7zmWVKMCj+SMj2FrmltuVS0aC +f0io3n97bUAvuU3dgjTFoHqW4017smfbE4VMwnLYi3/1SS9s0ysKM6Px5yEM3oQi +OW/9pS48wSFfs3lXi8N1BikgPdU5FFA+5BGSUhxyFf+lqdjwcByBC7LT3dCrFeWQ +OL0UeVh6wG48O63j8jue7mfTm+559uXnD/J65PiHcZTnAAYpiE8EGBECAA8FAkBd +2ykCGwwFCQNY7wAACgkQXeJJllsDWKIS1gCgoJ2z4OnA0dVt7ZM/PeAsKXA0KFUA +n3AV3yuZKX4WHw5Pnf5sLmF5LUkluQELBEO4FiIBCADRWoeCwf4lVIJQahM7ytFR +vPMrkSZQy072/I6/4QPKsaHI+HnoB8PjTmBpyBDLK8Y6Of3Y1hNb77xe+m2g+8Wq +/BUKHvUi1F+xzszpnixtMr+QOiy6U7kCJA6fGvq0qmzrXGcv5rXpGvWwyZfymTLW +4X2WKgNL8bhODy0uJ9ZR/fhjE7nnIHgIboSnBAUPHCsI9BFumsbU8FKsKJCOBqzi +HEyDHbix7uP6ByYslH2tUw9WdQU8Yzo2mWojghXpjE7UT0tAb4QNTdwurLgiEIH5 +umsM43elr1/2nd06KigQX+NR4MqytR+28JtEEKvULwJZpmExs4B+OB4x8l+6Lc0/ +AAYpiE8EGBECAA8FAkO4FiICGwwFCQPBFYAACgkQXeJJllsDWKJdywCeNyRtO1/y +IyiNkotYRfO5y3xuHocAnAyA4jaxa702sRs4iPR/WWJkMgEqmI4EQ7f6xwEEANCZ +GXorXMkDKpNsRnf+ZhqHOPmDcEKPDkplcCL2PFACN7QaK4ReoWvZ4mqmVOL3ZXU5 +1zFNI9aD3JAIToET2jr2hGYWFExdBf9eaYgBeXZGUOnbJl1VJDzWDGU6ZHNpwPiA +AgYjpsoBgZCxbl7x0VtYukjc9vIkR/1GXGC4v9ohACCBVlCZtCZXZXJuZXIgS29j +aCAoZGlzdCBzaWcpIDxkZDlqbkBnbnUub3JnPoi8BBMBAgAmBQJDt/rIAhsDBQkF +o5qABgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQU7Yg0BzgxjB5owQAh0MO0kuQ +7hM6AKj8YK4bRGapHBmeIniaer9Y6vwXgErfDUci7BUQTxXoFFTgKHHzBz39bzeS +tyQgTm5plGaOEJcJayIr07DaeBtcC/dMoVUJswybKMFtP7fUz05PRKjChvxrWzhe +/Yn6BAmPF+6YxQo2W98rzq0THS5wKJjXmHw= +=F0ww +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gcr/frob-certificate-request.c b/gcr/frob-certificate-request.c new file mode 100644 index 0000000..6801b8c --- /dev/null +++ b/gcr/frob-certificate-request.c @@ -0,0 +1,113 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "console-interaction.h" + +#include "gcr/gcr-base.h" + +#include "egg/egg-armor.h" + +#include +#include +#include + +const gchar *cn_name = NULL; + +static GckObject * +load_key_for_uri (const gchar *uri) +{ + GError *error = NULL; + GTlsInteraction *interaction; + GckEnumerator *enumerator; + GList *modules; + GckObject *key; + + gcr_pkcs11_initialize (NULL, &error); + g_assert_no_error (error); + + modules = gcr_pkcs11_get_modules (); + enumerator = gck_modules_enumerate_uri (modules, uri, GCK_SESSION_LOGIN_USER | + GCK_SESSION_READ_ONLY, &error); + gck_list_unref_free (modules); + + interaction = console_interaction_new (); + gck_enumerator_set_interaction (enumerator, interaction); + g_object_unref (interaction); + + key = gck_enumerator_next (enumerator, NULL, &error); + g_assert_no_error (error); + g_object_unref (enumerator); + + return key; +} + +static void +test_request (const gchar *uri) +{ + GcrCertificateRequest *req; + GError *error = NULL; + GckObject *key; + guchar *data; + gsize n_data; + + key = load_key_for_uri (uri); + if (key == NULL) + g_error ("couldn't find key for uri: %s", uri); + + if (!gcr_certificate_request_capable (key, NULL, &error)) { + if (error != NULL) + g_error ("error checking key capabilities: %s", error->message); + g_clear_error (&error); + g_printerr ("frob-certificate-request: key doesn't have right capabilities"); + g_object_unref (key); + return; + } + + req = gcr_certificate_request_prepare (GCR_CERTIFICATE_REQUEST_PKCS10, key); + g_object_unref (key); + + gcr_certificate_request_set_cn (req, cn_name); + gcr_certificate_request_complete (req, NULL, &error); + g_assert_no_error (error); + + data = gcr_certificate_request_encode (req, TRUE, &n_data); + + if (write (1, data, n_data) < 0) + g_error ("failed to write: %s", g_strerror (errno)); + g_free (data); +} + +int +main(int argc, char *argv[]) +{ + g_set_prgname ("frob-certificate-request"); + + if (argc <= 1) + g_printerr ("frob-certificate-request: specify pkcs11: url of key"); + + if (cn_name == NULL) + cn_name = g_strdup ("name.example.com"); + + test_request (argv[1]); + return 0; +} diff --git a/gcr/frob-openpgp.c b/gcr/frob-openpgp.c new file mode 100644 index 0000000..433056b --- /dev/null +++ b/gcr/frob-openpgp.c @@ -0,0 +1,117 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-openpgp.h" +#include "gcr/gcr-record.h" + +#include "egg/egg-armor.h" + +static void +on_packet_print_records (GPtrArray *records, + GBytes *packet, + gpointer user_data) +{ + gchar *string; + guint i; + + for (i = 0; i < records->len; i++) { + string = _gcr_record_format (records->pdata[i]); + g_print ("%s\n", string); + g_free (string); + } +} + +static gboolean +parse_binary (GBytes *contents) +{ + guint packets; + + packets = _gcr_openpgp_parse (contents, + GCR_OPENPGP_PARSE_KEYS | + GCR_OPENPGP_PARSE_ATTRIBUTES, + on_packet_print_records, NULL); + + return (packets > 0); +} + +static void +on_armor_parsed (GQuark type, + GBytes *data, + GBytes *outer, + GHashTable *headers, + gpointer user_data) +{ + const gchar *value; + gboolean *result = user_data; + + value = g_hash_table_lookup (headers, "Version"); + g_assert_cmpstr (value, ==, "GnuPG v1.4.11 (GNU/Linux)"); + + *result = parse_binary (data); +} + +static gboolean +parse_armor_or_binary (GBytes *contents) +{ + gboolean result; + guint parts; + + parts = egg_armor_parse (contents, on_armor_parsed, &result); + if (parts == 0) + result = parse_binary (contents); + return result; +} + +int +main(int argc, char *argv[]) +{ + GError *error = NULL; + gchar *contents; + gsize length; + GBytes *bytes; + int ret; + + g_set_prgname ("frob-openpgp"); + + if (argc != 2) { + g_printerr ("usage: frob-openpgp filename\n"); + return 2; + } + + if (!g_file_get_contents (argv[1], &contents, &length, &error)) { + g_printerr ("frob-openpgp: couldn't read file: %s: %s", argv[1], error->message); + g_error_free (error); + return 1; + } + + bytes = g_bytes_new_take (contents, length); + ret = 0; + if (!parse_armor_or_binary (bytes)) { + g_printerr ("frob-openpgp: no openpgp data found in data"); + ret = 1; + } + + g_bytes_unref (bytes); + return ret; +} diff --git a/gcr/frob-parser.c b/gcr/frob-parser.c new file mode 100644 index 0000000..1abf2e9 --- /dev/null +++ b/gcr/frob-parser.c @@ -0,0 +1,131 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr-base.h" + +#include +#include +#include + +static gboolean +dump_certificate (GckAttributes *attrs, const gchar *filename) +{ + const GckAttribute *attr; + GcrCertificate *cert; + gchar *subject; + gulong klass; + + if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) || + klass != CKO_CERTIFICATE) + return FALSE; + + attr = gck_attributes_find (attrs, CKA_VALUE); + if (!attr) + return FALSE; + + cert = gcr_simple_certificate_new_static (attr->value, attr->length); + subject = gcr_certificate_get_subject_dn (cert); + g_print ("%s: parsed certificate: %s\n", filename, subject); + g_free (subject); + g_object_unref (cert); + + return TRUE; +} + +static void +on_parser_parsed (GcrParser *parser, gpointer user_data) +{ + GckAttributes *attrs; + const gchar **pointer_filename = (const gchar**)user_data; + + attrs = gcr_parser_get_parsed_attributes (parser); + g_return_if_fail (attrs); + + if (!dump_certificate (attrs, *pointer_filename)) + g_print ("%s: parsed %s\n", *pointer_filename, + gcr_parser_get_parsed_description (parser)); +} + +int +main(int argc, char *argv[]) +{ + GcrParser *parser; + GError *error = NULL; + gchar *contents; + gsize len; + GDir *dir; + const gchar *filename; + GBytes *bytes; + gchar *path; + + g_set_prgname ("frob-parser"); + + if (argc != 2) { + g_printerr ("usage: frob-parser directory\n"); + return 2; + } + + dir = g_dir_open (argv[1], 0, &error); + if (!dir) { + g_printerr ("couldn't list directory: %s: %s\n", argv[1], error->message); + g_clear_error (&error); + return 1; + } + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &filename); + + for (;;) { + filename = g_dir_read_name (dir); + if (!filename) + break; + if (filename[0] == '.') + continue; + + path = g_build_filename (argv[1], filename, NULL); + g_file_get_contents (path, &contents, &len, &error); + g_free (path); + + if (error) { + g_printerr ("%s: couldn't read file: %s\n", filename, error->message); + g_clear_error (&error); + continue; + } + + bytes = g_bytes_new_take (contents, len); + gcr_parser_parse_bytes (parser, bytes, &error); + g_bytes_unref (bytes); + + if (error) { + g_warning ("%s: couldn't parse: %s\n", filename, error->message); + g_clear_error (&error); + } + + g_print ("%s: finished parsing\n", filename); + } + + g_dir_close (dir); + g_object_unref (parser); + + return 0; +} diff --git a/gcr/gcr-base.h b/gcr/gcr-base.h new file mode 100644 index 0000000..ea80d8e --- /dev/null +++ b/gcr/gcr-base.h @@ -0,0 +1,65 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GI_SCANNER__ +#ifndef GCR_API_SUBJECT_TO_CHANGE +#error +#endif +#endif + +#ifndef __GCR_BASE_H__ +#define __GCR_BASE_H__ + +#include + +#define __GCR_INSIDE_HEADER__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef __GCR_INSIDE_HEADER__ + +#endif /* __GCR_BASE_H__ */ diff --git a/gcr/gcr-base.pc.in b/gcr/gcr-base.pc.in new file mode 100644 index 0000000..894a63f --- /dev/null +++ b/gcr/gcr-base.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +datarootdir=@datarootdir@ +datadir=@datadir@ +sysconfdir=@sysconfdir@ + +Name: gcr-base-@GCR_MAJOR@ +Description: GObject library for high level crypto parsing +Version: @VERSION@ +Requires: glib-2.0 gobject-2.0 gio-2.0 gck-@GCK_MAJOR@ p11-kit-1 +Libs: -L${libdir} -lgcr-base-@GCR_MAJOR@ +Cflags: -I${includedir}/gcr-@GCR_MAJOR@ diff --git a/gcr/gcr-base.symbols b/gcr/gcr-base.symbols new file mode 100644 index 0000000..7a97e9a --- /dev/null +++ b/gcr/gcr-base.symbols @@ -0,0 +1,265 @@ +/* This file lists all exported symbols. It is used to guarantee that we + * only consciously change our ABI. + */ + +gcr_certificate_compare +gcr_certificate_chain_add +gcr_certificate_chain_build +gcr_certificate_chain_build_async +gcr_certificate_chain_build_finish +gcr_certificate_chain_flags_get_type +gcr_certificate_chain_get_anchor +gcr_certificate_chain_get_certificate +gcr_certificate_chain_get_endpoint +gcr_certificate_chain_get_length +gcr_certificate_chain_get_status +gcr_certificate_chain_get_type +gcr_certificate_chain_new +gcr_certificate_chain_status_get_type +gcr_certificate_get_basic_constraints +gcr_certificate_get_columns +gcr_certificate_get_der_data +gcr_certificate_get_expiry_date +gcr_certificate_get_fingerprint +gcr_certificate_get_fingerprint_hex +gcr_certificate_get_icon +gcr_certificate_get_issued_date +gcr_certificate_get_issuer_cn +gcr_certificate_get_issuer_dn +gcr_certificate_get_issuer_name +gcr_certificate_get_issuer_part +gcr_certificate_get_issuer_raw +gcr_certificate_get_key_size +gcr_certificate_get_markup_text +gcr_certificate_get_serial_number +gcr_certificate_get_serial_number_hex +gcr_certificate_get_subject_cn +gcr_certificate_get_subject_dn +gcr_certificate_get_subject_name +gcr_certificate_get_subject_part +gcr_certificate_get_subject_raw +gcr_certificate_get_type +gcr_certificate_mixin_class_init +gcr_certificate_mixin_comparable_init +gcr_certificate_mixin_emit_notify +gcr_certificate_mixin_get_property +gcr_certificate_is_issuer +gcr_certificate_request_capable +gcr_certificate_request_capable_async +gcr_certificate_request_capable_finish +gcr_certificate_request_complete +gcr_certificate_request_complete_async +gcr_certificate_request_complete_finish +gcr_certificate_request_encode +gcr_certificate_request_format_get_type +gcr_certificate_request_get_format +gcr_certificate_request_get_private_key +gcr_certificate_request_get_type +gcr_certificate_request_prepare +gcr_certificate_request_set_cn +gcr_collection_contains +gcr_collection_emit_added +gcr_collection_emit_removed +gcr_collection_get_length +gcr_collection_get_objects +gcr_collection_get_type +gcr_comparable_compare +gcr_comparable_get_type +gcr_comparable_memcmp +gcr_column_flags_get_type +gcr_data_error_get_domain +gcr_data_error_get_type +gcr_data_format_get_type +gcr_error_get_domain +gcr_filter_collection_get_type +gcr_filter_collection_get_underlying +gcr_filter_collection_new_with_callback +gcr_filter_collection_refilter +gcr_filter_collection_set_callback +gcr_fingerprint_from_attributes +gcr_fingerprint_from_subject_public_key_info +gcr_icon_for_token +gcr_importer_create_for_parsed +gcr_importer_get_interaction +gcr_importer_get_parser +gcr_importer_get_prompt_behavior +gcr_importer_get_slot +gcr_importer_get_type +gcr_importer_import +gcr_importer_import_async +gcr_importer_import_finish +gcr_importer_prompt_behavior_get_type +gcr_importer_queue_and_filter_for_parsed +gcr_importer_queue_for_parsed +gcr_importer_register +gcr_importer_register_well_known +gcr_importer_set_interaction +gcr_importer_set_parser +gcr_importer_set_prompt_behavior +gcr_importer_set_slot +gcr_import_interaction_get_type +gcr_import_interaction_supplement +gcr_import_interaction_supplement_async +gcr_import_interaction_supplement_finish +gcr_import_interaction_supplement_prep +gcr_mock_prompter_expect_close +gcr_mock_prompter_expect_confirm_cancel +gcr_mock_prompter_expect_confirm_ok +gcr_mock_prompter_expect_password_cancel +gcr_mock_prompter_expect_password_ok +gcr_mock_prompter_get_delay_msec +gcr_mock_prompter_is_expecting +gcr_mock_prompter_is_prompting +gcr_mock_prompter_set_delay_msec +gcr_mock_prompter_start +gcr_mock_prompter_stop +gcr_mock_prompter_disconnect +gcr_parsed_get_attributes +gcr_parsed_get_bytes +gcr_parsed_get_data +gcr_parsed_get_description +gcr_parsed_get_filename +gcr_parsed_get_format +gcr_parsed_get_label +gcr_parsed_get_type +gcr_parsed_ref +gcr_parsed_unref +gcr_parser_add_password +gcr_parser_format_disable +gcr_parser_format_enable +gcr_parser_format_supported +gcr_parser_get_filename +gcr_parser_get_parsed +gcr_parser_get_parsed_attributes +gcr_parser_get_parsed_bytes +gcr_parser_get_parsed_block +gcr_parser_get_parsed_description +gcr_parser_get_parsed_format +gcr_parser_get_parsed_label +gcr_parser_get_type +gcr_parser_new +gcr_parser_parse_bytes +gcr_parser_parse_data +gcr_parser_parse_stream +gcr_parser_parse_stream_async +gcr_parser_parse_stream_finish +gcr_parser_set_filename +gcr_pkcs11_add_module +gcr_pkcs11_add_module_from_file +gcr_pkcs11_certificate_get_attributes +gcr_pkcs11_certificate_get_type +gcr_pkcs11_certificate_lookup_issuer +gcr_pkcs11_certificate_lookup_issuer_async +gcr_pkcs11_certificate_lookup_issuer_finish +gcr_pkcs11_get_modules +gcr_pkcs11_get_trust_lookup_slots +gcr_pkcs11_get_trust_lookup_uris +gcr_pkcs11_get_trust_store_slot +gcr_pkcs11_get_trust_store_uri +gcr_pkcs11_initialize +gcr_pkcs11_initialize_async +gcr_pkcs11_initialize_finish +gcr_pkcs11_set_modules +gcr_pkcs11_set_trust_lookup_uris +gcr_pkcs11_set_trust_store_uri +gcr_prompt_close +gcr_prompt_confirm +gcr_prompt_confirm_async +gcr_prompt_confirm_finish +gcr_prompt_confirm_run +gcr_prompt_get_caller_window +gcr_prompt_get_cancel_label +gcr_prompt_get_choice_chosen +gcr_prompt_get_choice_label +gcr_prompt_get_continue_label +gcr_prompt_get_description +gcr_prompt_get_message +gcr_prompt_get_password_new +gcr_prompt_get_password_strength +gcr_prompt_get_title +gcr_prompt_get_type +gcr_prompt_get_warning +gcr_prompt_password +gcr_prompt_password_async +gcr_prompt_password_finish +gcr_prompt_password_run +gcr_prompt_reply_get_type +gcr_prompt_reset +gcr_prompt_set_caller_window +gcr_prompt_set_cancel_label +gcr_prompt_set_choice_chosen +gcr_prompt_set_choice_label +gcr_prompt_set_continue_label +gcr_prompt_set_description +gcr_prompt_set_message +gcr_prompt_set_password_new +gcr_prompt_set_title +gcr_prompt_set_warning +gcr_secret_exchange_begin +gcr_secret_exchange_get_protocol +gcr_secret_exchange_get_secret +gcr_secret_exchange_get_type +gcr_secret_exchange_new +gcr_secret_exchange_receive +gcr_secret_exchange_send +gcr_secure_memory_alloc +gcr_secure_memory_free +gcr_secure_memory_is_secure +gcr_secure_memory_realloc +gcr_secure_memory_strdup +gcr_secure_memory_strfree +gcr_secure_memory_try_alloc +gcr_secure_memory_try_realloc +gcr_simple_certificate_get_type +gcr_simple_certificate_new +gcr_simple_certificate_new_static +gcr_simple_collection_add +gcr_simple_collection_contains +gcr_simple_collection_get_type +gcr_simple_collection_new +gcr_simple_collection_remove +gcr_ssh_askpass_child_setup +gcr_ssh_askpass_executable +gcr_ssh_askpass_get_interaction +gcr_ssh_askpass_get_type +gcr_ssh_askpass_new +gcr_system_prompter_get_mode +gcr_system_prompter_get_prompt_type +gcr_system_prompter_get_prompting +gcr_system_prompter_get_type +gcr_system_prompter_mode_get_type +gcr_system_prompter_new +gcr_system_prompter_register +gcr_system_prompter_unregister +gcr_system_prompt_close +gcr_system_prompt_close_async +gcr_system_prompt_close_finish +gcr_system_prompt_error_get_domain +gcr_system_prompt_error_get_type +gcr_system_prompt_get_type +gcr_system_prompt_get_secret_exchange +gcr_system_prompt_open +gcr_system_prompt_open_async +gcr_system_prompt_open_finish +gcr_system_prompt_open_for_prompter +gcr_system_prompt_open_for_prompter_async +gcr_trust_add_pinned_certificate +gcr_trust_add_pinned_certificate_async +gcr_trust_add_pinned_certificate_finish +gcr_trust_is_certificate_anchored +gcr_trust_is_certificate_anchored_async +gcr_trust_is_certificate_anchored_finish +gcr_trust_is_certificate_pinned +gcr_trust_is_certificate_pinned_async +gcr_trust_is_certificate_pinned_finish +gcr_trust_remove_pinned_certificate +gcr_trust_remove_pinned_certificate_async +gcr_trust_remove_pinned_certificate_finish +gcr_union_collection_add +gcr_union_collection_elements +gcr_union_collection_get_type +gcr_union_collection_have +gcr_union_collection_new +gcr_union_collection_remove +gcr_union_collection_size +gcr_union_collection_take diff --git a/gcr/gcr-callback-output-stream.c b/gcr/gcr-callback-output-stream.c new file mode 100644 index 0000000..ac85eab --- /dev/null +++ b/gcr/gcr-callback-output-stream.c @@ -0,0 +1,130 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-callback-output-stream.h" + +#include + +struct _GcrCallbackOutputStream { + GOutputStream parent; + GcrCallbackOutputFunc callback; + gpointer user_data; + GDestroyNotify destroy_func; +}; + +struct _GcrCallbackOutputStreamClass { + GOutputStreamClass parent_class; +}; + +G_DEFINE_TYPE (GcrCallbackOutputStream, _gcr_callback_output_stream, G_TYPE_OUTPUT_STREAM); + +static void +_gcr_callback_output_stream_init (GcrCallbackOutputStream *self) +{ + +} + +static gssize +_gcr_callback_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GcrCallbackOutputStream *self = GCR_CALLBACK_OUTPUT_STREAM (stream); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) { + return -1; + } else if (self->callback == NULL) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("The stream was closed")); + return -1; + } + + return (self->callback) (buffer, count, cancellable, self->user_data, error); +} + +static gboolean +_gcr_callback_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GcrCallbackOutputStream *self = GCR_CALLBACK_OUTPUT_STREAM (stream); + if (g_cancellable_set_error_if_cancelled (cancellable, error)) { + return FALSE; + } else if (self->callback == NULL) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("The stream was closed")); + return FALSE; + } + + if (self->destroy_func != NULL) + (self->destroy_func) (self->user_data); + self->destroy_func = NULL; + self->user_data = NULL; + self->callback = NULL; + + return TRUE; +} + +static void +_gcr_callback_output_stream_dispose (GObject *obj) +{ + _gcr_callback_output_stream_close (G_OUTPUT_STREAM (obj), NULL, NULL); + G_OBJECT_CLASS (_gcr_callback_output_stream_parent_class)->dispose (obj); +} + +static void +_gcr_callback_output_stream_class_init (GcrCallbackOutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *output_class = G_OUTPUT_STREAM_CLASS (klass); + + gobject_class->dispose = _gcr_callback_output_stream_dispose; + output_class->write_fn = _gcr_callback_output_stream_write; + output_class->close_fn = _gcr_callback_output_stream_close; +} + +/** + * _gcr_callback_output_stream_new: (skip) + * + * Create a new output stream which invokes the callback. + * + * Returns: (transfer full) (type Gcr.CallbackOutputStream): the new stream + */ +GOutputStream * +_gcr_callback_output_stream_new (GcrCallbackOutputFunc callback, + gpointer user_data, + GDestroyNotify destroy_func) +{ + GcrCallbackOutputStream *self; + + g_return_val_if_fail (callback, NULL); + + self = g_object_new (GCR_TYPE_CALLBACK_OUTPUT_STREAM, NULL); + self->callback = callback; + self->user_data = user_data; + self->destroy_func = destroy_func; + + return G_OUTPUT_STREAM (self); +} diff --git a/gcr/gcr-callback-output-stream.h b/gcr/gcr-callback-output-stream.h new file mode 100644 index 0000000..63a48dd --- /dev/null +++ b/gcr/gcr-callback-output-stream.h @@ -0,0 +1,55 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_CALLBACK_OUTPUT_STREAM_H +#define GCR_CALLBACK_OUTPUT_STREAM_H + +#include "gcr-collection.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_CALLBACK_OUTPUT_STREAM (_gcr_callback_output_stream_get_type ()) +#define GCR_CALLBACK_OUTPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CALLBACK_OUTPUT_STREAM, GcrCallbackOutputStream)) +#define GCR_CALLBACK_OUTPUT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CALLBACK_OUTPUT_STREAM, GcrCallbackOutputStreamClass)) +#define GCR_IS_CALLBACK_OUTPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CALLBACK_OUTPUT_STREAM)) +#define GCR_IS_CALLBACK_OUTPUT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CALLBACK_OUTPUT_STREAM)) +#define GCR_CALLBACK_OUTPUT_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CALLBACK_OUTPUT_STREAM, GcrCallbackOutputStreamClass)) + +typedef struct _GcrCallbackOutputStream GcrCallbackOutputStream; +typedef struct _GcrCallbackOutputStreamClass GcrCallbackOutputStreamClass; + +GType _gcr_callback_output_stream_get_type (void); + +typedef gssize (*GcrCallbackOutputFunc) (gconstpointer buffer, + gsize count, + GCancellable *cancellable, + gpointer user_data, + GError **error); + +GOutputStream * _gcr_callback_output_stream_new (GcrCallbackOutputFunc callback, + gpointer user_data, + GDestroyNotify destroy_func); + +G_END_DECLS + +#endif /* GCR_CALLBACK_OUTPUT_STREAM_H */ diff --git a/gcr/gcr-certificate-chain.c b/gcr/gcr-certificate-chain.c new file mode 100644 index 0000000..b0d2d31 --- /dev/null +++ b/gcr/gcr-certificate-chain.c @@ -0,0 +1,837 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-certificate-chain.h" + +#include "gcr-certificate.h" +#include "gcr-pkcs11-certificate.h" +#include "gcr-simple-certificate.h" +#include "gcr-trust.h" + +#include "gcr/gcr-enum-types-base.h" + +#include "egg/egg-error.h" + +/** + * SECTION:gcr-certificate-chain + * @title: GcrCertificateChain + * @short_description: A certificate chain + * + * #GcrCertificateChain represents a chain of certificates, normally used to + * validate the trust in a certificate. An X.509 certificate chain has one + * endpoint certificate (the one for which trust is being verified) and then + * in turn the certificate that issued each previous certificate in the chain. + * + * This functionality is for building of certificate chains not for validating + * them. Use your favorite crypto library to validate trust in a certificate + * chain once its built. + * + * The order of certificates in the chain should be first the endpoint + * certificates and then the signing certificates. + * + * Create a new certificate chain with gcr_certificate_chain_new() and then + * add the certificates with gcr_certificate_chain_add(). + * + * You can then use gcr_certificate_chain_build() to build the remainder of + * the chain. This will lookup missing certificates in PKCS\#11 modules and + * also check that each certificate in the chain is the signer of the previous + * one. If a trust anchor, pinned certificate, or self-signed certificate is + * found, then the chain is considered built. Any extra certificates are + * removed from the chain. + * + * Once the certificate chain has been built, you can access its status + * through gcr_certificate_chain_get_status(). The status signifies whether + * the chain is anchored on a trust root, self-signed, incomplete etc. See + * #GcrCertificateChainStatus for information on the various statuses. + * + * It's important to understand that the building of a certificate chain is + * merely the first step towards verifying trust in a certificate. + */ + + +/** + * GcrCertificateChain: + * + * A chain of certificates. + */ + +/** + * GcrCertificateChainClass: + * @parent_class: The parent class + * + * The class for #GcrCertificateChain. + */ + +enum { + PROP_0, + PROP_STATUS, + PROP_LENGTH, +}; + +struct _GcrCertificateChainPrivate { + GPtrArray *certificates; + GcrCertificateChainStatus status; + + /* Used in build operation */ + gchar *purpose; + gchar *peer; + guint flags; +}; + +static GQuark Q_ORIGINAL_CERT = 0; +static GQuark Q_OPERATION_DATA = 0; + +G_DEFINE_TYPE (GcrCertificateChain, gcr_certificate_chain, G_TYPE_OBJECT); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static void +free_chain_private (gpointer data) +{ + GcrCertificateChainPrivate *pv = data; + g_ptr_array_unref (pv->certificates); + g_free (pv->purpose); + g_free (pv->peer); + g_slice_free (GcrCertificateChainPrivate, pv); +} + +static GcrCertificateChainPrivate* +new_chain_private (void) +{ + GcrCertificateChainPrivate *pv = g_slice_new0 (GcrCertificateChainPrivate); + pv->certificates = g_ptr_array_new_with_free_func (g_object_unref); + return pv; +} + +static GcrCertificateChainPrivate* +prep_chain_private (GcrCertificateChainPrivate *orig, const gchar *purpose, + const gchar *peer, guint flags) +{ + GcrCertificateChainPrivate *pv; + GcrCertificate *certificate; + guint i; + + g_assert (orig); + g_assert (purpose); + + pv = new_chain_private (); + for (i = 0; i < orig->certificates->len; ++i) { + certificate = g_ptr_array_index (orig->certificates, i); + g_ptr_array_add (pv->certificates, g_object_ref (certificate)); + } + + pv->status = orig->status; + pv->purpose = g_strdup (purpose); + pv->peer = g_strdup (peer); + pv->flags = flags; + return pv; +} + +static GcrCertificateChainPrivate* +prep_chain_private_thread_safe (GcrCertificateChainPrivate *orig, const gchar *purpose, + const gchar *peer, guint flags) +{ + GcrCertificateChainPrivate *pv; + GcrCertificate *certificate, *safe; + gconstpointer der; + gsize n_der; + guint i; + + g_assert (orig); + + pv = prep_chain_private (orig, purpose, peer, flags); + + for (i = 0; i < pv->certificates->len; ++i) { + certificate = g_ptr_array_index (pv->certificates, i); + + /* We regard these types as thread safe */ + if (GCR_IS_SIMPLE_CERTIFICATE (certificate) || + GCR_IS_PKCS11_CERTIFICATE (certificate)) { + safe = g_object_ref (certificate); + + /* Otherwise copy the certificate data */ + } else { + der = gcr_certificate_get_der_data (certificate, &n_der); + g_return_val_if_fail (der, NULL); + safe = gcr_simple_certificate_new (der, n_der); + + g_debug ("copying certificate so it's thread safe"); + + /* Always set the original certificate onto the safe one */ + g_object_set_qdata_full (G_OBJECT (safe), Q_ORIGINAL_CERT, + g_object_ref (certificate), g_object_unref); + } + + g_ptr_array_index (pv->certificates, i) = safe; + g_object_unref (certificate); + } + + return pv; +} + +static GcrCertificateChainPrivate* +cleanup_chain_private (GcrCertificateChainPrivate *pv) +{ + GcrCertificate *certificate, *orig; + guint i; + + for (i = 0; i < pv->certificates->len; ++i) { + certificate = g_ptr_array_index (pv->certificates, i); + + /* If there's an original certificate set, then replace it back */ + orig = g_object_get_qdata (G_OBJECT (certificate), Q_ORIGINAL_CERT); + if (orig != NULL) { + g_ptr_array_index (pv->certificates, i) = g_object_ref (orig); + g_object_unref (certificate); + } + } + + return pv; +} + +static GcrCertificate * +pop_certificate (GPtrArray *certificates, + GcrCertificate *issued) +{ + GcrCertificate *certificate; + gint i; + + for (i = 0; i < certificates->len; i++) { + certificate = certificates->pdata[i]; + if (!issued || gcr_certificate_is_issuer (issued, certificate)) { + g_object_ref (certificate); + g_ptr_array_remove_index_fast (certificates, i); + return certificate; + } + } + + return NULL; +} + +static gboolean +perform_build_chain (GcrCertificateChainPrivate *pv, GCancellable *cancellable, + GError **rerror) +{ + GError *error = NULL; + GcrCertificate *certificate; + GcrCertificate *issued; + GPtrArray *input; + gboolean lookups; + gboolean ret; + guint length; + gchar *subject; + + g_assert (pv); + g_assert (pv->certificates); + + pv->status = GCR_CERTIFICATE_CHAIN_UNKNOWN; + lookups = !((pv->flags & GCR_CERTIFICATE_CHAIN_NO_LOOKUPS) == GCR_CERTIFICATE_CHAIN_NO_LOOKUPS); + + /* This chain is built */ + if (!pv->certificates->len) { + g_debug ("empty certificate chain"); + return TRUE; + } + + input = pv->certificates; + pv->certificates = g_ptr_array_new_with_free_func (g_object_unref); + + /* First check for pinned certificates */ + certificate = pop_certificate (input, NULL); + g_ptr_array_add (pv->certificates, certificate); + + subject = gcr_certificate_get_subject_dn (certificate); + g_debug ("first certificate: %s", subject); + g_free (subject); + + if (lookups && pv->peer) { + ret = gcr_trust_is_certificate_pinned (certificate, pv->purpose, + pv->peer, cancellable, &error); + if (!ret && error) { + g_debug ("failed to lookup pinned certificate: %s", + egg_error_message (error)); + g_propagate_error (rerror, error); + g_ptr_array_unref (input); + return FALSE; + } + + /* + * This is a pinned certificate and the rest of the chain + * is irrelevant, so truncate chain and consider built. + */ + if (ret) { + g_debug ("found pinned certificate for peer '%s', truncating chain", + pv->peer); + + g_ptr_array_unref (input); + pv->status = GCR_CERTIFICATE_CHAIN_PINNED; + return TRUE; + } + } + + /* The first certificate is always unconditionally in the chain */ + while (pv->status == GCR_CERTIFICATE_CHAIN_UNKNOWN) { + issued = certificate; + + /* Stop the chain if previous was self-signed */ + if (gcr_certificate_is_issuer (certificate, certificate)) { + g_debug ("found self-signed certificate"); + pv->status = GCR_CERTIFICATE_CHAIN_SELFSIGNED; + break; + } + + /* Get the next certificate */ + certificate = pop_certificate (input, issued); + if (certificate) { + subject = gcr_certificate_get_subject_dn (certificate); + g_debug ("next certificate: %s", subject); + g_free (subject); + + /* No more in chain, try to lookup */ + } else if (lookups) { + certificate = gcr_pkcs11_certificate_lookup_issuer (issued, + cancellable, &error); + if (error != NULL) { + g_debug ("failed to lookup issuer: %s", error->message); + g_propagate_error (rerror, error); + g_ptr_array_unref (input); + return FALSE; + + } else if (certificate) { + subject = gcr_certificate_get_subject_dn (certificate); + g_debug ("found issuer certificate: %s", subject); + g_free (subject); + + } else { + g_debug ("no issuer found"); + } + + /* No more in chain, and can't lookup */ + } else { + g_debug ("no more certificates available, and no lookups"); + certificate = NULL; + } + + /* Stop the chain if nothing found */ + if (certificate == NULL) { + g_debug ("chain is incomplete"); + pv->status = GCR_CERTIFICATE_CHAIN_INCOMPLETE; + break; + } + + g_ptr_array_add (pv->certificates, certificate); + ++length; + + /* See if this certificate is an anchor */ + if (lookups) { + ret = gcr_trust_is_certificate_anchored (certificate, pv->purpose, + cancellable, &error); + + if (!ret && error) { + g_debug ("failed to lookup anchored certificate: %s", + egg_error_message (error)); + g_propagate_error (rerror, error); + g_ptr_array_unref (input); + return FALSE; + + /* Stop the chain at the first anchor */ + } else if (ret) { + g_debug ("found anchored certificate"); + pv->status = GCR_CERTIFICATE_CHAIN_ANCHORED; + break; + } + } + } + + /* TODO: Need to check each certificate in the chain for distrusted */ + + g_ptr_array_unref (input); + return TRUE; +} + +static void +thread_build_chain (GSimpleAsyncResult *result, GObject *object, + GCancellable *cancellable) +{ + GcrCertificateChainPrivate *pv; + GError *error = NULL; + + pv = g_object_get_qdata (G_OBJECT (result), Q_OPERATION_DATA); + g_assert (pv); + + g_debug ("building asynchronously in another thread"); + + if (!perform_build_chain (pv, cancellable, &error)) { + g_simple_async_result_set_from_error (result, error); + g_clear_error (&error); + } +} + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static void +gcr_certificate_chain_init (GcrCertificateChain *self) +{ + self->pv = new_chain_private (); +} + +static void +gcr_certificate_chain_dispose (GObject *obj) +{ + GcrCertificateChain *self = GCR_CERTIFICATE_CHAIN (obj); + + g_ptr_array_set_size (self->pv->certificates, 0); + self->pv->status = GCR_CERTIFICATE_CHAIN_UNKNOWN; + + G_OBJECT_CLASS (gcr_certificate_chain_parent_class)->dispose (obj); +} + +static void +gcr_certificate_chain_finalize (GObject *obj) +{ + GcrCertificateChain *self = GCR_CERTIFICATE_CHAIN (obj); + + free_chain_private (self->pv); + self->pv = NULL; + + G_OBJECT_CLASS (gcr_certificate_chain_parent_class)->finalize (obj); +} + +static void +gcr_certificate_chain_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrCertificateChain *self = GCR_CERTIFICATE_CHAIN (obj); + + switch (prop_id) { + case PROP_STATUS: + g_value_set_enum (value, gcr_certificate_chain_get_status (self)); + break; + case PROP_LENGTH: + g_value_set_uint (value, gcr_certificate_chain_get_length (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_chain_class_init (GcrCertificateChainClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gcr_certificate_chain_parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = gcr_certificate_chain_dispose; + gobject_class->finalize = gcr_certificate_chain_finalize; + gobject_class->get_property = gcr_certificate_chain_get_property; + + /** + * GcrCertificateChain:status: + * + * The certificate chain status. See #GcrCertificateChainStatus + */ + g_object_class_install_property (gobject_class, PROP_STATUS, + g_param_spec_enum ("status", "Status", "Status of certificate chain", + GCR_TYPE_CERTIFICATE_CHAIN_STATUS, + GCR_CERTIFICATE_CHAIN_UNKNOWN, G_PARAM_READABLE)); + + /** + * GcrCertificateChain:length: + * + * The length of the certificate chain. + */ + g_object_class_install_property (gobject_class, PROP_LENGTH, + g_param_spec_uint ("length", "Length", "Length of certificate chain", + 0, G_MAXUINT, 0, G_PARAM_READABLE)); + + Q_ORIGINAL_CERT = g_quark_from_static_string ("gcr-certificate-chain-original-cert"); + Q_OPERATION_DATA = g_quark_from_static_string ("gcr-certificate-chain-operation-data"); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * GcrCertificateChainStatus: + * @GCR_CERTIFICATE_CHAIN_UNKNOWN: The certificate chain's status is unknown. + * When a chain is not yet built it has this status. If a chain is modified after + * being built, it has this status. + * @GCR_CERTIFICATE_CHAIN_INCOMPLETE: A full chain could not be loaded. The + * chain does not end with a self-signed certificate, a trusted anchor, or a + * pinned certificate. + * @GCR_CERTIFICATE_CHAIN_SELFSIGNED: The chain ends with a self-signed + * certificate. No trust anchor was found. + * @GCR_CERTIFICATE_CHAIN_DISTRUSTED: The certificate chain contains a revoked + * or otherwise explicitly distrusted certificate. The entire chain should + * be distrusted. + * @GCR_CERTIFICATE_CHAIN_ANCHORED: The chain ends with an anchored + * certificate. The anchored certificate is not necessarily self-signed. + * @GCR_CERTIFICATE_CHAIN_PINNED: The chain represents a pinned certificate. A + * pinned certificate is an exception which trusts a given certificate + * explicitly for a purpose and communication with a certain peer. + * + * The status of a built certificate chain. Will be set to + * %GCR_CERTIFICATE_CHAIN_UNKNOWN for certificate chains that have not been + * built. + */ + +/** + * GCR_TYPE_CERTIFICATE_CHAIN_STATUS: + * + * The enum #GType for #GcrCertificateChainStatus. + */ + +/** + * GcrCertificateChainFlags: + * @GCR_CERTIFICATE_CHAIN_NONE: no flags + * @GCR_CERTIFICATE_CHAIN_NO_LOOKUPS: If this flag is specified then no + * lookups for anchors or pinned certificates are done, and the resulting chain + * will be neither anchored or pinned. Additionally no missing certificate + * authorities are looked up in PKCS\#11. + * + * Flags to be used with the gcr_certificate_chain_build() operation. + */ + +/** + * GCR_TYPE_CERTIFICATE_CHAIN_FLAGS: + * + * The flags #GType for #GcrCertificateChainFlags. + */ + +/** + * gcr_certificate_chain_new: + * + * Create a new #GcrCertificateChain. + * + * Returns: (transfer full): a newly allocated certificate chain + */ +GcrCertificateChain * +gcr_certificate_chain_new (void) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_CHAIN, NULL); +} + +/** + * gcr_certificate_chain_add: + * @self: the #GcrCertificateChain + * @certificate: a #GcrCertificate to add to the chain + * + * Add @certificate to the chain. The order of certificates in the chain are + * important. The first certificate should be the endpoint certificate, and + * then come the signers (certificate authorities) each in turn. If a root + * certificate authority is present, it should come last. + * + * Adding a certificate an already built chain (see + * gcr_certificate_chain_build()) resets the type of the certificate chain + * to %GCR_CERTIFICATE_CHAIN_UNKNOWN + */ +void +gcr_certificate_chain_add (GcrCertificateChain *self, GcrCertificate *certificate) +{ + g_return_if_fail (GCR_IS_CERTIFICATE_CHAIN (self)); + g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); + g_ptr_array_add (self->pv->certificates, g_object_ref (certificate)); + self->pv->status = GCR_CERTIFICATE_CHAIN_UNKNOWN; + g_object_notify (G_OBJECT (self), "status"); + g_object_notify (G_OBJECT (self), "length"); +} + +/** + * gcr_certificate_chain_get_status: + * @self: the #GcrCertificateChain + * + * Get the status of a certificate chain. If the certificate chain has not + * been built, then the status will be %GCR_CERTIFICATE_CHAIN_UNKNOWN. + * + * A status of %GCR_CERTIFICATE_CHAIN_ANCHORED does not mean that the + * certificate chain has been verified, but merely that an anchor has been + * found. + * + * Returns: the status of the certificate chain. + */ +GcrCertificateChainStatus +gcr_certificate_chain_get_status (GcrCertificateChain *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), GCR_CERTIFICATE_CHAIN_UNKNOWN); + return self->pv->status; +} + +/** + * gcr_certificate_chain_get_anchor: + * @self: the #GcrCertificateChain + * + * If the certificate chain has been built and is of status + * %GCR_CERTIFICATE_CHAIN_ANCHORED, then this will return the anchor + * certificate that was found. This is not necessarily a root certificate + * authority. If an intermediate certificate authority in the chain was + * found to be anchored, then that certificate will be returned. + * + * If an anchor is returned it does not mean that the certificate chain has + * been verified, but merely that an anchor has been found. + * + * Returns: (transfer none): the anchor certificate, or NULL if not anchored. + */ +GcrCertificate * +gcr_certificate_chain_get_anchor (GcrCertificateChain *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), NULL); + if (self->pv->status != GCR_CERTIFICATE_CHAIN_ANCHORED) + return NULL; + g_assert (self->pv->certificates->len > 0); + return GCR_CERTIFICATE (g_ptr_array_index (self->pv->certificates, + self->pv->certificates->len - 1)); +} + +/** + * gcr_certificate_chain_get_endpoint: + * @self: the #GcrCertificateChain + * + * Get the endpoint certificate in the chain. This is always the first + * certificate in the chain. The endpoint certificate cannot be anchored. + * + * Returns: (transfer none): the endpoint certificate, or %NULL if the chain + * is empty + */ +GcrCertificate* +gcr_certificate_chain_get_endpoint (GcrCertificateChain *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), NULL); + if (!self->pv->certificates->len) + return NULL; + return GCR_CERTIFICATE (g_ptr_array_index (self->pv->certificates, 0)); +} + +/** + * gcr_certificate_chain_get_length: + * @self: the #GcrCertificateChain + * + * Get the length of the certificate chain. + * + * Returns: the length of the certificate chain + */ +guint +gcr_certificate_chain_get_length (GcrCertificateChain *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), 0); + return self->pv->certificates->len; +} + +/** + * gcr_certificate_chain_get_certificate: + * @self: the #GcrCertificateChain + * @index: index of the certificate to get + * + * Get a certificate in the chain. It is an error to call this function + * with an invalid index. + * + * Returns: (transfer none): the certificate + */ +GcrCertificate * +gcr_certificate_chain_get_certificate (GcrCertificateChain *self, guint index) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), NULL); + g_return_val_if_fail (index < self->pv->certificates->len, NULL); + return GCR_CERTIFICATE (g_ptr_array_index (self->pv->certificates, index)); +} + +/** + * gcr_certificate_chain_build: + * @self: the #GcrCertificateChain + * @purpose: the purpose the certificate chain will be used for + * @peer: (allow-none): the peer the certificate chain will be used with, or %NULL + * @flags: chain completion flags + * @cancellable: a #GCancellable or %NULL + * @error: a #GError or %NULL + * + * Complete a certificate chain. Once a certificate chain has been built + * its status can be examined. + * + * This operation will lookup missing certificates in PKCS\#11 + * modules and also that each certificate in the chain is the signer of the + * previous one. If a trust anchor, pinned certificate, or self-signed certificate + * is found, then the chain is considered built. Any extra certificates are + * removed from the chain. + * + * It's important to understand that building of a certificate chain does not + * constitute verifying that chain. This is merely the first step towards + * trust verification. + * + * The @purpose is a string like %GCR_PURPOSE_CLIENT_AUTH and is the purpose + * for which the certificate chain will be used. Trust anchors are looked up + * for this purpose. This argument is required. + * + * The @peer is usually the host name of the peer whith which this certificate + * chain is being used. It is used to look up pinned certificates that have + * been stored for this peer. If %NULL then no pinned certificates will + * be considered. + * + * If the %GCR_CERTIFICATE_CHAIN_NO_LOOKUPS flag is specified then no + * lookups for anchors or pinned certificates are done, and the resulting chain + * will be neither anchored or pinned. Additionally no missing certificate + * authorities are looked up in PKCS\#11 + * + * This call will block, see gcr_certificate_chain_build_async() for the + * asynchronous version. + * + * Returns: whether the operation completed successfully + */ +gboolean +gcr_certificate_chain_build (GcrCertificateChain *self, + const gchar *purpose, + const gchar *peer, + GcrCertificateChainFlags flags, + GCancellable *cancellable, + GError **error) +{ + GcrCertificateChainPrivate *pv; + gboolean ret; + + g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), FALSE); + g_return_val_if_fail (purpose != NULL, FALSE); + + pv = prep_chain_private (self->pv, purpose, peer, flags); + + ret = perform_build_chain (pv, cancellable, error); + + if (ret) { + free_chain_private (self->pv); + self->pv = cleanup_chain_private (pv); + g_object_notify (G_OBJECT (self), "status"); + g_object_notify (G_OBJECT (self), "length"); + } else { + free_chain_private (pv); + } + + return ret; +} + +/** + * gcr_certificate_chain_build_async: + * @self: the #GcrCertificateChain + * @purpose: the purpose the certificate chain will be used for + * @peer: (allow-none): the peer the certificate chain will be used with, or %NULL + * @flags: chain completion flags + * @cancellable: a #GCancellable or %NULL + * @callback: this will be called when the operation completes. + * @user_data: data to pass to the callback + * + * Complete a certificate chain. Once a certificate chain has been built + * its status can be examined. + * + * This will lookup missing certificates in PKCS\#11 + * modules and also that each certificate in the chain is the signer of the + * previous one. If a trust anchor, pinned certificate, or self-signed certificate + * is found, then the chain is considered built. Any extra certificates are + * removed from the chain. + * + * It's important to understand that building of a certificate chain does not + * constitute verifying that chain. This is merely the first step towards + * trust verification. + * + * The @purpose is a string like %GCR_PURPOSE_CLIENT_AUTH and is the purpose + * for which the certificate chain will be used. Trust anchors are looked up + * for this purpose. This argument is required. + * + * The @peer is usually the host name of the peer whith which this certificate + * chain is being used. It is used to look up pinned certificates that have + * been stored for this peer. If %NULL then no pinned certificates will + * be considered. + * + * If the %GCR_CERTIFICATE_CHAIN_NO_LOOKUPS flag is specified then no + * lookups for anchors or pinned certificates are done, and the resulting chain + * will be neither anchored or pinned. Additionally no missing certificate + * authorities are looked up in PKCS\#11 + * + * When the operation is finished, @callback will be called. You can then call + * gcr_certificate_chain_build_finish() to get the result of the operation. + */ +void +gcr_certificate_chain_build_async (GcrCertificateChain *self, + const gchar *purpose, + const gchar *peer, + GcrCertificateChainFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrCertificateChainPrivate *pv; + GSimpleAsyncResult *result; + + g_return_if_fail (GCR_IS_CERTIFICATE_CHAIN (self)); + + g_return_if_fail (GCR_IS_CERTIFICATE_CHAIN (self)); + g_return_if_fail (purpose); + + pv = prep_chain_private_thread_safe (self->pv, purpose, peer, flags); + + result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, + gcr_certificate_chain_build_async); + g_object_set_qdata_full (G_OBJECT (result), Q_OPERATION_DATA, pv, free_chain_private); + + g_simple_async_result_run_in_thread (result, thread_build_chain, + G_PRIORITY_DEFAULT, cancellable); + g_object_unref (result); +} + +/** + * gcr_certificate_chain_build_finish: + * @self: the #GcrCertificateChain + * @result: the #GAsyncResult passed to the callback + * @error: a #GError, or NULL + * + * Finishes an asynchronous operation started by + * gcr_certificate_chain_build_async(). + * + * Returns: whether the operation succeeded + */ +gboolean +gcr_certificate_chain_build_finish (GcrCertificateChain *self, GAsyncResult *result, + GError **error) +{ + GcrCertificateChainPrivate *pv; + + g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), + gcr_certificate_chain_build_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + pv = g_object_steal_qdata (G_OBJECT (result), Q_OPERATION_DATA); + g_return_val_if_fail (pv, FALSE); + + free_chain_private (self->pv); + self->pv = cleanup_chain_private (pv); + + g_object_notify (G_OBJECT (self), "status"); + g_object_notify (G_OBJECT (self), "length"); + return TRUE; +} diff --git a/gcr/gcr-certificate-chain.h b/gcr/gcr-certificate-chain.h new file mode 100644 index 0000000..9d922da --- /dev/null +++ b/gcr/gcr-certificate-chain.h @@ -0,0 +1,111 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_CHAIN_H__ +#define __GCR_CERTIFICATE_CHAIN_H__ + +#include + +#include "gcr-certificate.h" +#include "gcr-types.h" + +G_BEGIN_DECLS + +typedef enum { + GCR_CERTIFICATE_CHAIN_UNKNOWN, + GCR_CERTIFICATE_CHAIN_INCOMPLETE, + GCR_CERTIFICATE_CHAIN_DISTRUSTED, + GCR_CERTIFICATE_CHAIN_SELFSIGNED, + GCR_CERTIFICATE_CHAIN_PINNED, + GCR_CERTIFICATE_CHAIN_ANCHORED, +} GcrCertificateChainStatus; + +typedef enum { + GCR_CERTIFICATE_CHAIN_NONE = 0, + GCR_CERTIFICATE_CHAIN_NO_LOOKUPS = 1 << 0, +} GcrCertificateChainFlags; + +#define GCR_TYPE_CERTIFICATE_CHAIN (gcr_certificate_chain_get_type ()) +#define GCR_CERTIFICATE_CHAIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_CHAIN, GcrCertificateChain)) +#define GCR_CERTIFICATE_CHAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_CHAIN, GcrCertificateChainClass)) +#define GCR_IS_CERTIFICATE_CHAIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_CHAIN)) +#define GCR_IS_CERTIFICATE_CHAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_CHAIN)) +#define GCR_CERTIFICATE_CHAIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_CHAIN, GcrCertificateChainClass)) + +typedef struct _GcrCertificateChain GcrCertificateChain; +typedef struct _GcrCertificateChainClass GcrCertificateChainClass; +typedef struct _GcrCertificateChainPrivate GcrCertificateChainPrivate; + +struct _GcrCertificateChain { + GObject parent; + + /*< private >*/ + GcrCertificateChainPrivate *pv; +}; + +struct _GcrCertificateChainClass { + GObjectClass parent_class; +}; + +GType gcr_certificate_chain_get_type (void) G_GNUC_CONST; + +GcrCertificateChain* gcr_certificate_chain_new (void); + +void gcr_certificate_chain_add (GcrCertificateChain *self, + GcrCertificate *certificate); + +GcrCertificateChainStatus gcr_certificate_chain_get_status (GcrCertificateChain *self); + +GcrCertificate* gcr_certificate_chain_get_anchor (GcrCertificateChain *self); + +GcrCertificate* gcr_certificate_chain_get_endpoint (GcrCertificateChain *self); + +guint gcr_certificate_chain_get_length (GcrCertificateChain *self); + +GcrCertificate* gcr_certificate_chain_get_certificate (GcrCertificateChain *self, + guint index); + +gboolean gcr_certificate_chain_build (GcrCertificateChain *self, + const gchar *purpose, + const gchar *peer, + GcrCertificateChainFlags flags, + GCancellable *cancellable, + GError **error); + +void gcr_certificate_chain_build_async (GcrCertificateChain *self, + const gchar *purpose, + const gchar *peer, + GcrCertificateChainFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_certificate_chain_build_finish (GcrCertificateChain *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_CHAIN_H__ */ diff --git a/gcr/gcr-certificate-extensions.c b/gcr/gcr-certificate-extensions.c new file mode 100644 index 0000000..393b3a6 --- /dev/null +++ b/gcr/gcr-certificate-extensions.c @@ -0,0 +1,334 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ +#include "config.h" + +#include "gcr-certificate-extensions.h" + +#include "gcr/gcr-oids.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-dn.h" + +#include + +GBytes * +_gcr_certificate_extension_find (GNode *cert, + GQuark oid, + gboolean *critical) +{ + GNode *node; + gint index; + + g_return_val_if_fail (cert != NULL, NULL); + + /* Extensions */ + for (index = 1; TRUE; ++index) { + node = egg_asn1x_node (cert, "tbsCertificate", "extensions", index, NULL); + if (node == NULL) + return NULL; + + /* Dig out the OID */ + if (egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL)) == oid) { + + if (critical) { + if (!egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), critical)) + g_return_val_if_reached (NULL); + } + + /* Extension value */ + return egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL)); + } + } + + g_assert_not_reached (); +} + +gboolean +_gcr_certificate_extension_basic_constraints (GBytes *data, + gboolean *is_ca, + gint *path_len) +{ + gboolean ret = TRUE; + GNode *asn = NULL; + GNode *node; + gulong value; + + g_return_val_if_fail (data != NULL, FALSE); + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "BasicConstraints", data); + if (asn == NULL) + return FALSE; + + if (path_len) { + node = egg_asn1x_node (asn, "pathLenConstraint", NULL); + if (!egg_asn1x_have (node)) + *path_len = -1; + else if (!egg_asn1x_get_integer_as_ulong (node, &value)) + ret = FALSE; + else + *path_len = value; + } + + if (is_ca) { + node = egg_asn1x_node (asn, "cA", NULL); + if (!egg_asn1x_have (node)) + *is_ca = FALSE; + else if (!egg_asn1x_get_boolean (node, is_ca)) + ret = FALSE; + } + + egg_asn1x_destroy (asn); + return ret; +} + +GQuark * +_gcr_certificate_extension_extended_key_usage (GBytes *data) +{ + GNode *asn = NULL; + GNode *node; + GArray *array; + GQuark oid; + int i; + + g_return_val_if_fail (data != NULL, NULL); + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "ExtKeyUsageSyntax", data); + if (asn == NULL) + return NULL; + + array = g_array_new (TRUE, TRUE, sizeof (GQuark)); + for (i = 0; TRUE; ++i) { + node = egg_asn1x_node (asn, i + 1, NULL); + if (node == NULL) + break; + oid = egg_asn1x_get_oid_as_quark (node); + g_array_append_val (array, oid); + } + + egg_asn1x_destroy (asn); + return (GQuark*)g_array_free (array, FALSE); +} + +gpointer +_gcr_certificate_extension_subject_key_identifier (GBytes *data, + gsize *n_keyid) +{ + GNode *asn = NULL; + gpointer result; + + g_return_val_if_fail (data != NULL, NULL); + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SubjectKeyIdentifier", data); + if (asn == NULL) + return NULL; + + result = egg_asn1x_get_string_as_raw (asn, g_realloc, n_keyid); + egg_asn1x_destroy (asn); + + return result; +} + +gboolean +_gcr_certificate_extension_key_usage (GBytes *data, + gulong *key_usage) +{ + GNode *asn = NULL; + gboolean ret = TRUE; + guint n_bits; + + g_return_val_if_fail (data != NULL, FALSE); + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "KeyUsage", data); + if (asn == NULL) + return FALSE; + + ret = egg_asn1x_get_bits_as_ulong (asn, key_usage, &n_bits); + egg_asn1x_destroy (asn); + return ret; +} + +static void +general_name_parse_other (GNode *node, GcrGeneralName *general) +{ + GNode *decode = NULL; + GQuark oid; + GNode *any; + + general->type = GCR_GENERAL_NAME_OTHER; + general->description = _("Other Name"); + general->display = NULL; + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "type-id", NULL)); + any = egg_asn1x_node (node, "value", NULL); + + if (any == NULL) + return; + + if (oid == GCR_OID_ALT_NAME_XMPP_ADDR) { + general->description = _("XMPP Addr"); + decode = egg_asn1x_get_any_as (any, pkix_asn1_tab, "UTF8String"); + general->display = egg_asn1x_get_string_as_utf8 (decode, g_realloc); + } else if (oid == GCR_OID_ALT_NAME_DNS_SRV) { + general->description = _("DNS SRV"); + decode = egg_asn1x_get_any_as (any, pkix_asn1_tab, "IA5String"); + general->display = egg_asn1x_get_string_as_utf8 (decode, g_realloc); + } + + egg_asn1x_destroy (decode); +} + +static void +general_name_parse_rfc822 (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_RFC822; + general->description = _("Email"); + general->display = egg_asn1x_get_string_as_utf8 (node, g_realloc); +} + +static void +general_name_parse_dns (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_DNS; + general->description = _("DNS"); + general->display = egg_asn1x_get_string_as_utf8 (node, g_realloc); +} + +static void +general_name_parse_x400 (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_X400; + general->description = _("X400 Address"); +} + +static void +general_name_parse_dn (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_DNS; + general->description = _("Directory Name"); + general->display = egg_dn_read (node); +} + +static void +general_name_parse_edi (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_EDI; + general->description = _("EDI Party Name"); +} + +static void +general_name_parse_uri (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_URI; + general->description = _("URI"); + general->display = egg_asn1x_get_string_as_utf8 (node, g_realloc); +} + +static void +general_name_parse_ip (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_IP; + general->description = _("IP Address"); + general->display = egg_asn1x_get_string_as_utf8 (node, g_realloc); +} + +static void +general_name_parse_registered (GNode *node, GcrGeneralName *general) +{ + general->type = GCR_GENERAL_NAME_REGISTERED_ID; + general->description = _("Registered ID"); + general->display = egg_asn1x_get_oid_as_string (node); +} + +GArray* +_gcr_certificate_extension_subject_alt_name (GBytes *data) +{ + GNode *asn = NULL; + guint count, i; + const gchar *node_name; + GArray *names; + GcrGeneralName general; + GNode *choice; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SubjectAltName", data); + if (asn == NULL) + return NULL; + + names = g_array_new (FALSE, TRUE, sizeof (GcrGeneralName)); + count = egg_asn1x_count (asn); + + for (i = 0; i < count; i++) { + choice = egg_asn1x_get_choice (egg_asn1x_node (asn, i + 1, NULL)); + g_return_val_if_fail (choice, NULL); + + node_name = egg_asn1x_name (choice); + g_return_val_if_fail (node_name, NULL); + + memset (&general, 0, sizeof (general)); + + if (g_str_equal (node_name, "otherName")) + general_name_parse_other (choice, &general); + + else if (g_str_equal (node_name, "rfc822Name")) + general_name_parse_rfc822 (choice, &general); + + else if (g_str_equal (node_name, "dNSName")) + general_name_parse_dns (choice, &general); + + else if (g_str_equal (node_name, "x400Address")) + general_name_parse_x400 (choice, &general); + + else if (g_str_equal (node_name, "directoryName")) + general_name_parse_dn (choice, &general); + + else if (g_str_equal (node_name, "ediPartyName")) + general_name_parse_edi (choice, &general); + + else if (g_str_equal (node_name, "uniformResourceIdentifier")) + general_name_parse_uri (choice, &general); + + else if (g_str_equal (node_name, "IPAddress")) + general_name_parse_ip (choice, &general); + + else if (g_str_equal (node_name, "registeredID")) + general_name_parse_registered (choice, &general); + + general.raw = egg_asn1x_get_element_raw (choice); + g_array_append_val (names, general); + } + + egg_asn1x_destroy (asn); + return names; +} + +void +_gcr_general_names_free (GArray *names) +{ + GcrGeneralName *name; + guint i; + + for (i = 0; names && i < names->len; i++) { + name = &g_array_index (names, GcrGeneralName, i); + g_free (name->display); + g_bytes_unref (name->raw); + } + g_array_free (names, TRUE); +} diff --git a/gcr/gcr-certificate-extensions.h b/gcr/gcr-certificate-extensions.h new file mode 100644 index 0000000..3f0849c --- /dev/null +++ b/gcr/gcr-certificate-extensions.h @@ -0,0 +1,84 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_CERTIFICATE_EXTENSIONS_H +#define GCR_CERTIFICATE_EXTENSIONS_H + +#include + +G_BEGIN_DECLS + +GBytes * _gcr_certificate_extension_find (GNode *cert, + GQuark oid, + gboolean *critical); + +gboolean _gcr_certificate_extension_basic_constraints (GBytes *data, + gboolean *is_ca, + gint *path_len); + +GQuark * _gcr_certificate_extension_extended_key_usage (GBytes *data); + +gpointer _gcr_certificate_extension_subject_key_identifier (GBytes *data, + gsize *n_keyid); + +typedef enum { + GCR_KEY_USAGE_DIGITAL_SIGNATURE = 1 << 0, + GCR_KEY_USAGE_NON_REPUDIATION = 1 << 1, + GCR_KEY_USAGE_KEY_ENCIPHERMENT = 1 << 2, + GCR_KEY_USAGE_DATA_ENCIPHERMENT = 1 << 3, + GCR_KEY_USAGE_KEY_AGREEMENT = 1 << 4, + GCR_KEY_USAGE_KEY_CERT_SIGN = 1 << 5, + GCR_KEY_USAGE_CRL_SIGN = 1 << 6, +} GcrCertificateExtensionKeyUsage; + +gboolean _gcr_certificate_extension_key_usage (GBytes *data, + gulong *key_usage); + +typedef enum { + GCR_GENERAL_NAME_OTHER, + GCR_GENERAL_NAME_RFC822, + GCR_GENERAL_NAME_DNS, + GCR_GENERAL_NAME_X400, + GCR_GENERAL_NAME_DN, + GCR_GENERAL_NAME_EDI, + GCR_GENERAL_NAME_URI, + GCR_GENERAL_NAME_IP, + GCR_GENERAL_NAME_REGISTERED_ID, +} GcrGeneralNameType; + +typedef struct { + GcrGeneralNameType type; + const gchar *description; + gchar *display; + GBytes *raw; +} GcrGeneralName; + +GArray * _gcr_certificate_extension_subject_alt_name (GBytes *data); + +void _gcr_general_names_free (GArray *names); + +G_END_DECLS + +#endif /* GCR_CERTIFICATE_H */ diff --git a/gcr/gcr-certificate-request.c b/gcr/gcr-certificate-request.c new file mode 100644 index 0000000..1128f30 --- /dev/null +++ b/gcr/gcr-certificate-request.c @@ -0,0 +1,833 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-certificate-request.h" +#include "gcr-key-mechanisms.h" +#include "gcr-subject-public-key.h" + +#include "gcr/gcr-enum-types-base.h" +#include "gcr/gcr-oids.h" + +#include +#include +#include +#include + +#include + +/** + * SECTION:gcr-certificate-request + * @title: GcrCertificateRequest + * @short_description: Represents a certificate request + * + * This is an object that allows creation of certificate requests. A + * certificate request is sent to a certificate authority to request an + * X.509 certificate. + * + * Use gcr_certificate_request_prepare() to create a blank certificate + * request for a given private key. Set the common name on the certificate + * request with gcr_certificate_request_set_cn(), and then sign the request + * with gcr_certificate_request_complete_async(). + */ + +/** + * GcrCertificateRequest: + * + * Represents a certificate request. + */ + +/** + * GcrCertificateRequestFormat: + * @GCR_CERTIFICATE_REQUEST_PKCS10: certificate request is in PKCS\#10 format + * + * The format of a certificate request. Currently only PKCS\#10 is supported. + */ + +#define GCR_CERTIFICATE_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_REQUEST, GcrCertificateRequestClass)) +#define GCR_IS_CERTIFICATE_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_REQUEST)) +#define GCR_CERTIFICATE_REQUEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_REQUEST, GcrCertificateRequestClass)) + +typedef struct _GcrCertificateRequestClass GcrCertificateRequestClass; + +struct _GcrCertificateRequest { + GObject parent; + + GckObject *private_key; + GNode *asn; + gulong *mechanisms; + gulong n_mechanisms; +}; + +struct _GcrCertificateRequestClass { + GObjectClass parent_class; +}; + +enum { + PROP_0, + PROP_FORMAT, + PROP_PRIVATE_KEY +}; + +/* Forward declarations */ +G_DEFINE_TYPE (GcrCertificateRequest, gcr_certificate_request, G_TYPE_OBJECT); + +/* When updating here, update prepare_to_be_signed() */ +static const gulong RSA_MECHANISMS[] = { + CKM_SHA1_RSA_PKCS, + CKM_RSA_PKCS, +}; + +/* When updating here, update prepare_to_be_signed() */ +static const gulong DSA_MECHANISMS[] = { + CKM_DSA_SHA1, + CKM_DSA, +}; + +static const gulong ALL_MECHANISMS[] = { + CKM_SHA1_RSA_PKCS, + CKM_DSA_SHA1, + CKM_RSA_PKCS, + CKM_DSA, +}; + +G_STATIC_ASSERT (sizeof (ALL_MECHANISMS) == sizeof (RSA_MECHANISMS) + sizeof (DSA_MECHANISMS)); + +static void +gcr_certificate_request_init (GcrCertificateRequest *self) +{ + +} + +static void +gcr_certificate_request_constructed (GObject *obj) +{ + GcrCertificateRequest *self = GCR_CERTIFICATE_REQUEST (obj); + GNode *version; + + G_OBJECT_CLASS (gcr_certificate_request_parent_class)->constructed (obj); + + self->asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-10-CertificationRequest"); + g_return_if_fail (self->asn != NULL); + + /* Setup the version */ + version = egg_asn1x_node (self->asn, "certificationRequestInfo", "version", NULL); + egg_asn1x_set_integer_as_ulong (version, 0); +} + +static void +gcr_certificate_request_finalize (GObject *obj) +{ + GcrCertificateRequest *self = GCR_CERTIFICATE_REQUEST (obj); + + egg_asn1x_destroy (self->asn); + g_free (self->mechanisms); + + G_OBJECT_CLASS (gcr_certificate_request_parent_class)->finalize (obj); +} + +static void +gcr_certificate_request_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrCertificateRequest *self = GCR_CERTIFICATE_REQUEST (obj); + GcrCertificateRequestFormat format; + + switch (prop_id) { + case PROP_PRIVATE_KEY: + g_return_if_fail (self->private_key == NULL); + self->private_key = g_value_dup_object (value); + g_return_if_fail (GCK_IS_OBJECT (self->private_key)); + break; + case PROP_FORMAT: + format = g_value_get_enum (value); + g_return_if_fail (format == GCR_CERTIFICATE_REQUEST_PKCS10); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_request_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrCertificateRequest *self = GCR_CERTIFICATE_REQUEST (obj); + + switch (prop_id) { + case PROP_PRIVATE_KEY: + g_value_set_object (value, gcr_certificate_request_get_private_key (self)); + break; + case PROP_FORMAT: + g_value_set_enum (value, gcr_certificate_request_get_format (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_request_class_init (GcrCertificateRequestClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructed = gcr_certificate_request_constructed; + gobject_class->finalize = gcr_certificate_request_finalize; + gobject_class->set_property = gcr_certificate_request_set_property; + gobject_class->get_property = gcr_certificate_request_get_property; + + /** + * GcrCertificateRequest:private-key: + * + * The private key that this certificate request is for. + */ + g_object_class_install_property (gobject_class, PROP_PRIVATE_KEY, + g_param_spec_object ("private-key", "Private key", "Private key for request", + GCK_TYPE_OBJECT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GcrCertificateRequest:format: + * + * The format of the certificate request. + */ + g_object_class_install_property (gobject_class, PROP_FORMAT, + g_param_spec_enum ("format", "Format", "Format of certificate request", + GCR_TYPE_CERTIFICATE_REQUEST_FORMAT, GCR_CERTIFICATE_REQUEST_PKCS10, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +/** + * gcr_certificate_request_prepare: + * @format: the format for the certificate request + * @private_key: the private key the the certificate is being requested for + * + * Create a new certificate request, in the given format for the private key. + * + * Returns: (transfer full): a new #GcrCertificate request + */ +GcrCertificateRequest * +gcr_certificate_request_prepare (GcrCertificateRequestFormat format, + GckObject *private_key) +{ + g_return_val_if_fail (format == GCR_CERTIFICATE_REQUEST_PKCS10, NULL); + g_return_val_if_fail (GCK_IS_OBJECT (private_key), NULL); + + return g_object_new (GCR_TYPE_CERTIFICATE_REQUEST, + "format", format, + "private-key", private_key, + NULL); +} + +/** + * gcr_certificate_request_get_private_key: + * @self: the certificate request + * + * Get the private key this certificate request is for. + * + * Returns: (transfer none): the private key, + */ +GckObject * +gcr_certificate_request_get_private_key (GcrCertificateRequest *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST (self), NULL); + return self->private_key; +} + +/** + * gcr_certificate_request_get_format: + * @self: the certificate request + * + * Get the format of this certificate request. + * + * Returns: the format + */ +GcrCertificateRequestFormat +gcr_certificate_request_get_format (GcrCertificateRequest *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST (self), 0); + return GCR_CERTIFICATE_REQUEST_PKCS10; +} + +/** + * gcr_certificate_request_set_cn: + * @self: the certificate request + * @cn: common name to set on the request + * + * Set the common name encoded in the certificate request. + */ +void +gcr_certificate_request_set_cn (GcrCertificateRequest *self, + const gchar *cn) +{ + GNode *subject; + GNode *dn; + + g_return_if_fail (GCR_IS_CERTIFICATE_REQUEST (self)); + g_return_if_fail (cn != NULL); + + subject = egg_asn1x_node (self->asn, "certificationRequestInfo", "subject", NULL); + dn = egg_asn1x_node (subject, "rdnSequence", NULL); + + /* TODO: we shouldn't really be clearing this, but replacing CN */ + egg_asn1x_set_choice (subject, dn); + egg_asn1x_clear (dn); + egg_dn_add_string_part (dn, GCR_OID_NAME_CN, cn); +} + +static GBytes * +hash_sha1_pkcs1 (GBytes *data) +{ + const guchar SHA1_ASN[15] = /* Object ID is 1.3.14.3.2.26 */ + { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, + 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 }; + + GChecksum *checksum; + guchar *hash; + gsize n_hash; + gsize n_digest; + + n_digest = g_checksum_type_get_length (G_CHECKSUM_SHA1); + n_hash = n_digest + sizeof (SHA1_ASN); + hash = g_malloc (n_hash); + memcpy (hash, SHA1_ASN, sizeof (SHA1_ASN)); + + checksum = g_checksum_new (G_CHECKSUM_SHA1); + g_checksum_update (checksum, g_bytes_get_data (data, NULL), g_bytes_get_size (data)); + g_checksum_get_digest (checksum, hash + sizeof (SHA1_ASN), &n_digest); + g_checksum_free (checksum); + + return g_bytes_new_take (hash, n_hash); +} + +static GBytes * +hash_sha1 (GBytes *data) +{ + GChecksum *checksum; + guchar *hash; + gsize n_hash; + + n_hash = g_checksum_type_get_length (G_CHECKSUM_SHA1); + hash = g_malloc (n_hash); + + checksum = g_checksum_new (G_CHECKSUM_SHA1); + g_checksum_update (checksum, g_bytes_get_data (data, NULL), g_bytes_get_size (data)); + g_checksum_get_digest (checksum, hash, &n_hash); + g_checksum_free (checksum); + + return g_bytes_new_take (hash, n_hash); +} + +static GBytes * +prepare_to_be_signed (GcrCertificateRequest *self, + GckMechanism *mechanism) +{ + GNode *node; + GBytes *data; + GBytes *hash; + + g_assert (mechanism != NULL); + + node = egg_asn1x_node (self->asn, "certificationRequestInfo", NULL); + data = egg_asn1x_encode (node, NULL); + + mechanism->parameter = NULL; + mechanism->n_parameter = 0; + + switch (mechanism->type) { + case CKM_SHA1_RSA_PKCS: + case CKM_DSA_SHA1: + return data; + + case CKM_RSA_PKCS: + hash = hash_sha1_pkcs1 (data); + g_bytes_unref (data); + return hash; + + case CKM_DSA: + hash = hash_sha1 (data); + g_bytes_unref (data); + return hash; + + default: + g_assert_not_reached (); + return NULL; + } +} + +static gboolean +prepare_subject_public_key_and_mechanisms (GcrCertificateRequest *self, + GNode *subject_public_key, + GQuark *algorithm, + const gulong **mechanisms, + gsize *n_mechanisms, + GError **error) +{ + GBytes *encoded; + GNode *node; + GQuark oid; + + g_assert (algorithm != NULL); + g_assert (mechanisms != NULL); + g_assert (n_mechanisms != NULL); + + encoded = egg_asn1x_encode (subject_public_key, NULL); + g_return_val_if_fail (encoded != NULL, FALSE); + + node = egg_asn1x_node (subject_public_key, "algorithm", "algorithm", NULL); + oid = egg_asn1x_get_oid_as_quark (node); + + if (oid == GCR_OID_PKIX1_RSA) { + *mechanisms = RSA_MECHANISMS; + *n_mechanisms = G_N_ELEMENTS (RSA_MECHANISMS); + *algorithm = GCR_OID_PKIX1_SHA1_WITH_RSA; + + } else if (oid == GCR_OID_PKIX1_DSA) { + *mechanisms = DSA_MECHANISMS; + *n_mechanisms = G_N_ELEMENTS (DSA_MECHANISMS); + *algorithm = GCR_OID_PKIX1_SHA1_WITH_DSA; + + } else { + g_bytes_unref (encoded); + g_set_error (error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED, + _("Unsupported key type for certificate request")); + return FALSE; + } + + node = egg_asn1x_node (self->asn, "certificationRequestInfo", "subjectPKInfo", NULL); + if (!egg_asn1x_decode (node, encoded)) + g_return_val_if_reached (FALSE); + + g_bytes_unref (encoded); + return TRUE; +} + +static void +encode_take_signature_into_request (GcrCertificateRequest *self, + GQuark algorithm, + GNode *subject_public_key, + guchar *result, + gsize n_result) +{ + GNode *params; + GNode *node; + + node = egg_asn1x_node (self->asn, "signature", NULL); + egg_asn1x_take_bits_as_raw (node, g_bytes_new_take (result, n_result), n_result * 8); + + node = egg_asn1x_node (self->asn, "signatureAlgorithm", "algorithm", NULL); + egg_asn1x_set_oid_as_quark (node, algorithm); + + node = egg_asn1x_node (self->asn, "signatureAlgorithm", "parameters", NULL); + params = egg_asn1x_node (subject_public_key, "algorithm", "parameters", NULL); + egg_asn1x_set_any_from (node, params); +} + +/** + * gcr_certificate_request_complete: + * @self: a certificate request + * @cancellable: a cancellation object + * @error: location to place an error on failure + * + * Complete and sign a certificate request, so that it can be encoded + * and sent to a certificate authority. + * + * This call may block as it signs the request using the private key. + * + * Returns: whether certificate request was successfully completed or not + */ +gboolean +gcr_certificate_request_complete (GcrCertificateRequest *self, + GCancellable *cancellable, + GError **error) +{ + GNode *subject_public_key; + const gulong *mechanisms; + gsize n_mechanisms; + GckMechanism mechanism = { 0, }; + GQuark algorithm = 0; + GBytes *tbs; + GckSession *session; + guchar *signature; + gsize n_signature; + gboolean ret; + + g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST (self), FALSE); + g_return_val_if_fail (cancellable == NULL || G_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + subject_public_key = _gcr_subject_public_key_load (self->private_key, + cancellable, error); + if (subject_public_key == NULL) + return FALSE; + + ret = prepare_subject_public_key_and_mechanisms (self, subject_public_key, + &algorithm, &mechanisms, + &n_mechanisms, error); + + if (!ret) { + egg_asn1x_destroy (subject_public_key); + return FALSE; + } + + /* Figure out which mechanism to use */ + mechanism.type = _gcr_key_mechanisms_check (self->private_key, mechanisms, + n_mechanisms, CKA_SIGN, + cancellable, NULL); + if (mechanism.type == GCK_INVALID) { + egg_asn1x_destroy (subject_public_key); + g_set_error (error, GCK_ERROR, CKR_KEY_TYPE_INCONSISTENT, + _("The key cannot be used to sign the request")); + return FALSE; + } + + tbs = prepare_to_be_signed (self, &mechanism); + session = gck_object_get_session (self->private_key); + signature = gck_session_sign_full (session, self->private_key, &mechanism, + g_bytes_get_data (tbs, NULL), + g_bytes_get_size (tbs), + &n_signature, cancellable, error); + g_object_unref (session); + g_bytes_unref (tbs); + + if (!signature) { + egg_asn1x_destroy (subject_public_key); + return FALSE; + } + + encode_take_signature_into_request (self, algorithm, subject_public_key, + signature, n_signature); + egg_asn1x_destroy (subject_public_key); + return TRUE; +} + +typedef struct { + GcrCertificateRequest *request; + GCancellable *cancellable; + GQuark algorithm; + GNode *subject_public_key; + GckMechanism mechanism; + GckSession *session; + GBytes *tbs; +} CompleteClosure; + +static void +complete_closure_free (gpointer data) +{ + CompleteClosure *closure = data; + egg_asn1x_destroy (closure->subject_public_key); + g_clear_object (&closure->request); + g_clear_object (&closure->cancellable); + g_clear_object (&closure->session); + if (closure->tbs) + g_bytes_unref (closure->tbs); + g_free (closure); +} + +static void +on_certificate_request_signed (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + CompleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GError *error = NULL; + guchar *signature; + gsize n_signature; + + signature = gck_session_sign_finish (closure->session, result, &n_signature, &error); + if (error == NULL) { + encode_take_signature_into_request (closure->request, + closure->algorithm, + closure->subject_public_key, + signature, n_signature); + + } else { + g_simple_async_result_take_error (res, error); + } + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +on_mechanism_check (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + CompleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + + closure->mechanism.type = _gcr_key_mechanisms_check_finish (closure->request->private_key, + result, NULL); + if (closure->mechanism.type == GCK_INVALID) { + g_simple_async_result_set_error (res, GCK_ERROR, CKR_KEY_TYPE_INCONSISTENT, + _("The key cannot be used to sign the request")); + g_simple_async_result_complete (res); + + } else { + closure->tbs = prepare_to_be_signed (closure->request, &closure->mechanism); + gck_session_sign_async (closure->session, + closure->request->private_key, + &closure->mechanism, + g_bytes_get_data (closure->tbs, NULL), + g_bytes_get_size (closure->tbs), + closure->cancellable, + on_certificate_request_signed, + g_object_ref (res)); + } + + g_object_unref (res); +} + +static void +on_subject_public_key_loaded (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + CompleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + const gulong *mechanisms; + gsize n_mechanisms; + GError *error = NULL; + + closure->subject_public_key = _gcr_subject_public_key_load_finish (result, &error); + if (error == NULL) { + prepare_subject_public_key_and_mechanisms (closure->request, + closure->subject_public_key, + &closure->algorithm, + &mechanisms, + &n_mechanisms, + &error); + } + + if (error != NULL) { + g_simple_async_result_take_error (res, error); + g_simple_async_result_complete (res); + + } else { + _gcr_key_mechanisms_check_async (closure->request->private_key, + mechanisms, n_mechanisms, CKA_SIGN, + closure->cancellable, on_mechanism_check, + g_object_ref (res)); + } + + g_object_unref (res); +} + +/** + * gcr_certificate_request_complete_async: + * @self: a certificate request + * @cancellable: a cancellation object + * @callback: called when the operation completes + * @user_data: data to pass to the callback + * + * Asynchronously complete and sign a certificate request, so that it can + * be encoded and sent to a certificate authority. + * + * This call will return immediately and complete later. + */ +void +gcr_certificate_request_complete_async (GcrCertificateRequest *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + CompleteClosure *closure; + + g_return_if_fail (GCR_IS_CERTIFICATE_REQUEST (self)); + g_return_if_fail (cancellable == NULL || G_CANCELLABLE (cancellable)); + + res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, + gcr_certificate_request_complete_async); + closure = g_new0 (CompleteClosure, 1); + closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL; + closure->session = gck_object_get_session (self->private_key); + closure->request = g_object_ref (self); + g_simple_async_result_set_op_res_gpointer (res, closure, complete_closure_free); + + _gcr_subject_public_key_load_async (self->private_key, cancellable, + on_subject_public_key_loaded, + g_object_ref (res)); + + g_object_unref (res); +} + +/** + * gcr_certificate_request_complete_finish: + * @self: a certificate request + * @result: result of the asynchronous operation + * @error: location to place an error on failure + * + * Finish an asynchronous operation to complete and sign a certificate + * request. + * + * Returns: whether certificate request was successfully completed or not + */ +gboolean +gcr_certificate_request_complete_finish (GcrCertificateRequest *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST (self), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), + gcr_certificate_request_complete_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +/** + * gcr_certificate_request_encode: + * @self: a certificate request + * @textual: whether to encode output as text + * @length: location to place length of returned data + * + * Encode the certificate request. It must have been completed with + * gcr_certificate_request_complete() or gcr_certificate_request_complete_async() + * + * If @textual is %FALSE, the output is a DER encoded certificate request. + * + * If @textual is %TRUE, the output is encoded as text. For PKCS\#10 requests this + * is done using the OpenSSL style PEM encoding. + * + * Returns: (transfer full) (array length=length): the encoded certificate request + */ +guchar * +gcr_certificate_request_encode (GcrCertificateRequest *self, + gboolean textual, + gsize *length) +{ + GBytes *bytes; + gpointer encoded; + gpointer data; + gsize size; + + g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST (self), NULL); + g_return_val_if_fail (length != NULL, NULL); + + bytes = egg_asn1x_encode (self->asn, NULL); + if (bytes == NULL) { + g_warning ("couldn't encode certificate request: %s", + egg_asn1x_message (self->asn)); + return NULL; + } + + size = g_bytes_get_size (bytes); + encoded = g_byte_array_free (g_bytes_unref_to_array (bytes), FALSE); + + if (textual) { + data = egg_armor_write (encoded, size, + g_quark_from_static_string ("CERTIFICATE REQUEST"), + NULL, length); + g_free (encoded); + encoded = data; + + } else { + *length = size; + } + + return encoded; +} + +/** + * gcr_certificate_request_capable: + * @private_key: a private key + * @cancellable: cancellation object + * @error: location to place an error + * + * Check whether #GcrCertificateRequest is capable of creating a request + * for the given @private_key. + * + * Returns: whether a request can be created + */ +gboolean +gcr_certificate_request_capable (GckObject *private_key, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (GCK_IS_OBJECT (private_key), FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return _gcr_key_mechanisms_check (private_key, ALL_MECHANISMS, + G_N_ELEMENTS (ALL_MECHANISMS), + CKA_SIGN, cancellable, error); +} + +/** + * gcr_certificate_request_capable_async: + * @private_key: a private key + * @cancellable: cancellation object + * @callback: will be called when the operation completes + * @user_data: data to be passed to callback + * + * Asynchronously check whether #GcrCertificateRequest is capable of creating + * a request for the given @private_key. + */ +void +gcr_certificate_request_capable_async (GckObject *private_key, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (GCK_IS_OBJECT (private_key)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + _gcr_key_mechanisms_check_async (private_key, ALL_MECHANISMS, + G_N_ELEMENTS (ALL_MECHANISMS), + CKA_SIGN, cancellable, + callback, user_data); +} + +/** + * gcr_certificate_request_capable_finish: + * @result: asynchronous result + * @error: location to place an error + * + * Get the result for asynchronously check whether #GcrCertificateRequest is + * capable of creating a request for the given @private_key. + * + * Returns: whether a request can be created + */ +gboolean +gcr_certificate_request_capable_finish (GAsyncResult *result, + GError **error) +{ + GObject *source; + gulong mech; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + source = g_async_result_get_source_object (result); + mech = _gcr_key_mechanisms_check_finish (GCK_OBJECT (source), result, error); + g_object_unref (source); + + return mech != GCK_INVALID; +} diff --git a/gcr/gcr-certificate-request.h b/gcr/gcr-certificate-request.h new file mode 100644 index 0000000..8128efc --- /dev/null +++ b/gcr/gcr-certificate-request.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_REQUEST_H__ +#define __GCR_CERTIFICATE_REQUEST_H__ + +#include + +#include "gcr-types.h" + +G_BEGIN_DECLS + +typedef enum { + GCR_CERTIFICATE_REQUEST_PKCS10 = 1, +} GcrCertificateRequestFormat; + +#define GCR_TYPE_CERTIFICATE_REQUEST (gcr_certificate_request_get_type ()) +#define GCR_CERTIFICATE_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_REQUEST, GcrCertificateRequest)) +#define GCR_IS_CERTIFICATE_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_REQUEST)) + +typedef struct _GcrCertificateRequest GcrCertificateRequest; + +gboolean gcr_certificate_request_capable (GckObject *private_key, + GCancellable *cancellable, + GError **error); + +void gcr_certificate_request_capable_async (GckObject *private_key, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + +gboolean gcr_certificate_request_capable_finish (GAsyncResult *result, + GError **error); + +GType gcr_certificate_request_get_type (void) G_GNUC_CONST; + +GcrCertificateRequest * gcr_certificate_request_prepare (GcrCertificateRequestFormat format, + GckObject *private_key); + +GckObject * gcr_certificate_request_get_private_key (GcrCertificateRequest *self); + +GcrCertificateRequestFormat gcr_certificate_request_get_format (GcrCertificateRequest *self); + +void gcr_certificate_request_set_cn (GcrCertificateRequest *self, + const gchar *cn); + +gboolean gcr_certificate_request_complete (GcrCertificateRequest *self, + GCancellable *cancellable, + GError **error); + +void gcr_certificate_request_complete_async (GcrCertificateRequest *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_certificate_request_complete_finish (GcrCertificateRequest *self, + GAsyncResult *result, + GError **error); + +guchar * gcr_certificate_request_encode (GcrCertificateRequest *self, + gboolean textual, + gsize *length); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_REQUEST_H__ */ diff --git a/gcr/gcr-certificate.c b/gcr/gcr-certificate.c new file mode 100644 index 0000000..dad64d8 --- /dev/null +++ b/gcr/gcr-certificate.c @@ -0,0 +1,1207 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-certificate.h" +#include "gcr-certificate-extensions.h" +#include "gcr-comparable.h" +#include "gcr-icons.h" +#include "gcr-internal.h" +#include "gcr-subject-public-key.h" + +#include "gcr/gcr-oids.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-dn.h" +#include "egg/egg-hex.h" + +#include +#include + +/** + * SECTION:gcr-certificate + * @title: GcrCertificate + * @short_description: Represents an X.509 certificate + * + * This is an interface that represents an X.509 certificate. Objects can + * implement this interface to make a certificate usable with the GCR + * library. + * + * Various methods are available to parse out relevant bits of the certificate. + * However no verification of the validity of a certificate is done here. Use + * your favorite crypto library to do this. + * + * You can use #GcrSimpleCertificate to simply load a certificate for which + * you already have the raw certificate data. + * + * The #GcrCertificate interface has several properties that must be implemented. + * You can use a mixin to implement these properties if desired. See the + * gcr_certificate_mixin_class_init() and gcr_certificate_mixin_get_property() + * functions. + * + * All certificates are comparable. If implementing a #GcrCertificate, you can + * use GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE() to implement the #GcrComparable + * interface. + */ + +/** + * GcrCertificate: + * + * An object which holds a certificate. + */ + +/** + * GcrCertificateIface: + * @parent: the parent interface type + * @get_der_data: a method which returns the RAW der data of the certificate + * + * The interface that implementors of #GcrCertificate must implement. + */ + +/** + * GCR_CERTIFICATE_COLUMNS: + * + * The columns that are valid for a certificate. This is to be used with + * the #GcrTreeSelector or #GcrCollectionModel. + * + * This is an array of #GcrColumn, owned by the gcr library. + */ + +/* + * The DER data in this structure is owned by the derived class. + * It is only valid for the duration of the current call stack + * after we call gcr_certificate_get_der_data(). We shouldn't + * save it anywhere else. + * + * We keep the pointer around and compare it so that if the derived + * class returns exactly the same pointer and size, then we can + * keep from parsing things over again. + */ + +typedef struct _GcrCertificateInfo { + gconstpointer der; + gsize n_der; + GNode *asn1; + guint key_size; +} GcrCertificateInfo; + +/* Forward declarations */ + +static GBytes * _gcr_certificate_get_subject_const (GcrCertificate *self); +static GBytes * _gcr_certificate_get_issuer_const (GcrCertificate *self); + +enum { + PROP_FIRST = 0x0007000, + PROP_LABEL, + PROP_MARKUP, + PROP_DESCRIPTION, + PROP_ICON, + PROP_SUBJECT, + PROP_ISSUER, + PROP_EXPIRY +}; + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static GQuark CERTIFICATE_INFO = 0; + +static void +certificate_info_free (gpointer data) +{ + GcrCertificateInfo *info = data; + if (info) { + g_assert (info->asn1); + egg_asn1x_destroy (info->asn1); + g_free (info); + } +} + +static GcrCertificateInfo* +certificate_info_load (GcrCertificate *cert) +{ + GcrCertificateInfo *info; + GBytes *bytes; + GNode *asn1; + gconstpointer der; + gsize n_der; + + g_assert (GCR_IS_CERTIFICATE (cert)); + + der = gcr_certificate_get_der_data (cert, &n_der); + if (der == NULL) + return NULL; + + info = g_object_get_qdata (G_OBJECT (cert), CERTIFICATE_INFO); + if (info != NULL) { + if (n_der == info->n_der && der == info->der) + return info; + } + + /* TODO: Once GBytes is public, add to GcrCertificate interface */ + bytes = g_bytes_new_static (der, n_der); + + /* Cache is invalid or non existent */ + asn1 = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes); + + g_bytes_unref (bytes); + + if (asn1 == NULL) { + g_warning ("a derived class provided an invalid or unparseable X.509 DER certificate data."); + return NULL; + } + + info = g_new0 (GcrCertificateInfo, 1); + info->der = der; + info->n_der = n_der; + info->asn1 = asn1; + + g_object_set_qdata_full (G_OBJECT (cert), CERTIFICATE_INFO, info, certificate_info_free); + return info; +} + +static GChecksum* +digest_certificate (GcrCertificate *self, GChecksumType type) +{ + GChecksum *digest; + gconstpointer der; + gsize n_der; + + g_assert (GCR_IS_CERTIFICATE (self)); + + der = gcr_certificate_get_der_data (self, &n_der); + if (der == NULL) + return NULL; + + digest = g_checksum_new (type); + g_return_val_if_fail (digest, NULL); + + g_checksum_update (digest, der, n_der); + return digest; +} + +/** + * gcr_certificate_get_markup_text: + * @self: a certificate + * + * Calculate a GMarkup string for displaying this certificate. + * + * Returns: (transfer full): the markup string + */ +gchar * +gcr_certificate_get_markup_text (GcrCertificate *self) +{ + gchar *label = NULL; + gchar *issuer; + gchar *markup; + + g_object_get (self, "label", &label, NULL); + issuer = gcr_certificate_get_issuer_name (self); + + if (issuer) + markup = g_markup_printf_escaped ("%s\nIssued by: %s", label, issuer); + else + markup = g_markup_printf_escaped ("%s\nIssued by: No name", label); + + g_free (label); + g_free (issuer); + return markup; +} + +static void +on_transform_date_to_string (const GValue *src, GValue *dest) +{ + static const gsize len = 256; + GDate *date; + gchar *result; + + g_return_if_fail (G_VALUE_TYPE (src) == G_TYPE_DATE); + + date = g_value_get_boxed (src); + g_return_if_fail (date); + + result = g_malloc0 (len); + if (!g_date_strftime (result, len, "%x", date)) { + g_free (result); + result = NULL; + } + + g_value_take_string (dest, result); +} + +/* --------------------------------------------------------------------------------- + * INTERFACE + */ + +static void +gcr_certificate_default_init (GcrCertificateIface *iface) +{ + static volatile gsize initialized = 0; + + if (g_once_init_enter (&initialized)) { + CERTIFICATE_INFO = g_quark_from_static_string ("_gcr_certificate_certificate_info"); + + /** + * GcrCertificate:label: + * + * A readable label for this certificate. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("label", "Label", "Certificate label", + "", G_PARAM_READABLE)); + + /** + * GcrCertificate:description: + * + * A readable description for this certificate + */ + g_object_interface_install_property (iface, + g_param_spec_string ("description", "Description", "Description of object being rendered", + "", G_PARAM_READABLE)); + + /** + * GcrCertificate:markup: + * + * GLib markup to describe the certificate + */ + g_object_interface_install_property (iface, + g_param_spec_string ("markup", "Markup", "Markup which describes object being rendered", + "", G_PARAM_READABLE)); + + /** + * GcrCertificate:icon: + * + * An icon representing the certificate + */ + g_object_interface_install_property (iface, + g_param_spec_object ("icon", "Icon", "Icon for the object being rendered", + G_TYPE_ICON, G_PARAM_READABLE)); + + /** + * GcrCertificate:subject: + * + * Common name part of the certificate subject + */ + g_object_interface_install_property (iface, + g_param_spec_string ("subject", "Subject", "Common name of subject", + "", G_PARAM_READABLE)); + + /** + * GcrCertificate:issuer: + * + * Common name part of the certificate issuer + */ + g_object_interface_install_property (iface, + g_param_spec_string ("issuer", "Issuer", "Common name of issuer", + "", G_PARAM_READABLE)); + + /** + * GcrCertificate:expiry: + * + * The expiry date of the certificate + */ + g_object_interface_install_property (iface, + g_param_spec_boxed ("expiry", "Expiry", "Certificate expiry", + G_TYPE_DATE, G_PARAM_READABLE)); + + g_once_init_leave (&initialized, 1); + } +} + +typedef GcrCertificateIface GcrCertificateInterface; + +G_DEFINE_INTERFACE (GcrCertificate, gcr_certificate, GCR_TYPE_COMPARABLE); + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_certificate_get_columns: (skip) + * + * Get the columns appropriate for a certificate + * + * Returns: (transfer none): the columns + */ +const GcrColumn* +gcr_certificate_get_columns (void) +{ + static GcrColumn columns[] = { + { "icon", /* later */ 0, /* later */ 0, NULL, 0 }, + { "label", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Name"), + GCR_COLUMN_SORTABLE }, + { "issuer", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Issued By"), + GCR_COLUMN_SORTABLE }, + { "expiry", /* later */ 0, G_TYPE_STRING, NC_("column", "Expires"), + GCR_COLUMN_SORTABLE, on_transform_date_to_string }, + { NULL } + }; + + columns[0].property_type = columns[0].column_type = G_TYPE_ICON; + columns[3].property_type = G_TYPE_DATE; + return columns; +} + +/** + * gcr_certificate_compare: + * @first: (allow-none): the certificate to compare + * @other: (allow-none): the certificate to compare against + * + * Compare one certificate against another. If the certificates are equal + * then zero is returned. If one certificate is %NULL or not a certificate, + * then a non-zero value is returned. + * + * The return value is useful in a stable sort, but has no user logical + * meaning. + * + * Returns: zero if the certificates match, non-zero otherwise. + */ +gint +gcr_certificate_compare (GcrComparable *first, GcrComparable *other) +{ + gconstpointer data1, data2; + gsize size1, size2; + + if (!GCR_IS_CERTIFICATE (first)) + first = NULL; + if (!GCR_IS_CERTIFICATE (other)) + other = NULL; + + if (first == other) + return TRUE; + if (!first) + return 1; + if (!other) + return -1; + + data1 = gcr_certificate_get_der_data (GCR_CERTIFICATE (first), &size1); + data2 = gcr_certificate_get_der_data (GCR_CERTIFICATE (other), &size2); + + return gcr_comparable_memcmp (data1, size1, data2, size2); +} + + +/** + * gcr_certificate_get_der_data: + * @self: a #GcrCertificate + * @n_data: a pointer to a location to store the size of the resulting DER data. + * + * Gets the raw DER data for an X.509 certificate. + * + * Returns: (transfer none) (array length=n_data): raw DER data of the X.509 certificate + **/ +const guint8 * +gcr_certificate_get_der_data (GcrCertificate *self, + gsize *n_data) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (n_data != NULL, NULL); + g_return_val_if_fail (GCR_CERTIFICATE_GET_INTERFACE (self)->get_der_data, NULL); + return GCR_CERTIFICATE_GET_INTERFACE (self)->get_der_data (self, n_data); +} + +/** + * gcr_certificate_get_issuer_name: + * @self: a #GcrCertificate + * + * Get a name to represent the issuer of this certificate. + * + * This will try to lookup the common name, orianizational unit, + * organization in that order. + * + * Returns: the allocated issuer name, or NULL if no issuer name + */ +gchar * +gcr_certificate_get_issuer_name (GcrCertificate *self) +{ + gchar *name; + + name = gcr_certificate_get_issuer_part (self, "cn"); + if (name == NULL) + name = gcr_certificate_get_issuer_part (self, "ou"); + if (name == NULL) + name = gcr_certificate_get_issuer_part (self, "o"); + + return name; +} + +/** + * gcr_certificate_get_issuer_cn: + * @self: a #GcrCertificate + * + * Get the common name of the issuer of this certificate. + * + * The string returned should be freed by the caller when no longer + * required. + * + * Returns: The allocated issuer CN, or NULL if no issuer CN present. + */ +gchar* +gcr_certificate_get_issuer_cn (GcrCertificate *self) +{ + return gcr_certificate_get_issuer_part (self, "cn"); +} + +/** + * gcr_certificate_get_issuer_part: + * @self: a #GcrCertificate + * @part: a DN type string or OID. + * + * Get a part of the DN of the issuer of this certificate. + * + * Examples of a @part might be the 'OU' (organizational unit) + * or the 'CN' (common name). Only the value of that part + * of the DN is returned. + * + * The string returned should be freed by the caller when no longer + * required. + * + * Returns: (allow-none): the allocated part of the issuer DN, or %NULL if no + * such part is present + */ +gchar * +gcr_certificate_get_issuer_part (GcrCertificate *self, const char *part) +{ + GcrCertificateInfo *info; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (part != NULL, NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + return egg_dn_read_part (egg_asn1x_node (info->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL), part); +} + +static GBytes * +_gcr_certificate_get_issuer_const (GcrCertificate *self) +{ + GcrCertificateInfo *info; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + return egg_asn1x_get_element_raw (egg_asn1x_node (info->asn1, "tbsCertificate", "issuer", NULL)); +} + +/** + * gcr_certificate_get_issuer_raw: + * @self: a #GcrCertificate + * @n_data: The length of the returned data. + * + * Get the raw DER data for the issuer DN of the certificate. + * + * The data should be freed by using g_free() when no longer required. + * + * Returns: (transfer full) (array length=n_data): allocated memory containing + * the raw issuer + */ +guchar * +gcr_certificate_get_issuer_raw (GcrCertificate *self, + gsize *n_data) +{ + GBytes *bytes; + guchar *result; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (n_data != NULL, NULL); + + bytes = _gcr_certificate_get_issuer_const (self); + if (bytes == NULL) + return NULL; + + *n_data = g_bytes_get_size (bytes); + result = g_memdup (g_bytes_get_data (bytes, NULL), *n_data); + g_bytes_unref (bytes); + + return result; +} + +/** + * gcr_certificate_is_issuer: + * @self: a #GcrCertificate + * @issuer: a possible issuer #GcrCertificate + * + * Check if @issuer could be the issuer of this certificate. This is done by + * comparing the relevant subject and issuer fields. No signature check is + * done. Proper verification of certificates must be done via a crypto + * library. + * + * Returns: whether @issuer could be the issuer of the certificate. + */ +gboolean +gcr_certificate_is_issuer (GcrCertificate *self, GcrCertificate *issuer) +{ + GBytes *subject_dn; + GBytes *issuer_dn; + gboolean ret; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), FALSE); + g_return_val_if_fail (GCR_IS_CERTIFICATE (issuer), FALSE); + + subject_dn = _gcr_certificate_get_subject_const (issuer); + if (subject_dn == NULL) + return FALSE; + + issuer_dn = _gcr_certificate_get_issuer_const (self); + if (issuer_dn == NULL) + return FALSE; + + ret = g_bytes_equal (subject_dn, issuer_dn); + + g_bytes_unref (subject_dn); + g_bytes_unref (issuer_dn); + + return ret; +} + +/** + * gcr_certificate_get_issuer_dn: + * @self: a #GcrCertificate + * + * Get the full issuer DN of the certificate as a (mostly) + * readable string. + * + * The string returned should be freed by the caller when no longer + * required. + * + * Returns: The allocated issuer DN of the certificate. + */ +gchar* +gcr_certificate_get_issuer_dn (GcrCertificate *self) +{ + GcrCertificateInfo *info; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + return egg_dn_read (egg_asn1x_node (info->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL)); +} + +/** + * gcr_certificate_get_subject_cn: + * @self: a #GcrCertificate + * + * Get the common name of the subject of this certificate. + * + * The string returned should be freed by the caller when no longer + * required. + * + * Returns: The allocated subject CN, or NULL if no subject CN present. + */ +gchar* +gcr_certificate_get_subject_cn (GcrCertificate *self) +{ + return gcr_certificate_get_subject_part (self, "cn"); +} + +/** + * gcr_certificate_get_subject_name: + * @self: a #GcrCertificate + * + * Get a name to represent the subject of this certificate. + * + * This will try to lookup the common name, orianizational unit, + * organization in that order. + * + * Returns: the allocated subject name, or NULL if no subject name + */ +gchar * +gcr_certificate_get_subject_name (GcrCertificate *self) +{ + gchar *name; + + name = gcr_certificate_get_subject_part (self, "cn"); + if (name == NULL) + name = gcr_certificate_get_subject_part (self, "ou"); + if (name == NULL) + name = gcr_certificate_get_subject_part (self, "o"); + + return name; +} + +/** + * gcr_certificate_get_subject_part: + * @self: a #GcrCertificate + * @part: a DN type string or OID. + * + * Get a part of the DN of the subject of this certificate. + * + * Examples of a @part might be the 'OU' (organizational unit) + * or the 'CN' (common name). Only the value of that part + * of the DN is returned. + * + * The string returned should be freed by the caller when no longer + * required. + * + * Returns: (allow-none): the allocated part of the subject DN, or %NULL if no + * such part is present. + */ +gchar* +gcr_certificate_get_subject_part (GcrCertificate *self, const char *part) +{ + GcrCertificateInfo *info; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (part != NULL, NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + return egg_dn_read_part (egg_asn1x_node (info->asn1, "tbsCertificate", "subject", "rdnSequence", NULL), part); +} + +/** + * gcr_certificate_get_subject_dn: + * @self: a #GcrCertificate + * + * Get the full subject DN of the certificate as a (mostly) + * readable string. + * + * The string returned should be freed by the caller when no longer + * required. + * + * Returns: The allocated subject DN of the certificate. + */ +gchar* +gcr_certificate_get_subject_dn (GcrCertificate *self) +{ + GcrCertificateInfo *info; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + return egg_dn_read (egg_asn1x_node (info->asn1, "tbsCertificate", "subject", "rdnSequence", NULL)); +} + +static GBytes * +_gcr_certificate_get_subject_const (GcrCertificate *self) +{ + GcrCertificateInfo *info; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + return egg_asn1x_get_element_raw (egg_asn1x_node (info->asn1, "tbsCertificate", "subject", NULL)); +} + +/** + * gcr_certificate_get_subject_raw: + * @self: a #GcrCertificate + * @n_data: The length of the returned data. + * + * Get the raw DER data for the subject DN of the certificate. + * + * The data should be freed by using g_free() when no longer required. + * + * Returns: (transfer full) (array length=n_data): allocated memory containing + * the raw subject + */ +guchar * +gcr_certificate_get_subject_raw (GcrCertificate *self, gsize *n_data) +{ + GBytes *bytes; + guchar *result; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (n_data != NULL, NULL); + + bytes = _gcr_certificate_get_subject_const (self); + if (bytes == NULL) + return NULL; + + *n_data = g_bytes_get_size (bytes); + result = g_memdup (g_bytes_get_data (bytes, NULL), *n_data); + + g_bytes_unref (bytes); + + return result; +} + +/** + * gcr_certificate_get_issued_date: + * @self: a #GcrCertificate + * + * Get the issued date of this certificate. + * + * The #GDate returned should be freed by the caller using + * g_date_free() when no longer required. + * + * Returns: An allocated issued date of this certificate. + */ +GDate* +gcr_certificate_get_issued_date (GcrCertificate *self) +{ + GcrCertificateInfo *info; + GDate *date; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + date = g_date_new (); + if (!egg_asn1x_get_time_as_date (egg_asn1x_node (info->asn1, "tbsCertificate", "validity", "notBefore", NULL), date)) { + g_date_free (date); + return NULL; + } + + return date; +} + +/** + * gcr_certificate_get_expiry_date: + * @self: a #GcrCertificate + * + * Get the expiry date of this certificate. + * + * The #GDate returned should be freed by the caller using + * g_date_free() when no longer required. + * + * Returns: An allocated expiry date of this certificate. + */ +GDate* +gcr_certificate_get_expiry_date (GcrCertificate *self) +{ + GcrCertificateInfo *info; + GDate *date; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + date = g_date_new (); + if (!egg_asn1x_get_time_as_date (egg_asn1x_node (info->asn1, "tbsCertificate", "validity", "notAfter", NULL), date)) { + g_date_free (date); + return NULL; + } + + return date; +} + +/** + * gcr_certificate_get_key_size: + * @self: a #GcrCertificate + * + * Get the key size in bits of the public key represented + * by this certificate. + * + * Returns: The key size of the certificate. + */ +guint +gcr_certificate_get_key_size (GcrCertificate *self) +{ + GcrCertificateInfo *info; + GNode *subject_public_key; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), 0); + + info = certificate_info_load (self); + if (info == NULL) + return 0; + + if (!info->key_size) { + subject_public_key = egg_asn1x_node (info->asn1, "tbsCertificate", + "subjectPublicKeyInfo", NULL); + info->key_size = _gcr_subject_public_key_calculate_size (subject_public_key); + } + + return info->key_size; +} + +/** + * gcr_certificate_get_fingerprint: + * @self: a #GcrCertificate + * @type: the type of algorithm for the fingerprint. + * @n_length: The length of the resulting fingerprint. + * + * Calculate the fingerprint for this certificate. + * + * You can pass G_CHECKSUM_SHA1 or G_CHECKSUM_MD5 as the @type + * parameter. + * + * The caller should free the returned data using g_free() when + * it is no longer required. + * + * Returns: (array length=n_length): the raw binary fingerprint + **/ +guchar * +gcr_certificate_get_fingerprint (GcrCertificate *self, GChecksumType type, gsize *n_length) +{ + GChecksum *sum; + guchar *digest; + gssize length; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (n_length != NULL, NULL); + + sum = digest_certificate (self, type); + if (sum == NULL) + return NULL; + + length = g_checksum_type_get_length (type); + g_return_val_if_fail (length > 0, NULL); + digest = g_malloc (length); + *n_length = length; + g_checksum_get_digest (sum, digest, n_length); + g_checksum_free (sum); + + return digest; +} + +/** + * gcr_certificate_get_fingerprint_hex: + * @self: a #GcrCertificate + * @type: the type of algorithm for the fingerprint. + * + * Calculate the fingerprint for this certificate, and return it + * as a hex string. + * + * You can pass G_CHECKSUM_SHA1 or G_CHECKSUM_MD5 as the @type + * parameter. + * + * The caller should free the returned data using g_free() when + * it is no longer required. + * + * Returns: an allocated hex string which contains the fingerprint. + */ +gchar* +gcr_certificate_get_fingerprint_hex (GcrCertificate *self, GChecksumType type) +{ + GChecksum *sum; + guchar *digest; + gsize n_digest; + gssize length; + gchar *hex; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + sum = digest_certificate (self, type); + if (sum == NULL) + return NULL; + + length = g_checksum_type_get_length (type); + g_return_val_if_fail (length > 0, NULL); + digest = g_malloc (length); + n_digest = length; + g_checksum_get_digest (sum, digest, &n_digest); + hex = egg_hex_encode_full (digest, n_digest, TRUE, " ", 1); + g_checksum_free (sum); + g_free (digest); + return hex; +} + +/** + * gcr_certificate_get_serial_number: + * @self: a #GcrCertificate + * @n_length: the length of the returned data. + * + * Get the raw binary serial number of the certificate. + * + * The caller should free the returned data using g_free() when + * it is no longer required. + * + * Returns: (array length=n_length): the raw binary serial number. + */ +guchar * +gcr_certificate_get_serial_number (GcrCertificate *self, gsize *n_length) +{ + GcrCertificateInfo *info; + GBytes *bytes; + guchar *result; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (n_length != NULL, NULL); + + info = certificate_info_load (self); + if (info == NULL) + return NULL; + + bytes = egg_asn1x_get_integer_as_raw (egg_asn1x_node (info->asn1, "tbsCertificate", "serialNumber", NULL)); + g_return_val_if_fail (bytes != NULL, NULL); + + *n_length = g_bytes_get_size (bytes); + result = g_memdup (g_bytes_get_data (bytes, NULL), *n_length); + + g_bytes_unref (bytes); + return result; +} + +/** + * gcr_certificate_get_serial_number_hex: + * @self: a #GcrCertificate + * + * Get the serial number of the certificate as a hex string. + * + * The caller should free the returned data using g_free() when + * it is no longer required. + * + * Returns: an allocated string containing the serial number as hex. + */ +gchar* +gcr_certificate_get_serial_number_hex (GcrCertificate *self) +{ + guchar *serial; + gsize n_serial; + gchar *hex; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + + serial = gcr_certificate_get_serial_number (self, &n_serial); + if (serial == NULL) + return NULL; + + hex = egg_hex_encode (serial, n_serial); + g_free (serial); + return hex; +} + +/** + * gcr_certificate_get_icon: (skip) + * @self: The certificate + * + * Get the icon for a certificate. + * + * Returns: (transfer full): the icon for this certificate, which should be + * released with g_object_unref() + */ +GIcon * +gcr_certificate_get_icon (GcrCertificate *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), FALSE); + return g_themed_icon_new (GCR_ICON_CERTIFICATE); +} + +/** + * gcr_certificate_get_basic_constraints: + * @self: the certificate + * @is_ca: (out) (allow-none): location to place a %TRUE if is an authority + * @path_len: (out) (allow-none): location to place the max path length + * + * Get the basic constraints for the certificate if present. If %FALSE is + * returned then no basic constraints are present and the @is_ca and + * @path_len arguments are not changed. + * + * Returns: whether basic constraints are present or not + */ +gboolean +gcr_certificate_get_basic_constraints (GcrCertificate *self, + gboolean *is_ca, + gint *path_len) +{ + GcrCertificateInfo *info; + GBytes *value; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), FALSE); + + info = certificate_info_load (self); + if (info == NULL) + return FALSE; + + value = _gcr_certificate_extension_find (info->asn1, GCR_OID_BASIC_CONSTRAINTS, NULL); + if (!value) + return FALSE; + + if (!_gcr_certificate_extension_basic_constraints (value, is_ca, path_len)) + g_return_val_if_reached (FALSE); + + g_bytes_unref (value); + return TRUE; +} + +/* ----------------------------------------------------------------------------- + * MIXIN + */ + +/** + * GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE: + * + * Implement the GcrComparable interface. Use this macro like this: + * + * + * G_DEFINE_TYPE_WITH_CODE (MyCertificate, my_certificate, G_TYPE_OBJECT, + * GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE (); + * G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, my_certificate_iface_init); + * ); + * + */ + +/** + * gcr_certificate_mixin_emit_notify: + * @self: the #GcrCertificate + * + * Implementers of the #GcrCertificate mixin should call this function to notify + * when the certificate has changed to emit notifications on the various + * properties. + */ +void +gcr_certificate_mixin_emit_notify (GcrCertificate *self) +{ + GObject *obj; + + g_return_if_fail (GCR_IS_CERTIFICATE (self)); + + obj = G_OBJECT (self); + g_object_notify (obj, "label"); + g_object_notify (obj, "markup"); + g_object_notify (obj, "subject"); + g_object_notify (obj, "issuer"); + g_object_notify (obj, "expiry"); +} + +/** + * gcr_certificate_mixin_comparable_init: (skip) + * @iface: The interface + * + * Initialize a #GcrComparableIface to compare the current certificate. + * In general it's easier to use the GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE() + * macro instead of this function. + */ +void +gcr_certificate_mixin_comparable_init (GcrComparableIface *iface) +{ + iface->compare = gcr_certificate_compare; +} + +/** + * gcr_certificate_mixin_class_init: (skip) + * @object_class: The GObjectClass for this class + * + * Initialize the certificate mixin for the class. This mixin implements the + * various required properties for the certificate. + * + * Call this function near the end of your derived class_init function. The + * derived class must implement the #GcrCertificate interface. + */ +void +gcr_certificate_mixin_class_init (GObjectClass *object_class) +{ + if (!g_object_class_find_property (object_class, "description")) + g_object_class_override_property (object_class, PROP_DESCRIPTION, "description"); + if (!g_object_class_find_property (object_class, "markup")) + g_object_class_override_property (object_class, PROP_MARKUP, "markup"); + if (!g_object_class_find_property (object_class, "label")) + g_object_class_override_property (object_class, PROP_LABEL, "label"); + if (!g_object_class_find_property (object_class, "icon")) + g_object_class_override_property (object_class, PROP_ICON, "icon"); + if (!g_object_class_find_property (object_class, "subject")) + g_object_class_override_property (object_class, PROP_SUBJECT, "subject"); + if (!g_object_class_find_property (object_class, "issuer")) + g_object_class_override_property (object_class, PROP_ISSUER, "issuer"); + if (!g_object_class_find_property (object_class, "expiry")) + g_object_class_override_property (object_class, PROP_EXPIRY, "expiry"); + + _gcr_initialize_library (); +} + +/** + * gcr_certificate_mixin_get_property: (skip) + * @obj: The object + * @prop_id: The property id + * @value: The value to fill in. + * @pspec: The param specification. + * + * Implementation to get various required certificate properties. This should + * be called from your derived class get_property function, or used as a + * get_property virtual function. + * + * Example of use as called from derived class get_property function: + * + * + * static void + * my_get_property (GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec) + * { + * switch (prop_id) { + * + * ... + * + * default: + * gcr_certificate_mixin_get_property (obj, prop_id, value, pspec); + * break; + * } + *} + * + * + * Example of use as get_property function: + * + * + * static void + * my_class_init (MyClass *klass) + * { + * GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + * gobject_class->get_property = gcr_certificate_mixin_get_property; + * + * ... + * } + * + + */ +void +gcr_certificate_mixin_get_property (GObject *obj, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + GcrCertificate *cert = GCR_CERTIFICATE (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_take_string (value, gcr_certificate_get_subject_name (cert)); + break; + case PROP_SUBJECT: + g_value_take_string (value, gcr_certificate_get_subject_name (cert)); + break; + case PROP_ICON: + g_value_set_object (value, gcr_certificate_get_icon (cert)); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, _("Certificate")); + break; + case PROP_MARKUP: + g_value_take_string (value, gcr_certificate_get_markup_text (cert)); + break; + case PROP_ISSUER: + g_value_take_string (value, gcr_certificate_get_issuer_name (cert)); + break; + case PROP_EXPIRY: + g_value_take_boxed (value, gcr_certificate_get_expiry_date (cert)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} diff --git a/gcr/gcr-certificate.h b/gcr/gcr-certificate.h new file mode 100644 index 0000000..05946a4 --- /dev/null +++ b/gcr/gcr-certificate.h @@ -0,0 +1,154 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_H__ +#define __GCR_CERTIFICATE_H__ + +#include "gcr-types.h" +#include "gcr-column.h" +#include "gcr-comparable.h" + +#include +#include + +G_BEGIN_DECLS + +#define GCR_CERTIFICATE_COLUMNS (gcr_certificate_get_columns ()) +#define GCR_TYPE_CERTIFICATE (gcr_certificate_get_type ()) +#define GCR_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE, GcrCertificate)) +#define GCR_IS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE)) +#define GCR_CERTIFICATE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_CERTIFICATE, GcrCertificateIface)) + +typedef struct _GcrCertificate GcrCertificate; +typedef struct _GcrCertificateIface GcrCertificateIface; + +struct _GcrCertificateIface { + GTypeInterface parent; + + + /* + * g-ir-scanner cannot comprehend this yet ... + * See: https://bugzilla.gnome.org/show_bug.cgi?id=725501 + * + * GcrCertificate.get_der_data: + * @self: a #GcrCertificate + * @n_data: a pointer to a location to store the size of the resulting DER data. + * + * Implemented to return the raw DER data for an X.509 certificate. The data + * should be owned by the #GcrCertificate object. + * + * Returns: (array length=n_data): raw DER data of the X.509 certificate + */ + const guint8 * (* get_der_data) (GcrCertificate *self, + gsize *n_data); + + /*< private >*/ + gpointer dummy1; + gpointer dummy2; + gpointer dummy3; + gpointer dummy5; + gpointer dummy6; + gpointer dummy7; + gpointer dummy8; +}; + +GType gcr_certificate_get_type (void); + +const guint8 * gcr_certificate_get_der_data (GcrCertificate *self, + gsize *n_data); + +const GcrColumn* gcr_certificate_get_columns (void); + +gint gcr_certificate_compare (GcrComparable *first, + GcrComparable *other); + +gchar * gcr_certificate_get_issuer_name (GcrCertificate *self); + +gchar* gcr_certificate_get_issuer_cn (GcrCertificate *self); + +gchar* gcr_certificate_get_issuer_dn (GcrCertificate *self); + +gchar* gcr_certificate_get_issuer_part (GcrCertificate *self, + const gchar *part); + +guchar * gcr_certificate_get_issuer_raw (GcrCertificate *self, + gsize *n_data); + +gboolean gcr_certificate_is_issuer (GcrCertificate *self, + GcrCertificate *issuer); + +gchar * gcr_certificate_get_subject_name (GcrCertificate *self); + +gchar* gcr_certificate_get_subject_cn (GcrCertificate *self); + +gchar* gcr_certificate_get_subject_dn (GcrCertificate *self); + +gchar* gcr_certificate_get_subject_part (GcrCertificate *self, + const gchar *part); + +guchar * gcr_certificate_get_subject_raw (GcrCertificate *self, + gsize *n_data); + +GDate* gcr_certificate_get_issued_date (GcrCertificate *self); + +GDate* gcr_certificate_get_expiry_date (GcrCertificate *self); + +guchar* gcr_certificate_get_serial_number (GcrCertificate *self, + gsize *n_length); + +gchar* gcr_certificate_get_serial_number_hex (GcrCertificate *self); + +guint gcr_certificate_get_key_size (GcrCertificate *self); + +guchar* gcr_certificate_get_fingerprint (GcrCertificate *self, + GChecksumType type, + gsize *n_length); + +gchar* gcr_certificate_get_fingerprint_hex (GcrCertificate *self, + GChecksumType type); + +gchar * gcr_certificate_get_markup_text (GcrCertificate *self); + +GIcon* gcr_certificate_get_icon (GcrCertificate *self); + +gboolean gcr_certificate_get_basic_constraints (GcrCertificate *self, + gboolean *is_ca, + gint *path_len); + +#define GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE() \ + G_IMPLEMENT_INTERFACE (GCR_TYPE_COMPARABLE, gcr_certificate_mixin_comparable_init) + +void gcr_certificate_mixin_emit_notify (GcrCertificate *self); + +void gcr_certificate_mixin_comparable_init (GcrComparableIface *iface); + +void gcr_certificate_mixin_class_init (GObjectClass *object_class); + +void gcr_certificate_mixin_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_H__ */ diff --git a/gcr/gcr-collection.c b/gcr/gcr-collection.c new file mode 100644 index 0000000..576ba4c --- /dev/null +++ b/gcr/gcr-collection.c @@ -0,0 +1,176 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-collection.h" + +/** + * SECTION:gcr-collection + * @title: GcrCollection + * @short_description: A collection of objects. + * + * A #GcrCollection is used to group a set of objects. This is an abstract + * interface which can be used to determine which objects show up in a selector + * or other user interface element. + * + * Use gcr_simple_collection_new() to create a concrete implementation of this + * interface which you can add objects to. + */ + +/** + * GcrCollection: + * + * A #GcrCollection is used to group a set of objects. + */ + +enum { + ADDED, + REMOVED, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + + +typedef GcrCollectionIface GcrCollectionInterface; + +G_DEFINE_INTERFACE (GcrCollection, gcr_collection, G_TYPE_OBJECT); + +static void +gcr_collection_default_init (GcrCollectionIface *iface) +{ + static volatile gsize initialized = 0; + + if (g_once_init_enter (&initialized)) { + + /** + * GcrCollection::added: + * @self: the collection + * @object: (type GObject.Object): object that was added + * + * This signal is emitted when an object is added to the collection. + */ + signals[ADDED] = g_signal_new ("added", GCR_TYPE_COLLECTION, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, added), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + + /** + * GcrCollection::removed: + * @self: the collection + * @object: (type GObject.Object): object that was removed + * + * This signal is emitted when an object is removed from the collection. + */ + signals[REMOVED] = g_signal_new ("removed", GCR_TYPE_COLLECTION, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, removed), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + + g_once_init_leave (&initialized, 1); + } +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + + +/** + * gcr_collection_get_length: + * @self: The collection + * + * Get the number of objects in this collection. + * + * Returns: The number of objects. + */ +guint +gcr_collection_get_length (GcrCollection *self) +{ + g_return_val_if_fail (GCR_IS_COLLECTION (self), 0); + g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->get_length, 0); + return GCR_COLLECTION_GET_INTERFACE (self)->get_length (self); +} + +/** + * gcr_collection_get_objects: + * @self: The collection + * + * Get a list of the objects in this collection. + * + * Returns: (transfer container) (element-type GObject.Object): a list of the objects + * in this collection, which should be freed with g_list_free() + */ +GList* +gcr_collection_get_objects (GcrCollection *self) +{ + g_return_val_if_fail (GCR_IS_COLLECTION (self), 0); + g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->get_objects, 0); + return GCR_COLLECTION_GET_INTERFACE (self)->get_objects (self); +} + +/** + * gcr_collection_contains: + * @self: the collection + * @object: object to check + * + * Check whether the collection contains an object or not. + * + * Returns: whether the collection contains this object + */ +gboolean +gcr_collection_contains (GcrCollection *self, + GObject *object) +{ + g_return_val_if_fail (GCR_IS_COLLECTION (self), FALSE); + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->contains, FALSE); + return GCR_COLLECTION_GET_INTERFACE (self)->contains (self, object); +} + +/** + * gcr_collection_emit_added: + * @self: The collection + * @object: The object that was added + * + * Emit the #GcrCollection::added signal for the given object. This function + * is used by implementors of this interface. + */ +void +gcr_collection_emit_added (GcrCollection *self, GObject *object) +{ + g_return_if_fail (GCR_IS_COLLECTION (self)); + g_signal_emit (self, signals[ADDED], 0, object); +} + +/** + * gcr_collection_emit_removed: + * @self: The collection + * @object: The object that was removed + * + * Emit the #GcrCollection::removed signal for the given object. This function + * is used by implementors of this interface. + */ +void +gcr_collection_emit_removed (GcrCollection *self, GObject *object) +{ + g_return_if_fail (GCR_IS_COLLECTION (self)); + g_signal_emit (self, signals[REMOVED], 0, object); +} diff --git a/gcr/gcr-collection.h b/gcr/gcr-collection.h new file mode 100644 index 0000000..6a1d193 --- /dev/null +++ b/gcr/gcr-collection.h @@ -0,0 +1,80 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_COLLECTION_H__ +#define __GCR_COLLECTION_H__ + +#include "gcr-types.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_COLLECTION (gcr_collection_get_type()) +#define GCR_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrCollection)) +#define GCR_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION)) +#define GCR_COLLECTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_COLLECTION, GcrCollectionIface)) + +typedef struct _GcrCollection GcrCollection; +typedef struct _GcrCollectionIface GcrCollectionIface; + +struct _GcrCollectionIface { + GTypeInterface parent; + + /* signals */ + void (*added) (GcrCollection *self, GObject *object); + + void (*removed) (GcrCollection *self, GObject *object); + + /* virtual */ + guint (*get_length) (GcrCollection *self); + + GList* (*get_objects) (GcrCollection *self); + + gboolean (*contains) (GcrCollection *self, + GObject *object); + + /*< private >*/ + gpointer dummy1; + gpointer dummy2; + gpointer dummy3; + gpointer dummy5; + gpointer dummy6; + gpointer dummy7; + gpointer dummy8; +}; + +GType gcr_collection_get_type (void); + +guint gcr_collection_get_length (GcrCollection *self); + +GList* gcr_collection_get_objects (GcrCollection *self); + +gboolean gcr_collection_contains (GcrCollection *self, + GObject *object); + +void gcr_collection_emit_added (GcrCollection *self, + GObject *object); + +void gcr_collection_emit_removed (GcrCollection *self, + GObject *object); + +G_END_DECLS + +#endif /* __GCR_COLLECTION_H__ */ diff --git a/gcr/gcr-column.c b/gcr/gcr-column.c new file mode 100644 index 0000000..e7e1b6e --- /dev/null +++ b/gcr/gcr-column.c @@ -0,0 +1,64 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-column.h" + +/** + * SECTION:gcr-column + * @title: GcrColumn + * @short_description: Column information for selector or model. + * + * A #GcrColumn is used with #GcrTreeSelector or #GcrCollectionModel to define + * the columns to display. + */ + +/** + * GcrColumnFlags: + * @GCR_COLUMN_NONE: No column flags + * @GCR_COLUMN_HIDDEN: Don't display this column. + * @GCR_COLUMN_SORTABLE: This column is sortable. + * + * Flags to be used with #GcrColumn + */ + +/** + * GcrColumn: + * @property_name: The name of the property this column will display + * @property_type: The type of the property + * @column_type: The eventual type of the column + * @label: The display label for the column + * @flags: Flags from #GcrColumnFlags + * @transformer: A transformer function used to convert the value from + * the property type to the column type. Can be %NULL if the types + * are the same. + * @user_data: User data associated with the column + * + * Represents a column to display in a #GcrCollectionModel or #GcrTreeSelector. + * + * The label should be set as a translatable string with a context of + * "column". This should be done with with this macro: + * + * + * NC_("column", "My Column Name") + * + */ diff --git a/gcr/gcr-column.h b/gcr/gcr-column.h new file mode 100644 index 0000000..a6eb75b --- /dev/null +++ b/gcr/gcr-column.h @@ -0,0 +1,53 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_COLUMN_H__ +#define __GCR_COLUMN_H__ + +#include "gcr-types.h" + +#include + +G_BEGIN_DECLS + +typedef enum { + GCR_COLUMN_NONE = 0, + GCR_COLUMN_HIDDEN = 1 << 1, + GCR_COLUMN_SORTABLE = 1 << 2, +} GcrColumnFlags; + +typedef struct _GcrColumn { + const gchar *property_name; /* The property to retrieve */ + GType property_type; /* The property type */ + GType column_type; /* The resulting property type for this column */ + + const gchar *label; /* The label for this column, or NULL */ + GcrColumnFlags flags; /* Column flags */ + + GValueTransform transformer; /* The way to transform to this type or NULL */ + + gpointer user_data; + + /*< private >*/ + gpointer reserved; +} GcrColumn; + +G_END_DECLS + +#endif /* __GCR_COLUMN_H__ */ diff --git a/gcr/gcr-comparable.c b/gcr/gcr-comparable.c new file mode 100644 index 0000000..5c4304d --- /dev/null +++ b/gcr/gcr-comparable.c @@ -0,0 +1,116 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-comparable.h" + +#include + +/** + * SECTION:gcr-comparable + * @title: GcrComparable + * @short_description: Interface for comparing objects + * + * The #GcrComparable interface is implemented by objects when they should be + * comparable against one another. + */ + +/** + * GcrComparable: + * + * The #GcrComparable interface is implemented by comparable objects. + */ + +/** + * GcrComparableIface: + * @parent: type interface + * @compare: Compare whether tow objects represent the same thing. + * + * The interface to implement for #GcrComparable + */ + +typedef GcrComparableIface GcrComparableInterface; +G_DEFINE_INTERFACE (GcrComparable, gcr_comparable, G_TYPE_OBJECT); + +static void +gcr_comparable_default_init (GcrComparableIface *iface) +{ + +} + + +/** + * gcr_comparable_compare: + * @self: The comparable object + * @other: (allow-none): Another comparable object + * + * Compare whether two objects represent the same thing. The return value can + * also be used to sort the objects. + * + * Returns: Zero if the two objects represent the same thing, non-zero if not. + */ +gint +gcr_comparable_compare (GcrComparable *self, GcrComparable *other) +{ + g_return_val_if_fail (GCR_IS_COMPARABLE (self), -1); + g_return_val_if_fail (GCR_COMPARABLE_GET_INTERFACE (self)->compare, -1); + g_return_val_if_fail (G_IS_OBJECT (self), -1); + return GCR_COMPARABLE_GET_INTERFACE (self)->compare (self, other); +} + +/** + * gcr_comparable_memcmp: (skip) + * @mem1: (array length=size1) (element-type guint8): First block of memory + * @size1: Length of first block + * @mem2: (array length=size2) (element-type guint8): Second block of memory + * @size2: Length of second block + * + * Compare two blocks of memory. The return value can be used to sort + * the blocks of memory. + * + * Returns: Zero if the blocks are identical, negative if first + * less than secend, possitive otherwise. + */ +gint +gcr_comparable_memcmp (gconstpointer mem1, + gsize size1, + gconstpointer mem2, + gsize size2) +{ + gint result; + + if (mem1 == mem2 && size1 == size2) + return 0; + + if (!mem1) + return 1; + if (!mem2) + return -1; + + result = memcmp (mem1, mem2, MIN (size1, size2)); + if (result != 0) + return result; + + if (size1 == size2) + return 0; + if (size1 < size2) + return -1; + return 1; +} diff --git a/gcr/gcr-comparable.h b/gcr/gcr-comparable.h new file mode 100644 index 0000000..5a8e28f --- /dev/null +++ b/gcr/gcr-comparable.h @@ -0,0 +1,52 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_COMPARABLE_H__ +#define __GCR_COMPARABLE_H__ + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_COMPARABLE (gcr_comparable_get_type()) +#define GCR_COMPARABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COMPARABLE, GcrComparable)) +#define GCR_IS_COMPARABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COMPARABLE)) +#define GCR_COMPARABLE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_COMPARABLE, GcrComparableIface)) + +typedef struct _GcrComparable GcrComparable; +typedef struct _GcrComparableIface GcrComparableIface; + +struct _GcrComparableIface { + GTypeInterface parent; + gint (*compare) (GcrComparable *self, GcrComparable *other); +}; + +GType gcr_comparable_get_type (void); + +gint gcr_comparable_compare (GcrComparable *self, + GcrComparable *other); + +gint gcr_comparable_memcmp (gconstpointer mem1, + gsize size1, + gconstpointer mem2, + gsize size2); + +G_END_DECLS + +#endif /* __GCR_COMPARABLE_H__ */ diff --git a/gcr/gcr-dbus-constants.h b/gcr/gcr-dbus-constants.h new file mode 100644 index 0000000..e4303d9 --- /dev/null +++ b/gcr/gcr-dbus-constants.h @@ -0,0 +1,59 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_DBUS_CONSTANTS_H__ +#define __GCR_DBUS_CONSTANTS_H__ + +#include + +G_BEGIN_DECLS + +#define GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME "org.gnome.keyring.SystemPrompter" +#define GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME "org.gnome.keyring.PrivatePrompter" +#define GCR_DBUS_PROMPTER_MOCK_BUS_NAME "org.gnome.keyring.MockPrompter" + +#define GCR_DBUS_PROMPTER_OBJECT_PATH "/org/gnome/keyring/Prompter" +#define GCR_DBUS_PROMPT_OBJECT_PREFIX "/org/gnome/keyring/Prompt" + +#define GCR_DBUS_PROMPTER_INTERFACE "org.gnome.keyring.internal.Prompter" + +#define GCR_DBUS_PROMPTER_METHOD_BEGIN "BeginPrompting" +#define GCR_DBUS_PROMPTER_METHOD_STOP "StopPrompting" +#define GCR_DBUS_PROMPTER_METHOD_PERFORM "PerformPrompt" + +#define GCR_DBUS_CALLBACK_INTERFACE "org.gnome.keyring.internal.Prompter.Callback" + +#define GCR_DBUS_PROMPT_ERROR_IN_PROGRESS "org.gnome.keyring.Prompter.InProgress" +#define GCR_DBUS_PROMPT_ERROR_FAILED "org.gnome.keyring.Prompter.Failed" + +#define GCR_DBUS_CALLBACK_METHOD_READY "PromptReady" +#define GCR_DBUS_CALLBACK_METHOD_DONE "PromptDone" + +#define GCR_DBUS_PROMPT_TYPE_PASSWORD "password" +#define GCR_DBUS_PROMPT_TYPE_CONFIRM "confirm" + +#define GCR_DBUS_PROMPT_REPLY_NONE "" +#define GCR_DBUS_PROMPT_REPLY_YES "yes" +#define GCR_DBUS_PROMPT_REPLY_NO "no" + +G_END_DECLS + +#endif /* __GCR_DBUS_CONSTANTS_H__ */ diff --git a/gcr/gcr-deprecated-base.h b/gcr/gcr-deprecated-base.h new file mode 100644 index 0000000..ef761e7 --- /dev/null +++ b/gcr/gcr-deprecated-base.h @@ -0,0 +1,71 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_BASE_DEPRECATED_H_ +#define GCR_BASE_DEPRECATED_H_ +#ifndef GCR_DISABLE_DEPRECATED +#ifndef __GI_SCANNER__ + +#include + +#include "gcr-importer.h" +#include "gcr-parser.h" +#include "gcr-simple-collection.h" + +G_BEGIN_DECLS + +#define GCR_ERROR (gcr_error_get_domain ()) + +GQuark gcr_error_get_domain (void) G_GNUC_CONST; + +gboolean gcr_simple_collection_contains (GcrSimpleCollection *self, + GObject *object); + +GcrParser * gcr_importer_get_parser (GcrImporter *self); + +void gcr_importer_set_parser (GcrImporter *self, + GcrParser *parser); + +GckSlot * gcr_importer_get_slot (GcrImporter *self); + +void gcr_importer_set_slot (GcrImporter *self, + GckSlot *slot); + +typedef enum { + GCR_IMPORTER_PROMPT_NEEDED, + GCR_IMPORTER_PROMPT_ALWAYS, + GCR_IMPORTER_PROMPT_NEVER +} GcrImporterPromptBehavior; + +GcrImporterPromptBehavior gcr_importer_get_prompt_behavior (GcrImporter *self); + +void gcr_importer_set_prompt_behavior (GcrImporter *self, + GcrImporterPromptBehavior behavior); + +G_END_DECLS + +#endif /* __GI_SCANNER__ */ +#endif /* GCR_DISABLE_DEPRECATED */ +#endif /* GCRTYPES_H_ */ diff --git a/gcr/gcr-enum-types-base.h b/gcr/gcr-enum-types-base.h new file mode 100644 index 0000000..9a6d209 --- /dev/null +++ b/gcr/gcr-enum-types-base.h @@ -0,0 +1,67 @@ + +/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ + + +#include + +G_BEGIN_DECLS + +/* enumerations from "gcr/gcr-certificate-chain.h" */ +#ifndef GCR_TYPE_CERTIFICATE_CHAIN_STATUS +GType gcr_certificate_chain_status_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_CERTIFICATE_CHAIN_STATUS (gcr_certificate_chain_status_get_type ()) +#endif +#ifndef GCR_TYPE_CERTIFICATE_CHAIN_FLAGS +GType gcr_certificate_chain_flags_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_CERTIFICATE_CHAIN_FLAGS (gcr_certificate_chain_flags_get_type ()) +#endif + +/* enumerations from "gcr/gcr-certificate-request.h" */ +#ifndef GCR_TYPE_CERTIFICATE_REQUEST_FORMAT +GType gcr_certificate_request_format_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_CERTIFICATE_REQUEST_FORMAT (gcr_certificate_request_format_get_type ()) +#endif + +/* enumerations from "gcr/gcr-column.h" */ +#ifndef GCR_TYPE_COLUMN_FLAGS +GType gcr_column_flags_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_COLUMN_FLAGS (gcr_column_flags_get_type ()) +#endif + +/* enumerations from "gcr/gcr-deprecated-base.h" */ +#ifndef GCR_TYPE_IMPORTER_PROMPT_BEHAVIOR +GType gcr_importer_prompt_behavior_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_IMPORTER_PROMPT_BEHAVIOR (gcr_importer_prompt_behavior_get_type ()) +#endif + +/* enumerations from "gcr/gcr-prompt.h" */ +#ifndef GCR_TYPE_PROMPT_REPLY +GType gcr_prompt_reply_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_PROMPT_REPLY (gcr_prompt_reply_get_type ()) +#endif + +/* enumerations from "gcr/gcr-system-prompt.h" */ +#ifndef GCR_TYPE_SYSTEM_PROMPT_ERROR +GType gcr_system_prompt_error_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_SYSTEM_PROMPT_ERROR (gcr_system_prompt_error_get_type ()) +#endif + +/* enumerations from "gcr/gcr-system-prompter.h" */ +#ifndef GCR_TYPE_SYSTEM_PROMPTER_MODE +GType gcr_system_prompter_mode_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_SYSTEM_PROMPTER_MODE (gcr_system_prompter_mode_get_type ()) +#endif + +/* enumerations from "gcr/gcr-types.h" */ +#ifndef GCR_TYPE_DATA_ERROR +GType gcr_data_error_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_DATA_ERROR (gcr_data_error_get_type ()) +#endif +#ifndef GCR_TYPE_DATA_FORMAT +GType gcr_data_format_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_DATA_FORMAT (gcr_data_format_get_type ()) +#endif +G_END_DECLS + +/* Generated data ends here */ + diff --git a/gcr/gcr-filter-collection.c b/gcr/gcr-filter-collection.c new file mode 100644 index 0000000..25e97ec --- /dev/null +++ b/gcr/gcr-filter-collection.c @@ -0,0 +1,379 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-collection.h" +#include "gcr-filter-collection.h" + +#include + +/** + * SECTION:gcr-filter-collection + * @title: GcrFilterCollection + * @short_description: A collection which filters a GcrCollection + * + * An implementation of #GcrCollection which filters objects from another + * underlying collection. Use gcr_filter_collection_new_with_callback() + * to create a new filter collection. + * + * The callback will determine the criteria for whether an object shows through + * the filter or not. + */ + +/** + * GcrFilterCollection: + * + * A filter implementation of #GcrCollection. + */ + +/** + * GcrFilterCollectionClass: + * @parent_class: the parent class + * + * The class for #GcrFilterCollection. + */ + +/** + * GcrFilterCollectionFunc: + * @object: object to filter + * @user_data: user data passed to the callback + * + * A function which is called by #GcrFilterCollection in order to determine + * whether an object should show through the filter or not. + * + * Returns: %TRUE if an object should be included in the filtered collection + */ + +enum { + PROP_0, + PROP_UNDERLYING +}; + +struct _GcrFilterCollectionPrivate { + GHashTable *items; + GcrCollection *underlying; + GcrFilterCollectionFunc filter_func; + gpointer user_data; + GDestroyNotify destroy_func; +}; + +static void gcr_filter_collection_iface (GcrCollectionIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrFilterCollection, gcr_filter_collection, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_filter_collection_iface)); + +static void +add_object (GcrFilterCollection *self, + GObject *object) +{ + g_assert (g_hash_table_lookup (self->pv->items, object) == NULL); + g_hash_table_insert (self->pv->items, g_object_ref (object), object); + gcr_collection_emit_added (GCR_COLLECTION (self), object); +} + +static void +remove_object (GcrFilterCollection *self, + GObject *object) +{ + g_object_ref (object); + if (!g_hash_table_remove (self->pv->items, object)) + g_assert_not_reached (); + gcr_collection_emit_removed (GCR_COLLECTION (self), object); + g_object_unref (object); +} + +static gboolean +filter_object (GcrFilterCollection *self, + GObject *object) +{ + gboolean match = TRUE; + + if (self->pv->filter_func) + match = (self->pv->filter_func) (object, self->pv->user_data); + + return match; +} + +static void +on_collection_added (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (user_data); + if (filter_object (self, object)) + add_object (self, object); +} + +static void +on_collection_removed (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (user_data); + if (g_hash_table_lookup (self->pv->items, object)) + remove_object (self, object); +} + +static void +gcr_filter_collection_init (GcrFilterCollection *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_FILTER_COLLECTION, GcrFilterCollectionPrivate); + self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); +} + +static void +gcr_filter_collection_set_property (GObject *obj, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj); + + switch (property_id) { + case PROP_UNDERLYING: + g_return_if_fail (self->pv->underlying == NULL); + self->pv->underlying = g_value_dup_object (value); + g_return_if_fail (self->pv->underlying != NULL); + g_signal_connect (self->pv->underlying, "added", + G_CALLBACK (on_collection_added), self); + g_signal_connect (self->pv->underlying, "removed", + G_CALLBACK (on_collection_removed), self); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); + break; + } +} + +static void +gcr_filter_collection_get_property (GObject *obj, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj); + + switch (property_id) { + case PROP_UNDERLYING: + g_value_set_object (value, gcr_filter_collection_get_underlying (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); + break; + } +} + +static void +gcr_filter_collection_finalize (GObject *obj) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj); + + if (self->pv->underlying) { + g_signal_handlers_disconnect_by_func (self->pv->underlying, + on_collection_added, self); + g_signal_handlers_disconnect_by_func (self->pv->underlying, + on_collection_removed, self); + g_object_unref (self->pv->underlying); + } + + if (self->pv->destroy_func) + (self->pv->destroy_func) (self->pv->user_data); + + g_assert (self->pv->items); + g_hash_table_destroy (self->pv->items); + self->pv->items = NULL; + + G_OBJECT_CLASS (gcr_filter_collection_parent_class)->finalize (obj); +} + +static void +gcr_filter_collection_class_init (GcrFilterCollectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = gcr_filter_collection_get_property; + gobject_class->set_property = gcr_filter_collection_set_property; + gobject_class->finalize = gcr_filter_collection_finalize; + + g_type_class_add_private (gobject_class, sizeof (GcrFilterCollectionPrivate)); + + g_object_class_install_property (gobject_class, PROP_UNDERLYING, + g_param_spec_object ("underlying", "Underlying", "Underlying collection", + GCR_TYPE_COLLECTION, G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +static guint +gcr_filter_collection_get_length (GcrCollection *coll) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (coll); + return g_hash_table_size (self->pv->items); +} + +static GList* +gcr_filter_collection_get_objects (GcrCollection *coll) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (coll); + return g_hash_table_get_keys (self->pv->items); +} + +static gboolean +gcr_filter_collection_contains (GcrCollection *collection, + GObject *object) +{ + GcrFilterCollection *self = GCR_FILTER_COLLECTION (collection); + return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE; +} + +static void +gcr_filter_collection_iface (GcrCollectionIface *iface) +{ + iface->get_length = gcr_filter_collection_get_length; + iface->get_objects = gcr_filter_collection_get_objects; + iface->contains = gcr_filter_collection_contains; +} + +/** + * gcr_filter_collection_new_with_callback: + * @underlying: the underlying collection + * @callback: (allow-none): function to call for each object + * @user_data: data to pass to the callback + * @destroy_func: called for user_data when it is no longer needed + * + * Create a new #GcrFilterCollection. + * + * The callback should return %TRUE if an object should appear in the + * filtered collection. + * + * If a %NULL callback is set, then all underlynig objects will appear in the + * filtered collection. + * + * Returns: (transfer full) (type Gcr.FilterCollection): a newly allocated + * filtered collection, which should be freed with g_object_unref() + */ +GcrCollection * +gcr_filter_collection_new_with_callback (GcrCollection *underlying, + GcrFilterCollectionFunc callback, + gpointer user_data, + GDestroyNotify destroy_func) +{ + GcrCollection *collection; + + collection = g_object_new (GCR_TYPE_FILTER_COLLECTION, + "underlying", underlying, + NULL); + gcr_filter_collection_set_callback (GCR_FILTER_COLLECTION (collection), + callback, user_data, destroy_func); + + return collection; +} + +/** + * gcr_filter_collection_set_callback: + * @self: a filter collection + * @callback: (allow-none): function to call for each object + * @user_data: data to pass to the callback + * @destroy_func: called for user_data when it is no longer needed + * + * Set the callback used to filter the objects in the underlying collection. + * The callback should return %TRUE if an object should appear in the + * filtered collection. + * + * If a %NULL callback is set, then all underlynig objects will appear in the + * filtered collection. + * + * This will refilter the collection. + */ +void +gcr_filter_collection_set_callback (GcrFilterCollection *self, + GcrFilterCollectionFunc callback, + gpointer user_data, + GDestroyNotify destroy_func) +{ + g_return_if_fail (GCR_IS_FILTER_COLLECTION (self)); + + if (self->pv->destroy_func) + (self->pv->destroy_func) (self->pv->user_data); + self->pv->filter_func = callback; + self->pv->user_data = user_data; + self->pv->destroy_func = destroy_func; + + gcr_filter_collection_refilter (self); +} + +/** + * gcr_filter_collection_refilter: + * @self: a filter collection + * + * Refilter all objects in the underlying collection. Call this function if + * the filter callback function changes its filtering criteria. + */ +void +gcr_filter_collection_refilter (GcrFilterCollection *self) +{ + GList *objects = NULL; + GHashTable *snapshot; + GHashTableIter iter; + GObject *object; + gboolean have; + gboolean should; + GList *l; + + g_return_if_fail (GCR_IS_FILTER_COLLECTION (self)); + + snapshot = g_hash_table_new (g_direct_hash, g_direct_equal); + g_hash_table_iter_init (&iter, self->pv->items); + while (g_hash_table_iter_next (&iter, (gpointer *)&object, NULL)) + g_hash_table_insert (snapshot, object, object); + + if (self->pv->underlying) + objects = gcr_collection_get_objects (self->pv->underlying); + + for (l = objects; l != NULL; l = g_list_next (l)) { + have = g_hash_table_remove (snapshot, l->data); + should = filter_object (self, l->data); + if (have && !should) + remove_object (self, l->data); + else if (!have && should) + add_object (self, l->data); + } + + g_hash_table_iter_init (&iter, snapshot); + while (g_hash_table_iter_next (&iter, (gpointer *)&object, NULL)) + remove_object (self, object); + g_hash_table_destroy (snapshot); + + g_list_free (objects); +} + +/** + * gcr_filter_collection_get_underlying: + * @self: a filter collection + * + * Get the collection that is being filtered by this filter collection. + * + * Returns: (transfer none): the underlying collection + */ +GcrCollection * +gcr_filter_collection_get_underlying (GcrFilterCollection *self) +{ + g_return_val_if_fail (GCR_IS_FILTER_COLLECTION (self), NULL); + return self->pv->underlying; +} diff --git a/gcr/gcr-filter-collection.h b/gcr/gcr-filter-collection.h new file mode 100644 index 0000000..9666a92 --- /dev/null +++ b/gcr/gcr-filter-collection.h @@ -0,0 +1,74 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_FILTER_COLLECTION_H__ +#define __GCR_FILTER_COLLECTION_H__ + +#include "gcr-collection.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_FILTER_COLLECTION (gcr_filter_collection_get_type ()) +#define GCR_FILTER_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollection)) +#define GCR_FILTER_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollectionClass)) +#define GCR_IS_FILTER_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_FILTER_COLLECTION)) +#define GCR_IS_FILTER_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_FILTER_COLLECTION)) +#define GCR_FILTER_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollectionClass)) + +typedef struct _GcrFilterCollection GcrFilterCollection; +typedef struct _GcrFilterCollectionClass GcrFilterCollectionClass; +typedef struct _GcrFilterCollectionPrivate GcrFilterCollectionPrivate; + +struct _GcrFilterCollection { + GObject parent; + + /*< private >*/ + GcrFilterCollectionPrivate *pv; +}; + +struct _GcrFilterCollectionClass { + GObjectClass parent_class; +}; + +GType gcr_filter_collection_get_type (void); + +typedef gboolean (* GcrFilterCollectionFunc) (GObject *object, + gpointer user_data); + +GcrCollection * gcr_filter_collection_new_with_callback (GcrCollection *underlying, + GcrFilterCollectionFunc callback, + gpointer user_data, + GDestroyNotify destroy_func); + +void gcr_filter_collection_set_callback (GcrFilterCollection *self, + GcrFilterCollectionFunc callback, + gpointer user_data, + GDestroyNotify destroy_func); + +void gcr_filter_collection_refilter (GcrFilterCollection *self); + +GcrCollection * gcr_filter_collection_get_underlying (GcrFilterCollection *self); + +G_END_DECLS + +#endif /* __GCR_FILTER_COLLECTION_H__ */ diff --git a/gcr/gcr-fingerprint.c b/gcr/gcr-fingerprint.c new file mode 100644 index 0000000..445f88a --- /dev/null +++ b/gcr/gcr-fingerprint.c @@ -0,0 +1,126 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-fingerprint.h" +#include "gcr-subject-public-key.h" + +#include "gcr/gcr-oids.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" + +#include + +/** + * SECTION:gcr-fingerprint + * @title: Key Fingerprints + * @short_description: Fingerprints for public and private keys + * + * These functions generate key fingerprints for public keys, certificates and + * key data. The fingerprints are created so that they they will be identical + * for a key and its corresponding certificate. + * + * Note that in the case of certificates these are not fingerprints of the + * actual certificate data, but rather of the public key contained in a + * certificate. + * + * These fingerprints are created using the subjectPublicKeyInfo ASN.1 structure. + */ + +/** + * gcr_fingerprint_from_subject_public_key_info: + * @key_info: (array length=n_key_info): DER encoded subjectPublicKeyInfo structure + * @n_key_info: length of DER encoded structure + * @checksum_type: the type of fingerprint to create + * @n_fingerprint: the length of fingerprint returned + * + * Create a key fingerprint for a DER encoded subjectPublicKeyInfo. + * + * Returns: (transfer full) (allow-none) (array length=n_fingerprint): the + * fingerprint or %NULL if the input was invalid. + */ +guchar * +gcr_fingerprint_from_subject_public_key_info (const guchar *key_info, + gsize n_key_info, + GChecksumType checksum_type, + gsize *n_fingerprint) +{ + GChecksum *check; + guint8 *fingerprint; + + g_return_val_if_fail (key_info, NULL); + g_return_val_if_fail (n_key_info, NULL); + g_return_val_if_fail (n_fingerprint, NULL); + + check = g_checksum_new (checksum_type); + g_return_val_if_fail (check, NULL); + + g_checksum_update (check, key_info, n_key_info); + + *n_fingerprint = g_checksum_type_get_length (checksum_type); + fingerprint = g_malloc (*n_fingerprint); + g_checksum_get_digest (check, fingerprint, n_fingerprint); + + g_checksum_free (check); + return fingerprint; +} + +/** + * gcr_fingerprint_from_attributes: + * @attrs: attributes for key or certificate + * @checksum_type: the type of fingerprint to create + * @n_fingerprint: the length of fingerprint returned + * + * Create a key fingerprint for a certificate, public key or private key. + * Note that this is not a fingerprint of certificate data, which you would + * use gcr_certificate_get_fingerprint() for. + * + * Returns: (transfer full) (allow-none) (array length=n_fingerprint): the + * fingerprint or %NULL if the input was invalid. + */ +guchar * +gcr_fingerprint_from_attributes (GckAttributes *attrs, + GChecksumType checksum_type, + gsize *n_fingerprint) +{ + gpointer fingerprint = NULL; + GBytes *info; + GNode *asn; + + g_return_val_if_fail (attrs != NULL, NULL); + g_return_val_if_fail (n_fingerprint, NULL); + + asn = _gcr_subject_public_key_for_attributes (attrs); + + if (asn != NULL) { + info = egg_asn1x_encode (asn, NULL); + fingerprint = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (info, NULL), + g_bytes_get_size (info), + checksum_type, + n_fingerprint); + g_bytes_unref (info); + } + + egg_asn1x_destroy (asn); + return fingerprint; +} diff --git a/gcr/gcr-fingerprint.h b/gcr/gcr-fingerprint.h new file mode 100644 index 0000000..299f087 --- /dev/null +++ b/gcr/gcr-fingerprint.h @@ -0,0 +1,43 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_FINGERPRINT_H +#define GCR_FINGERPRINT_H + +#include + +#include "gcr-types.h" +#include "gcr-certificate.h" + +guchar * gcr_fingerprint_from_subject_public_key_info (const guchar *key_info, + gsize n_key_info, + GChecksumType checksum_type, + gsize *n_fingerprint); + +guchar * gcr_fingerprint_from_attributes (GckAttributes *attrs, + GChecksumType checksum_type, + gsize *n_fingerprint); + +#endif /* GCR_FINGERPRINT_H_ */ diff --git a/gcr/gcr-gnupg-collection.c b/gcr/gcr-gnupg-collection.c new file mode 100644 index 0000000..e46f348 --- /dev/null +++ b/gcr/gcr-gnupg-collection.c @@ -0,0 +1,750 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-callback-output-stream.h" +#include "gcr-collection.h" +#include "gcr-gnupg-collection.h" +#include "gcr-gnupg-key.h" +#include "gcr-gnupg-process.h" +#include "gcr-gnupg-records.h" +#include "gcr-gnupg-util.h" +#include "gcr-internal.h" +#include "gcr-record.h" +#include "gcr-util.h" + +#include +#include + +enum { + PROP_0, + PROP_DIRECTORY +}; + +struct _GcrGnupgCollectionPrivate { + GHashTable *items; /* char *keyid -> GcrGnupgKey* */ + gchar *directory; +}; + +/* Forward declarations */ +static void _gcr_collection_iface (GcrCollectionIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrGnupgCollection, _gcr_gnupg_collection, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, _gcr_collection_iface) +); + + +static void +_gcr_gnupg_collection_init (GcrGnupgCollection *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_GNUPG_COLLECTION, + GcrGnupgCollectionPrivate); + + self->pv->items = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_object_unref); +} + +static void +_gcr_gnupg_collection_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); + + switch (prop_id) { + case PROP_DIRECTORY: + g_return_if_fail (!self->pv->directory); + self->pv->directory = g_value_dup_string (value); + if (self->pv->directory && !g_path_is_absolute (self->pv->directory)) { + g_warning ("gnupg collection directory path should be absolute: %s", + self->pv->directory); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_collection_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); + + switch (prop_id) { + case PROP_DIRECTORY: + g_value_set_string (value, self->pv->directory); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_collection_dispose (GObject *obj) +{ + GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); + + g_hash_table_remove_all (self->pv->items); + + G_OBJECT_CLASS (_gcr_gnupg_collection_parent_class)->dispose (obj); +} + +static void +_gcr_gnupg_collection_finalize (GObject *obj) +{ + GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); + + g_assert (self->pv->items); + g_assert (g_hash_table_size (self->pv->items) == 0); + g_hash_table_destroy (self->pv->items); + self->pv->items = NULL; + + g_free (self->pv->directory); + self->pv->directory = NULL; + + G_OBJECT_CLASS (_gcr_gnupg_collection_parent_class)->finalize (obj); +} + +static void +_gcr_gnupg_collection_class_init (GcrGnupgCollectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = _gcr_gnupg_collection_get_property; + gobject_class->set_property = _gcr_gnupg_collection_set_property; + gobject_class->dispose = _gcr_gnupg_collection_dispose; + gobject_class->finalize = _gcr_gnupg_collection_finalize; + + /** + * GcrGnupgCollection:directory: + * + * Directory to load the gnupg keys from, or %NULL for default + * ~/.gnupg/ directory. + */ + g_object_class_install_property (gobject_class, PROP_DIRECTORY, + g_param_spec_string ("directory", "Directory", "Gnupg Directory", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (gobject_class, sizeof (GcrGnupgCollectionPrivate)); + _gcr_initialize_library (); +} + +static guint +gcr_gnupg_collection_real_get_length (GcrCollection *coll) +{ + GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (coll); + return g_hash_table_size (self->pv->items); +} + +static GList* +gcr_gnupg_collection_real_get_objects (GcrCollection *coll) +{ + GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (coll); + return g_hash_table_get_values (self->pv->items); +} + +static gboolean +gcr_gnupg_collection_real_contains (GcrCollection *collection, + GObject *object) +{ + GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (collection); + GcrGnupgKey *key; + + if (!GCR_IS_GNUPG_KEY (object)) + return FALSE; + key = g_hash_table_lookup (self->pv->items, + _gcr_gnupg_key_get_keyid (GCR_GNUPG_KEY (object))); + if (key != NULL && G_OBJECT (key) == object) + return TRUE; + return FALSE; +} + +static void +_gcr_collection_iface (GcrCollectionIface *iface) +{ + iface->get_length = gcr_gnupg_collection_real_get_length; + iface->get_objects = gcr_gnupg_collection_real_get_objects; + iface->contains = gcr_gnupg_collection_real_contains; +} + +/** + * _gcr_gnupg_collection_new: + * @directory: (allow-none): The gnupg home directory. + * + * Create a new GcrGnupgCollection. + * + * The gnupg home directory is where the keyring files live. If directory is + * %NULL then the default gnupg home directory is used. + * + * Returns: (transfer full) (type Gcr.GnupgCollection): A newly allocated collection. + */ +GcrCollection* +_gcr_gnupg_collection_new (const gchar *directory) +{ + return g_object_new (GCR_TYPE_GNUPG_COLLECTION, + "directory", directory, + NULL); +} + +/* + * We have to run the gnupg process twice to list the public and then the + * secret keys. These phases are tracked by GcrLoadingPhase. If the first + * phase completes successfully (using gpg --list-keys) then we move on to + * the second phase where the secret keys are loaded (using gpg --list-secret-keys) + * + * If a key is loaded as a public key by the public phase, it can be updated by + * the secret phase. A key discovered in the secret phase must have a public + * counterpart already loaded by the public phase. + */ + +typedef enum { + GCR_LOADING_PHASE_PUBLIC = 1, + GCR_LOADING_PHASE_SECRET = 2, +} GcrLoadingPhase; + +/* + * We use @difference to track the keys that were in the collection before + * the load process, and then remove any not found, at the end of the load + * process. Strings are directly used from collection->pv->items keys. + */ + +typedef struct { + GcrGnupgCollection *collection; /* reffed pointer back to collection */ + GcrLoadingPhase loading_phase; /* Whether loading public or private */ + GPtrArray *records; /* GcrRecord* not yet made into a key */ + GcrGnupgProcess *process; /* The gnupg process itself */ + GCancellable *cancel; /* Cancellation for process */ + GString *out_data; /* Pending output not yet parsed into colons */ + GHashTable *difference; /* Hashset gchar *keyid -> gchar *keyid */ + + guint error_sig; + guint status_sig; + GOutputStream *output; + GOutputStream *outattr; + + GQueue *attribute_queue; /* Queue of unprocessed GcrRecord* status records */ + GByteArray *attribute_buf; /* Buffer of unprocessed attribute data received */ + GHashTable *attributes; /* Processed attributes waiting for a matching key */ +} GcrGnupgCollectionLoad; + +/* Forward declarations */ +static void spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GSimpleAsyncResult *res); + +static void +_gcr_gnupg_collection_load_free (gpointer data) +{ + GcrGnupgCollectionLoad *load = data; + g_assert (load); + + g_ptr_array_unref (load->records); + g_string_free (load->out_data, TRUE); + g_hash_table_destroy (load->difference); + g_object_unref (load->collection); + + if (load->process) { + if (load->error_sig) + g_signal_handler_disconnect (load->process, load->error_sig); + if (load->status_sig) + g_signal_handler_disconnect (load->process, load->status_sig); + g_object_unref (load->process); + } + + g_output_stream_close (load->output, NULL, NULL); + g_object_unref (load->output); + g_output_stream_close (load->outattr, NULL, NULL); + g_object_unref (load->outattr); + + if (load->cancel) + g_object_unref (load->cancel); + + if (load->attribute_queue) { + while (!g_queue_is_empty (load->attribute_queue)) + _gcr_record_free (g_queue_pop_head (load->attribute_queue)); + g_queue_free (load->attribute_queue); + } + if (load->attribute_buf) + g_byte_array_unref (load->attribute_buf); + if (load->attributes) + g_hash_table_destroy (load->attributes); + + g_slice_free (GcrGnupgCollectionLoad, load); +} + +static void +process_records_as_public_key (GcrGnupgCollectionLoad *load, GPtrArray *records, + const gchar *keyid) +{ + GPtrArray *attr_records = NULL; + const gchar *fingerprint; + gchar *orig_fingerprint; + GcrGnupgKey *key; + guint i; + + /* Add in any attributes we have loaded */ + fingerprint = _gcr_gnupg_records_get_fingerprint (records); + if (fingerprint && load->attributes) + attr_records = g_hash_table_lookup (load->attributes, fingerprint); + if (attr_records) { + g_debug ("adding %d user id attribute(s) to key/fingerprint: %s/%s", + (gint)attr_records->len, keyid, fingerprint); + + if (!g_hash_table_lookup_extended (load->attributes, fingerprint, + (gpointer*)&orig_fingerprint, NULL)) + g_assert_not_reached (); + if (!g_hash_table_steal (load->attributes, fingerprint)) + g_assert_not_reached (); + g_free (orig_fingerprint); + + /* Move all the attribute records over to main records set */ + for (i = 0; i < attr_records->len; i++) + g_ptr_array_add (records, attr_records->pdata[i]); + + /* Shallow free of attr_records array */ + g_free (g_ptr_array_free (attr_records, FALSE)); + } + + /* Note that we've seen this keyid */ + g_hash_table_remove (load->difference, keyid); + + key = g_hash_table_lookup (load->collection->pv->items, keyid); + + /* Already have this key, just update */ + if (key) { + g_debug ("updating public key: %s", keyid); + _gcr_gnupg_key_set_public_records (key, records); + + /* Add a new key */ + } else { + key = _gcr_gnupg_key_new (records, NULL); + g_debug ("creating public key: %s", keyid); + g_hash_table_insert (load->collection->pv->items, g_strdup (keyid), key); + gcr_collection_emit_added (GCR_COLLECTION (load->collection), G_OBJECT (key)); + } +} + +static void +process_records_as_secret_key (GcrGnupgCollectionLoad *load, GPtrArray *records, + const gchar *keyid) +{ + GcrGnupgKey *key; + + key = g_hash_table_lookup (load->collection->pv->items, keyid); + + /* Don't have this key */ + if (key == NULL) { + g_message ("Secret key seen but no public key for: %s", keyid); + + /* Tell the private key that it's a secret one */ + } else { + g_debug ("adding secret records to key: %s", keyid); + _gcr_gnupg_key_set_secret_records (key, records); + } +} + +static void +process_records_as_key (GcrGnupgCollectionLoad *load) +{ + GPtrArray *records; + const gchar *keyid; + GQuark schema; + + g_assert (load->records->len); + + records = load->records; + load->records = g_ptr_array_new_with_free_func (_gcr_record_free); + + keyid = _gcr_gnupg_records_get_keyid (records); + if (keyid) { + schema = _gcr_record_get_schema (records->pdata[0]); + + /* A public key */ + if (schema == GCR_RECORD_SCHEMA_PUB) + process_records_as_public_key (load, records, keyid); + + /* A secret key */ + else if (schema == GCR_RECORD_SCHEMA_SEC) + process_records_as_secret_key (load, records, keyid); + + else + g_assert_not_reached (); + + } else { + g_warning ("parsed gnupg data had no keyid"); + } + + g_ptr_array_unref (records); +} + +static gboolean +process_outstanding_attribute (GcrGnupgCollectionLoad *load, GcrRecord *record) +{ + const gchar *fingerprint; + GPtrArray *records; + GcrRecord *xa1; + guint length; + + if (!_gcr_record_get_uint (record, GCR_RECORD_ATTRIBUTE_LENGTH, &length)) + g_return_val_if_reached (FALSE); + fingerprint = _gcr_record_get_raw (record, GCR_RECORD_ATTRIBUTE_KEY_FINGERPRINT); + g_return_val_if_fail (fingerprint != NULL, FALSE); + + /* Do we have enough data for this attribute? */ + if (!load->attribute_buf || load->attribute_buf->len < length) { + g_debug ("not enough attribute data in buffer: %u", length); + return FALSE; + } + + if (!load->attributes) + load->attributes = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify)g_ptr_array_unref); + + records = g_hash_table_lookup (load->attributes, fingerprint); + if (!records) { + records = g_ptr_array_new_with_free_func (_gcr_record_free); + g_hash_table_insert (load->attributes, g_strdup (fingerprint), records); + } + + g_debug ("new attribute of length %d for key with fingerprint %s", + length, fingerprint); + + xa1 = _gcr_gnupg_build_xa1_record (record, load->attribute_buf->data, length); + g_ptr_array_add (records, xa1); + + /* Did we use up all the attribute data? Get rid of the buffer */ + if (length == load->attribute_buf->len) { + g_byte_array_unref (load->attribute_buf); + load->attribute_buf = NULL; + + /* Otherwise clear out the used data from buffer */ + } else { + g_byte_array_remove_range (load->attribute_buf, 0, length); + } + + return TRUE; +} + +static void +process_outstanding_attributes (GcrGnupgCollectionLoad *load) +{ + GcrRecord *record; + + if (load->attribute_queue == NULL) + return; + + g_debug ("%d outstanding attribute records", + (gint)g_queue_get_length (load->attribute_queue)); + + for (;;) { + record = g_queue_peek_head (load->attribute_queue); + if (record == NULL) + break; + if (!process_outstanding_attribute (load, record)) + break; + g_queue_pop_head (load->attribute_queue); + _gcr_record_free (record); + } +} + +static void +on_line_parse_output (const gchar *line, gpointer user_data) +{ + GcrGnupgCollectionLoad *load = user_data; + GcrRecord *record; + GQuark schema; + + g_debug ("output: %s", line); + + record = _gcr_record_parse_colons (line, -1); + if (!record) { + g_warning ("invalid gnupg output line: %s", line); + return; + } + + schema = _gcr_record_get_schema (record); + + /* + * Each time we see a line with 'pub' or 'sec' schema we assume that + * it's a new key being listed. + */ + if (schema == GCR_RECORD_SCHEMA_PUB || schema == GCR_RECORD_SCHEMA_SEC) { + g_debug ("start of new key"); + if (load->records->len) + process_records_as_key (load); + g_assert (!load->records->len); + g_ptr_array_add (load->records, record); + record = NULL; + + /* + * 'uid' and 'fpr' schema lines get added to the key that came before. + */ + } else if (schema == GCR_RECORD_SCHEMA_UID || + schema == GCR_RECORD_SCHEMA_FPR) { + if (load->records->len) { + g_ptr_array_add (load->records, record); + record = NULL; + } + } + + if (record != NULL) + _gcr_record_free (record); +} + + +static gssize +on_gnupg_process_output_data (gconstpointer buffer, + gsize count, + GCancellable *cancellable, + gpointer user_data, + GError **error) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + + g_string_append_len (load->out_data, buffer, count); + _gcr_util_parse_lines (load->out_data, FALSE, on_line_parse_output, load); + return count; +} + +static void +on_gnupg_process_error_line (GcrGnupgProcess *process, const gchar *line, + gpointer user_data) +{ + g_printerr ("%s\n", line); +} + +static void +on_gnupg_process_status_record (GcrGnupgProcess *process, GcrRecord *record, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + + if (GCR_RECORD_SCHEMA_ATTRIBUTE != _gcr_record_get_schema (record)) + return; + + if (!load->attribute_queue) + load->attribute_queue = g_queue_new (); + + g_queue_push_tail (load->attribute_queue, _gcr_record_copy (record)); + process_outstanding_attributes (load); +} + +static gssize +on_gnupg_process_attribute_data (gconstpointer buffer, + gsize count, + GCancellable *cancellable, + gpointer user_data, + GError **error) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + + /* If we don't have a buffer, just claim this one */ + if (!load->attribute_buf) + load->attribute_buf = g_byte_array_new (); + + g_byte_array_append (load->attribute_buf, buffer, count); + + process_outstanding_attributes (load); + return count; +} + +static void +on_gnupg_process_completed (GObject *source, GAsyncResult *result, gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + GHashTableIter iter; + GError *error = NULL; + GObject *object; + gpointer keyid; + + if (!_gcr_gnupg_process_run_finish (GCR_GNUPG_PROCESS (source), result, &error)) { + g_simple_async_result_set_from_error (res, error); + g_simple_async_result_complete (res); + g_object_unref (res); + g_clear_error (&error); + return; + } + + /* Process any remaining output */ + _gcr_util_parse_lines (load->out_data, TRUE, on_line_parse_output, load); + + /* Process last bit as a key, if any */ + if (load->records->len) + process_records_as_key (load); + + /* If we completed loading public keys, then go and load secret */ + switch (load->loading_phase) { + case GCR_LOADING_PHASE_PUBLIC: + g_debug ("public load phase completed"); + load->loading_phase = GCR_LOADING_PHASE_SECRET; + spawn_gnupg_list_process (load, res); + g_object_unref (res); + return; + case GCR_LOADING_PHASE_SECRET: + g_debug ("secret load phase completed"); + /* continue below */ + break; + default: + g_assert_not_reached (); + } + + /* Remove any keys that we still have in the difference */ + g_hash_table_iter_init (&iter, load->difference); + while (g_hash_table_iter_next (&iter, &keyid, NULL)) { + object = g_hash_table_lookup (load->collection->pv->items, keyid); + if (object != NULL) { + g_object_ref (object); + g_debug ("removing key no longer present in keyring: %s", (gchar*)keyid); + g_hash_table_remove (load->collection->pv->items, keyid); + gcr_collection_emit_removed (GCR_COLLECTION (load->collection), object); + g_object_unref (object); + } + } + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GSimpleAsyncResult *res) +{ + GcrGnupgProcessFlags flags = 0; + GPtrArray *argv; + + argv = g_ptr_array_new (); + + switch (load->loading_phase) { + case GCR_LOADING_PHASE_PUBLIC: + g_debug ("starting public load phase"); + g_ptr_array_add (argv, (gpointer)"--list-keys"); + /* Load photos in public phase */ + flags = GCR_GNUPG_PROCESS_WITH_ATTRIBUTES | + GCR_GNUPG_PROCESS_WITH_STATUS; + break; + case GCR_LOADING_PHASE_SECRET: + g_debug ("starting secret load phase"); + g_ptr_array_add (argv, (gpointer)"--list-secret-keys"); + break; + default: + g_assert_not_reached (); + } + + g_ptr_array_add (argv, (gpointer)"--fixed-list-mode"); + g_ptr_array_add (argv, (gpointer)"--with-colons"); + g_ptr_array_add (argv, (gpointer)"--with-fingerprint"); + g_ptr_array_add (argv, NULL); + + /* res is unreffed in on_gnupg_process_completed */ + _gcr_gnupg_process_run_async (load->process, (const gchar**)argv->pdata, NULL, flags, + load->cancel, on_gnupg_process_completed, + g_object_ref (res)); + + g_ptr_array_unref (argv); +} + +/** + * _gcr_gnupg_collection_load_async: + * @self: The collection + * @cancellable: Cancellation object or %NULL + * @callback: Callback to call when result is ready + * @user_data: Data for callback + * + * Start an operation to load or reload the list of gnupg keys in this + * collection. + */ +void +_gcr_gnupg_collection_load_async (GcrGnupgCollection *self, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GSimpleAsyncResult *res; + GcrGnupgCollectionLoad *load; + GHashTableIter iter; + gpointer keyid; + + g_return_if_fail (GCR_IS_GNUPG_COLLECTION (self)); + + /* TODO: Cancellation not yet implemented */ + + res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, + _gcr_gnupg_collection_load_async); + + load = g_slice_new0 (GcrGnupgCollectionLoad); + load->records = g_ptr_array_new_with_free_func (_gcr_record_free); + load->out_data = g_string_sized_new (1024); + load->collection = g_object_ref (self); + load->cancel = cancellable ? g_object_ref (cancellable) : cancellable; + + load->output = _gcr_callback_output_stream_new (on_gnupg_process_output_data, res, NULL); + load->outattr = _gcr_callback_output_stream_new (on_gnupg_process_attribute_data, res, NULL); + + load->process = _gcr_gnupg_process_new (self->pv->directory, NULL); + _gcr_gnupg_process_set_output_stream (load->process, load->output); + _gcr_gnupg_process_set_attribute_stream (load->process, load->outattr); + load->error_sig = g_signal_connect (load->process, "error-line", G_CALLBACK (on_gnupg_process_error_line), res); + load->status_sig = g_signal_connect (load->process, "status-record", G_CALLBACK (on_gnupg_process_status_record), res); + + /* + * Track all the keys we currently have, at end remove those that + * didn't get listed by the gpg process. + */ + load->difference = g_hash_table_new (g_str_hash, g_str_equal); + g_hash_table_iter_init (&iter, self->pv->items); + while (g_hash_table_iter_next (&iter, &keyid, NULL)) + g_hash_table_insert (load->difference, keyid, keyid); + + g_simple_async_result_set_op_res_gpointer (res, load, + _gcr_gnupg_collection_load_free); + + load->loading_phase = GCR_LOADING_PHASE_PUBLIC; + spawn_gnupg_list_process (load, res); + + g_object_unref (res); +} + +/** + * _gcr_gnupg_collection_load_finish: + * @self: The collection + * @result: The result passed to the callback + * @error: Location to raise an error on failure. + * + * Get the result of an operation to load or reload the list of gnupg keys + * in this collection. + */ +gboolean +_gcr_gnupg_collection_load_finish (GcrGnupgCollection *self, GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GCR_IS_GNUPG_COLLECTION (self), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), + _gcr_gnupg_collection_load_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} diff --git a/gcr/gcr-gnupg-collection.h b/gcr/gcr-gnupg-collection.h new file mode 100644 index 0000000..e0b4367 --- /dev/null +++ b/gcr/gcr-gnupg-collection.h @@ -0,0 +1,67 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_GNUPG_COLLECTION_H +#define GCR_GNUPG_COLLECTION_H + +#include "gcr-collection.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_GNUPG_COLLECTION (_gcr_gnupg_collection_get_type ()) +#define GCR_GNUPG_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollection)) +#define GCR_GNUPG_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollectionClass)) +#define GCR_IS_GNUPG_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_COLLECTION)) +#define GCR_IS_GNUPG_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_COLLECTION)) +#define GCR_GNUPG_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollectionClass)) + +typedef struct _GcrGnupgCollection GcrGnupgCollection; +typedef struct _GcrGnupgCollectionClass GcrGnupgCollectionClass; +typedef struct _GcrGnupgCollectionPrivate GcrGnupgCollectionPrivate; + +struct _GcrGnupgCollection { + /*< private >*/ + GObject parent; + GcrGnupgCollectionPrivate *pv; +}; + +struct _GcrGnupgCollectionClass { + GObjectClass parent_class; +}; + +GType _gcr_gnupg_collection_get_type (void); + +GcrCollection* _gcr_gnupg_collection_new (const gchar *directory); + +void _gcr_gnupg_collection_load_async (GcrGnupgCollection *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean _gcr_gnupg_collection_load_finish (GcrGnupgCollection *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* GCR_GNUPG_COLLECTION_H */ diff --git a/gcr/gcr-gnupg-importer.c b/gcr/gcr-gnupg-importer.c new file mode 100644 index 0000000..bee2c1b --- /dev/null +++ b/gcr/gcr-gnupg-importer.c @@ -0,0 +1,384 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-gnupg-importer.h" +#include "gcr-gnupg-process.h" +#include "gcr-internal.h" + +#include + +enum { + PROP_0, + PROP_LABEL, + PROP_ICON, + PROP_IMPORTED, + PROP_DIRECTORY, + PROP_INTERACTION, + PROP_URI +}; + +struct _GcrGnupgImporterPrivate { + GcrGnupgProcess *process; + GMemoryInputStream *packets; + GTlsInteraction *interaction; + gchar *first_error; + GArray *imported; +}; + +static void gcr_gnupg_importer_iface (GcrImporterIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrGnupgImporter, _gcr_gnupg_importer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, gcr_gnupg_importer_iface); +); + +static void +_gcr_gnupg_importer_init (GcrGnupgImporter *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_GNUPG_IMPORTER, GcrGnupgImporterPrivate); + self->pv->packets = G_MEMORY_INPUT_STREAM (g_memory_input_stream_new ()); + self->pv->imported = g_array_new (TRUE, TRUE, sizeof (gchar *)); +} + +static void +_gcr_gnupg_importer_dispose (GObject *obj) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (obj); + + if (self->pv->process) + g_object_run_dispose (G_OBJECT (self->pv->process)); + g_clear_object (&self->pv->process); + g_clear_object (&self->pv->packets); + g_clear_object (&self->pv->interaction); + + G_OBJECT_CLASS (_gcr_gnupg_importer_parent_class)->dispose (obj); +} + +static void +_gcr_gnupg_importer_finalize (GObject *obj) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (obj); + + g_array_free (self->pv->imported, TRUE); + g_free (self->pv->first_error); + + G_OBJECT_CLASS (_gcr_gnupg_importer_parent_class)->finalize (obj); +} + +static gchar * +calculate_label (GcrGnupgImporter *self) +{ + const gchar *directory; + + directory = _gcr_gnupg_process_get_directory (self->pv->process); + if (directory == NULL) + return g_strdup (_("GnuPG Keyring")); + else + return g_strdup_printf (_("GnuPG Keyring: %s"), directory); +} + +static GIcon * +calculate_icon (GcrGnupgImporter *self) +{ + const gchar *directory; + + directory = _gcr_gnupg_process_get_directory (self->pv->process); + if (directory == NULL) + return g_themed_icon_new ("user-home"); + else + return g_themed_icon_new ("folder"); +} + +static gchar * +calculate_uri (GcrGnupgImporter *self) +{ + const gchar *directory; + + directory = _gcr_gnupg_process_get_directory (self->pv->process); + if (directory == NULL) + return g_strdup ("gnupg://"); + else + return g_strdup_printf ("gnupg://%s", directory); +} + +static gboolean +on_process_error_line (GcrGnupgProcess *process, + const gchar *line, + gpointer user_data) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (user_data); + + if (self->pv->first_error) + return TRUE; + + if (g_str_has_prefix (line, "gpg: ")) { + line += 5; + if (g_pattern_match_simple ("key ????????:*", line)) + line += 13; + } + + while (line[0] && g_ascii_isspace (line[0])) + line++; + + self->pv->first_error = g_strdup (line); + g_strstrip (self->pv->first_error); + return TRUE; +} + +static gboolean +on_process_status_record (GcrGnupgProcess *process, + GcrRecord *record, + gpointer user_data) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (user_data); + const gchar *value; + gchar *fingerprint; + + if (_gcr_record_get_schema (record) != GCR_RECORD_SCHEMA_IMPORT_OK) + return TRUE; + + value = _gcr_record_get_raw (record, GCR_RECORD_IMPORT_FINGERPRINT); + if (value != NULL && value[0] != 0) { + fingerprint = g_strdup (value); + g_array_append_val (self->pv->imported, fingerprint); + } + + return TRUE; +} + +static void +_gcr_gnupg_importer_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (obj); + + switch (prop_id) { + case PROP_DIRECTORY: + self->pv->process = _gcr_gnupg_process_new (g_value_get_string (value), NULL); + _gcr_gnupg_process_set_input_stream (self->pv->process, G_INPUT_STREAM (self->pv->packets)); + g_signal_connect (self->pv->process, "error-line", G_CALLBACK (on_process_error_line), self); + g_signal_connect (self->pv->process, "status-record", G_CALLBACK (on_process_status_record), self); + break; + case PROP_INTERACTION: + g_clear_object (&self->pv->interaction); + self->pv->interaction = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_importer_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_take_string (value, calculate_label (self)); + break; + case PROP_ICON: + g_value_take_object (value, calculate_icon (self)); + break; + case PROP_IMPORTED: + g_value_set_boxed (value, _gcr_gnupg_importer_get_imported (self)); + break; + case PROP_DIRECTORY: + g_value_set_string (value, _gcr_gnupg_process_get_directory (self->pv->process)); + break; + case PROP_INTERACTION: + g_value_set_object (value, self->pv->interaction); + break; + case PROP_URI: + g_value_take_string (value, calculate_uri (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_importer_class_init (GcrGnupgImporterClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GckBuilder builder = GCK_BUILDER_INIT; + + gobject_class->dispose = _gcr_gnupg_importer_dispose; + gobject_class->finalize = _gcr_gnupg_importer_finalize; + gobject_class->set_property = _gcr_gnupg_importer_set_property; + gobject_class->get_property = _gcr_gnupg_importer_get_property; + + g_type_class_add_private (gobject_class, sizeof (GcrGnupgImporterPrivate)); + + g_object_class_override_property (gobject_class, PROP_LABEL, "label"); + g_object_class_override_property (gobject_class, PROP_ICON, "icon"); + g_object_class_override_property (gobject_class, PROP_INTERACTION, "interaction"); + g_object_class_override_property (gobject_class, PROP_URI, "uri"); + + g_object_class_install_property (gobject_class, PROP_IMPORTED, + g_param_spec_boxed ("imported", "Imported", "Fingerprints of imported keys", + G_TYPE_STRV, G_PARAM_READABLE)); + + g_object_class_install_property (gobject_class, PROP_DIRECTORY, + g_param_spec_string ("directory", "Directory", "Directory to import keys to", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_GNUPG_RECORDS); + gcr_importer_register (GCR_TYPE_GNUPG_IMPORTER, gck_builder_end (&builder)); + + _gcr_initialize_library (); +} + +static GList * +_gcr_gnupg_importer_create_for_parsed (GcrParsed *parsed) +{ + GcrImporter *self; + + if (gcr_parsed_get_format (parsed) != GCR_FORMAT_OPENPGP_PACKET) + return NULL; + + self = _gcr_gnupg_importer_new (NULL); + if (!gcr_importer_queue_for_parsed (self, parsed)) + g_assert_not_reached (); + + return g_list_append (NULL, self); +} + +static gboolean +_gcr_gnupg_importer_queue_for_parsed (GcrImporter *importer, + GcrParsed *parsed) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (importer); + gconstpointer block; + gsize n_block; + + if (gcr_parsed_get_format (parsed) != GCR_FORMAT_OPENPGP_PACKET) + return FALSE; + + block = gcr_parsed_get_data (parsed, &n_block); + g_return_val_if_fail (block, FALSE); + + g_memory_input_stream_add_data (self->pv->packets, g_memdup (block, n_block), + n_block, g_free); + return TRUE; +} + +static void +on_process_run_complete (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (g_async_result_get_source_object (user_data)); + GError *error = NULL; + + if (!_gcr_gnupg_process_run_finish (GCR_GNUPG_PROCESS (source), result, &error)) { + if (g_error_matches (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED) && self->pv->first_error) { + g_simple_async_result_set_error (res, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + "%s", self->pv->first_error); + g_error_free (error); + } else { + g_simple_async_result_take_error (res, error); + } + } + + g_simple_async_result_complete (res); + g_object_unref (self); + g_object_unref (res); +} + +static void +_gcr_gnupg_importer_import_async (GcrImporter *importer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (importer); + GSimpleAsyncResult *res; + const gchar *argv[] = { "--import", NULL }; + + g_free (self->pv->first_error); + self->pv->first_error = NULL; + + res = g_simple_async_result_new (G_OBJECT (importer), callback, user_data, + _gcr_gnupg_importer_import_async); + + _gcr_gnupg_process_run_async (self->pv->process, argv, NULL, + GCR_GNUPG_PROCESS_WITH_STATUS, + cancellable, on_process_run_complete, + g_object_ref (res)); + + g_object_unref (res); +} + +static gboolean +_gcr_gnupg_importer_import_finish (GcrImporter *importer, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (importer), + _gcr_gnupg_importer_import_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +static void +gcr_gnupg_importer_iface (GcrImporterIface *iface) +{ + iface->create_for_parsed = _gcr_gnupg_importer_create_for_parsed; + iface->queue_for_parsed = _gcr_gnupg_importer_queue_for_parsed; + iface->import_async = _gcr_gnupg_importer_import_async; + iface->import_finish = _gcr_gnupg_importer_import_finish; +} + +/** + * _gcr_gnupg_importer_new: + * @directory: (allow-none): the directory to import to, or %NULL for default + * + * Create a new #GcrGnupgImporter. + * + * Returns: (transfer full) (type Gcr.GnupgImporter): the new importer + */ +GcrImporter * +_gcr_gnupg_importer_new (const gchar *directory) +{ + return g_object_new (GCR_TYPE_GNUPG_IMPORTER, + "directory", directory, + NULL); +} + +const gchar ** +_gcr_gnupg_importer_get_imported (GcrGnupgImporter *self) +{ + g_return_val_if_fail (GCR_IS_GNUPG_IMPORTER (self), NULL); + return (const gchar **)self->pv->imported->data; +} diff --git a/gcr/gcr-gnupg-importer.h b/gcr/gcr-gnupg-importer.h new file mode 100644 index 0000000..5b37ea0 --- /dev/null +++ b/gcr/gcr-gnupg-importer.h @@ -0,0 +1,65 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GCR_GNUPG_IMPORTER_H__ +#define __GCR_GNUPG_IMPORTER_H__ + +#include "gcr-importer.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_GNUPG_IMPORTER (_gcr_gnupg_importer_get_type ()) +#define GCR_GNUPG_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_IMPORTER, GcrGnupgImporter)) +#define GCR_GNUPG_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_IMPORTER, GcrGnupgImporterClass)) +#define GCR_IS_GNUPG_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_IMPORTER)) +#define GCR_IS_GNUPG_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_IMPORTER)) +#define GCR_GNUPG_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_IMPORTER, GcrGnupgImporterClass)) + +typedef struct _GcrGnupgImporter GcrGnupgImporter; +typedef struct _GcrGnupgImporterClass GcrGnupgImporterClass; +typedef struct _GcrGnupgImporterPrivate GcrGnupgImporterPrivate; + +struct _GcrGnupgImporter { + GObject parent; + + /*< private >*/ + GcrGnupgImporterPrivate *pv; +}; + +struct _GcrGnupgImporterClass { + GObjectClass parent_class; +}; + +GType _gcr_gnupg_importer_get_type (void) G_GNUC_CONST; + +GcrImporter * _gcr_gnupg_importer_new (const gchar *directory); + +const gchar ** _gcr_gnupg_importer_get_imported (GcrGnupgImporter *self); + +G_END_DECLS + +#endif /* __GCR_IMPORTER_H__ */ diff --git a/gcr/gcr-gnupg-key.c b/gcr/gcr-gnupg-key.c new file mode 100644 index 0000000..606434e --- /dev/null +++ b/gcr/gcr-gnupg-key.c @@ -0,0 +1,439 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-gnupg-key.h" +#include "gcr-gnupg-records.h" +#include "gcr-record.h" +#include "gcr-memory-icon.h" + +#include "gck/gck.h" + +#include + +enum { + PROP_0, + PROP_KEYID, + PROP_PUBLIC_RECORDS, + PROP_SECRET_RECORDS, + PROP_LABEL, + PROP_MARKUP, + PROP_DESCRIPTION, + PROP_SHORT_KEYID, + PROP_ICON +}; + +struct _GcrGnupgKeyPrivate { + GPtrArray *public_records; + GPtrArray *secret_records; + GIcon *icon; +}; + +G_DEFINE_TYPE (GcrGnupgKey, _gcr_gnupg_key, G_TYPE_OBJECT); + +static gchar * +calculate_name (GcrGnupgKey *self) +{ + GcrRecord* record; + + record = _gcr_records_find (self->pv->public_records, GCR_RECORD_SCHEMA_UID); + g_return_val_if_fail (record, NULL); + + return _gcr_record_get_string (record, GCR_RECORD_UID_USERID); +} + +static gchar * +calculate_markup (GcrGnupgKey *self) +{ + gchar *markup = NULL; + gchar *uid, *name, *email, *comment; + + uid = calculate_name (self); + if (uid == NULL) + return NULL; + + _gcr_gnupg_records_parse_user_id (uid, &name, &email, &comment); + if (comment != NULL && comment[0] != '\0') + markup = g_markup_printf_escaped ("%s\n%s \'%s\'", name, email, comment); + else + markup = g_markup_printf_escaped ("%s\n%s", name, email); + g_free (name); + g_free (email); + g_free (comment); + g_free (uid); + + return markup; +} + +static void +_gcr_gnupg_key_init (GcrGnupgKey *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_GNUPG_KEY, GcrGnupgKeyPrivate)); +} + +static void +_gcr_gnupg_key_finalize (GObject *obj) +{ + GcrGnupgKey *self = GCR_GNUPG_KEY (obj); + + if (self->pv->public_records) + g_ptr_array_unref (self->pv->public_records); + if (self->pv->secret_records) + g_ptr_array_unref (self->pv->secret_records); + + G_OBJECT_CLASS (_gcr_gnupg_key_parent_class)->finalize (obj); +} + +static void +_gcr_gnupg_key_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrGnupgKey *self = GCR_GNUPG_KEY (obj); + + switch (prop_id) { + case PROP_PUBLIC_RECORDS: + _gcr_gnupg_key_set_public_records (self, g_value_get_boxed (value)); + break; + case PROP_SECRET_RECORDS: + _gcr_gnupg_key_set_secret_records (self, g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_key_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrGnupgKey *self = GCR_GNUPG_KEY (obj); + + switch (prop_id) { + case PROP_PUBLIC_RECORDS: + g_value_set_boxed (value, self->pv->public_records); + break; + case PROP_SECRET_RECORDS: + g_value_set_boxed (value, self->pv->secret_records); + break; + case PROP_KEYID: + g_value_set_string (value, _gcr_gnupg_key_get_keyid (self)); + break; + case PROP_LABEL: + g_value_take_string (value, calculate_name (self)); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, _("PGP Key")); + break; + case PROP_MARKUP: + g_value_take_string (value, calculate_markup (self)); + break; + case PROP_SHORT_KEYID: + g_value_set_string (value, _gcr_gnupg_records_get_short_keyid (self->pv->public_records)); + break; + case PROP_ICON: + g_value_set_object (value, _gcr_gnupg_key_get_icon (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_key_class_init (GcrGnupgKeyClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + _gcr_gnupg_key_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrGnupgKeyPrivate)); + + gobject_class->finalize = _gcr_gnupg_key_finalize; + gobject_class->set_property = _gcr_gnupg_key_set_property; + gobject_class->get_property = _gcr_gnupg_key_get_property; + + /** + * GcrGnupgKey:public-records: + * + * Public key data. Should always be present. + */ + g_object_class_install_property (gobject_class, PROP_PUBLIC_RECORDS, + g_param_spec_boxed ("public-records", "Public Records", "Public Key Colon Records", + G_TYPE_PTR_ARRAY, G_PARAM_READWRITE)); + + /** + * GcrGnupgKey:secret-records: + * + * Secret key data. The keyid of this data must match public-dataset. + * If present, this key represents a secret key. + */ + g_object_class_install_property (gobject_class, PROP_SECRET_RECORDS, + g_param_spec_boxed ("secret-records", "Secret Records", "Secret Key Colon Records", + G_TYPE_PTR_ARRAY, G_PARAM_READWRITE)); + + /** + * GcrGnupgKey:keyid: + * + * Key identifier. + */ + g_object_class_install_property (gobject_class, PROP_KEYID, + g_param_spec_string ("keyid", "Key ID", "Key identifier", + "", G_PARAM_READABLE)); + + /** + * GcrGnupgKey:label: + * + * User readable label for this key. + */ + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "Label", "Key label", + "", G_PARAM_READABLE)); + + /** + * GcrGnupgKey::description: + * + * Description of type of key. + */ + g_object_class_install_property (gobject_class, PROP_DESCRIPTION, + g_param_spec_string ("description", "Description", "Description of object type", + "", G_PARAM_READABLE)); + + /** + * GcrGnupgKey:markup: + * + * User readable markup which contains key label. + */ + g_object_class_install_property (gobject_class, PROP_MARKUP, + g_param_spec_string ("markup", "Markup", "Markup which describes key", + "", G_PARAM_READABLE)); + + /** + * GcrGnupgKey:short-keyid: + * + * User readable key identifier. + */ + g_object_class_install_property (gobject_class, PROP_SHORT_KEYID, + g_param_spec_string ("short-keyid", "Short Key ID", "Display key identifier", + "", G_PARAM_READABLE)); + + /** + * GcrGnupgKey:icon: + * + * Icon for this key. + */ + g_object_class_install_property (gobject_class, PROP_ICON, + g_param_spec_object ("icon", "Icon", "Icon for this key", + G_TYPE_ICON, G_PARAM_READABLE)); +} + +/** + * _gcr_gnupg_key_new: + * @pubset: array of GcrRecord* representing public part of key + * @secset: (allow-none): array of GcrRecord* representing secret part of key. + * + * Create a new GcrGnupgKey for the record data passed. If the secret part + * of the key is set, then this represents a secret key; otherwise it represents + * a public key. + * + * Returns: (transfer full): A newly allocated key. + */ +GcrGnupgKey* +_gcr_gnupg_key_new (GPtrArray *pubset, GPtrArray *secset) +{ + g_return_val_if_fail (pubset, NULL); + return g_object_new (GCR_TYPE_GNUPG_KEY, + "public-records", pubset, + "secret-records", secset, + NULL); +} + +/** + * _gcr_gnupg_key_get_public_records: + * @self: The key + * + * Get the record data this key is based on. + * + * Returns: (transfer none): An array of GcrRecord*. + */ +GPtrArray* +_gcr_gnupg_key_get_public_records (GcrGnupgKey *self) +{ + g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL); + return self->pv->public_records; +} + +/** + * _gcr_gnupg_key_set_public_records: + * @self: The key + * @records: The new array of GcrRecord* + * + * Change the record data that this key is based on. + */ +void +_gcr_gnupg_key_set_public_records (GcrGnupgKey *self, GPtrArray *records) +{ + GObject *obj; + + g_return_if_fail (GCR_IS_GNUPG_KEY (self)); + g_return_if_fail (records); + + /* Check that it matches previous */ + if (self->pv->public_records) { + const gchar *old_keyid = _gcr_gnupg_records_get_keyid (self->pv->public_records); + const gchar *new_keyid = _gcr_gnupg_records_get_keyid (records); + + if (g_strcmp0 (old_keyid, new_keyid) != 0) { + g_warning ("it is an error to change a gnupg key so that the " + "fingerprint is no longer the same: %s != %s", + old_keyid, new_keyid); + return; + } + } + + g_ptr_array_ref (records); + if (self->pv->public_records) + g_ptr_array_unref (self->pv->public_records); + self->pv->public_records = records; + + obj = G_OBJECT (self); + g_object_freeze_notify (obj); + g_object_notify (obj, "public-records"); + g_object_notify (obj, "label"); + g_object_notify (obj, "markup"); + g_object_thaw_notify (obj); +} + +/** + * _gcr_gnupg_key_get_secret_records: + * @self: The key + * + * Get the record secret data this key is based on. %NULL if a public key. + * + * Returns: (transfer none) (allow-none): An array of GcrColons*. + */ +GPtrArray* +_gcr_gnupg_key_get_secret_records (GcrGnupgKey *self) +{ + g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL); + return self->pv->secret_records; +} + +/** + * _gcr_gnupg_key_set_secret_records: + * @self: The key + * @records: (allow-none): The new array of GcrRecord* + * + * Set the secret data for this key. %NULL if public key. + */ +void +_gcr_gnupg_key_set_secret_records (GcrGnupgKey *self, GPtrArray *records) +{ + GObject *obj; + + g_return_if_fail (GCR_IS_GNUPG_KEY (self)); + + /* Check that it matches public key */ + if (self->pv->public_records && records) { + const gchar *pub_keyid = _gcr_gnupg_records_get_keyid (self->pv->public_records); + const gchar *sec_keyid = _gcr_gnupg_records_get_keyid (records); + + if (g_strcmp0 (pub_keyid, sec_keyid) != 0) { + g_warning ("it is an error to create a gnupg key so that the " + "fingerprint of thet pub and sec parts are not the same: %s != %s", + pub_keyid, sec_keyid); + return; + } + } + + if (records) + g_ptr_array_ref (records); + if (self->pv->secret_records) + g_ptr_array_unref (self->pv->secret_records); + self->pv->secret_records = records; + + obj = G_OBJECT (self); + g_object_freeze_notify (obj); + g_object_notify (obj, "secret-records"); + g_object_thaw_notify (obj); +} + +/** + * _gcr_gnupg_key_get_keyid: + * @self: The key + * + * Get the keyid for this key. + * + * Returns: (transfer none): The keyid. + */ +const gchar* +_gcr_gnupg_key_get_keyid (GcrGnupgKey *self) +{ + g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL); + return _gcr_gnupg_records_get_keyid (self->pv->public_records); +} + +/** + * _gcr_gnupg_key_get_icon: + * @self: A gnupg key. + * + * Get the display icon for this key. + * + * Return value: (transfer none): The icon, owned by the key. + */ +GIcon* +_gcr_gnupg_key_get_icon (GcrGnupgKey *self) +{ + g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL); + + if (self->pv->icon == NULL) { + self->pv->icon = _gcr_gnupg_records_get_icon (self->pv->public_records); + if (self->pv->icon == NULL) { + if (self->pv->secret_records) + self->pv->icon = g_themed_icon_new ("gcr-key-pair"); + else + self->pv->icon = g_themed_icon_new ("gcr-key"); + } + } + + return self->pv->icon; +} + +/** + * _gcr_gnupg_key_get_columns: + * + * Get the columns that we should display for gnupg keys. + * + * Returns: (transfer none): The columns, NULL terminated, should not be freed. + */ +const GcrColumn* +_gcr_gnupg_key_get_columns (void) +{ + static GcrColumn columns[] = { + { "icon", /* later */ 0, /* later */ 0, NULL, 0, NULL, 0 }, + { "label", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Name"), + GCR_COLUMN_SORTABLE, NULL, 0 }, + { "short-keyid", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Key ID"), + GCR_COLUMN_SORTABLE, NULL, 0 }, + { NULL } + }; + + columns[0].property_type = columns[0].column_type = G_TYPE_ICON; + return columns; +} diff --git a/gcr/gcr-gnupg-key.h b/gcr/gcr-gnupg-key.h new file mode 100644 index 0000000..7f546c0 --- /dev/null +++ b/gcr/gcr-gnupg-key.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_GNUPG_KEY_H +#define GCR_GNUPG_KEY_H + +#include + +#include "gcr-column.h" +#include "gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_GNUPG_KEY_COLUMNS (_gcr_gnupg_key_get_columns ()) +#define GCR_TYPE_GNUPG_KEY (_gcr_gnupg_key_get_type ()) +#define GCR_GNUPG_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_KEY, GcrGnupgKey)) +#define GCR_GNUPG_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_KEY, GcrGnupgKeyClass)) +#define GCR_IS_GNUPG_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_KEY)) +#define GCR_IS_GNUPG_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_KEY)) +#define GCR_GNUPG_KEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_KEY, GcrGnupgKeyClass)) + +typedef struct _GcrGnupgKey GcrGnupgKey; +typedef struct _GcrGnupgKeyClass GcrGnupgKeyClass; +typedef struct _GcrGnupgKeyPrivate GcrGnupgKeyPrivate; + +struct _GcrGnupgKey { + /*< private >*/ + GObject parent; + GcrGnupgKeyPrivate *pv; +}; + +struct _GcrGnupgKeyClass { + GObjectClass parent_class; +}; + +GType _gcr_gnupg_key_get_type (void); + +const GcrColumn* _gcr_gnupg_key_get_columns (void); + +GcrGnupgKey* _gcr_gnupg_key_new (GPtrArray *pubset, + GPtrArray *secset); + +const gchar* _gcr_gnupg_key_get_keyid (GcrGnupgKey *self); + +GPtrArray* _gcr_gnupg_key_get_public_records (GcrGnupgKey *self); + +void _gcr_gnupg_key_set_public_records (GcrGnupgKey *self, + GPtrArray *records); + +GPtrArray* _gcr_gnupg_key_get_secret_records (GcrGnupgKey *self); + +void _gcr_gnupg_key_set_secret_records (GcrGnupgKey *self, + GPtrArray *records); + +GIcon* _gcr_gnupg_key_get_icon (GcrGnupgKey *self); + +G_END_DECLS + +#endif /* __GCR_GNUPG_KEY_H__ */ diff --git a/gcr/gcr-gnupg-process.c b/gcr/gcr-gnupg-process.c new file mode 100644 index 0000000..a53d6db --- /dev/null +++ b/gcr/gcr-gnupg-process.c @@ -0,0 +1,1160 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-gnupg-process.h" +#include "gcr-util.h" + +#include "gcr/gcr-marshal.h" + +#include + +#include +#include +#include +#include +#include + +/** + * GcrGnupgProcessFlags: + * @GCR_GNUPG_PROCESS_NONE: No flags + * @GCR_GNUPG_PROCESS_RESPECT_LOCALE: Respect the user's locale when running gnupg. + * @GCR_GNUPG_PROCESS_WITH_STATUS: Ask the process to send status records. + * @GCR_GNUPG_PROCESS_WITH_ATTRIBUTES: Ask the process to output attribute data. + * + * Flags for running a gnupg process. + */ + +enum { + PROP_0, + PROP_DIRECTORY, + PROP_EXECUTABLE, + PROP_INPUT_STREAM, + PROP_OUTPUT_STREAM, + PROP_ATTRIBUTE_STREAM +}; + +enum { + FD_INPUT, + FD_OUTPUT, + FD_ERROR, + FD_STATUS, + FD_ATTRIBUTE, + NUM_FDS +}; + +enum { + ERROR_LINE, + STATUS_RECORD, + NUM_SIGNALS +}; + +static gint signals[NUM_SIGNALS] = { 0, }; + +typedef struct _GnupgSource { + GSource source; + GPollFD polls[NUM_FDS]; /* The various fd's we're listening to */ + + GcrGnupgProcess *process; /* Pointer back to the process object */ + + GByteArray *input_buf; + GString *error_buf; + GString *status_buf; + + GPid child_pid; + guint child_sig; + + GCancellable *cancellable; + guint cancel_sig; +} GnupgSource; + +struct _GcrGnupgProcessPrivate { + gchar *directory; + gchar *executable; + + GInputStream *input; + GOutputStream *output; + GOutputStream *attributes; + + gboolean running; + gboolean complete; + GError *error; + guint source_sig; + + GAsyncReadyCallback async_callback; + gpointer user_data; +}; + +/* Forward declarations */ +static void _gcr_gnupg_process_init_async (GAsyncResultIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrGnupgProcess, _gcr_gnupg_process, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, _gcr_gnupg_process_init_async)); + +static void +_gcr_gnupg_process_init (GcrGnupgProcess *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_GNUPG_PROCESS, + GcrGnupgProcessPrivate); +} + +static void +_gcr_gnupg_process_constructed (GObject *obj) +{ + GcrGnupgProcess *self = GCR_GNUPG_PROCESS (obj); + + if (G_OBJECT_CLASS (_gcr_gnupg_process_parent_class)->constructed) + G_OBJECT_CLASS (_gcr_gnupg_process_parent_class)->constructed (obj); + + if (!self->pv->executable) + self->pv->executable = g_strdup (GPG_EXECUTABLE); +} + +static void +_gcr_gnupg_process_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrGnupgProcess *self = GCR_GNUPG_PROCESS (obj); + + switch (prop_id) { + case PROP_DIRECTORY: + g_value_set_string (value, self->pv->directory); + break; + case PROP_EXECUTABLE: + g_value_set_string (value, self->pv->executable); + break; + case PROP_INPUT_STREAM: + g_value_set_object (value, _gcr_gnupg_process_get_input_stream (self)); + break; + case PROP_OUTPUT_STREAM: + g_value_set_object (value, _gcr_gnupg_process_get_output_stream (self)); + break; + case PROP_ATTRIBUTE_STREAM: + g_value_set_object (value, _gcr_gnupg_process_get_attribute_stream (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_process_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrGnupgProcess *self = GCR_GNUPG_PROCESS (obj); + + switch (prop_id) { + case PROP_DIRECTORY: + g_return_if_fail (!self->pv->directory); + self->pv->directory = g_value_dup_string (value); + break; + case PROP_EXECUTABLE: + g_return_if_fail (!self->pv->executable); + self->pv->executable = g_value_dup_string (value); + break; + case PROP_INPUT_STREAM: + _gcr_gnupg_process_set_input_stream (self, g_value_get_object (value)); + break; + case PROP_OUTPUT_STREAM: + _gcr_gnupg_process_set_output_stream (self, g_value_get_object (value)); + break; + case PROP_ATTRIBUTE_STREAM: + _gcr_gnupg_process_set_attribute_stream (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_process_dispose (GObject *obj) +{ + GcrGnupgProcess *self = GCR_GNUPG_PROCESS (obj); + + g_clear_object (&self->pv->input); + g_clear_object (&self->pv->output); + g_clear_object (&self->pv->attributes); + + G_OBJECT_CLASS (_gcr_gnupg_process_parent_class)->dispose (obj); +} + +static void +_gcr_gnupg_process_finalize (GObject *obj) +{ + GcrGnupgProcess *self = GCR_GNUPG_PROCESS (obj); + + g_assert (self->pv->source_sig == 0); + g_assert (!self->pv->running); + g_free (self->pv->directory); + g_free (self->pv->executable); + g_clear_error (&self->pv->error); + + G_OBJECT_CLASS (_gcr_gnupg_process_parent_class)->finalize (obj); +} + +static void +_gcr_gnupg_process_class_init (GcrGnupgProcessClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructed = _gcr_gnupg_process_constructed; + gobject_class->get_property = _gcr_gnupg_process_get_property; + gobject_class->set_property = _gcr_gnupg_process_set_property; + gobject_class->dispose = _gcr_gnupg_process_dispose; + gobject_class->finalize = _gcr_gnupg_process_finalize; + + /** + * GcrGnupgProcess:directory: + * + * Directory to run as gnupg home directory, or %NULL for default + * ~/.gnupg/ directory. + */ + g_object_class_install_property (gobject_class, PROP_DIRECTORY, + g_param_spec_string ("directory", "Directory", "Gnupg Directory", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GcrGnupgProcess:executable: + * + * Path to the gnupg executable, or %NULL for default. + */ + g_object_class_install_property (gobject_class, PROP_EXECUTABLE, + g_param_spec_string ("executable", "Executable", "Gnupg Executable", + GPG_EXECUTABLE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GcrGnupgProcess:input-stream: + * + * Input for gnupg, or %NULL for no input. + */ + g_object_class_install_property (gobject_class, PROP_INPUT_STREAM, + g_param_spec_object ("input-stream", "Input Stream", "Input Stream", + G_TYPE_INPUT_STREAM, G_PARAM_READWRITE)); + + /** + * GcrGnupgProcess:output-stream: + * + * Output from gnupg, or %NULL for ignored output. + */ + g_object_class_install_property (gobject_class, PROP_OUTPUT_STREAM, + g_param_spec_object ("output-stream", "Output Stream", "Output Stream", + G_TYPE_OUTPUT_STREAM, G_PARAM_READWRITE)); + + /** + * GcrGnupgProcess:attribute-stream: + * + * Output of attribute data from gnupg, or %NULL for ignored attributes. + */ + g_object_class_install_property (gobject_class, PROP_ATTRIBUTE_STREAM, + g_param_spec_object ("attribute-stream", "Attribute Stream", "Attribute Stream", + G_TYPE_OUTPUT_STREAM, G_PARAM_READWRITE)); + + /** + * GcrGnupgProcess::error-line: + * @line: a line of error output. + * + * Signal emitted when a line of error output is available from the + * gnupg process. + */ + signals[ERROR_LINE] = g_signal_new ("error-line", GCR_TYPE_GNUPG_PROCESS, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrGnupgProcessClass, error_line), + NULL, NULL, _gcr_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + /** + * GcrGnupgProcess::status-record: + * @record: a status record. + * + * Signal emitted when a status record is available from the gnupg process. + */ + signals[STATUS_RECORD] = g_signal_new ("status-record", GCR_TYPE_GNUPG_PROCESS, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrGnupgProcessClass, status_record), + NULL, NULL, _gcr_marshal_VOID__BOXED, + G_TYPE_NONE, 1, GCR_TYPE_RECORD); + + g_type_class_add_private (gobject_class, sizeof (GcrGnupgProcessPrivate)); +} + +static gpointer +_gcr_gnupg_process_get_user_data (GAsyncResult *result) +{ + g_return_val_if_fail (GCR_IS_GNUPG_PROCESS (result), NULL); + return GCR_GNUPG_PROCESS (result)->pv->user_data; +} + +static GObject* +_gcr_gnupg_process_get_source_object (GAsyncResult *result) +{ + g_return_val_if_fail (GCR_IS_GNUPG_PROCESS (result), NULL); + return g_object_ref (result); +} + +static void +_gcr_gnupg_process_init_async (GAsyncResultIface *iface) +{ + iface->get_source_object = _gcr_gnupg_process_get_source_object; + iface->get_user_data = _gcr_gnupg_process_get_user_data; +} + +/** + * _gcr_gnupg_process_new: + * @directory: (allow-none): The gnupg home directory + * @executable: (allow-none): The gpg executable + * + * Create a new GcrGnupgProcess. + * + * The gnupg home directory is where the keyring files live. If directory is + * %NULL then the default gnupg home directory is used. + * + * The executable will default to the compiled in path if a %NULL executable + * argument is used. + * + * Returns: (transfer full): A newly allocated process. + */ +GcrGnupgProcess* +_gcr_gnupg_process_new (const gchar *directory, const gchar *executable) +{ + return g_object_new (GCR_TYPE_GNUPG_PROCESS, + "directory", directory, + "executable", executable, + NULL); +} + +const gchar * +_gcr_gnupg_process_get_directory (GcrGnupgProcess *self) +{ + g_return_val_if_fail (GCR_GNUPG_PROCESS (self), NULL); + return self->pv->directory; +} + +GInputStream * +_gcr_gnupg_process_get_input_stream (GcrGnupgProcess *self) +{ + g_return_val_if_fail (GCR_GNUPG_PROCESS (self), NULL); + return self->pv->input; +} + +void +_gcr_gnupg_process_set_input_stream (GcrGnupgProcess *self, + GInputStream *input) +{ + g_return_if_fail (GCR_GNUPG_PROCESS (self)); + g_return_if_fail (input == NULL || G_INPUT_STREAM (input)); + + if (input) + g_object_ref (input); + if (self->pv->input) + g_object_unref (self->pv->input); + self->pv->input = input; + g_object_notify (G_OBJECT (self), "input-stream"); +} + +GOutputStream * +_gcr_gnupg_process_get_output_stream (GcrGnupgProcess *self) +{ + g_return_val_if_fail (GCR_GNUPG_PROCESS (self), NULL); + return self->pv->output; +} + +void +_gcr_gnupg_process_set_output_stream (GcrGnupgProcess *self, + GOutputStream *output) +{ + g_return_if_fail (GCR_GNUPG_PROCESS (self)); + g_return_if_fail (output == NULL || G_OUTPUT_STREAM (output)); + + if (output) + g_object_ref (output); + if (self->pv->output) + g_object_unref (self->pv->output); + self->pv->output = output; + g_object_notify (G_OBJECT (self), "output-stream"); +} + +GOutputStream * +_gcr_gnupg_process_get_attribute_stream (GcrGnupgProcess *self) +{ + g_return_val_if_fail (GCR_GNUPG_PROCESS (self), NULL); + return self->pv->attributes; +} + +void +_gcr_gnupg_process_set_attribute_stream (GcrGnupgProcess *self, + GOutputStream *output) +{ + g_return_if_fail (GCR_GNUPG_PROCESS (self)); + g_return_if_fail (output == NULL || G_OUTPUT_STREAM (output)); + + if (output) + g_object_ref (output); + if (self->pv->attributes) + g_object_unref (self->pv->attributes); + self->pv->attributes = output; + g_object_notify (G_OBJECT (self), "attribute-stream"); +} + +static void +run_async_ready_callback (GcrGnupgProcess *self) +{ + GAsyncReadyCallback callback; + gpointer user_data; + + g_debug ("running async callback"); + + /* Remove these before completing */ + callback = self->pv->async_callback; + user_data = self->pv->user_data; + self->pv->async_callback = NULL; + self->pv->user_data = NULL; + + if (callback != NULL) + (callback) (G_OBJECT (self), G_ASYNC_RESULT (self), user_data); +} + +static gboolean +on_run_async_ready_callback_later (gpointer user_data) +{ + run_async_ready_callback (GCR_GNUPG_PROCESS (user_data)); + return FALSE; /* Don't run this callback again */ +} + +static void +run_async_ready_callback_later (GcrGnupgProcess *self) +{ + g_debug ("running async callback later"); + g_idle_add_full (G_PRIORITY_DEFAULT, on_run_async_ready_callback_later, + g_object_ref (self), g_object_unref); +} + +static void +complete_run_process (GcrGnupgProcess *self) +{ + g_return_if_fail (self->pv->running); + g_return_if_fail (!self->pv->complete); + + self->pv->running = FALSE; + self->pv->complete = TRUE; + + if (self->pv->error == NULL) { + g_debug ("completed process"); + } else { + g_debug ("completed process with error: %s", + self->pv->error->message); + } +} + +static void +complete_source_is_done (GnupgSource *gnupg_source) +{ + GcrGnupgProcess *self = gnupg_source->process; + + g_debug ("all fds closed and process exited, completing"); + + g_assert (gnupg_source->child_sig == 0); + + if (gnupg_source->cancel_sig) { + g_signal_handler_disconnect (gnupg_source->cancellable, gnupg_source->cancel_sig); + gnupg_source->cancel_sig = 0; + } + + g_clear_object (&gnupg_source->cancellable); + + complete_run_process (self); + run_async_ready_callback (self); + + /* All done, the source can go away now */ + g_source_unref ((GSource*)gnupg_source); +} + +static void +close_fd (int *fd) +{ + g_assert (fd); + if (*fd >= 0) { + g_debug ("closing fd: %d", *fd); + close (*fd); + } + *fd = -1; +} + +static void +close_poll (GSource *source, GPollFD *poll) +{ + g_source_remove_poll (source, poll); + close_fd (&poll->fd); + poll->revents = 0; +} + +static gboolean +unused_callback (gpointer data) +{ + /* Never called */ + g_assert_not_reached (); + return FALSE; +} + +static gboolean +on_gnupg_source_prepare (GSource *source, gint *timeout_) +{ + GnupgSource *gnupg_source = (GnupgSource*)source; + gint i; + + for (i = 0; i < NUM_FDS; ++i) { + if (gnupg_source->polls[i].fd >= 0) + return FALSE; + } + + /* If none of the FDs are valid, then process immediately */ + return TRUE; +} + +static gboolean +on_gnupg_source_check (GSource *source) +{ + GnupgSource *gnupg_source = (GnupgSource*)source; + gint i; + + for (i = 0; i < NUM_FDS; ++i) { + if (gnupg_source->polls[i].fd >= 0 && gnupg_source->polls[i].revents != 0) + return TRUE; + } + return FALSE; +} + +static void +on_gnupg_source_finalize (GSource *source) +{ + GnupgSource *gnupg_source = (GnupgSource*)source; + gint i; + + g_assert (gnupg_source->cancellable == NULL); + g_assert (gnupg_source->cancel_sig == 0); + + for (i = 0; i < NUM_FDS; ++i) + close_fd (&gnupg_source->polls[i].fd); + + g_object_unref (gnupg_source->process); + if (gnupg_source->input_buf) + g_byte_array_free (gnupg_source->input_buf, TRUE); + g_string_free (gnupg_source->error_buf, TRUE); + g_string_free (gnupg_source->status_buf, TRUE); + + g_assert (!gnupg_source->child_pid); + g_assert (!gnupg_source->child_sig); +} + +static gboolean +read_output (int fd, GByteArray *buffer) +{ + guchar block[1024]; + gssize result; + + g_return_val_if_fail (fd >= 0, FALSE); + + do { + result = read (fd, block, sizeof (block)); + if (result < 0) { + if (errno == EINTR || errno == EAGAIN) + continue; + return FALSE; + } else { + g_byte_array_append (buffer, block, result); + } + } while (result == sizeof (block)); + + return TRUE; +} + +static gboolean +write_input (int fd, GByteArray *buffer) +{ + gssize result; + + g_return_val_if_fail (fd >= 0, FALSE); + + for (;;) { + result = write (fd, buffer->data, buffer->len); + if (result < 0) { + if (errno == EINTR || errno == EAGAIN) + continue; + return FALSE; + } else { + g_byte_array_remove_range (buffer, 0, result); + return TRUE; + } + } +} + +static void +emit_status_for_each_line (const gchar *line, gpointer user_data) +{ + GcrRecord *record; + + if (g_str_has_prefix (line, "[GNUPG:] ")) { + g_debug ("received status line: %s", line); + line += 9; + } else { + g_message ("gnupg status record was not prefixed appropriately: %s", line); + return; + } + + record = _gcr_record_parse_spaces (line, -1); + if (!record) { + g_message ("couldn't parse status record: %s", line); + return; + } + + g_signal_emit (GCR_GNUPG_PROCESS (user_data), signals[STATUS_RECORD], 0, record); + _gcr_record_free (record); +} + +static void +emit_error_for_each_line (const gchar *line, gpointer user_data) +{ + g_debug ("received error line: %s", line); + g_signal_emit (GCR_GNUPG_PROCESS (user_data), signals[ERROR_LINE], 0, line); +} + +static gboolean +on_gnupg_source_input (GcrGnupgProcess *self, + GnupgSource *gnupg_source, + gint fd) +{ + gssize read; + + if (gnupg_source->input_buf == NULL || + gnupg_source->input_buf->len == 0) { + if (self->pv->input == NULL) + return FALSE; + if (!gnupg_source->input_buf) + gnupg_source->input_buf = g_byte_array_new (); + g_byte_array_set_size (gnupg_source->input_buf, 4096); + read = g_input_stream_read (self->pv->input, + gnupg_source->input_buf->data, + gnupg_source->input_buf->len, + gnupg_source->cancellable, NULL); + g_byte_array_set_size (gnupg_source->input_buf, read < 0 ? 0 : read); + if (read < 0) + return FALSE; + if (read == 0) + return FALSE; + } + + if (!write_input (fd, gnupg_source->input_buf)) { + g_warning ("couldn't write output data to gnupg process"); + return FALSE; + } + + return TRUE; +} + +static gboolean +on_gnupg_source_status (GcrGnupgProcess *self, + GnupgSource *gnupg_source, + gint fd) +{ + GByteArray *buffer = g_byte_array_new (); + gboolean result = TRUE; + + if (!read_output (fd, buffer)) { + g_warning ("couldn't read status data from gnupg process"); + result = FALSE; + } else { + g_string_append_len (gnupg_source->status_buf, (gchar*)buffer->data, buffer->len); + _gcr_util_parse_lines (gnupg_source->status_buf, buffer->len == 0, + emit_status_for_each_line, self); + } + + g_byte_array_unref (buffer); + return result; +} + +static gboolean +on_gnupg_source_attribute (GcrGnupgProcess *self, + GnupgSource *gnupg_source, + gint fd) +{ + GByteArray *buffer = g_byte_array_new (); + gboolean result = TRUE; + + if (!read_output (fd, buffer)) { + g_warning ("couldn't read attribute data from gnupg process"); + result = FALSE; + } else if (buffer->len > 0) { + g_debug ("received %d bytes of attribute data", (gint)buffer->len); + if (self->pv->attributes != NULL) + g_output_stream_write_all (self->pv->attributes, buffer->data, + buffer->len, NULL, + gnupg_source->cancellable, NULL); + } + + g_byte_array_unref (buffer); + return result; +} + +static gboolean +on_gnupg_source_output (GcrGnupgProcess *self, + GnupgSource *gnupg_source, + gint fd) +{ + GByteArray *buffer = g_byte_array_new (); + gboolean result = TRUE; + + if (!read_output (fd, buffer)) { + g_warning ("couldn't read output data from gnupg process"); + result = FALSE; + } else if (buffer->len > 0) { + g_debug ("received %d bytes of output data", (gint)buffer->len); + if (self->pv->output != NULL) + g_output_stream_write_all (self->pv->output, buffer->data, buffer->len, + NULL, gnupg_source->cancellable, NULL); + } + + g_byte_array_unref (buffer); + return result; +} + +static gboolean +on_gnupg_source_error (GcrGnupgProcess *self, + GnupgSource *gnupg_source, + gint fd, + gboolean last) +{ + GByteArray *buffer = g_byte_array_new (); + gboolean result = TRUE; + + if (!read_output (fd, buffer)) { + g_warning ("couldn't read error data from gnupg process"); + result = FALSE; + } else { + g_string_append_len (gnupg_source->error_buf, (gchar*)buffer->data, buffer->len); + _gcr_util_parse_lines (gnupg_source->error_buf, last, + emit_error_for_each_line, gnupg_source->process); + } + + g_byte_array_unref (buffer); + return result; +} + +static gboolean +on_gnupg_source_dispatch (GSource *source, GSourceFunc unused, gpointer user_data) +{ + GnupgSource *gnupg_source = (GnupgSource*)source; + GcrGnupgProcess *self = gnupg_source->process; + GPollFD *poll; + guint i; + + /* Standard input, no support yet */ + poll = &gnupg_source->polls[FD_INPUT]; + if (poll->fd >= 0) { + if (poll->revents & G_IO_OUT) + if (!on_gnupg_source_input (self, gnupg_source, poll->fd)) + poll->revents |= G_IO_HUP; + if (poll->revents & G_IO_HUP) + close_poll (source, poll); + poll->revents = 0; + } + + /* Status output */ + poll = &gnupg_source->polls[FD_STATUS]; + if (poll->fd >= 0) { + if (poll->revents & G_IO_IN) + if (!on_gnupg_source_status (self, gnupg_source, poll->fd)) + poll->revents |= G_IO_HUP; + if (poll->revents & G_IO_HUP) + close_poll (source, poll); + poll->revents = 0; + } + + /* Attribute output */ + poll = &gnupg_source->polls[FD_ATTRIBUTE]; + if (poll->fd >= 0) { + if (poll->revents & G_IO_IN) + if (!on_gnupg_source_attribute (self, gnupg_source, poll->fd)) + poll->revents |= G_IO_HUP; + if (poll->revents & G_IO_HUP) + close_poll (source, poll); + poll->revents = 0; + } + + /* Standard output */ + poll = &gnupg_source->polls[FD_OUTPUT]; + if (poll->fd >= 0) { + if (poll->revents & G_IO_IN) + if (!on_gnupg_source_output (self, gnupg_source, poll->fd)) + poll->revents |= G_IO_HUP; + if (poll->revents & G_IO_HUP) + close_poll (source, poll); + poll->revents = 0; + } + + /* Standard error */ + poll = &gnupg_source->polls[FD_ERROR]; + if (poll->fd >= 0) { + if (poll->revents & G_IO_IN) + if (!on_gnupg_source_error (self, gnupg_source, poll->fd, + (poll->revents & G_IO_HUP) ? TRUE : FALSE)) + poll->revents |= G_IO_HUP; + if (poll->revents & G_IO_HUP) + close_poll (source, poll); + poll->revents = 0; + } + + for (i = 0; i < NUM_FDS; ++i) { + if (gnupg_source->polls[i].fd >= 0) + return TRUE; + } + + /* Because we return below */ + self->pv->source_sig = 0; + + if (!gnupg_source->child_pid) + complete_source_is_done (gnupg_source); + + return FALSE; /* Disconnect this source */ +} + +static GSourceFuncs gnupg_source_funcs = { + on_gnupg_source_prepare, + on_gnupg_source_check, + on_gnupg_source_dispatch, + on_gnupg_source_finalize, +}; + +static void +on_gnupg_process_child_exited (GPid pid, gint status, gpointer user_data) +{ + GnupgSource *gnupg_source = user_data; + GcrGnupgProcess *self = gnupg_source->process; + GError *error = NULL; + gint code; + guint i; + + g_debug ("process exited: %d", (int)pid); + + g_spawn_close_pid (gnupg_source->child_pid); + gnupg_source->child_pid = 0; + gnupg_source->child_sig = 0; + + if (WIFEXITED (status)) { + code = WEXITSTATUS (status); + if (code != 0) { + error = g_error_new (G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Gnupg process exited with code: %d"), code); + } + } else if (WIFSIGNALED (status)) { + code = WTERMSIG (status); + /* Ignore cases where we've signaled the process because we were cancelled */ + if (!g_error_matches (self->pv->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + error = g_error_new (G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Gnupg process was terminated with signal: %d"), code); + } + + /* Take this as the async result error */ + if (error && !self->pv->error) { + g_debug ("%s", error->message); + self->pv->error = error; + + /* Already have an error, just print out message */ + } else if (error) { + g_warning ("%s", error->message); + g_error_free (error); + } + + for (i = 0; i < NUM_FDS; ++i) { + if (gnupg_source->polls[i].fd >= 0) + return; + } + + complete_source_is_done (gnupg_source); +} + +static void +on_gnupg_process_child_setup (gpointer user_data) +{ + int *child_fds = user_data; + long val; + guint i; + + /* + * Clear close-on-exec flag for these file descriptors, so that + * gnupg can write to them + */ + + for (i = 0; i < NUM_FDS; i++) { + if (child_fds[i] >= 0) { + val = fcntl (child_fds[i], F_GETFD); + fcntl (child_fds[i], F_SETFD, val & ~FD_CLOEXEC); + } + } +} + +static void +on_cancellable_cancelled (GCancellable *cancellable, gpointer user_data) +{ + GnupgSource *gnupg_source = user_data; + + g_assert (gnupg_source->process); + + g_debug ("process cancelled"); + + /* Set an error, which is respected when this actually completes. */ + if (gnupg_source->process->pv->error == NULL) + gnupg_source->process->pv->error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("The operation was cancelled")); + + /* Try and kill the child process */ + if (gnupg_source->child_pid) { + g_debug ("sending term signal to process: %d", + (int)gnupg_source->child_pid); + kill (gnupg_source->child_pid, SIGTERM); + } +} + +/** + * _gcr_gnupg_process_run_async: + * @self: The process + * @argv: (array zero-terminated=1): The arguments for the process, not including executable, terminated with %NULL. + * @envp: (allow-none) (array zero-terminated=1): The environment for new process, terminated with %NULL. + * @flags: Flags for starting the process. + * @cancellable: (allow-none): Cancellation object + * @callback: Will be called when operation completes. + * @user_data: (closure): Data passed to callback. + * + * Run the gpg process. Only one 'run' operation can run per GcrGnupgProcess + * object. The GcrGnupgProcess:output_data and GcrGnupgProcess:error_line + * signals will be emitted when data is received from the gpg process. + * + * Unless the %GCR_GNUPG_PROCESS_RESPECT_LOCALE flag is specified, the process + * will be run in the 'C' locale. If the %GCR_GNUPG_PROCESS_WITH_STATUS or + * %GCR_GNUPG_PROCESS_WITH_ATTRIBUTES flags are set, then the gpg process + * will be status and attribute output respectively. The + * GcrGnupgProcess:status_record and GcrGnupgProcess:attribute_data signals + * will provide this data. + */ +void +_gcr_gnupg_process_run_async (GcrGnupgProcess *self, const gchar **argv, const gchar **envp, + GcrGnupgProcessFlags flags, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GError *error = NULL; + GPtrArray *args; + GPtrArray *envs; + int child_fds[NUM_FDS]; + int status_fds[2] = { -1, -1 }; + int attribute_fds[2] = { -1, -1 }; + int output_fd = -1; + int error_fd = -1; + int input_fd = -1; + GnupgSource *gnupg_source; + GSource *source; + GPid pid; + guint i; + + g_return_if_fail (GCR_IS_GNUPG_PROCESS (self)); + g_return_if_fail (argv); + g_return_if_fail (callback); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + g_return_if_fail (self->pv->running == FALSE); + g_return_if_fail (self->pv->complete == FALSE); + g_return_if_fail (self->pv->executable); + + self->pv->async_callback = callback; + self->pv->user_data = user_data; + + for (i = 0; i < NUM_FDS; i++) + child_fds[i] = -1; + + /* The command needs to be updated with these status and attribute fds */ + args = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (args, g_strdup (self->pv->executable)); + + /* Spawn/child will close all other attributes, besides thesthose in child_fds */ + child_fds[FD_INPUT] = 0; + child_fds[FD_OUTPUT] = 1; + child_fds[FD_ERROR] = 2; + + if (flags & GCR_GNUPG_PROCESS_WITH_STATUS) { + if (pipe (status_fds) < 0) + g_return_if_reached (); + child_fds[FD_STATUS] = status_fds[1]; + g_ptr_array_add (args, g_strdup ("--status-fd")); + g_ptr_array_add (args, g_strdup_printf ("%d", child_fds[FD_STATUS])); + } + if (flags & GCR_GNUPG_PROCESS_WITH_ATTRIBUTES) { + if (pipe (attribute_fds) < 0) + g_return_if_reached (); + child_fds[FD_ATTRIBUTE] = attribute_fds[1]; + g_ptr_array_add (args, g_strdup ("--attribute-fd")); + g_ptr_array_add (args, g_strdup_printf ("%d", child_fds[FD_ATTRIBUTE])); + } + + if (self->pv->directory) { + g_ptr_array_add (args, g_strdup ("--homedir")); + g_ptr_array_add (args, g_strdup (self->pv->directory)); + } + + /* All the remaining arguments */ + for (i = 0; argv[i] != NULL; i++) + g_ptr_array_add (args, g_strdup (argv[i])); + g_ptr_array_add (args, NULL); + + envs = g_ptr_array_new (); + for (i = 0; envp && envp[i] != NULL; i++) { + if (flags & GCR_GNUPG_PROCESS_RESPECT_LOCALE || + !g_str_has_prefix (envp[i], "LOCALE=")) + g_ptr_array_add (envs, (gpointer)envp[i]); + } + if (!(flags & GCR_GNUPG_PROCESS_RESPECT_LOCALE)) + g_ptr_array_add (envs, (gpointer)"LOCALE=C"); + g_ptr_array_add (envs, NULL); + + gchar *command = g_strjoinv (" ", (gchar**)args->pdata); + gchar *environ = g_strjoinv (", ", (gchar**)envs->pdata); + g_debug ("running command: %s", command); + g_debug ("process environment: %s", environ); + g_free (command); + g_free (environ); + + g_spawn_async_with_pipes (self->pv->directory, (gchar**)args->pdata, + (gchar**)envs->pdata, G_SPAWN_DO_NOT_REAP_CHILD, + on_gnupg_process_child_setup, child_fds, + &pid, &input_fd, &output_fd, &error_fd, &error); + + g_ptr_array_free (args, TRUE); + g_ptr_array_free (envs, TRUE); + + /* Close 'wrong' ends of extra file descriptors */ + close_fd (&(status_fds[1])); + close_fd (&(attribute_fds[1])); + + self->pv->complete = FALSE; + self->pv->running = TRUE; + + if (error) { + close_fd (&(status_fds[0])); + close_fd (&(attribute_fds[0])); + g_assert (!self->pv->error); + self->pv->error = error; + complete_run_process (self); + run_async_ready_callback_later (self); + return; + } + + g_debug ("process started: %d", (int)pid); + + source = g_source_new (&gnupg_source_funcs, sizeof (GnupgSource)); + + /* Initialize the source */ + gnupg_source = (GnupgSource*)source; + for (i = 0; i < NUM_FDS; i++) + gnupg_source->polls[i].fd = -1; + gnupg_source->error_buf = g_string_sized_new (128); + gnupg_source->status_buf = g_string_sized_new (128); + gnupg_source->process = g_object_ref (self); + gnupg_source->child_pid = pid; + + gnupg_source->polls[FD_INPUT].fd = input_fd; + if (input_fd >= 0) { + gnupg_source->polls[FD_INPUT].events = G_IO_HUP | G_IO_OUT; + g_source_add_poll (source, &gnupg_source->polls[FD_INPUT]); + } + gnupg_source->polls[FD_OUTPUT].fd = output_fd; + if (output_fd >= 0) { + gnupg_source->polls[FD_OUTPUT].events = G_IO_HUP | G_IO_IN; + g_source_add_poll (source, &gnupg_source->polls[FD_OUTPUT]); + } + gnupg_source->polls[FD_ERROR].fd = error_fd; + if (error_fd >= 0) { + gnupg_source->polls[FD_ERROR].events = G_IO_HUP | G_IO_IN; + g_source_add_poll (source, &gnupg_source->polls[FD_ERROR]); + } + gnupg_source->polls[FD_STATUS].fd = status_fds[0]; + if (status_fds[0] >= 0) { + gnupg_source->polls[FD_STATUS].events = G_IO_HUP | G_IO_IN; + g_source_add_poll (source, &gnupg_source->polls[FD_STATUS]); + } + gnupg_source->polls[FD_ATTRIBUTE].fd = attribute_fds[0]; + if (attribute_fds[0] >= 0) { + gnupg_source->polls[FD_ATTRIBUTE].events = G_IO_HUP | G_IO_IN; + g_source_add_poll (source, &gnupg_source->polls[FD_ATTRIBUTE]); + } + + if (cancellable) { + gnupg_source->cancellable = g_object_ref (cancellable); + gnupg_source->cancel_sig = g_cancellable_connect (cancellable, + G_CALLBACK (on_cancellable_cancelled), + g_source_ref (source), + (GDestroyNotify)g_source_unref); + } + + g_assert (self->pv->source_sig == 0); + g_source_set_callback (source, unused_callback, NULL, NULL); + self->pv->source_sig = g_source_attach (source, g_main_context_default ()); + + /* This assumes the outstanding reference to source */ + g_assert (gnupg_source->child_sig == 0); + gnupg_source->child_sig = g_child_watch_add_full (G_PRIORITY_DEFAULT, pid, + on_gnupg_process_child_exited, + g_source_ref (source), + (GDestroyNotify)g_source_unref); + + /* source is unreffed in complete_if_source_is_done() */ +} + +/** + * _gcr_gnupg_process_run_finish: + * @self: The process + * @result: The result passed to the callback + * @error: Location to raise an error on failure. + * + * Get the result of running a gnupg process. + * + * Return value: Whether the Gnupg process was run or not. + */ +gboolean +_gcr_gnupg_process_run_finish (GcrGnupgProcess *self, GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GCR_IS_GNUPG_PROCESS (self), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + g_return_val_if_fail (G_ASYNC_RESULT (self) == result, FALSE); + g_return_val_if_fail (self->pv->complete, FALSE); + + /* This allows the process to run again... */ + self->pv->complete = FALSE; + + g_assert (!self->pv->running); + g_assert (!self->pv->async_callback); + g_assert (!self->pv->user_data); + + if (self->pv->error) { + g_propagate_error (error, self->pv->error); + self->pv->error = NULL; + return FALSE; + } + + return TRUE; +} diff --git a/gcr/gcr-gnupg-process.h b/gcr/gcr-gnupg-process.h new file mode 100644 index 0000000..4fab849 --- /dev/null +++ b/gcr/gcr-gnupg-process.h @@ -0,0 +1,101 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_GNUPG_PROCESS_H +#define GCR_GNUPG_PROCESS_H + +#include "gcr-record.h" + +#include +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_GNUPG_PROCESS (_gcr_gnupg_process_get_type ()) +#define GCR_GNUPG_PROCESS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_PROCESS, GcrGnupgProcess)) +#define GCR_GNUPG_PROCESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_PROCESS, GcrGnupgProcessClass)) +#define GCR_IS_GNUPG_PROCESS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_PROCESS)) +#define GCR_IS_GNUPG_PROCESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_PROCESS)) +#define GCR_GNUPG_PROCESS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_PROCESS, GcrGnupgProcessClass)) + +typedef struct _GcrGnupgProcess GcrGnupgProcess; +typedef struct _GcrGnupgProcessClass GcrGnupgProcessClass; +typedef struct _GcrGnupgProcessPrivate GcrGnupgProcessPrivate; + +struct _GcrGnupgProcess { + /*< private >*/ + GObject parent; + GcrGnupgProcessPrivate *pv; +}; + +struct _GcrGnupgProcessClass { + GObjectClass parent_class; + + /* signals */ + gboolean (*error_line) (GcrGnupgProcess *self, const gchar *line); + + gboolean (*status_record) (GcrGnupgProcess *self, GcrRecord *record); +}; + +typedef enum { + GCR_GNUPG_PROCESS_NONE = 0, + GCR_GNUPG_PROCESS_RESPECT_LOCALE = 1 << 0, + GCR_GNUPG_PROCESS_WITH_STATUS = 1 << 1, + GCR_GNUPG_PROCESS_WITH_ATTRIBUTES = 1 << 2 +} GcrGnupgProcessFlags; + +GType _gcr_gnupg_process_get_type (void) G_GNUC_CONST; + +GcrGnupgProcess* _gcr_gnupg_process_new (const gchar *directory, + const gchar *executable); + +const gchar * _gcr_gnupg_process_get_directory (GcrGnupgProcess *self); + +GInputStream * _gcr_gnupg_process_get_input_stream (GcrGnupgProcess *self); + +void _gcr_gnupg_process_set_input_stream (GcrGnupgProcess *self, + GInputStream *input); + +GOutputStream * _gcr_gnupg_process_get_output_stream (GcrGnupgProcess *self); + +void _gcr_gnupg_process_set_output_stream (GcrGnupgProcess *self, + GOutputStream *output); + +GOutputStream * _gcr_gnupg_process_get_attribute_stream (GcrGnupgProcess *self); + +void _gcr_gnupg_process_set_attribute_stream (GcrGnupgProcess *self, + GOutputStream *output); + +void _gcr_gnupg_process_run_async (GcrGnupgProcess *self, + const gchar **argv, + const gchar **envp, + GcrGnupgProcessFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean _gcr_gnupg_process_run_finish (GcrGnupgProcess *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* GCR_GNUPG_PROCESS_H */ diff --git a/gcr/gcr-gnupg-records.c b/gcr/gcr-gnupg-records.c new file mode 100644 index 0000000..f8ee6bb --- /dev/null +++ b/gcr/gcr-gnupg-records.c @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-gnupg-records.h" +#include "gcr-record.h" +#include "gcr-memory-icon.h" + +#include "gck/gck.h" + +#include + +/* Copied from GPGME */ +gboolean +_gcr_gnupg_records_parse_user_id (const gchar *user_id, + gchar **rname, + gchar **remail, + gchar **rcomment) +{ + gchar *src, *tail, *x; + int in_name = 0; + int in_email = 0; + int in_comment = 0; + gboolean anything; + const gchar *name = NULL; + const gchar *email = NULL; + const gchar *comment = NULL; + + x = tail = src = g_strdup (user_id); + + while (*src) { + if (in_email) { + /* Not legal but anyway. */ + if (*src == '<') + in_email++; + else if (*src == '>') { + if (!--in_email && !email) { + email = tail; + *src = 0; + tail = src + 1; + } + } + } else if (in_comment) { + if (*src == '(') + in_comment++; + else if (*src == ')') { + if (!--in_comment && !comment) { + comment = tail; + *src = 0; + tail = src + 1; + } + } + } else if (*src == '<') { + if (in_name) { + if (!name) { + name = tail; + *src = 0; + tail = src + 1; + } + in_name = 0; + } else + tail = src + 1; + + in_email = 1; + } else if (*src == '(') { + if (in_name) { + if (!name) { + name = tail; + *src = 0; + tail = src + 1; + } + in_name = 0; + } + in_comment = 1; + } else if (!in_name && *src != ' ' && *src != '\t') { + in_name = 1; + } + src++; + } + + if (in_name) { + if (!name) { + name = tail; + *src = 0; + } + } + + anything = FALSE; + + if (rname) { + *rname = g_strdup (name); + if (name) { + g_strstrip (*rname); + anything = TRUE; + } + } + + if (remail) { + *remail = g_strdup (email); + if (email) { + g_strstrip (*remail); + anything = TRUE; + } + } + + if (rcomment) { + *rcomment = g_strdup (comment); + if (comment) { + g_strstrip (*rcomment); + anything = TRUE; + } + } + + g_free (x); + return anything; +} + +const gchar * +_gcr_gnupg_records_get_keyid (GPtrArray *records) +{ + GcrRecord *record; + + record = _gcr_records_find (records, GCR_RECORD_SCHEMA_PUB); + if (record != NULL) + return _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID); + record = _gcr_records_find (records, GCR_RECORD_SCHEMA_SEC); + if (record != NULL) + return _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID); + return NULL; +} + +const gchar * +_gcr_gnupg_records_get_short_keyid (GPtrArray *records) +{ + const gchar *keyid; + gsize length; + + keyid = _gcr_gnupg_records_get_keyid (records); + if (keyid == NULL) + return NULL; + + length = strlen (keyid); + if (length > 8) + keyid += (length - 8); + + return keyid; +} + +gchar * +_gcr_gnupg_records_get_user_id (GPtrArray *records) +{ + GcrRecord *record; + + record = _gcr_records_find (records, GCR_RECORD_SCHEMA_UID); + if (record != NULL) + return _gcr_record_get_string (record, GCR_RECORD_UID_USERID); + return NULL; +} + +const gchar * +_gcr_gnupg_records_get_fingerprint (GPtrArray *records) +{ + GcrRecord *record; + + record = _gcr_records_find (records, GCR_RECORD_SCHEMA_FPR); + if (record != NULL) + return _gcr_record_get_raw (record, GCR_RECORD_FPR_FINGERPRINT); + return NULL; +} + +#define TYPE_IMAGE 0x01 +#define IMAGE_HEADER_LEN 0x10 +#define IMAGE_JPEG_SIG "\x10\x00\x01\x01" +#define IMAGE_JPEG_SIG_LEN 4 + +static void +add_emblem_to_icon (GIcon **icon, + const gchar *emblem_name) +{ + GIcon *emblem_icon; + GIcon *result; + GEmblem *emblem; + + emblem_icon = g_themed_icon_new (emblem_name); + emblem = g_emblem_new_with_origin (emblem_icon, G_EMBLEM_ORIGIN_LIVEMETADATA); + result = g_emblemed_icon_new (*icon, emblem); + g_object_unref (*icon); + *icon = result; + g_object_unref (emblem); + g_object_unref (emblem_icon); +} + +GIcon * +_gcr_gnupg_records_get_icon (GPtrArray *records) +{ + GcrRecord *record; + gchar validity; + guchar *data; + gsize n_data; + guint type; + GIcon *icon; + guint i; + + for (i = 0; i < records->len; i++) { + record = records->pdata[i]; + if (GCR_RECORD_SCHEMA_XA1 != _gcr_record_get_schema (record)) + continue; + if (!_gcr_record_get_uint (record, GCR_RECORD_XA1_TYPE, &type)) + continue; + if (type != TYPE_IMAGE) + continue; + + data = _gcr_record_get_base64 (record, GCR_RECORD_XA1_DATA, &n_data); + g_return_val_if_fail (data != NULL, NULL); + + /* Header is 16 bytes long */ + if (n_data <= IMAGE_HEADER_LEN) { + g_free (data); + continue; + } + + /* These are the header bytes. See gnupg doc/DETAILS */ + g_assert (IMAGE_JPEG_SIG_LEN < IMAGE_HEADER_LEN); + if (memcmp (data, IMAGE_JPEG_SIG, IMAGE_JPEG_SIG_LEN) != 0) { + g_free (data); + continue; + } + + icon = G_ICON (_gcr_memory_icon_new_full ("image/jpeg", data, + n_data, IMAGE_HEADER_LEN, + g_free)); + + validity = _gcr_record_get_char (record, GCR_RECORD_XA1_TRUST); + if (validity != 0 && validity != 'm' && validity != 'f' && validity != 'u') + add_emblem_to_icon (&icon, "dialog-question"); + + /* We have a valid header */ + return icon; + } + + if (_gcr_records_find (records, GCR_RECORD_SCHEMA_SEC)) + return g_themed_icon_new ("gcr-key-pair"); + else + return g_themed_icon_new ("gcr-key"); + + return NULL; +} diff --git a/gcr/gcr-gnupg-records.h b/gcr/gcr-gnupg-records.h new file mode 100644 index 0000000..4f4e673 --- /dev/null +++ b/gcr/gcr-gnupg-records.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef GCR_GNUPG_RECORDS_H +#define GCR_GNUPG_RECORDS_H + +#include + +#include "gcr-record.h" + +G_BEGIN_DECLS + +const gchar * _gcr_gnupg_records_get_keyid (GPtrArray *records); + +const gchar * _gcr_gnupg_records_get_short_keyid (GPtrArray *records); + +const gchar * _gcr_gnupg_records_get_fingerprint (GPtrArray *records); + +gchar * _gcr_gnupg_records_get_user_id (GPtrArray *records); + +gboolean _gcr_gnupg_records_parse_user_id (const gchar *user_id, + gchar **name, + gchar **email, + gchar **comment); + +GIcon * _gcr_gnupg_records_get_icon (GPtrArray *records); + +G_END_DECLS + +#endif /* __GCR_GNUPG_RECORD_H__ */ diff --git a/gcr/gcr-gnupg-util.c b/gcr/gcr-gnupg-util.c new file mode 100644 index 0000000..687108d --- /dev/null +++ b/gcr/gcr-gnupg-util.c @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "egg/egg-hex.h" + +#include "gcr-gnupg-util.h" + +#include + +/** + * _gcr_gnupg_build_xa1_record: + * @meta: Status metadata record about the attribute data. + * @attribute: Pointer to attribute data. + * @n_attribute: Length of attribute data. + * + * Build a record for attribute data. We use this records to convert attribute + * data into something we can keep with an array of GcrRecord. + * + * Returns: (transfer full): The newly allocated record. + */ +GcrRecord* +_gcr_gnupg_build_xa1_record (GcrRecord *meta, gpointer attribute, + gsize n_attribute) +{ + gchar hash[20]; + gchar *hex; + gchar status = 0; + GcrRecord *record; + guint flags, type; + const gchar *created, *expiry; + + g_return_val_if_fail (meta, NULL); + + record = _gcr_record_new (GCR_RECORD_SCHEMA_XA1, GCR_RECORD_XA1_MAX, ':'); + + gcry_md_hash_buffer (GCRY_MD_RMD160, hash, attribute, n_attribute); + hex = egg_hex_encode_full (hash, sizeof (hash), TRUE, NULL, 1); + _gcr_record_take_raw (record, GCR_RECORD_XA1_FINGERPRINT, hex); + + if (!_gcr_record_get_uint (meta, GCR_RECORD_ATTRIBUTE_FLAGS, &flags)) + flags = 0; + + if (_gcr_record_get_uint (meta, GCR_RECORD_ATTRIBUTE_TYPE, &type)) + _gcr_record_set_uint (record, GCR_RECORD_XA1_TYPE, type); + + created = _gcr_record_get_raw (meta, GCR_RECORD_ATTRIBUTE_TIMESTAMP); + if (created == NULL) + _gcr_record_set_raw (record, GCR_RECORD_XA1_TIMESTAMP, created); + + expiry = _gcr_record_get_raw (meta, GCR_RECORD_ATTRIBUTE_EXPIRY); + if (expiry != NULL) + _gcr_record_set_raw (record, GCR_RECORD_XA1_EXPIRY, expiry); + + /* These values are from gnupg doc/DETAILS */ + if (flags & 0x02) + status = 'r'; + else if (flags & 0x04) + status = 'e'; + else if (flags & 0x01) + status = 'P'; + if (status != 0) + _gcr_record_set_char (record, GCR_RECORD_XA1_TRUST, status); + + _gcr_record_set_base64 (record, GCR_RECORD_XA1_DATA, attribute, n_attribute); + + return record; +} diff --git a/gcr/gcr-gnupg-util.h b/gcr/gcr-gnupg-util.h new file mode 100644 index 0000000..300cda8 --- /dev/null +++ b/gcr/gcr-gnupg-util.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_GNUPG_UTIL_H +#define GCR_GNUPG_UTIL_H + +#include + +#include "gcr-record.h" + +G_BEGIN_DECLS + +GcrRecord* _gcr_gnupg_build_xa1_record (GcrRecord *meta, + gpointer attribute, + gsize n_attribute); + +G_END_DECLS + +#endif /* __GCR_GNUPG_KEY_H__ */ diff --git a/gcr/gcr-icons.c b/gcr/gcr-icons.c new file mode 100644 index 0000000..7183c70 --- /dev/null +++ b/gcr/gcr-icons.c @@ -0,0 +1,64 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-icons.h" + +#define ICON_SYSTEM "applications-system" +#define ICON_FOLDER "folder" + +/** + * gcr_icon_for_token: + * @token_info: the token info + * + * Get an appropriate icon for the token + * + * Returns: (transfer full): the icon + */ +GIcon * +gcr_icon_for_token (GckTokenInfo *token_info) +{ + GIcon *icon; + + g_return_val_if_fail (token_info != NULL, NULL); + + if (g_strcmp0 (token_info->manufacturer_id, "Gnome Keyring") == 0) { + icon = g_themed_icon_new (GCR_ICON_HOME_DIRECTORY); + + } else if (g_strcmp0 (token_info->model, "p11-kit-trust") == 0) { + if (g_strcmp0 (token_info->label, "Default Trust") == 0 || + g_strcmp0 (token_info->label, "System Trust") == 0) { + icon = g_themed_icon_new (ICON_SYSTEM); + } else { + icon = g_themed_icon_new (ICON_FOLDER); + } + + } else if (g_strcmp0 (token_info->manufacturer_id, "Mozilla Foundation") == 0 && + g_strcmp0 (token_info->model, "NSS 3") == 0) { + icon = g_themed_icon_new (GCR_ICON_HOME_DIRECTORY); + + } else { + icon = g_themed_icon_new (GCR_ICON_SMART_CARD); + } + + return icon; +} diff --git a/gcr/gcr-icons.h b/gcr/gcr-icons.h new file mode 100644 index 0000000..f4b981a --- /dev/null +++ b/gcr/gcr-icons.h @@ -0,0 +1,46 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * Copyright (C) 2011 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_ICONS_H__ +#define __GCR_ICONS_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GCR_ICON_CERTIFICATE "application-certificate" +#define GCR_ICON_PASSWORD "gcr-password" +#define GCR_ICON_GNUPG "gcr-gnupg" +#define GCR_ICON_KEY "gcr-key" +#define GCR_ICON_KEY_PAIR "gcr-key-pair" +#define GCR_ICON_SMART_CARD "gcr-smart-card" +#define GCR_ICON_HOME_DIRECTORY "user-home" + +GIcon * gcr_icon_for_token (GckTokenInfo *token_info); + +G_END_DECLS + +#endif /* __GCR_SMART_CARD_H__ */ diff --git a/gcr/gcr-import-interaction.c b/gcr/gcr-import-interaction.c new file mode 100644 index 0000000..c8e7585 --- /dev/null +++ b/gcr/gcr-import-interaction.c @@ -0,0 +1,192 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-import-interaction.h" + +/** + * SECTION:gcr-import-interaction + * @title: GcrImportInteraction + * @short_description: User interaction during importing + * + * This is an interface implemented by a caller performing an import. It allows + * the importer to ask the caller for further information about the import. + * + * It must be implemented on a derived class of #GTlsInteraction + */ + +/** + * GcrImportInteraction: + * + * Interface implemented by the caller performing an import. + */ + +/** + * GcrImportInteractionIface: + * @parent: parent interface + * @supplement_prep: method which prepares for supplementing the given attributes before import + * @supplement: method which synchronously supplements attributes before import + * @supplement_async: method which asynchronously supplements attributes before import + * @supplement_finish: method which completes @supplement_async + * + * Interface implemented by implementations of #GcrImportInteraction. + */ + +typedef GcrImportInteractionIface GcrImportInteractionInterface; + +G_DEFINE_INTERFACE (GcrImportInteraction, gcr_import_interaction, G_TYPE_TLS_INTERACTION); + +static void +gcr_import_interaction_default_init (GcrImportInteractionIface *iface) +{ + static volatile gsize initialized = 0; + + if (g_once_init_enter (&initialized)) { + g_once_init_leave (&initialized, 1); + } +} + +/** + * gcr_import_interaction_supplement_prep: + * @interaction: the interaction + * @builder: attributes to supplement + * + * Prepare for supplementing the given attributes before import. This means + * prompting the user for things like labels and the like. The attributes + * will contain attributes for values that the importer needs, either empty + * or prefilled with suggested values. + * + * This method does not prompt the user, but rather just prepares the + * interaction that these are the attributes that are needed. + */ +void +gcr_import_interaction_supplement_prep (GcrImportInteraction *interaction, + GckBuilder *builder) +{ + GcrImportInteractionIface *iface; + + g_return_if_fail (GCR_IS_IMPORT_INTERACTION (interaction)); + g_return_if_fail (builder != NULL); + + iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + if (iface->supplement != NULL) + (iface->supplement_prep) (interaction, builder); +} + +/** + * gcr_import_interaction_supplement: + * @interaction: the interaction + * @builder: supplemented attributes + * @cancellable: optional cancellable object + * @error: location to store error on failure + * + * Supplement attributes before import. This means prompting the user for + * things like labels and the like. The needed attributes will have been passed + * to gcr_import_interaction_supplement_prep(). + * + * This method prompts the user and fills in the attributes. If the user or + * cancellable cancels the operation the error should be set with %G_IO_ERROR_CANCELLED. + * + * Returns: %G_TLS_INTERACTION_HANDLED if successful or %G_TLS_INTERACTION_FAILED + */ +GTlsInteractionResult +gcr_import_interaction_supplement (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GError **error) +{ + GcrImportInteractionIface *iface; + + g_return_val_if_fail (GCR_IS_IMPORT_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (builder != NULL, G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED); + + iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + g_return_val_if_fail (iface->supplement != NULL, G_TLS_INTERACTION_UNHANDLED); + + return (iface->supplement) (interaction, builder, cancellable, error); +} + + +/** + * gcr_import_interaction_supplement_async: + * @interaction: the interaction + * @builder: supplemented attributes + * @cancellable: optional cancellable object + * @callback: called when the operation completes + * @user_data: data to be passed to the callback + * + * Asynchronously supplement attributes before import. This means prompting the + * user for things like labels and the like. The needed attributes will have + * been passed to gcr_import_interaction_supplement_prep(). + * + * This method prompts the user and fills in the attributes. + */ +void +gcr_import_interaction_supplement_async (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrImportInteractionIface *iface; + + g_return_if_fail (GCR_IS_IMPORT_INTERACTION (interaction)); + g_return_if_fail (builder != NULL); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + g_return_if_fail (iface->supplement != NULL); + + (iface->supplement_async) (interaction, builder, cancellable, callback, user_data); +} + +/** + * gcr_import_interaction_supplement_finish: + * @interaction: the interaction + * @result: the asynchronous result + * @error: location to place an error on failure + * + * Complete operation to asynchronously supplement attributes before import. + * + * If the user or cancellable cancels the operation the error should be set + * with %G_IO_ERROR_CANCELLED. + * + * Returns: %G_TLS_INTERACTION_HANDLED if successful or %G_TLS_INTERACTION_FAILED + */ +GTlsInteractionResult +gcr_import_interaction_supplement_finish (GcrImportInteraction *interaction, + GAsyncResult *result, + GError **error) +{ + GcrImportInteractionIface *iface; + + g_return_val_if_fail (GCR_IS_IMPORT_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED); + + iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + g_return_val_if_fail (iface->supplement != NULL, G_TLS_INTERACTION_UNHANDLED); + + return (iface->supplement_finish) (interaction, result, error); +} diff --git a/gcr/gcr-import-interaction.h b/gcr/gcr-import-interaction.h new file mode 100644 index 0000000..79d615b --- /dev/null +++ b/gcr/gcr-import-interaction.h @@ -0,0 +1,92 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_IMPORT_INTERACTION_H__ +#define __GCR_IMPORT_INTERACTION_H__ + +#include "gcr-importer.h" + +#include + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_IMPORT_INTERACTION (gcr_import_interaction_get_type ()) +#define GCR_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORT_INTERACTION, GcrImportInteraction)) +#define GCR_IS_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORT_INTERACTION)) +#define GCR_IMPORT_INTERACTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_IMPORT_INTERACTION, GcrImportInteractionIface)) + +typedef struct _GcrImportInteraction GcrImportInteraction; +typedef struct _GcrImportInteractionIface GcrImportInteractionIface; + +struct _GcrImportInteractionIface { + GTypeInterface parent; + + void (*supplement_prep) (GcrImportInteraction *interaction, + GckBuilder *builder); + + GTlsInteractionResult (*supplement) (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GError **error); + + void (*supplement_async) (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GTlsInteractionResult (*supplement_finish) (GcrImportInteraction *interaction, + GAsyncResult *result, + GError **error); + + /*< private >*/ + gpointer reserved[6]; +}; + +GType gcr_import_interaction_get_type (void); + +void gcr_import_interaction_supplement_prep (GcrImportInteraction *interaction, + GckBuilder *builder); + +GTlsInteractionResult gcr_import_interaction_supplement (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GError **error); + +void gcr_import_interaction_supplement_async (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GTlsInteractionResult gcr_import_interaction_supplement_finish (GcrImportInteraction *interaction, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __GCR_IMPORT_INTERACTION_H__ */ diff --git a/gcr/gcr-importer.c b/gcr/gcr-importer.c new file mode 100644 index 0000000..ef029e1 --- /dev/null +++ b/gcr/gcr-importer.c @@ -0,0 +1,653 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-deprecated-base.h" +#include "gcr-importer.h" +#include "gcr-internal.h" +#include "gcr-gnupg-importer.h" +#include "gcr-parser.h" +#include "gcr-pkcs11-importer.h" + +#include "gcr/gcr-marshal.h" + +#include + +/** + * SECTION:gcr-importer + * @title: GcrImporter + * @short_description: Import certificates and keys + * + * An interface which allows importing of certificates and keys. Each + * #GcrImporter is registered with a set of PKCS\#11 attributes to match + * stuff that it can import. + * + * An importer gets passed a #GcrParser and accesses the currently parsed + * item. To create a set of importers that can import the currently parsed + * item in a #GcrParser, use gcr_importer_create_for_parsed(). The list of + * importers returned has the parsed item queued for import. + * + * To queue additional items with a importer use gcr_importer_queue_for_parsed(). + * In addition you can try and queue an additional item with a set of importers + * using the gcr_importer_queue_and_filter_for_parsed(). + * + * To start the import use gcr_importer_import() or the async variants. + */ + +/** + * GcrImporter: + * + * Imports certificates and keys + */ + +/** + * GcrImporterIface: + * @parent: parent interface + * @create_for_parsed: implementation of gcr_importer_create_for_parsed(), required + * @queue_for_parsed: implementation of gcr_importer_queue_for_parsed(), required + * @import_sync: optional implemantionon of gcr_importer_import() + * @import_async: implementation of gcr_importer_import_async(), required + * @import_finish: implementation of gcr_importer_import_finish() + * + * Interface implemented for a #GcrImporter. + */ + +typedef GcrImporterIface GcrImporterInterface; + +G_DEFINE_INTERFACE (GcrImporter, gcr_importer, G_TYPE_OBJECT); + +typedef struct _GcrRegistered { + GckAttributes *attrs; + GType importer_type; +} GcrRegistered; + +static GArray *registered_importers = NULL; +static gboolean registered_sorted = FALSE; + +static void +gcr_importer_default_init (GcrImporterIface *iface) +{ + static volatile gsize initialized = 0; + + if (g_once_init_enter (&initialized)) { + + /** + * GcrImporter:label: + * + * The label for the importer. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("label", "Label", "The label for the importer", + "", G_PARAM_READABLE)); + + /** + * GcrImporter:icon: + * + * The icon for the importer. + */ + g_object_interface_install_property (iface, + g_param_spec_object ("icon", "Icon", "The icon for the importer", + G_TYPE_ICON, G_PARAM_READABLE)); + + /** + * GcrImporter:interaction: + * + * The interaction for the importer. + */ + g_object_interface_install_property (iface, + g_param_spec_object ("interaction", "Interaction", + "Interaction for prompts", + G_TYPE_TLS_INTERACTION, G_PARAM_READWRITE)); + + /** + * GcrImporter:uri: + * + * The URI of the location imported to. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("uri", "URI", "URI of location", + NULL, G_PARAM_READABLE)); + + g_once_init_leave (&initialized, 1); + } +} + +/** + * gcr_importer_register: + * @importer_type: the GType of the importer being registered + * @attrs: the attributes that this importer is compatible with + * + * Register an importer to handle parsed items that match the given attributes. + * + * If @attrs are a floating reference, then it is consumed. + */ +void +gcr_importer_register (GType importer_type, + GckAttributes *attrs) +{ + GcrRegistered registered; + + if (!registered_importers) + registered_importers = g_array_new (FALSE, FALSE, sizeof (GcrRegistered)); + + registered.importer_type = importer_type; + registered.attrs = gck_attributes_ref_sink (attrs); + g_array_append_val (registered_importers, registered); + registered_sorted = FALSE; +} + +static gint +sort_registered_by_n_attrs (gconstpointer a, gconstpointer b) +{ + const GcrRegistered *ra = a; + const GcrRegistered *rb = b; + gulong na, nb; + + g_assert (a); + g_assert (b); + + na = gck_attributes_count (ra->attrs); + nb = gck_attributes_count (rb->attrs); + + /* Note we're sorting in reverse order */ + if (na < nb) + return 1; + return (na == nb) ? 0 : -1; +} + +static gboolean +check_if_seen_or_add (GHashTable *seen, + gpointer key) +{ + if (g_hash_table_lookup (seen, key)) + return TRUE; + g_hash_table_insert (seen, key, key); + return FALSE; +} + +/** + * gcr_importer_create_for_parsed: + * @parsed: a parser with a parsed item to import + * + * Create a set of importers which can import this parsed item. + * The parsed item is represented by the state of the GcrParser at the + * time of calling this method. + * + * Returns: (element-type Gcr.Importer) (transfer full): a list of importers + * which can import the parsed item, which should be freed with + * g_object_unref(), or %NULL if no types of importers can be created + */ +GList * +gcr_importer_create_for_parsed (GcrParsed *parsed) +{ + GcrRegistered *registered; + GcrImporterIface *iface; + gpointer instance_class; + GckAttributes *attrs; + gboolean matched; + gulong n_attrs; + GList *results = NULL; + GHashTable *seen; + gulong j; + gsize i; + + g_return_val_if_fail (parsed != NULL, NULL); + + gcr_importer_register_well_known (); + + if (!registered_importers) + return NULL; + + if (!registered_sorted) { + g_array_sort (registered_importers, sort_registered_by_n_attrs); + registered_sorted = TRUE; + } + + attrs = gcr_parsed_get_attributes (parsed); + if (attrs != NULL) + gck_attributes_ref (attrs); + else + attrs = gck_attributes_new_empty (GCK_INVALID); + + seen = g_hash_table_new (g_direct_hash, g_direct_equal); + + gchar *a = gck_attributes_to_string (attrs); + g_debug ("looking for importer for: %s", a); + g_free (a); + + for (i = 0; i < registered_importers->len; ++i) { + registered = &(g_array_index (registered_importers, GcrRegistered, i)); + n_attrs = gck_attributes_count (registered->attrs); + + matched = TRUE; + + for (j = 0; j < n_attrs; ++j) { + if (!gck_attributes_contains (attrs, gck_attributes_at (registered->attrs, j))) { + matched = FALSE; + break; + } + } + + gchar *a = gck_attributes_to_string (registered->attrs); + g_debug ("importer %s %s: %s", g_type_name (registered->importer_type), + matched ? "matched" : "didn't match", a); + g_free (a); + + if (matched) { + if (check_if_seen_or_add (seen, GUINT_TO_POINTER (registered->importer_type))) + continue; + + instance_class = g_type_class_ref (registered->importer_type); + + iface = g_type_interface_peek (instance_class, GCR_TYPE_IMPORTER); + g_return_val_if_fail (iface != NULL, NULL); + g_return_val_if_fail (iface->create_for_parsed, NULL); + results = g_list_concat (results, (iface->create_for_parsed) (parsed)); + + g_type_class_unref (instance_class); + } + } + + g_hash_table_unref (seen); + gck_attributes_unref (attrs); + return results; +} + +/** + * gcr_importer_queue_for_parsed: + * @importer: an importer to add additional items to + * @parsed: a parsed item to import + * + * Queues an additional item to be imported. The parsed item is represented + * by the state of the #GcrParser at the time of calling this method. + * + * If the parsed item is incompatible with the importer, then this will + * fail and the item will not be queued. + * + * Returns: whether the item was queued or not + */ +gboolean +gcr_importer_queue_for_parsed (GcrImporter *importer, + GcrParsed *parsed) +{ + GcrImporterIface *iface; + + g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE); + g_return_val_if_fail (parsed != NULL, FALSE); + + iface = GCR_IMPORTER_GET_INTERFACE (importer); + g_return_val_if_fail (iface != NULL, FALSE); + g_return_val_if_fail (iface->queue_for_parsed != NULL, FALSE); + + return (iface->queue_for_parsed) (importer, parsed); +} + +/** + * gcr_importer_queue_and_filter_for_parsed: + * @importers: (element-type Gcr.Importer): a set of importers + * @parsed: a parsed item + * + * Queues an additional item to be imported in all compattible importers + * in the set. The parsed item is represented by the state of the #GcrParser + * at the time of calling this method. + * + * If the parsed item is incompatible with an importer, then that the item + * will not be queued on that importer. + * + * Returns: (transfer full) (element-type Gcr.Importer): a new set of importers + * that queued the item, which should be freed with gck_list_unref_free() + */ +GList * +gcr_importer_queue_and_filter_for_parsed (GList *importers, + GcrParsed *parsed) +{ + GList *results = NULL; + GList *l; + + for (l = importers; l != NULL; l = g_list_next (l)) { + if (gcr_importer_queue_for_parsed (l->data, parsed)) + results = g_list_prepend (results, g_object_ref (l->data)); + } + + return g_list_reverse (results); +} + +typedef struct { + gboolean complete; + GCond *cond; + GMutex *mutex; + GError *error; + GMainContext *context; +} ImportClosure; + +static void +on_import_async_complete (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ImportClosure *closure = user_data; + GError *error = NULL; + + if (!gcr_importer_import_finish (GCR_IMPORTER (source), result, &error)) { + if (error == NULL) { + g_warning ("%s::import_finished returned false, but did not set error", + G_OBJECT_TYPE_NAME (source)); + } + } + + g_mutex_lock (closure->mutex); + + closure->complete = TRUE; + closure->error = error; + g_cond_signal (closure->cond); + + g_mutex_unlock (closure->mutex); +} + +/** + * gcr_importer_import: + * @importer: the importer + * @cancellable: a #GCancellable, or %NULL + * @error: the location to place an error on failure, or %NULL + * + * Import the queued items in the importer. This call will block + * until the operation completes. + * + * Returns: whether the items were imported successfully or not + */ +gboolean +gcr_importer_import (GcrImporter *importer, + GCancellable *cancellable, + GError **error) +{ + gboolean result; + ImportClosure *closure; + GcrImporterIface *iface; + + g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + iface = GCR_IMPORTER_GET_INTERFACE (importer); + if (iface->import_sync) + return (iface->import_sync) (importer, cancellable, error); + + g_return_val_if_fail (iface->import_async != NULL, FALSE); + g_return_val_if_fail (iface->import_finish != NULL, FALSE); + + closure = g_new0 (ImportClosure, 1); + closure->cond = g_new (GCond, 1); + g_cond_init (closure->cond); + closure->mutex = g_new (GMutex, 1); + g_mutex_init (closure->mutex); + closure->context = g_main_context_get_thread_default (); + g_mutex_lock (closure->mutex); + + (iface->import_async) (importer, cancellable, on_import_async_complete, closure); + + /* + * Handle the case where we've been called from within the main context + * or in the case where the main context is not running. This approximates + * the behavior of a modal dialog. + */ + if (g_main_context_acquire (closure->context)) { + while (!closure->complete) { + g_mutex_unlock (closure->mutex); + g_main_context_iteration (closure->context, TRUE); + g_mutex_lock (closure->mutex); + } + + g_main_context_release (closure->context); + + /* + * Handle the case where we're in a different thread than the main + * context and a main loop is running. + */ + } else { + while (!closure->complete) + g_cond_wait (closure->cond, closure->mutex); + } + + g_mutex_unlock (closure->mutex); + + result = (closure->error == NULL); + if (closure->error) + g_propagate_error (error, closure->error); + + g_cond_clear (closure->cond); + g_free (closure->cond); + g_mutex_clear (closure->mutex); + g_free (closure->mutex); + g_free (closure); + + return result; +} + +/** + * gcr_importer_import_async: + * @importer: the importer + * @cancellable: a #GCancellable, or %NULL + * @callback: called when the operation completes + * @user_data: data to be passed to the callback + * + * Import the queued items in the importer. This function returns immediately + * and completes asynchronously. + */ +void +gcr_importer_import_async (GcrImporter *importer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrImporterIface *iface; + + g_return_if_fail (GCR_IS_IMPORTER (importer)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + iface = GCR_IMPORTER_GET_INTERFACE (importer); + g_return_if_fail (iface != NULL); + g_return_if_fail (iface->import_async != NULL); + + return (iface->import_async) (importer, cancellable, callback, user_data); +} + +/** + * gcr_importer_import_finish: + * @importer: the importer + * @result: an asynchronous result + * @error: the location to place an error on failure, or %NULL + * + * Complete an asynchronous operation to import queued items. + * + * Returns: whether the import succeeded or failed + */ +gboolean +gcr_importer_import_finish (GcrImporter *importer, + GAsyncResult *result, + GError **error) +{ + GcrImporterIface *iface; + + g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + iface = GCR_IMPORTER_GET_INTERFACE (importer); + g_return_val_if_fail (iface != NULL, FALSE); + g_return_val_if_fail (iface->import_finish != NULL, FALSE); + + return (iface->import_finish) (importer, result, error); +} + +/** + * gcr_importer_get_interaction: + * @importer: the importer + * + * Get the interaction used to prompt the user when needed by this + * importer. + * + * Returns: (transfer none) (allow-none): the interaction or %NULL + */ +GTlsInteraction * +gcr_importer_get_interaction (GcrImporter *importer) +{ + GTlsInteraction *interaction = NULL; + + g_return_val_if_fail (GCR_IS_IMPORTER (importer), NULL); + + g_object_get (importer, "interaction", &interaction, NULL); + + if (interaction != NULL) + g_object_unref (interaction); + + return interaction; +} + +/** + * gcr_importer_set_interaction: + * @importer: the importer + * @interaction: the interaction used by the importer + * + * Set the interaction used to prompt the user when needed by this + * importer. + */ +void +gcr_importer_set_interaction (GcrImporter *importer, + GTlsInteraction *interaction) +{ + g_return_if_fail (GCR_IS_IMPORTER (importer)); + g_object_set (importer, "interaction", interaction, NULL); +} + +/** + * gcr_importer_register_well_known: + * + * Register built-in PKCS\#11 and GnuPG importers. + */ +void +gcr_importer_register_well_known (void) +{ + g_type_class_unref (g_type_class_ref (GCR_TYPE_PKCS11_IMPORTER)); + g_type_class_unref (g_type_class_ref (GCR_TYPE_GNUPG_IMPORTER)); +} + +#ifndef GCR_DISABLE_DEPRECATED + +/** + * gcr_importer_get_parser: + * @self: An importer + * + * Has no effect. Use gcr_importer_listen() instead. + * + * Returns: %NULL is always returned. + * Deprecated: Since 3.0.0 + */ +GcrParser* +gcr_importer_get_parser (GcrImporter *self) +{ + g_warning ("gcr_importer_get_parser() is no longer supported " + "Use gcr_importer_listen() instead."); + return NULL; +} + +/** + * gcr_importer_set_parser: + * @self: An importer + * @parser: A parser + * + * Has no effect. Use gcr_importer_listen() instead. + * + * Deprecated: Since 3.0.0 + */ +void +gcr_importer_set_parser (GcrImporter *self, + GcrParser *parser) +{ + g_warning ("gcr_importer_set_parser() is no longer supported " + "Use gcr_importer_listen() instead."); +} + +/* + * gcr_importer_get_slot: + * @self: The importer + * + * Returns %NULL. + * + * Deprecated: since 3.4.0 + */ +GckSlot * +gcr_importer_get_slot (GcrImporter *self) +{ + g_warning ("gcr_importer_get_slot() is no longer supported."); + return NULL; +} + +/** + * gcr_importer_set_slot: + * @self: The importer + * @slot: The slot to import to + * + * Has no effect. + * + * Deprecated: since 3.4.0 + */ +void +gcr_importer_set_slot (GcrImporter *self, + GckSlot *slot) +{ + g_warning ("gcr_importer_set_slot() is no longer supported."); +} + +/** + * gcr_importer_get_prompt_behavior: + * @self: The importer + * + * Does nothing. + * + * Returns: zero + * + * Deprecated: since 3.4.0 + */ +GcrImporterPromptBehavior +gcr_importer_get_prompt_behavior (GcrImporter *self) +{ + g_warning ("gcr_importer_get_prompt_behavior() is no longer supported."); + return 0; +} + +/** + * gcr_importer_set_prompt_behavior: + * @self: The importer + * @behavior: The prompt behavior flag + * + * Has no effect. + * + * Deprecated: since 3.4.0 + */ +void +gcr_importer_set_prompt_behavior (GcrImporter *self, + GcrImporterPromptBehavior behavior) +{ + g_warning ("gcr_importer_set_prompt_behavior() is no longer supported."); +} + +#endif /* GCR_DISABLE_DEPRECATED */ diff --git a/gcr/gcr-importer.h b/gcr/gcr-importer.h new file mode 100644 index 0000000..7a1bcc1 --- /dev/null +++ b/gcr/gcr-importer.h @@ -0,0 +1,105 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_IMPORTER_H__ +#define __GCR_IMPORTER_H__ + +#include "gcr-parser.h" + +#include + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_IMPORTER (gcr_importer_get_type ()) +#define GCR_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORTER, GcrImporter)) +#define GCR_IS_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORTER)) +#define GCR_IMPORTER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_IMPORTER, GcrImporterIface)) + +typedef struct _GcrImporter GcrImporter; +typedef struct _GcrImporterIface GcrImporterIface; + +struct _GcrImporterIface { + GTypeInterface parent; + + GList * (*create_for_parsed) (GcrParsed *parsed); + + gboolean (*queue_for_parsed) (GcrImporter *importer, + GcrParsed *parsed); + + gboolean (*import_sync) (GcrImporter *importer, + GCancellable *cancellable, + GError **error); + + void (*import_async) (GcrImporter *importer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + gboolean (*import_finish) (GcrImporter *importer, + GAsyncResult *result, + GError **error); + + /*< private >*/ + gpointer reserved[14]; +}; + +GType gcr_importer_get_type (void); + +GList * gcr_importer_create_for_parsed (GcrParsed *parsed); + +gboolean gcr_importer_queue_for_parsed (GcrImporter *importer, + GcrParsed *parsed); + +GList * gcr_importer_queue_and_filter_for_parsed (GList *importers, + GcrParsed *parsed); + +gboolean gcr_importer_import (GcrImporter *importer, + GCancellable *cancellable, + GError **error); + +void gcr_importer_import_async (GcrImporter *importer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_importer_import_finish (GcrImporter *importer, + GAsyncResult *result, + GError **error); + +GTlsInteraction * gcr_importer_get_interaction (GcrImporter *importer); + +void gcr_importer_set_interaction (GcrImporter *importer, + GTlsInteraction *interaction); + +void gcr_importer_register (GType importer_type, + GckAttributes *attrs); + +void gcr_importer_register_well_known (void); + +G_END_DECLS + +#endif /* __GCR_IMPORTER_H__ */ diff --git a/gcr/gcr-internal.h b/gcr/gcr-internal.h new file mode 100644 index 0000000..729aab7 --- /dev/null +++ b/gcr/gcr-internal.h @@ -0,0 +1,37 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_INTERNAL_H_ +#define GCR_INTERNAL_H_ + +#include +#include + +/* Should only be used internally */ +#define GCR_SUCCESS 0 + +void _gcr_initialize_library (void); + +void _gcr_uninitialize_library (void); + +void _gcr_set_pkcs11_config_dir (const gchar *dir); + +#endif /* GCR_INTERNAL_H_ */ diff --git a/gcr/gcr-key-mechanisms.c b/gcr/gcr-key-mechanisms.c new file mode 100644 index 0000000..dce6038 --- /dev/null +++ b/gcr/gcr-key-mechanisms.c @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-key-mechanisms.h" + +#include + +static gboolean +check_have_attributes (GckAttributes *attrs, + const gulong *types, + gsize n_types) +{ + gsize i; + + for (i = 0; i < n_types; i++) { + if (!gck_attributes_find (attrs, types[i])) + return FALSE; + } + + return TRUE; +} + +static gulong +find_first_usable_mechanism (GckObject *key, + GckAttributes *attrs, + const gulong *mechanisms, + gsize n_mechanisms, + gulong action_attr_type) +{ + GckSession *session; + GckSlot *slot; + GArray *mechs; + gboolean can; + gsize i; + + if (gck_attributes_find_boolean (attrs, action_attr_type, &can) && !can) { + g_debug ("key not capable of needed action"); + return GCK_INVALID; + } + + session = gck_object_get_session (key); + slot = gck_session_get_slot (session); + mechs = gck_slot_get_mechanisms (slot); + g_object_unref (slot); + g_object_unref (session); + + if (!mechs) { + g_debug ("couldn't get slot mechanisms"); + return GCK_INVALID; + } + + for (i = 0; i < n_mechanisms; i++) { + if (gck_mechanisms_check (mechs, mechanisms[i], GCK_INVALID)) + break; + } + + gck_mechanisms_free (mechs); + + if (i < n_mechanisms) + return mechanisms[i]; + return GCK_INVALID; +} + +gulong +_gcr_key_mechanisms_check (GckObject *key, + const gulong *mechanisms, + gsize n_mechanisms, + gulong action_attr_type, + GCancellable *cancellable, + GError **error) +{ + gulong attr_types[] = { action_attr_type }; + GckAttributes *attrs = NULL; + gulong result; + + g_return_val_if_fail (GCK_IS_OBJECT (key), GCK_INVALID); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), GCK_INVALID); + g_return_val_if_fail (error == NULL || *error == NULL, GCK_INVALID); + + if (GCK_IS_OBJECT_CACHE (key)) { + attrs = gck_object_cache_get_attributes (GCK_OBJECT_CACHE (key)); + if (!check_have_attributes (attrs, attr_types, G_N_ELEMENTS (attr_types))) { + gck_attributes_unref (attrs); + attrs = NULL; + } + } + + if (attrs == NULL) { + attrs = gck_object_get_full (key, attr_types, G_N_ELEMENTS (attr_types), + cancellable, error); + } + + if (!attrs) + return GCK_INVALID; + + result = find_first_usable_mechanism (key, attrs, mechanisms, n_mechanisms, action_attr_type); + gck_attributes_unref (attrs); + return result; +} + +typedef struct { + gulong *mechanisms; + gsize n_mechanisms; + gulong action_attr_type; + GckAttributes *attrs; +} CheckClosure; + +static void +check_closure_free (gpointer data) +{ + CheckClosure *closure = data; + g_free (closure->mechanisms); + gck_attributes_unref (closure->attrs); + g_free (closure); +} + +static void +on_check_get_attributes (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + CheckClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GError *error = NULL; + + closure->attrs = gck_object_cache_lookup_finish (GCK_OBJECT (source), result, &error); + if (error != NULL) + g_simple_async_result_take_error (res, error); + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +void +_gcr_key_mechanisms_check_async (GckObject *key, + const gulong *mechanisms, + gsize n_mechanisms, + gulong action_attr_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gulong attr_types[] = { action_attr_type }; + CheckClosure *closure; + GSimpleAsyncResult *res; + + g_return_if_fail (GCK_IS_OBJECT (key)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + res = g_simple_async_result_new (G_OBJECT (key), callback, user_data, + _gcr_key_mechanisms_check_async); + closure = g_new0 (CheckClosure, 1); + closure->mechanisms = g_memdup (mechanisms, n_mechanisms * sizeof (gulong)); + closure->n_mechanisms = n_mechanisms; + closure->action_attr_type = action_attr_type; + g_simple_async_result_set_op_res_gpointer (res, closure, check_closure_free); + + gck_object_cache_lookup_async (key, attr_types, G_N_ELEMENTS (attr_types), + cancellable, on_check_get_attributes, g_object_ref (res)); + + g_object_unref (res); + + +} + +gulong +_gcr_key_mechanisms_check_finish (GckObject *key, + GAsyncResult *result, + GError **error) +{ + CheckClosure *closure; + GSimpleAsyncResult *res; + + g_return_val_if_fail (GCK_IS_OBJECT (key), GCK_INVALID); + g_return_val_if_fail (error == NULL || *error == NULL, GCK_INVALID); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (key), + _gcr_key_mechanisms_check_async), FALSE); + + res = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (res, error)) + return FALSE; + + closure = g_simple_async_result_get_op_res_gpointer (res); + + return find_first_usable_mechanism (GCK_OBJECT (key), closure->attrs, + closure->mechanisms, closure->n_mechanisms, + closure->action_attr_type); +} diff --git a/gcr/gcr-key-mechanisms.h b/gcr/gcr-key-mechanisms.h new file mode 100644 index 0000000..37cf46c --- /dev/null +++ b/gcr/gcr-key-mechanisms.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_KEY_MECHANISMS_H__ +#define __GCR_KEY_MECHANISMS_H__ + +#include + +#include "gck/gck.h" + +G_BEGIN_DECLS + +gulong _gcr_key_mechanisms_check (GckObject *key, + const gulong *mechanisms, + gsize n_mechanisms, + gulong action_attr_type, + GCancellable *cancellable, + GError **error); + +void _gcr_key_mechanisms_check_async (GckObject *key, + const gulong *mechanisms, + gsize n_mechanisms, + gulong action_attr_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gulong _gcr_key_mechanisms_check_finish (GckObject *key, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __GCR_KEY_MECHANISMS_H__ */ diff --git a/gcr/gcr-library.c b/gcr/gcr-library.c new file mode 100644 index 0000000..7275c63 --- /dev/null +++ b/gcr/gcr-library.c @@ -0,0 +1,629 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-deprecated-base.h" +#include "gcr-internal.h" +#include "gcr-library.h" +#include "gcr-types.h" + +#include "egg/egg-error.h" +#include "egg/egg-libgcrypt.h" +#include "egg/egg-secure-memory.h" + +#include + +#include + +#include + +#include + +/** + * SECTION:gcr-library + * @title: Library Utilities + * @short_description: Library utilities such as version checks + * + * Basic library utilities such as version checks. + */ + +/** + * GCR_CHECK_VERSION: + * @major: the major version to check for + * @minor: the minor version to check for + * @micro: the micro version to check for + * + * Checks the version of the Gcr libarry that is being compiled + * against. + * + * + * Checking the version of the Gcr library + * + * #if !GCR_CHECK_VERSION (3, 0, 0) + * #warning Old Gcr version, disabling functionality + * #endif + * + * + * + * Returns: %TRUE if the version of the Gcr header files + * is the same as or newer than the passed-in version. + */ + +/** + * GCR_MAJOR_VERSION: + * + * The major version number of the Gcr library. + */ + +/** + * GCR_MINOR_VERSION: + * + * The minor version number of the Gcr library. + */ + +/** + * GCR_MICRO_VERSION: + * + * The micro version number of the Gcr library. + */ + +/** + * SECTION:gcr-pkcs11 + * @title: Library PKCS#11 + * @short_description: functions for manipulating GCR library global settings. + * + * Manage or lookup various global aspesct and settings of the library. + * + * The GCR library maintains a global list of PKCS\#11 modules to use for + * its various lookups and storage operations. Each module is represented by + * a GckModule object. You can examine this list by using + * gcr_pkcs11_get_modules(). + * + * The list is configured automatically by looking for system installed + * PKCS\#11 modules. It's not not normally necessary to modify this list. But + * if you have special needs, you can use the gcr_pkcs11_set_modules() and + * gcr_pkcs11_add_module() to do so. + * + * Trust assertions are stored and looked up in specific PKCS\#11 slots. + * You can examine this list with gcr_pkcs11_get_trust_lookup_slots() + */ + +/** + * SECTION:gcr-private + * @title: Private declarations + * @short_description: private declarations to supress warnings. + * + * This section is only here to supress warnings, and should not be displayed. + */ + +G_LOCK_DEFINE_STATIC (modules); +static GList *all_modules = NULL; +static gboolean initialized_modules = FALSE; + +G_LOCK_DEFINE_STATIC (uris); +static gboolean initialized_uris = FALSE; +static gchar *trust_store_uri = NULL; +static gchar **trust_lookup_uris = NULL; + +/* ----------------------------------------------------------------------------- + * ERRORS + */ + +GQuark +gcr_data_error_get_domain (void) +{ + static GQuark domain = 0; + if (domain == 0) + domain = g_quark_from_static_string ("gcr-parser-error"); + return domain; +} + +GQuark +gcr_error_get_domain (void) +{ + static GQuark domain = 0; + if (domain == 0) + domain = g_quark_from_static_string ("gcr-error"); + return domain; +} + +/* ----------------------------------------------------------------------------- + * INITIALIZATION + */ + +void +_gcr_uninitialize_library (void) +{ + G_LOCK (modules); + + gck_list_unref_free (all_modules); + all_modules = NULL; + initialized_modules = FALSE; + + G_UNLOCK (modules); + + G_LOCK (uris); + + initialized_uris = FALSE; + g_free (trust_store_uri); + trust_store_uri = NULL; + g_strfreev (trust_lookup_uris); + trust_lookup_uris = NULL; + + G_UNLOCK (uris); +} +void +_gcr_initialize_library (void) +{ + static gint gcr_initialize = 0; + + if (g_atomic_int_add (&gcr_initialize, 1) == 0) + return; + + /* Initialize the libgcrypt library if needed */ + egg_libgcrypt_initialize (); + + g_debug ("initialized library"); +} + +static void +initialize_uris (void) +{ + GPtrArray *uris; + GList *l; + gchar *uri; + gchar *debug; + + if (initialized_uris) + return; + + if (!initialized_modules) { + g_debug ("modules not initialized"); + return; + } + + G_LOCK (uris); + + if (!initialized_uris) { + /* Ask for the global x-trust-store option */ + trust_store_uri = p11_kit_config_option (NULL, "x-trust-store"); + for (l = all_modules; !trust_store_uri && l != NULL; l = g_list_next (l)) { + trust_store_uri = p11_kit_config_option (gck_module_get_functions (l->data), + "x-trust-store"); + } + + uris = g_ptr_array_new (); + uri = p11_kit_config_option (NULL, "x-trust-lookup"); + if (uri != NULL) + g_ptr_array_add (uris, uri); + for (l = all_modules; l != NULL; l = g_list_next (l)) { + uri = p11_kit_config_option (gck_module_get_functions (l->data), + "x-trust-lookup"); + if (uri != NULL) + g_ptr_array_add (uris, uri); + } + g_ptr_array_add (uris, NULL); + + trust_lookup_uris = (gchar**)g_ptr_array_free (uris, FALSE); + + g_debug ("trust store uri is: %s", trust_store_uri); + debug = g_strjoinv (" ", trust_lookup_uris); + g_debug ("trust lookup uris are: %s", debug); + g_free (debug); + + initialized_uris = TRUE; + } + + G_UNLOCK (uris); +} + +static void +on_initialize_registered (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GError *error = NULL; + GList *results; + + results = gck_modules_initialize_registered_finish (result, &error); + if (error != NULL) { + g_debug ("failed %s", error->message); + g_simple_async_result_take_error (res, error); + + } else { + + G_LOCK (modules); + + if (!initialized_modules) { + all_modules = g_list_concat(all_modules, results); + results = NULL; + initialized_modules = TRUE; + } + + G_UNLOCK (modules); + } + + gck_list_unref_free (results); + + g_debug ("completed initialize of registered modules"); + g_simple_async_result_complete (res); + g_object_unref (res); +} + +/** + * gcr_pkcs11_initialize_async: + * @cancellable: optional cancellable used to cancel the operation + * @callback: callback which will be called when the operation completes + * @user_data: data passed to the callback + * + * Asynchronously initialize the registered PKCS\#11 modules. + */ +void +gcr_pkcs11_initialize_async (GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (NULL, callback, user_data, + gcr_pkcs11_initialize_async); + + if (initialized_modules) { + g_debug ("already initialized, no need to async"); + g_simple_async_result_complete_in_idle (res); + } else { + gck_modules_initialize_registered_async (cancellable, + on_initialize_registered, + g_object_ref (res)); + g_debug ("starting initialize of registered modules"); + } + + g_object_unref (res); +} + +/** + * gcr_pkcs11_initialize_finish: + * @result: the asynchronous result + * @error: location to place an error on failure + * + * Complete the asynchronous operation to initialize the registered PKCS\#11 + * modules. + * + * Returns: whether the operation was successful or not. + */ +gboolean +gcr_pkcs11_initialize_finish (GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, + gcr_pkcs11_initialize_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +/** + * gcr_pkcs11_initialize: + * @cancellable: optional cancellable used to cancel the operation + * @error: location to place an error on failure + * + * Asynchronously initialize the registered PKCS\#11 modules. + * + * Returns: whether the operation was successful or not. + */ + +gboolean +gcr_pkcs11_initialize (GCancellable *cancellable, + GError **error) +{ + GList *results; + GError *err = NULL; + + if (initialized_modules) + return TRUE; + + results = gck_modules_initialize_registered (cancellable, &err); + if (err == NULL) { + + g_debug ("registered module initialize succeeded: %d modules", + g_list_length (results)); + + G_LOCK (modules); + + if (!initialized_modules) { + all_modules = g_list_concat (all_modules, results); + results = NULL; + initialized_modules = TRUE; + } + + G_UNLOCK (modules); + + } else { + g_debug ("registered module initialize failed: %s", err->message); + g_propagate_error (error, err); + } + + gck_list_unref_free (results); + return (err == NULL); +} + +/** + * gcr_pkcs11_get_modules: + * + * List all the PKCS\#11 modules that are used by the GCR library. + * Each module is a #GckModule object. + * + * An empty list of modules will be returned if gcr_pkcs11_set_modules(), + * or gcr_pkcs11_initialize() has not yet run. + * + * When done with the list, free it with gck_list_unref_free(). + * + * Returns: (transfer full) (element-type Gck.Module): a newly allocated list + * of #GckModule objects + */ +GList* +gcr_pkcs11_get_modules (void) +{ + if (!initialized_modules) + g_debug ("pkcs11 not yet initialized"); + else if (!all_modules) + g_debug ("no modules loaded"); + return gck_list_ref_copy (all_modules); +} + +/** + * gcr_pkcs11_set_modules: + * @modules: (element-type Gck.Module): a list of #GckModule + * + * Set the list of PKCS\#11 modules that are used by the GCR library. + * Each module in the list is a #GckModule object. + * + * It is not normally necessary to call this function. The available + * PKCS\#11 modules installed on the system are automatically loaded + * by the GCR library. + */ +void +gcr_pkcs11_set_modules (GList *modules) +{ + GList *l; + + for (l = modules; l; l = g_list_next (l)) + g_return_if_fail (GCK_IS_MODULE (l->data)); + + modules = gck_list_ref_copy (modules); + gck_list_unref_free (all_modules); + all_modules = modules; + initialized_modules = TRUE; +} + +/** + * gcr_pkcs11_add_module: + * @module: a #GckModule + * + * Add a #GckModule to the list of PKCS\#11 modules that are used by the + * GCR library. + * + * It is not normally necessary to call this function. The available + * PKCS\#11 modules installed on the system are automatically loaded + * by the GCR library. + */ +void +gcr_pkcs11_add_module (GckModule *module) +{ + g_return_if_fail (GCK_IS_MODULE (module)); + all_modules = g_list_append (all_modules, g_object_ref (module)); +} + +/** + * gcr_pkcs11_add_module_from_file: + * @module_path: the full file path of the PKCS\#11 module + * @unused: unused + * @error: a #GError or NULL + * + * Initialize a PKCS\#11 module and add it to the modules that are + * used by the GCR library. Note that is an error to initialize the same + * PKCS\#11 module twice. + * + * It is not normally necessary to call this function. The available + * PKCS\#11 modules installed on the system are automatically loaded + * by the GCR library. + * + * Returns: whether the module was sucessfully added. + */ +gboolean +gcr_pkcs11_add_module_from_file (const gchar *module_path, gpointer unused, + GError **error) +{ + GckModule *module; + GError *err = NULL; + + g_return_val_if_fail (module_path, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + module = gck_module_initialize (module_path, NULL, &err); + if (module == NULL) { + g_debug ("initializing module failed: %s: %s", + module_path, err->message); + g_propagate_error (error, err); + return FALSE; + } + + gcr_pkcs11_add_module (module); + + g_debug ("initialized and added module: %s", module_path); + g_object_unref (module); + return TRUE; +} + +/** + * gcr_pkcs11_get_trust_store_slot: + * + * Selects an appropriate PKCS\#11 slot to store trust assertions. The slot + * to use is normally configured automatically by the system. + * + * This will only return a valid result after the gcr_pkcs11_initialize() + * method has been called. + * + * When done with the #GckSlot, use g_object_unref() to release it. + * + * Returns: (transfer full): the #GckSlot to use for trust assertions. + */ +GckSlot * +gcr_pkcs11_get_trust_store_slot (void) +{ + GckSlot *slot; + GError *error = NULL; + + if (!initialized_modules) + return NULL; + + initialize_uris (); + slot = gck_modules_token_for_uri (all_modules, trust_store_uri, &error); + if (!slot) { + if (error) { + g_warning ("error finding slot to store trust assertions: %s: %s", + trust_store_uri, egg_error_message (error)); + g_clear_error (&error); + } else { + g_debug ("no trust store slot found"); + } + } + + return slot; +} + +/** + * gcr_pkcs11_get_trust_lookup_slots: + * + * List all the PKCS\#11 slots that are used by the GCR library for lookup + * of trust assertions. Each slot is a #GckSlot object. + * + * This will return an empty list if the gcr_pkcs11_initialize() function has + * not yet been called. + * + * When done with the list, free it with gck_list_unref_free(). + * + * Returns: (transfer full) (element-type Gck.Slot): a list of #GckSlot objects + * to use for lookup of trust. + */ +GList* +gcr_pkcs11_get_trust_lookup_slots (void) +{ + GList *results = NULL; + GError *error = NULL; + gchar **uri; + + if (!initialized_modules) + return NULL; + + initialize_uris (); + + for (uri = trust_lookup_uris; uri && *uri; ++uri) { + results = g_list_concat (results, gck_modules_tokens_for_uri (all_modules, *uri, &error)); + if (error != NULL) { + g_warning ("error finding slot for trust assertions: %s: %s", + *uri, egg_error_message (error)); + g_clear_error (&error); + } + } + + if (results == NULL) + g_debug ("no trust lookup slots found"); + + return results; +} + +/** + * gcr_pkcs11_get_trust_store_uri: + * + * Get the PKCS\#11 URI that is used to identify which slot to use for + * storing trust storage. + * + * Returns: (allow-none): the uri which identifies trust storage slot + */ +const gchar* +gcr_pkcs11_get_trust_store_uri (void) +{ + initialize_uris (); + return trust_store_uri; +} + +/** + * gcr_pkcs11_set_trust_store_uri: + * @pkcs11_uri: (allow-none): the uri which identifies trust storage slot + * + * Set the PKCS\#11 URI that is used to identify which slot to use for + * storing trust assertions. + * + * It is not normally necessary to call this function. The relevant + * PKCS\#11 slot is automatically configured by the GCR library. + */ +void +gcr_pkcs11_set_trust_store_uri (const gchar *pkcs11_uri) +{ + G_LOCK (uris); + + g_free (trust_store_uri); + trust_store_uri = g_strdup (pkcs11_uri); + initialized_uris = TRUE; + + G_UNLOCK (uris); +} + + +/** + * gcr_pkcs11_get_trust_lookup_uris: + * + * Get the PKCS\#11 URIs that are used to identify which slots to use for + * lookup trust assertions. + * + * Returns: (allow-none) (transfer none): the uri which identifies trust storage slot + */ +const gchar ** +gcr_pkcs11_get_trust_lookup_uris (void) +{ + initialize_uris (); + return (const gchar **)trust_lookup_uris; +} + +/** + * gcr_pkcs11_set_trust_lookup_uris: + * @pkcs11_uris: (allow-none): the uris which identifies trust lookup slots + * + * Set the PKCS\#11 URIs that are used to identify which slots to use for + * lookup of trust assertions. + * + * It is not normally necessary to call this function. The relevant + * PKCS\#11 slots are automatically configured by the GCR library. + */ +void +gcr_pkcs11_set_trust_lookup_uris (const gchar **pkcs11_uris) +{ + G_LOCK (uris); + + g_strfreev (trust_lookup_uris); + trust_lookup_uris = g_strdupv ((gchar**)pkcs11_uris); + initialized_uris = TRUE; + + G_UNLOCK (uris); +} diff --git a/gcr/gcr-library.h b/gcr/gcr-library.h new file mode 100644 index 0000000..9650497 --- /dev/null +++ b/gcr/gcr-library.h @@ -0,0 +1,65 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_LIBRARY_H_ +#define GCR_LIBRARY_H_ + +#include "gcr-types.h" + +#include + +void gcr_pkcs11_initialize_async (GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_pkcs11_initialize_finish (GAsyncResult *result, + GError **error); + +gboolean gcr_pkcs11_initialize (GCancellable *cancellable, + GError **error); + +GList* gcr_pkcs11_get_modules (void); + +void gcr_pkcs11_set_modules (GList *modules); + +void gcr_pkcs11_add_module (GckModule *module); + +gboolean gcr_pkcs11_add_module_from_file (const gchar *module_path, + gpointer unused, + GError **error); + +GList* gcr_pkcs11_get_trust_lookup_slots (void); + +GckSlot* gcr_pkcs11_get_trust_store_slot (void); + +const gchar** gcr_pkcs11_get_trust_lookup_uris (void); + +void gcr_pkcs11_set_trust_lookup_uris (const gchar **pkcs11_uris); + +const gchar* gcr_pkcs11_get_trust_store_uri (void); + +void gcr_pkcs11_set_trust_store_uri (const gchar *pkcs11_uri); + +#endif /* GCR_LIBRARY_H_ */ diff --git a/gcr/gcr-marshal.list b/gcr/gcr-marshal.list new file mode 100644 index 0000000..d2eda8f --- /dev/null +++ b/gcr/gcr-marshal.list @@ -0,0 +1,8 @@ +BOOLEAN:INT +BOOLEAN:BOXED +OBJECT:VOID +VOID:STRING,BOXED +VOID:BOXED +VOID:STRING +VOID:OBJECT,BOXED +VOID:OBJECT,OBJECT diff --git a/gcr/gcr-memory-icon.c b/gcr/gcr-memory-icon.c new file mode 100644 index 0000000..e1c62f3 --- /dev/null +++ b/gcr/gcr-memory-icon.c @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-memory-icon.h" + +#include + +struct _GcrMemoryIconPrivate { + gpointer data; + gsize n_data; + goffset offset; + gchar *image_type; + GDestroyNotify destroy; +}; + +/* Forward declarations */ +static void _gcr_memory_icon_iface_icon (GIconIface *iface); +static void _gcr_memory_icon_iface_loadable_icon (GLoadableIconIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrMemoryIcon, _gcr_memory_icon, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ICON, _gcr_memory_icon_iface_icon); + G_IMPLEMENT_INTERFACE (G_TYPE_LOADABLE_ICON, _gcr_memory_icon_iface_loadable_icon); +); + + +static void +_gcr_memory_icon_init (GcrMemoryIcon *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_MEMORY_ICON, GcrMemoryIconPrivate)); +} + +static void +_gcr_memory_icon_finalize (GObject *obj) +{ + GcrMemoryIcon *self = GCR_MEMORY_ICON (obj); + + if (self->pv->destroy) + (self->pv->destroy) (self->pv->data); + g_free (self->pv->image_type); + + G_OBJECT_CLASS (_gcr_memory_icon_parent_class)->finalize (obj); +} + +static void +_gcr_memory_icon_class_init (GcrMemoryIconClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GcrMemoryIconPrivate)); + + gobject_class->finalize = _gcr_memory_icon_finalize; +} + +static gboolean +_gcr_memory_icon_equal (GIcon *icon1, GIcon *icon2) +{ + GcrMemoryIcon *one = GCR_MEMORY_ICON (icon1); + GcrMemoryIcon *two = GCR_MEMORY_ICON (icon2); + + if (icon1 == icon2) + return TRUE; + if (!g_str_equal (one->pv->image_type, two->pv->image_type)) + return FALSE; + if ((one->pv->n_data - one->pv->offset) != (two->pv->n_data - two->pv->offset)) + return FALSE; + return memcmp ((guchar*)one->pv->data + one->pv->offset, + (guchar*)two->pv->data + two->pv->offset, + one->pv->n_data - one->pv->offset) == 0; +} + +static guint +_gcr_memory_icon_hash (GIcon *icon) +{ + GcrMemoryIcon *self = GCR_MEMORY_ICON (icon); + const signed char *p, *end; + guint32 hash; + + hash = g_str_hash (self->pv->image_type); + + /* Adapted from g_str_hash */ + p = self->pv->data; + end = p + self->pv->n_data; + p += self->pv->offset; + while (p < end) + hash = (hash << 5) + hash + *(p++); + + return hash; +} + +static void +_gcr_memory_icon_iface_icon (GIconIface *iface) +{ + iface->equal = _gcr_memory_icon_equal; + iface->hash = _gcr_memory_icon_hash; +} + +static GInputStream * +_gcr_memory_icon_load (GLoadableIcon *icon, int size, gchar **type, + GCancellable *cancellable, GError **error) +{ + GcrMemoryIcon *self = GCR_MEMORY_ICON (icon); + GInputStream *is; + + if (type != NULL) + *type = g_strdup (self->pv->image_type); + + is = g_memory_input_stream_new_from_data ((guchar*)self->pv->data + self->pv->offset, + self->pv->n_data, NULL); + + /* + * Hold a reference to this object from the stream, so that we can rely + * on the data hanging around. + */ + g_object_set_data_full (G_OBJECT (is), "back-reference", g_object_ref (self), + g_object_unref); + + return is; +} + +static void +_gcr_memory_icon_load_async (GLoadableIcon *icon, int size, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (icon), callback, user_data, + _gcr_memory_icon_load_async); + + g_simple_async_result_complete_in_idle (res); + g_object_unref (res); +} + +static GInputStream* +_gcr_memory_icon_finish (GLoadableIcon *icon, GAsyncResult *res, char **type, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (res, G_OBJECT (icon), + _gcr_memory_icon_load_async), NULL); + return _gcr_memory_icon_load (icon, 0, type, NULL, error); +} + + +static void +_gcr_memory_icon_iface_loadable_icon (GLoadableIconIface *iface) +{ + iface->load = _gcr_memory_icon_load; + iface->load_async = _gcr_memory_icon_load_async; + iface->load_finish = _gcr_memory_icon_finish; +} + +/** + * _gcr_memory_icon_new: + * @image_type: MIME content-type of the image. + * @data: Data for the image. + * @n_data: Length of data. + * + * Create a new GIcon based on image data in memory. The data will be copied + * by the new icon. + * + * Returns: (transfer full) (type Gcr.MemoryIcon): A newly allocated icon. + */ +GIcon* +_gcr_memory_icon_new (const gchar *image_type, gconstpointer data, gsize n_data) +{ + g_return_val_if_fail (image_type != NULL, NULL); + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (n_data != 0, NULL); + + return _gcr_memory_icon_new_full (image_type, g_memdup (data, n_data), + n_data, 0, g_free); +} + +/** + * _gcr_memory_icon_new_full: + * @image_type: MIME content-type of the image. + * @data: Data for the image. + * @n_data: Length of data. + * @offset: Offset of the start of the image in @data. + * @destroy: Callback to free or release @data when no longer needed. + * + * Create a new GIcon based on image data in memory. The data will be used + * directly from the @data passed. Use @destroy to control the lifetime of + * the data in memory. + * + * Returns: (transfer full): A newly allocated icon. + */ +GIcon* +_gcr_memory_icon_new_full (const gchar *image_type, gpointer data, gsize n_data, + goffset offset, GDestroyNotify destroy) +{ + GcrMemoryIcon *self; + + g_return_val_if_fail (image_type != NULL, NULL); + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (offset < n_data, NULL); + + self = g_object_new (GCR_TYPE_MEMORY_ICON, NULL); + self->pv->data = data; + self->pv->n_data = n_data; + self->pv->offset = offset; + self->pv->destroy = destroy; + self->pv->image_type = g_strdup (image_type); + + return G_ICON (self); +} diff --git a/gcr/gcr-memory-icon.h b/gcr/gcr-memory-icon.h new file mode 100644 index 0000000..579db93 --- /dev/null +++ b/gcr/gcr-memory-icon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_MEMORY_ICON_H +#define GCR_MEMORY_ICON_H + +#include +#include + +G_BEGIN_DECLS + +#define GCR_MEMORY_ICON_COLUMNS (_gcr_memory_icon_get_columns ()) +#define GCR_TYPE_MEMORY_ICON (_gcr_memory_icon_get_type ()) +#define GCR_MEMORY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_MEMORY_ICON, GcrMemoryIcon)) +#define GCR_MEMORY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_MEMORY_ICON, GcrMemoryIconClass)) +#define GCR_IS_MEMORY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_MEMORY_ICON)) +#define GCR_IS_MEMORY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_MEMORY_ICON)) +#define GCR_MEMORY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_MEMORY_ICON, GcrMemoryIconClass)) + +typedef struct _GcrMemoryIcon GcrMemoryIcon; +typedef struct _GcrMemoryIconClass GcrMemoryIconClass; +typedef struct _GcrMemoryIconPrivate GcrMemoryIconPrivate; + +struct _GcrMemoryIcon { + /*< private >*/ + GObject parent; + GcrMemoryIconPrivate *pv; +}; + +struct _GcrMemoryIconClass { + GObjectClass parent_class; +}; + +GType _gcr_memory_icon_get_type (void) G_GNUC_CONST; + +GIcon* _gcr_memory_icon_new (const gchar *image_type, + gconstpointer data, + gsize n_data); + +GIcon* _gcr_memory_icon_new_full (const gchar *image_type, + gpointer data, + gsize n_data, + goffset offset, + GDestroyNotify destroy); + +G_END_DECLS + +#endif /* __GCR_MEMORY_ICON_H__ */ diff --git a/gcr/gcr-mkoids b/gcr/gcr-mkoids new file mode 100644 index 0000000..b0eb5c4 --- /dev/null +++ b/gcr/gcr-mkoids @@ -0,0 +1,89 @@ +#!/bin/sh + +set -euf + +generate_header () +{ + echo "/* WARNING: file is autogenerated */" + echo "" + echo "#include " + echo "" + echo "#ifndef ${UPPER}_OIDS_" + echo "#define ${UPPER}_OIDS_" + echo "" + + while read name oid; do + if [ -n "$name" ]; then + lname=$(echo "$name" | tr '[:upper:]' '[:lower:]') + echo "GQuark _${LOWER}_oid_${lname}_get_quark (void) G_GNUC_CONST;" + echo "#define ${UPPER}_OID_${name} _${LOWER}_oid_${lname}_get_quark ()" + echo "" + fi + done + + echo "" + echo "#endif /* ${UPPER}_OIDS_ */" +} + +generate_source () +{ + echo "/* WARNING: file is autogenerated */" + echo "" + echo "#include \"$HEADER\"" + echo "" + + while read name oid; do + if [ -n "$name" ]; then + lname=$(echo "$name" | tr '[:upper:]' '[:lower:]') + echo "GQuark" + echo "_${LOWER}_oid_${lname}_get_quark (void)" + echo "{" + echo " static volatile gsize inited = 0;" + echo " static GQuark quark = 0;" + echo " if (g_once_init_enter (&inited)) {" + echo " quark = g_quark_from_static_string (\"${oid}\");" + echo " g_once_init_leave (&inited, 1);" + echo " }" + echo " return quark;" + echo "}" + echo "" + fi + done +} + +UPPER="PREFIX" +LOWER="prefix" + +while getopts 'c:h:p:' arg; do + case $arg in + p) + UPPER=$(echo "$OPTARG" | tr '[:lower:]' '[:upper:]') + LOWER=$(echo "$OPTARG" | tr '[:upper:]' '[:lower:]') + ;; + c) + SOURCE="$OPTARG" + ;; + h) + HEADER="$OPTARG" + ;; + *) + echo "gcr-mkoids: invalid argument: $arg" >&2 + exit 2 + ;; + esac +done + +shift $(expr $OPTIND - 1) +if [ $# -ne 1 ]; then + echo "gcr-mkoids: specify input file on command line" + exit 2 +fi + +INPUT="$1" + +if [ -n "$HEADER" ]; then + generate_header < $INPUT > $HEADER +fi +if [ -n "$SOURCE" ]; then + generate_source < $INPUT > $SOURCE +fi diff --git a/gcr/gcr-mock-prompter.c b/gcr/gcr-mock-prompter.c new file mode 100644 index 0000000..81a14c3 --- /dev/null +++ b/gcr/gcr-mock-prompter.c @@ -0,0 +1,1094 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-mock-prompter.h" +#include "gcr-prompt.h" + +#include "egg/egg-error.h" + +#include + +#include + +/** + * SECTION:gcr-mock-prompter + * @title: GcrMockPrompter + * @short_description: a mock GcrSystemPrompter for testing + * + * A mock GcrSystemPrompter used for testing against. + * + * Use gcr_mock_prompter_start() to start the mock prompter in another + * thread. The returned string is the dbus address of the mock prompter. + * You can pass this to gcr_system_prompt_open() as the prompter bus name. + * + * Use the gcr_mock_prompter_expect_confirm_ok() function and friends before + * prompting to verify that the prompts are displayed as expected, and to + * provide a response. + */ + +GType _gcr_mock_prompt_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_MOCK_PROMPT (_gcr_mock_prompt_get_type ()) +#define GCR_MOCK_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_MOCK_PROMPT, GcrMockPrompt)) +#define GCR_IS_MOCK_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_MOCK_PROMPT)) +#define GCR_IS_MOCK_PROMPT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_MOCK_PROMPT)) +#define GCR_MOCK_PROMPT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_MOCK_PROMPT, GcrMockPromptClass)) +#define GCR_MOCK_PROMPT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_MOCK_PROMPT, GcrMockPromptClass)) + +typedef struct _GcrMockPrompt GcrMockPrompt; +typedef struct _GcrMockPromptClass GcrMockPromptClass; +typedef struct _GcrMockPromptPrivate GcrMockPromptPrivate; + +enum { + PROP_0, + + PROP_TITLE, + PROP_MESSAGE, + PROP_DESCRIPTION, + PROP_WARNING, + PROP_PASSWORD_NEW, + PROP_PASSWORD_STRENGTH, + PROP_CHOICE_LABEL, + PROP_CHOICE_CHOSEN, + PROP_CALLER_WINDOW, + PROP_CONTINUE_LABEL, + PROP_CANCEL_LABEL, +}; + +struct _GcrMockPrompt { + GObject parent; + GHashTable *properties; + gboolean disposed; +}; + +struct _GcrMockPromptClass { + GObjectClass parent_class; +}; + +typedef struct { + gboolean close; + gboolean proceed; + gchar *password; + GList *properties; +} MockResponse; + +typedef struct { + /* Owned by the calling thread */ + GMutex *mutex; + GCond *start_cond; + GThread *thread; + + guint delay_msec; + GQueue responses; + + /* Owned by the prompter thread*/ + GcrSystemPrompter *prompter; + GDBusConnection *connection; + GMainLoop *loop; +} ThreadData; + +static gint prompts_a_prompting = 0; +static ThreadData *running = NULL; + +static void gcr_mock_prompt_iface (GcrPromptIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrMockPrompt, _gcr_mock_prompt, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_mock_prompt_iface); +); + +static void +mock_property_free (gpointer data) +{ + GParameter *param = data; + g_value_unset (¶m->value); + g_free (param); +} + +static void +mock_response_free (gpointer data) +{ + MockResponse *response = data; + + if (response == NULL) + return; + + g_free (response->password); + g_list_free_full (response->properties, mock_property_free); + g_free (response); +} + +static void +blank_string_property (GHashTable *properties, + const gchar *property) +{ + GParameter *param; + + param = g_new0 (GParameter, 1); + param->name = property; + g_value_init (¶m->value, G_TYPE_STRING); + g_value_set_string (¶m->value, ""); + g_hash_table_insert (properties, (gpointer)param->name, param); +} + + +static void +blank_boolean_property (GHashTable *properties, + const gchar *property) +{ + GParameter *param; + + param = g_new0 (GParameter, 1); + param->name = property; + g_value_init (¶m->value, G_TYPE_BOOLEAN); + g_value_set_boolean (¶m->value, FALSE); + g_hash_table_insert (properties, (gpointer)param->name, param); +} + +static void +blank_int_property (GHashTable *properties, + const gchar *property) +{ + GParameter *param; + + param = g_new0 (GParameter, 1); + param->name = property; + g_value_init (¶m->value, G_TYPE_INT); + g_value_set_int (¶m->value, 0); + g_hash_table_insert (properties, (gpointer)param->name, param); +} + +static void +_gcr_mock_prompt_init (GcrMockPrompt *self) +{ + g_atomic_int_add (&prompts_a_prompting, 1); + + self->properties = g_hash_table_new_full (g_str_hash, g_str_equal, + NULL, mock_property_free); + + blank_string_property (self->properties, "title"); + blank_string_property (self->properties, "message"); + blank_string_property (self->properties, "description"); + blank_string_property (self->properties, "warning"); + blank_string_property (self->properties, "choice-label"); + blank_string_property (self->properties, "caller-window"); + blank_string_property (self->properties, "continue-label"); + blank_string_property (self->properties, "cancel-label"); + + blank_boolean_property (self->properties, "choice-chosen"); + blank_boolean_property (self->properties, "password-new"); + + blank_int_property (self->properties, "password-strength"); +} + +static void +_gcr_mock_prompt_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrMockPrompt *self = GCR_MOCK_PROMPT (obj); + GParameter *param; + + switch (prop_id) { + case PROP_TITLE: + case PROP_MESSAGE: + case PROP_DESCRIPTION: + case PROP_WARNING: + case PROP_PASSWORD_NEW: + case PROP_CHOICE_LABEL: + case PROP_CHOICE_CHOSEN: + case PROP_CALLER_WINDOW: + case PROP_CONTINUE_LABEL: + case PROP_CANCEL_LABEL: + param = g_new0 (GParameter, 1); + param->name = pspec->name; + g_value_init (¶m->value, pspec->value_type); + g_value_copy (value, ¶m->value); + g_hash_table_replace (self->properties, (gpointer)param->name, param); + g_object_notify (G_OBJECT (self), param->name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_mock_prompt_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrMockPrompt *self = GCR_MOCK_PROMPT (obj); + GParameter *param; + + switch (prop_id) { + case PROP_TITLE: + case PROP_MESSAGE: + case PROP_DESCRIPTION: + case PROP_WARNING: + case PROP_PASSWORD_NEW: + case PROP_PASSWORD_STRENGTH: + case PROP_CHOICE_LABEL: + case PROP_CHOICE_CHOSEN: + case PROP_CALLER_WINDOW: + case PROP_CONTINUE_LABEL: + case PROP_CANCEL_LABEL: + param = g_hash_table_lookup (self->properties, pspec->name); + g_return_if_fail (param != NULL); + g_value_copy (¶m->value, value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + + +static void +_gcr_mock_prompt_dispose (GObject *obj) +{ + GcrMockPrompt *self = GCR_MOCK_PROMPT (obj); + + if (!self->disposed) { + g_atomic_int_add (&prompts_a_prompting, -1); + self->disposed = TRUE; + } + + G_OBJECT_CLASS (_gcr_mock_prompt_parent_class)->dispose (obj); +} + +static void +_gcr_mock_prompt_finalize (GObject *obj) +{ + GcrMockPrompt *self = GCR_MOCK_PROMPT (obj); + + g_hash_table_destroy(self->properties); + + G_OBJECT_CLASS (_gcr_mock_prompt_parent_class)->finalize (obj); +} + +static gboolean +value_equal (const GValue *a, const GValue *b) +{ + gboolean ret = FALSE; + + g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); + + switch (G_VALUE_TYPE (a)) { + case G_TYPE_BOOLEAN: + ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); + break; + case G_TYPE_UCHAR: + ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); + break; + case G_TYPE_INT: + ret = (g_value_get_int (a) == g_value_get_int (b)); + break; + case G_TYPE_UINT: + ret = (g_value_get_uint (a) == g_value_get_uint (b)); + break; + case G_TYPE_INT64: + ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); + break; + case G_TYPE_UINT64: + ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); + break; + case G_TYPE_DOUBLE: + ret = (g_value_get_double (a) == g_value_get_double (b)); + break; + case G_TYPE_STRING: + ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); + break; + default: + g_critical ("no support for comparing of type %s", g_type_name (G_VALUE_TYPE (a))); + break; + } + + return ret; +} + +static void +prompt_set_or_check_properties (GcrMockPrompt *self, + GList *properties) +{ + GValue value = G_VALUE_INIT; + GObjectClass *object_class; + GParameter *param; + GParamSpec *spec; + GList *l; + + object_class = G_OBJECT_GET_CLASS (self); + for (l = properties; l != NULL; l = g_list_next (l)) { + param = l->data; + + spec = g_object_class_find_property (object_class, param->name); + g_assert (spec != NULL); + + /* For these we set the value */ + if (g_str_equal (param->name, "choice-chosen")) { + g_object_set_property (G_OBJECT (self), param->name, ¶m->value); + + /* For others we check that the value is correct */ + } else { + g_value_init (&value, G_VALUE_TYPE (¶m->value)); + g_object_get_property (G_OBJECT (self), param->name, &value); + if (!value_equal (&value, ¶m->value)) { + gchar *expected = g_strdup_value_contents (¶m->value); + gchar *actual = g_strdup_value_contents (&value); + g_critical ("expected prompt property '%s' to be %s, but it " + "is instead %s", param->name, expected, actual); + g_free (expected); + g_free (actual); + } + g_value_unset (&value); + } + } +} + +static void +_gcr_mock_prompt_class_init (GcrMockPromptClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = _gcr_mock_prompt_get_property; + gobject_class->set_property = _gcr_mock_prompt_set_property; + gobject_class->dispose = _gcr_mock_prompt_dispose; + gobject_class->finalize = _gcr_mock_prompt_finalize; + + g_object_class_override_property (gobject_class, PROP_TITLE, "title"); + g_object_class_override_property (gobject_class, PROP_MESSAGE, "message"); + g_object_class_override_property (gobject_class, PROP_DESCRIPTION, "description"); + g_object_class_override_property (gobject_class, PROP_WARNING, "warning"); + g_object_class_override_property (gobject_class, PROP_CALLER_WINDOW, "caller-window"); + g_object_class_override_property (gobject_class, PROP_CHOICE_LABEL, "choice-label"); + g_object_class_override_property (gobject_class, PROP_CHOICE_CHOSEN, "choice-chosen"); + g_object_class_override_property (gobject_class, PROP_PASSWORD_NEW, "password-new"); + g_object_class_override_property (gobject_class, PROP_PASSWORD_STRENGTH, "password-strength"); + g_object_class_override_property (gobject_class, PROP_CONTINUE_LABEL, "continue-label"); + g_object_class_override_property (gobject_class, PROP_CANCEL_LABEL, "cancel-label"); +} + +static gboolean +on_timeout_complete (gpointer data) +{ + GSimpleAsyncResult *res = data; + g_simple_async_result_complete (res); + return FALSE; +} + +static gboolean +on_timeout_complete_and_close (gpointer data) +{ + GSimpleAsyncResult *res = data; + GcrPrompt *prompt = GCR_PROMPT (g_async_result_get_source_object (data)); + g_simple_async_result_complete (res); + gcr_prompt_close (prompt); + g_object_unref (prompt); + return FALSE; +} + +static void +destroy_unref_source (gpointer source) +{ + if (!g_source_is_destroyed (source)) + g_source_destroy (source); + g_source_unref (source); +} + +static void +gcr_mock_prompt_confirm_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrMockPrompt *self = GCR_MOCK_PROMPT (prompt); + GSourceFunc complete_func = on_timeout_complete; + GSimpleAsyncResult *res; + MockResponse *response; + GSource *source; + guint delay_msec; + + g_mutex_lock (running->mutex); + delay_msec = running->delay_msec; + response = g_queue_pop_head (&running->responses); + g_mutex_unlock (running->mutex); + + res = g_simple_async_result_new (G_OBJECT (prompt), callback, user_data, + gcr_mock_prompt_confirm_async); + + if (response == NULL) { + g_critical ("password prompt requested, but not expected"); + g_simple_async_result_set_op_res_gboolean (res, FALSE); + + } else if (response->close) { + complete_func = on_timeout_complete_and_close; + g_simple_async_result_set_op_res_gboolean (res, FALSE); + + } else if (response->password) { + g_critical ("confirmation prompt requested, but password prompt expected"); + g_simple_async_result_set_op_res_gboolean (res, FALSE); + + } else { + prompt_set_or_check_properties (self, response->properties); + g_simple_async_result_set_op_res_gboolean (res, response->proceed); + } + + if (delay_msec > 0) + source = g_timeout_source_new (delay_msec); + else + source = g_idle_source_new (); + + g_source_set_callback (source, complete_func, g_object_ref (res), g_object_unref); + g_source_attach (source, g_main_context_get_thread_default ()); + g_object_set_data_full (G_OBJECT (self), "delay-source", source, destroy_unref_source); + + mock_response_free (response); + g_object_unref (res); +} + +static GcrPromptReply +gcr_mock_prompt_confirm_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt), + gcr_mock_prompt_confirm_async), GCR_PROMPT_REPLY_CANCEL); + + return g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result)) ? + GCR_PROMPT_REPLY_CONTINUE : GCR_PROMPT_REPLY_CANCEL; +} + +static void +ensure_password_strength (GcrMockPrompt *self, + const gchar *password) +{ + GParameter *param; + gint strength; + + strength = strlen (password) > 0 ? 1 : 0; + param = g_new0 (GParameter, 1); + param->name = "password-strength"; + g_value_init (¶m->value, G_TYPE_INT); + g_value_set_int (¶m->value, strength); + g_hash_table_replace (self->properties, (gpointer)param->name, param); + g_object_notify (G_OBJECT (self), param->name); +} + +static void +gcr_mock_prompt_password_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrMockPrompt *self = GCR_MOCK_PROMPT (prompt); + GSourceFunc complete_func = on_timeout_complete; + GSimpleAsyncResult *res; + MockResponse *response; + GSource *source; + guint delay_msec; + + g_mutex_lock (running->mutex); + delay_msec = running->delay_msec; + response = g_queue_pop_head (&running->responses); + g_mutex_unlock (running->mutex); + + res = g_simple_async_result_new (G_OBJECT (prompt), callback, user_data, + gcr_mock_prompt_password_async); + + if (response == NULL) { + g_critical ("password prompt requested, but not expected"); + g_simple_async_result_set_op_res_gpointer (res, NULL, NULL); + + } else if (response->close) { + g_simple_async_result_set_op_res_gpointer (res, NULL, NULL); + complete_func = on_timeout_complete_and_close; + + } else if (!response->password) { + g_critical ("password prompt requested, but confirmation prompt expected"); + g_simple_async_result_set_op_res_gpointer (res, NULL, NULL); + + } else if (!response->proceed) { + prompt_set_or_check_properties (self, response->properties); + g_simple_async_result_set_op_res_gpointer (res, NULL, NULL); + + } else { + ensure_password_strength (self, response->password); + prompt_set_or_check_properties (self, response->properties); + g_simple_async_result_set_op_res_gpointer (res, response->password, g_free); + response->password = NULL; + } + + mock_response_free (response); + + if (delay_msec > 0) + source = g_timeout_source_new (delay_msec); + else + source = g_idle_source_new (); + + g_source_set_callback (source, complete_func, g_object_ref (res), g_object_unref); + g_source_attach (source, g_main_context_get_thread_default ()); + g_object_set_data_full (G_OBJECT (self), "delay-source", source, destroy_unref_source); + + g_object_unref (res); +} + + +static const gchar * +gcr_mock_prompt_password_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt), + gcr_mock_prompt_password_async), NULL); + + return g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); + +} + +static void +gcr_mock_prompt_iface (GcrPromptIface *iface) +{ + iface->prompt_confirm_async = gcr_mock_prompt_confirm_async; + iface->prompt_confirm_finish = gcr_mock_prompt_confirm_finish; + iface->prompt_password_async = gcr_mock_prompt_password_async; + iface->prompt_password_finish = gcr_mock_prompt_password_finish; +} + +static GList * +build_properties (GObjectClass *object_class, + const gchar *first_property, + va_list var_args) +{ + GList *result = NULL; + const gchar *name; + + name = first_property; + while (name) { + GValue value = G_VALUE_INIT; + GParameter *parameter; + GParamSpec *spec; + gchar *error = NULL; + + spec = g_object_class_find_property (object_class, name); + if (spec == NULL) { + g_warning ("prompt object class has no property named '%s'", name); + break; + } + + if ((spec->flags & G_PARAM_CONSTRUCT_ONLY) && !(spec->flags & G_PARAM_READABLE)) { + g_warning ("prompt property '%s' can't be set after construction", name); + break; + } + + G_VALUE_COLLECT_INIT (&value, spec->value_type, var_args, 0, &error); + if (error != NULL) { + g_warning ("%s", error); + g_free (error); + g_value_unset (&value); + break; + } + + parameter = g_new0 (GParameter, 1); + parameter->name = g_intern_string (name); + memcpy (¶meter->value, &value, sizeof (value)); + result = g_list_prepend (result, parameter); + + name = va_arg (var_args, gchar *); + } + + return result; +} + +/** + * gcr_mock_prompter_is_prompting: + * + * Check if the mock prompter is showing any prompts. + * + * Returns: whether prompting + */ +gboolean +gcr_mock_prompter_is_prompting (void) +{ + return g_atomic_int_get (&prompts_a_prompting) > 0; +} + +/** + * gcr_mock_prompter_get_delay_msec: + * + * Get the delay in milliseconds before the mock prompter completes + * an expected prompt. + * + * Returns: the delay + */ +guint +gcr_mock_prompter_get_delay_msec (void) +{ + guint delay_msec; + + g_assert (running != NULL); + g_mutex_lock (running->mutex); + delay_msec = running->delay_msec; + g_mutex_unlock (running->mutex); + + return delay_msec; +} + +/** + * gcr_mock_prompter_set_delay_msec: + * @delay_msec: prompt response delay in milliseconds + * + * Set the delay in milliseconds before the mock prompter completes + * an expected prompt. + */ +void +gcr_mock_prompter_set_delay_msec (guint delay_msec) +{ + g_assert (running != NULL); + g_mutex_lock (running->mutex); + running->delay_msec = delay_msec; + g_mutex_unlock (running->mutex); +} + +/** + * gcr_mock_prompter_expect_confirm_ok: + * @first_property_name: the first property name in the argument list or %NULL + * @...: properties to expect + * + * Queue an expected response on the mock prompter. + * + * Expects a confirmation prompt, and then confirms that prompt by + * simulating a click on the ok button. + * + * Additional property pairs for the prompt can be added in the argument + * list, in the same way that you would with g_object_new(). + * + * If the "choice-chosen" property is specified then that value will be + * set on the prompt as if the user had changed the value. + * + * All other properties will be checked against the prompt, and an error + * will occur if they do not match the value set on the prompt. + */ +void +gcr_mock_prompter_expect_confirm_ok (const gchar *first_property_name, + ...) +{ + MockResponse *response; + gpointer klass; + va_list var_args; + + g_assert (running != NULL); + + g_mutex_lock (running->mutex); + + response = g_new0 (MockResponse, 1); + response->password = NULL; + response->proceed = TRUE; + + klass = g_type_class_ref (GCR_TYPE_MOCK_PROMPT); + + va_start (var_args, first_property_name); + response->properties = build_properties (G_OBJECT_CLASS (klass), first_property_name, var_args); + va_end (var_args); + + g_type_class_unref (klass); + g_queue_push_tail (&running->responses, response); + g_mutex_unlock (running->mutex); +} + +/** + * gcr_mock_prompter_expect_confirm_cancel: + * + * Queue an expected response on the mock prompter. + * + * Expects a confirmation prompt, and then cancels that prompt. + */ +void +gcr_mock_prompter_expect_confirm_cancel (void) +{ + MockResponse *response; + + g_assert (running != NULL); + + g_mutex_lock (running->mutex); + + response = g_new0 (MockResponse, 1); + response->password = NULL; + response->proceed = FALSE; + + g_queue_push_tail (&running->responses, response); + + g_mutex_unlock (running->mutex); +} + +/** + * gcr_mock_prompter_expect_password_ok: + * @password: the password to return from the prompt + * @first_property_name: the first property name in the argument list or %NULL + * @...: properties to expect + * + * Queue an expected response on the mock prompter. + * + * Expects a password prompt, and returns @password as if the user had entered + * it and clicked the ok button. + * + * Additional property pairs for the prompt can be added in the argument + * list, in the same way that you would with g_object_new(). + * + * If the "choice-chosen" property is specified then that value will be + * set on the prompt as if the user had changed the value. + * + * All other properties will be checked against the prompt, and an error + * will occur if they do not match the value set on the prompt. + */ +void +gcr_mock_prompter_expect_password_ok (const gchar *password, + const gchar *first_property_name, + ...) +{ + MockResponse *response; + gpointer klass; + va_list var_args; + + g_assert (running != NULL); + g_assert (password != NULL); + + g_mutex_lock (running->mutex); + + response = g_new0 (MockResponse, 1); + response->password = g_strdup (password); + response->proceed = TRUE; + + klass = g_type_class_ref (GCR_TYPE_MOCK_PROMPT); + + va_start (var_args, first_property_name); + response->properties = build_properties (G_OBJECT_CLASS (klass), first_property_name, var_args); + va_end (var_args); + + g_type_class_unref (klass); + g_queue_push_tail (&running->responses, response); + + g_mutex_unlock (running->mutex); +} + +/** + * gcr_mock_prompter_expect_password_cancel: + * + * Queue an expected response on the mock prompter. + * + * Expects a password prompt, and then cancels that prompt. + */ +void +gcr_mock_prompter_expect_password_cancel (void) +{ + MockResponse *response; + + g_assert (running != NULL); + + g_mutex_lock (running->mutex); + + response = g_new0 (MockResponse, 1); + response->password = g_strdup (""); + response->proceed = FALSE; + + g_queue_push_tail (&running->responses, response); + + g_mutex_unlock (running->mutex); +} + +/** + * gcr_mock_prompter_expect_close: + * + * Queue an expected response on the mock prompter. + * + * Expects any prompt, and closes the prompt when it gets it. + */ +void +gcr_mock_prompter_expect_close (void) +{ + MockResponse *response; + + g_assert (running != NULL); + + g_mutex_lock (running->mutex); + + response = g_new0 (MockResponse, 1); + response->close = TRUE; + + g_queue_push_tail (&running->responses, response); + + g_mutex_unlock (running->mutex); +} + +/** + * gcr_mock_prompter_is_expecting: + * + * Check if the mock prompter is expecting a response. This will be %TRUE + * when one of the gcr_mock_prompter_expect_xxx() + * functions have been used to queue an expected prompt, but that prompt + * response has not be 'used' yet. + * + * Returns: whether expecting a prompt + */ +gboolean +gcr_mock_prompter_is_expecting (void) +{ + gboolean expecting; + + g_assert (running != NULL); + + g_mutex_lock (running->mutex); + + expecting = !g_queue_is_empty (&running->responses); + + g_mutex_unlock (running->mutex); + + return expecting; +} + +static gboolean +on_idle_signal_cond (gpointer user_data) +{ + GCond *cond = user_data; + g_cond_signal (cond); + return FALSE; /* Don't run again */ +} + +/* + * These next few functions test the new-prompt signals of + * GcrSystemPrompter. They should probably be in tests, but + * don't fit there nicely. + */ +static GcrPrompt * +on_new_prompt_skipped (GcrSystemPrompter *prompter, + gpointer user_data) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (prompter), NULL); + return NULL; +} + +static GcrPrompt * +on_new_prompt_creates (GcrSystemPrompter *prompter, + gpointer user_data) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (prompter), NULL); + return g_object_new (GCR_TYPE_MOCK_PROMPT, NULL); +} + +static GcrPrompt * +on_new_prompt_not_called (GcrSystemPrompter *prompter, + gpointer user_data) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (prompter), NULL); + g_return_val_if_reached (NULL); +} + +static gpointer +mock_prompter_thread (gpointer data) +{ + ThreadData *thread_data = data; + GDBusConnection *connection = NULL; + GMainContext *context; + GError *error = NULL; + GSource *idle; + gchar *address; + + g_mutex_lock (thread_data->mutex); + context = g_main_context_new (); + g_main_context_push_thread_default (context); + + /* + * Random choice between signals, and prompt-gtype style of creating + * GcrPrompt objects. + */ + + if (g_random_boolean ()) { + /* Allows GcrSystemPrompter to create the prompts directly */ + thread_data->prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE, + GCR_TYPE_MOCK_PROMPT); + + } else { + /* Create the prompt objects in signal handler */ + thread_data->prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE, 0); + g_signal_connect (thread_data->prompter, "new-prompt", G_CALLBACK (on_new_prompt_skipped), NULL); + g_signal_connect (thread_data->prompter, "new-prompt", G_CALLBACK (on_new_prompt_creates), NULL); + g_signal_connect (thread_data->prompter, "new-prompt", G_CALLBACK (on_new_prompt_not_called), NULL); + } + + address = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (error == NULL) { + connection = g_dbus_connection_new_for_address_sync (address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, NULL, &error); + if (error == NULL) { + thread_data->connection = connection; + gcr_system_prompter_register (GCR_SYSTEM_PROMPTER (thread_data->prompter), + connection); + } else { + g_critical ("couldn't create connection: %s", error->message); + g_error_free (error); + } + + g_free (address); + } + + if (error != NULL) { + g_critical ("mock prompter couldn't get session bus address: %s", + egg_error_message (error)); + g_clear_error (&error); + } + + thread_data->loop = g_main_loop_new (context, FALSE); + g_mutex_unlock (thread_data->mutex); + + idle = g_idle_source_new (); + g_source_set_callback (idle, on_idle_signal_cond, thread_data->start_cond, NULL); + g_source_attach (idle, context); + g_source_unref (idle); + + g_main_loop_run (thread_data->loop); + + g_mutex_lock (thread_data->mutex); + g_main_context_pop_thread_default (context); + + gcr_system_prompter_unregister (thread_data->prompter, TRUE); + g_object_unref (thread_data->prompter); + thread_data->prompter = NULL; + + if (connection) { + thread_data->connection = NULL; + + if (!g_dbus_connection_is_closed (connection)) { + if (!g_dbus_connection_flush_sync (connection, NULL, &error)) { + g_critical ("connection flush failed: %s", error->message); + g_error_free (error); + } + if (!g_dbus_connection_close_sync (connection, NULL, &error)) { + g_critical ("connection close failed: %s", error->message); + g_error_free (error); + } + } + + g_object_unref (connection); + } + + while (g_main_context_iteration (context, FALSE)); + + g_main_context_unref (context); + g_main_loop_unref (thread_data->loop); + thread_data->loop = NULL; + + g_mutex_unlock (thread_data->mutex); + return thread_data; +} + +/** + * gcr_mock_prompter_start: + * + * Start the mock prompter. This is often used from the + * setup() function of tests. + * + * Starts the mock prompter in an additional thread. Use the returned DBus bus + * name with gcr_system_prompt_open_for_prompter() to connect to this prompter. + * + * Returns: the bus name that the mock prompter is listening on + */ +const gchar * +gcr_mock_prompter_start (void) +{ + GError *error = NULL; + + g_assert (running == NULL); + + running = g_new0 (ThreadData, 1); + running->mutex = g_new0 (GMutex, 1); + g_mutex_init (running->mutex); + running->start_cond = g_new0 (GCond, 1); + g_cond_init (running->start_cond); + g_queue_init (&running->responses); + g_mutex_lock (running->mutex); + + running->thread = g_thread_new ("mock-prompter", mock_prompter_thread, running); + if (error != NULL) + g_error ("mock prompter couldn't start thread: %s", error->message); + + g_cond_wait (running->start_cond, running->mutex); + g_assert (running->loop); + g_assert (running->prompter); + g_mutex_unlock (running->mutex); + + return g_dbus_connection_get_unique_name (running->connection); +} + +/** + * gcr_mock_prompter_disconnect: + * + * Disconnect the mock prompter + */ +void +gcr_mock_prompter_disconnect (void) +{ + GError *error = NULL; + + g_assert (running != NULL); + g_assert (running->connection); + + g_dbus_connection_close_sync (running->connection, NULL, &error); + if (error != NULL) { + g_critical ("disconnect connection close failed: %s", error->message); + g_error_free (error); + } +} + +/** + * gcr_mock_prompter_stop: + * + * Stop the mock prompter. This is often used from the + * teardown() function of tests. + */ +void +gcr_mock_prompter_stop (void) +{ + ThreadData *check; + + g_assert (running != NULL); + + g_mutex_lock (running->mutex); + g_assert (running->loop != NULL); + g_main_loop_quit (running->loop); + g_mutex_unlock (running->mutex); + + check = g_thread_join (running->thread); + g_assert (check == running); + + g_queue_foreach (&running->responses, (GFunc)mock_response_free, NULL); + g_queue_clear (&running->responses); + + g_cond_clear (running->start_cond); + g_free (running->start_cond); + g_mutex_clear (running->mutex); + g_free (running->mutex); + + g_free (running); + running = NULL; +} diff --git a/gcr/gcr-mock-prompter.h b/gcr/gcr-mock-prompter.h new file mode 100644 index 0000000..369fd5f --- /dev/null +++ b/gcr/gcr-mock-prompter.h @@ -0,0 +1,64 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_MOCK_PROMPTER_H__ +#define __GCR_MOCK_PROMPTER_H__ + +#include "gcr-system-prompter.h" + +#include + +G_BEGIN_DECLS + +const gchar * gcr_mock_prompter_start (void); + +void gcr_mock_prompter_disconnect (void); + +void gcr_mock_prompter_stop (void); + +gboolean gcr_mock_prompter_is_prompting (void); + +guint gcr_mock_prompter_get_delay_msec (void); + +void gcr_mock_prompter_set_delay_msec (guint delay_msec); + +void gcr_mock_prompter_expect_confirm_ok (const gchar *first_property_name, + ...); + +void gcr_mock_prompter_expect_confirm_cancel (void); + +void gcr_mock_prompter_expect_password_ok (const gchar *password, + const gchar *first_property_name, + ...); + +void gcr_mock_prompter_expect_password_cancel (void); + +void gcr_mock_prompter_expect_close (void); + +gboolean gcr_mock_prompter_is_expecting (void); + +G_END_DECLS + +#endif /* __GCR_MOCK_PROMPTER_H__ */ diff --git a/gcr/gcr-oids.list b/gcr/gcr-oids.list new file mode 100644 index 0000000..cf94dba --- /dev/null +++ b/gcr/gcr-oids.list @@ -0,0 +1,48 @@ +NAME_CN 2.5.4.3 + +BASIC_CONSTRAINTS 2.5.29.19 +EXTENDED_KEY_USAGE 2.5.29.37 +SUBJECT_KEY_IDENTIFIER 2.5.29.14 +KEY_USAGE 2.5.29.15 +SUBJECT_ALT_NAME 2.5.29.17 + +PKIX1_RSA 1.2.840.113549.1.1.1 +PKIX1_SHA1_WITH_RSA 1.2.840.113549.1.1.5 +PKIX1_DSA 1.2.840.10040.4.1 +PKIX1_SHA1_WITH_DSA 1.2.840.10040.4.3 +PKIX1_EC 1.2.840.10045.2.1 +PKIX1_SHA1_WITH_ECDSA 1.2.840.10045.4.1 +PKIX1_SHA224_WITH_ECDSA 1.2.840.10045.4.3.1 +PKIX1_SHA256_WITH_ECDSA 1.2.840.10045.4.3.2 +PKIX1_SHA384_WITH_ECDSA 1.2.840.10045.4.3.3 +PKIX1_SHA512_WITH_ECDSA 1.2.840.10045.4.3.4 + +PKCS7_DATA 1.2.840.113549.1.7.1 +PKCS7_SIGNED_DATA 1.2.840.113549.1.7.2 +PKCS7_ENCRYPTED_DATA 1.2.840.113549.1.7.6 +PKCS9_ATTRIBUTE_FRIENDLY 1.2.840.113549.1.9.20 +PKCS9_ATTRIBUTE_LOCAL_KEY_ID 1.2.840.113549.1.9.21 +PKCS9_ATTRIBUTE_EXTENSION_REQ 1.2.840.113549.1.9.14 +PKCS12_BAG_PKCS8_KEY 1.2.840.113549.1.12.10.1.1 +PKCS12_BAG_PKCS8_ENCRYPTED_KEY 1.2.840.113549.1.12.10.1.2 +PKCS12_BAG_CERTIFICATE 1.2.840.113549.1.12.10.1.3 +PKCS12_BAG_CRL 1.2.840.113549.1.12.10.1.4 + +ALT_NAME_XMPP_ADDR 1.3.6.1.5.5.7.8.5 +ALT_NAME_DNS_SRV 1.3.6.1.5.5.7.8.7 + +EC_SECP192R1 1.2.840.10045.3.1.1 +EC_SECT163K1 1.3.132.0.1 +EC_SECT163R2 1.3.132.0.15 +EC_SECP224R1 1.3.132.0.33 +EC_SECT233K1 1.3.132.0.26 +EC_SECT233R1 1.3.132.0.27 +EC_SECP256R1 1.2.840.10045.3.1.7 +EC_SECT283K1 1.3.132.0.16 +EC_SECT283R1 1.3.132.0.17 +EC_SECP384R1 1.3.132.0.34 +EC_SECT409K1 1.3.132.0.36 +EC_SECT409R1 1.3.132.0.37 +EC_SECP521R1 1.3.132.0.35 +EC_SECP571K1 1.3.132.0.38 +EC_SECT571R1 1.3.132.0.39 diff --git a/gcr/gcr-openpgp.c b/gcr/gcr-openpgp.c new file mode 100644 index 0000000..0687430 --- /dev/null +++ b/gcr/gcr-openpgp.c @@ -0,0 +1,1308 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-openpgp.h" +#include "gcr-internal.h" +#include "gcr-record.h" +#include "gcr-types.h" + +#include "egg/egg-hex.h" + +#include + +#include + +typedef enum { + OPENPGP_PKT_RESERVED = 0, + OPENPGP_PKT_PUBKEY_ENC = 1, + OPENPGP_PKT_SIGNATURE = 2, + OPENPGP_PKT_ONEPASS_SIG = 4, + OPENPGP_PKT_SECRET_KEY = 5, + OPENPGP_PKT_PUBLIC_KEY = 6, + OPENPGP_PKT_SECRET_SUBKEY = 7, + OPENPGP_PKT_COMPRESSED = 8, + OPENPGP_PKT_MARKER = 10, + OPENPGP_PKT_LITERAL = 11, + OPENPGP_PKT_RING_TRUST = 12, + OPENPGP_PKT_USER_ID = 13, + OPENPGP_PKT_PUBLIC_SUBKEY = 14, + OPENPGP_PKT_OLD_COMMENT = 16, + OPENPGP_PKT_ATTRIBUTE = 17, + OPENPGP_PKT_MDC = 19 +} OpenpgpPktType; + +typedef enum { + OPENPGP_SIG_CREATION = 2, + OPENPGP_SIG_EXPIRY = 3, + OPENPGP_SIG_EXPORTABLE = 4, + OPENPGP_SIG_TRUST = 5, + OPENPGP_SIG_REGULAR_EXPRESSION = 6, + OPENPGP_SIG_REVOCABLE = 7, + OPENPGP_SIG_KEY_EXPIRY = 9, + OPENPGP_SIG_SYMMETRIC_ALGOS = 11, + OPENPGP_SIG_REVOCATION_KEY = 12, + OPENPGP_SIG_ISSUER = 16, + OPENPGP_SIG_NOTATION_DATA = 20, + OPENPGP_SIG_HASH_ALGOS = 21, + OPENPGP_SIG_COMPRESSION_ALGOS = 22, + OPENPGP_SIG_KEYSERVER_PREFS = 23, + OPENPGP_SIG_PREFERRED_KEYSERVER = 24, + OPENPGP_SIG_PRIMARY_USERID = 25, + OPENPGP_SIG_POLICY_URI = 26, + OPENPGP_SIG_KEY_FLAGS = 27, + OPENPGP_SIG_SIGNER_USERID = 28, + OPENPGP_SIG_REVOCATION_REASON = 29, + OPENPGP_SIG_FEATURES = 30, + OPENPGP_SIG_TARGET = 31, + OPENPGP_SIG_EMBEDDED_SIGNATURE = 32, +} OpenpgpSigPacket; + +static gboolean +read_byte (const guchar **at, + const guchar *end, + guint8 *result) +{ + g_assert (at); + if (*at == end) + *at = NULL; + if (*at == NULL) + return FALSE; + if (result) + *result = *(*at); + (*at)++; + return TRUE; +} + +static gboolean +read_bytes (const guchar **at, + const guchar *end, + gpointer buffer, + gsize length) +{ + g_assert (at); + if (*at + length > end) + *at = NULL; + if (*at == NULL) + return FALSE; + if (buffer != NULL) + memcpy (buffer, *at, length); + (*at) += length; + return TRUE; +} + +static gboolean +read_uint32 (const guchar **at, + const guchar *end, + guint32 *value) +{ + guchar buf[4]; + g_assert (at); + if (!read_bytes (at, end, buf, 4)) + return FALSE; + if (value) + *value = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]; + return TRUE; +} + +static gboolean +read_uint16 (const guchar **at, + const guchar *end, + guint16 *value) +{ + guchar buf[2]; + g_assert (at); + if (!read_bytes (at, end, buf, 2)) + return FALSE; + if (value) + *value = buf[0] << 8 | buf[1]; + return TRUE; +} + +static gboolean +read_mpi (const guchar **at, + const guchar *end, + guint16 *bits, + guchar **value) +{ + gsize bytes; + guint16 b; + g_assert (at); + if (!bits) + bits = &b; + if (!read_uint16 (at, end, bits)) + return FALSE; + bytes = (*bits + 7) / 8; + if (bytes == 0) + return FALSE; + if (value) + *value = g_malloc (bytes); + if (!read_bytes (at, end, value ? *value : NULL, bytes)) { + if (value) + g_free (*value); + return FALSE; + } + return TRUE; +} + +static gboolean +read_new_length (const guchar **at, + const guchar *end, + gsize *pkt_len) +{ + guint8 c, c1; + guint32 val; + + if (!read_byte (at, end, &c)) + return FALSE; + if (c < 192) { + *pkt_len = c; + } else if (c >= 192 && c <= 223) { + if (!read_byte (at, end, &c1)) + return FALSE; + *pkt_len = ((c - 192) << 8) + c1 + 192; + } else if (c == 255) { + if (!read_uint32 (at, end, &val)) + return FALSE; + *pkt_len = val; + } else { + /* We don't support partial length */ + return FALSE; + } + + return TRUE; +} + +static gboolean +read_old_length (const guchar **at, + const guchar *end, + guchar ctb, + gsize *pkt_len) +{ + gsize llen = ctb & 0x03; + guint16 v16; + guint32 v32; + guint8 c; + + if (llen == 0) { + if (!read_byte (at, end, &c)) + return FALSE; + *pkt_len = c; + } else if (llen == 1) { + if (!read_uint16 (at, end, &v16)) + return FALSE; + *pkt_len = v16; + } else if (llen == 2) { + if (!read_uint32 (at, end, &v32)) + return FALSE; + *pkt_len = v32; + } else { + *pkt_len = end - *at; + } + + return TRUE; +} + +static GcrDataError +read_openpgp_packet (const guchar **at, + const guchar *end, + guint8 *pkt_type, + gsize *length) +{ + gboolean new_ctb; + guint8 ctb; + gboolean ret; + + if (!read_byte (at, end, &ctb)) + return GCR_ERROR_UNRECOGNIZED; + if (!(ctb & 0x80)) + return GCR_ERROR_UNRECOGNIZED; + + /* RFC2440 packet format. */ + if (ctb & 0x40) { + *pkt_type = ctb & 0x3f; + new_ctb = TRUE; + + /* the old RFC1991 packet format. */ + } else { + *pkt_type = ctb & 0x3f; + *pkt_type >>= 2; + new_ctb = FALSE; + } + + if (*pkt_type > 63) + return GCR_ERROR_UNRECOGNIZED; + + if (new_ctb) + ret = read_new_length (at, end, length); + else + ret = read_old_length (at, end, ctb, length); + if (!ret) + return GCR_ERROR_UNRECOGNIZED; + + if ((*at) + *length > end) + return GCR_ERROR_FAILURE; + + return GCR_SUCCESS; +} + +static gchar * +hash_user_id_or_attribute (const guchar *beg, + const guchar *end) +{ + guint8 digest[20] = { 0, }; + + g_assert (beg != NULL); + g_assert (end > beg); + + gcry_md_hash_buffer (GCRY_MD_RMD160, digest, beg, end - beg); + return egg_hex_encode_full (digest, sizeof (digest), TRUE, NULL, 0); +} + +static gboolean +parse_v3_rsa_bits_and_keyid (const guchar **at, + const guchar *end, + guint16 *bits, + gchar **keyid) +{ + guchar *n; + gsize bytes; + + g_assert (bits); + g_assert (keyid); + + /* Read in the modulus */ + if (!read_mpi (at, end, bits, &n)) + return FALSE; + + /* Last 64-bits of modulus are keyid */ + bytes = (*bits + 7) / 8; + if (bytes < 8) { + g_free (n); + return FALSE; + } + + *keyid = egg_hex_encode_full (n + (bytes - 8), 8, TRUE, NULL, 0); + return TRUE; +} + +static gchar * +hash_v4_keyid (const guchar *data, + const guchar *end, + gchar **fingerprint) +{ + gcry_md_hd_t mdh; + gcry_error_t gcry; + guchar header[3]; + guint8 *digest; + gchar *keyid; + gsize len; + + /* + * Both primary and subkeys use the public key tag byte + * 0x99 to construct the hash. So we skip over that here. + */ + + g_assert (data != NULL); + g_assert (end > data); + + len = end - data; + g_return_val_if_fail (len < G_MAXUSHORT, NULL); + + header[0] = 0x99; + header[1] = len >> 8 & 0xff; + header[2] = len & 0xff; + + gcry = gcry_md_open (&mdh, GCRY_MD_SHA1, 0); + g_return_val_if_fail (gcry == 0, NULL); + + gcry_md_write (mdh, header, 3); + gcry_md_write (mdh, data, len); + + digest = gcry_md_read (mdh, 0); + keyid = egg_hex_encode_full (digest + 12, 8, TRUE, NULL, 0); + if (fingerprint) + *fingerprint = egg_hex_encode_full (digest, 20, TRUE, NULL, 0); + gcry_md_close (mdh); + + return keyid; +} + +static gboolean +parse_v4_algo_bits (const guchar **at, + const guchar *end, + guint8 algo, + guint16 *bits) +{ + switch (algo) { + case GCR_OPENPGP_ALGO_RSA: + case GCR_OPENPGP_ALGO_RSA_E: + case GCR_OPENPGP_ALGO_RSA_S: + if (!read_mpi (at, end, bits, NULL) || + !read_mpi (at, end, NULL, NULL)) + return FALSE; + return TRUE; + case GCR_OPENPGP_ALGO_DSA: + if (!read_mpi (at, end, bits, NULL) || + !read_mpi (at, end, NULL, NULL) || + !read_mpi (at, end, NULL, NULL) || + !read_mpi (at, end, NULL, NULL)) + return FALSE; + return TRUE; + case GCR_OPENPGP_ALGO_ELG_E: + if (!read_mpi (at, end, bits, NULL) || + !read_mpi (at, end, NULL, NULL) || + !read_mpi (at, end, NULL, NULL)) + return FALSE; + return TRUE; + default: /* Unsupported key */ + return FALSE; + } +} + +static const gchar * +default_caps_for_algo (guint8 algo) +{ + switch (algo) { + case GCR_OPENPGP_ALGO_RSA: + return "cse"; + case GCR_OPENPGP_ALGO_RSA_E: + return "e"; + case GCR_OPENPGP_ALGO_RSA_S: + return "s"; + case GCR_OPENPGP_ALGO_ELG_E: + return "e"; + case GCR_OPENPGP_ALGO_DSA: + return "sca"; + default: + return ""; + } +} + +static gboolean +parse_public_key_or_subkey (GQuark schema, + guint n_columns, + const guchar *beg, + const guchar **at, + const guchar *end, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + gchar *fingerprint = NULL; + gchar *keyid; + GcrRecord *record; + guint8 version; + guint32 timestamp; + guint16 ndays = 0; + guint8 algo; + guint16 bits; + gulong expiry; + const guchar *data; + + /* Start of actual key data in packet */ + data = *at; + + /* First byte is version */ + if (!read_byte (at, end, &version)) + return FALSE; + if (version < 2 || version > 4) + return FALSE; + + /* Next a 4 byte create date */ + if (!read_uint32 (at, end, ×tamp)) + return FALSE; + /* If version 2 or 3, validity days comes next */ + if (version < 4) { + if (!read_uint16 (at, end, &ndays)) + return FALSE; + } + + /* Algorithm */ + if (!read_byte (at, end, &algo)) + return FALSE; + + /* For version 2 and 3, only RSA, keyid is low 64-bits of modulus */ + if (version < 4) { + if (!parse_v3_rsa_bits_and_keyid (at, end, &bits, &keyid)) + return FALSE; + + /* For version 4 */ + } else { + if (!parse_v4_algo_bits (at, end, algo, &bits)) + return FALSE; + keyid = hash_v4_keyid (data, *at, &fingerprint); + } + + record = _gcr_record_new (schema, n_columns, ':'); + _gcr_record_set_uint (record, GCR_RECORD_KEY_BITS, bits); + _gcr_record_set_uint (record, GCR_RECORD_KEY_ALGO, algo); + _gcr_record_take_raw (record, GCR_RECORD_KEY_KEYID, keyid); + _gcr_record_set_ulong (record, GCR_RECORD_KEY_TIMESTAMP, timestamp); + if (schema != GCR_RECORD_SCHEMA_SEC && schema != GCR_RECORD_SCHEMA_SSB) + _gcr_record_set_raw (record, GCR_RECORD_PUB_CAPS, default_caps_for_algo (algo)); + + if (ndays > 0) { + expiry = (gulong)timestamp + ((gulong)ndays * 86400); + _gcr_record_set_ulong (record, GCR_RECORD_KEY_EXPIRY, expiry); + } + + g_ptr_array_add (records, record); + + if (fingerprint && (schema == GCR_RECORD_SCHEMA_PUB || schema == GCR_RECORD_SCHEMA_SEC)) { + record = _gcr_record_new (GCR_RECORD_SCHEMA_FPR, GCR_RECORD_FPR_MAX, ':'); + _gcr_record_take_raw (record, GCR_RECORD_FPR_FINGERPRINT, fingerprint); + g_ptr_array_add (records, record); + fingerprint = NULL; + } + + g_free (fingerprint); + return TRUE; +} + +static gboolean +parse_secret_key_or_subkey (GQuark schema, + const guchar *beg, + const guchar **at, + const guchar *end, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + /* + * Identical to a public key, with extra crap after it. The + * extra crap is hard to parse and doesn't add anything to + * the records, so just skip over it. + * + * Also don't print out trust, that doesn't make sense for + * secret keys. + */ + + if (!parse_public_key_or_subkey (schema, GCR_RECORD_SEC_MAX, + beg, at, end, flags, records)) + return FALSE; + + *at = end; + return TRUE; +} + +static gboolean +parse_user_id (const guchar *beg, + const guchar **at, + const guchar *end, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + gchar *string; + GcrRecord *record; + gchar *fingerprint; + + g_assert (at); + if (!*at || !end || *at > end) + return FALSE; + + string = g_strndup ((gchar *)*at, end - *at); + + fingerprint = hash_user_id_or_attribute (*at, end); + record = _gcr_record_new (GCR_RECORD_SCHEMA_UID, GCR_RECORD_UID_MAX, ':'); + _gcr_record_take_raw (record, GCR_RECORD_UID_FINGERPRINT, fingerprint); + _gcr_record_set_string (record, GCR_RECORD_UID_USERID, string); + g_free (string); + + g_ptr_array_add (records, record); + + *at = end; + return TRUE; +} + +static gboolean +parse_user_attribute_packet (const guchar *beg, + const guchar **at, + const guchar *end, + guchar subpkt_type, + GPtrArray *records) +{ + GcrRecord *record; + gchar *fingerprint; + + record = _gcr_record_new (GCR_RECORD_SCHEMA_XA1, GCR_RECORD_XA1_MAX, ':'); + _gcr_record_set_uint (record, GCR_RECORD_XA1_LENGTH, end - *at); + _gcr_record_set_uint (record, GCR_RECORD_XA1_TYPE, subpkt_type); + fingerprint = hash_user_id_or_attribute (*at, end); + _gcr_record_take_raw (record, GCR_RECORD_XA1_FINGERPRINT, fingerprint); + _gcr_record_set_base64 (record, GCR_RECORD_XA1_DATA, *at, end - *at); + + g_ptr_array_add (records, record); + + *at = end; + return TRUE; +} + +static gboolean +parse_user_attribute (const guchar *beg, + const guchar **at, + const guchar *end, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + gsize subpkt_len; + guint count = 0; + const guchar *start; + const guchar *subpkt_beg; + guint8 subpkt_type; + gchar *fingerprint; + gchar *string; + GcrRecord *record; + + start = *at; + while (*at != end) { + subpkt_beg = *at; + + if (!read_new_length (at, end, &subpkt_len) || + !read_byte (at, end, &subpkt_type)) + return FALSE; + + count++; + + if (flags & GCR_OPENPGP_PARSE_ATTRIBUTES) { + if (!parse_user_attribute_packet (subpkt_beg, at, + *at + (subpkt_len - 1), + subpkt_type, records)) + return FALSE; + + /* We already progressed one extra byte for the subpkt_type */ + } else { + *at += (subpkt_len - 1); + } + } + + fingerprint = hash_user_id_or_attribute (start, end); + string = g_strdup_printf ("%d %d", count, (guint)(*at - start)); + record = _gcr_record_new (GCR_RECORD_SCHEMA_UAT, GCR_RECORD_UAT_MAX, ':'); + _gcr_record_take_raw (record, GCR_RECORD_UAT_FINGERPRINT, fingerprint); + _gcr_record_take_raw (record, GCR_RECORD_UAT_COUNT_SIZE, string); + + g_ptr_array_add (records, record); + return TRUE; +} + +static gboolean +skip_signature_mpis (const guchar **at, + const guchar *end, + guint8 algo) +{ + switch (algo) { + + /* RSA signature value */ + case GCR_OPENPGP_ALGO_RSA: + return read_mpi (at, end, NULL, NULL); + + /* DSA values r and s */ + case GCR_OPENPGP_ALGO_DSA: + return read_mpi (at, end, NULL, NULL) && + read_mpi (at, end, NULL, NULL); + default: + return FALSE; + } +} + +static gboolean +parse_v3_signature (const guchar **at, + const guchar *end, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + guchar keyid[8]; + guint8 sig_type; + guint8 sig_len; + guint32 sig_time; + guint8 key_algo; + guint8 hash_algo; + guint16 left_bits; + GcrRecord *record; + gchar *value; + + if (!read_byte (at, end, &sig_len) || sig_len != 5) + return FALSE; + + if (!read_byte (at, end, &sig_type) || + !read_uint32 (at, end, &sig_time) || + !read_bytes (at, end, keyid, 8) || + !read_byte (at, end, &key_algo) || + !read_byte (at, end, &hash_algo) || + !read_uint16 (at, end, &left_bits) || + !skip_signature_mpis (at, end, key_algo)) + return FALSE; + + if (flags & GCR_OPENPGP_PARSE_SIGNATURES) { + record = _gcr_record_new (GCR_RECORD_SCHEMA_SIG, GCR_RECORD_SIG_MAX, ':'); + _gcr_record_set_uint (record, GCR_RECORD_SIG_ALGO, key_algo); + value = egg_hex_encode_full (keyid, sizeof (keyid), TRUE, NULL, 0); + _gcr_record_take_raw (record, GCR_RECORD_SIG_KEYID, value); + _gcr_record_set_ulong (record, GCR_RECORD_SIG_TIMESTAMP, sig_time); + value = g_strdup_printf ("%02xx", (guint)sig_type); + _gcr_record_take_raw (record, GCR_RECORD_SIG_CLASS, value); + g_ptr_array_add (records, record); + } + + return TRUE; +} + +typedef struct { + gulong key_expiry; + gboolean exportable; + gboolean primary; + guint8 key_flags; + GcrRecord *revocation; +} SigSubpacket; + +static gboolean +parse_v4_signature_revocation (const guchar **at, + const guchar *end, + GcrRecord *revocation) +{ + guchar fingerprint[20]; + gchar *value; + guint8 klass; + guint8 algo; + + if (!read_byte (at, end, &klass) || + !read_byte (at, end, &algo) || + !read_bytes (at, end, fingerprint, 20)) + return FALSE; + + _gcr_record_set_uint (revocation, GCR_RECORD_RVK_ALGO, algo); + value = egg_hex_encode_full (fingerprint, 20, TRUE, NULL, 0); + _gcr_record_take_raw (revocation, GCR_RECORD_RVK_FINGERPRINT, value); + value = g_strdup_printf ("%02X", (guint)klass); + _gcr_record_take_raw (revocation, GCR_RECORD_RVK_CLASS, value); + + return TRUE; +} + +static gboolean +parse_v4_signature_subpacket (const guchar **at, + const guchar *end, + guint8 sub_type, + GcrRecord *record, + SigSubpacket *subpkt) +{ + guchar keyid[8]; + guint32 when; + guint8 byte; + gboolean critical; + gchar *value; + + critical = (sub_type & 0x80) ? TRUE : FALSE; + sub_type &= ~0xC0; + + switch (sub_type) { + case OPENPGP_SIG_CREATION: + if (!read_uint32 (at, end, &when)) + return FALSE; + _gcr_record_set_ulong (record, GCR_RECORD_SIG_TIMESTAMP, when); + return TRUE; + case OPENPGP_SIG_ISSUER: + if (!read_bytes (at, end, keyid, 8)) + return FALSE; + value = egg_hex_encode_full (keyid, 8, TRUE, NULL, 0); + _gcr_record_take_raw (record, GCR_RECORD_SIG_KEYID, value); + return TRUE; + case OPENPGP_SIG_KEY_EXPIRY: + if (!read_uint32 (at, end, &when)) + return FALSE; + subpkt->key_expiry = when; + return TRUE; + case OPENPGP_SIG_EXPIRY: + if (!read_uint32 (at, end, &when)) + return FALSE; + _gcr_record_set_ulong (record, GCR_RECORD_SIG_EXPIRY, when); + return TRUE; + case OPENPGP_SIG_EXPORTABLE: + if (!read_byte (at, end, &byte)) + return FALSE; + if (byte != 0 && byte != 1) + return FALSE; + subpkt->exportable = (byte == 0 ? FALSE : TRUE); + return TRUE; + + case OPENPGP_SIG_PRIMARY_USERID: + if (!read_byte (at, end, &byte)) + return FALSE; + if (byte != 0 && byte != 1) + return FALSE; + subpkt->primary = byte; + return TRUE; + + case OPENPGP_SIG_KEY_FLAGS: + if (!read_byte (at, end, &byte)) + return FALSE; + *at = end; /* N octets of flags */ + subpkt->key_flags = byte; + return TRUE; + + case OPENPGP_SIG_SIGNER_USERID: + value = g_strndup ((gchar *)*at, end - *at); + _gcr_record_set_string (record, GCR_RECORD_SIG_USERID, value); + g_free (value); + return TRUE; + + case OPENPGP_SIG_REVOCATION_KEY: + _gcr_record_free (subpkt->revocation); + subpkt->revocation = _gcr_record_new (GCR_RECORD_SCHEMA_RVK, GCR_RECORD_RVK_MAX, ':'); + return parse_v4_signature_revocation (at, end, subpkt->revocation); + + /* Ignored */ + case OPENPGP_SIG_SYMMETRIC_ALGOS: + case OPENPGP_SIG_HASH_ALGOS: + case OPENPGP_SIG_COMPRESSION_ALGOS: + case OPENPGP_SIG_REVOCABLE: + case OPENPGP_SIG_TRUST: + case OPENPGP_SIG_REGULAR_EXPRESSION: + case OPENPGP_SIG_NOTATION_DATA: + case OPENPGP_SIG_KEYSERVER_PREFS: + case OPENPGP_SIG_PREFERRED_KEYSERVER: + case OPENPGP_SIG_POLICY_URI: + case OPENPGP_SIG_REVOCATION_REASON: + case OPENPGP_SIG_FEATURES: + case OPENPGP_SIG_TARGET: + case OPENPGP_SIG_EMBEDDED_SIGNATURE: + *at = end; + return TRUE; + + /* Unrecognized */ + default: + /* Critical, but not recognized */ + if (critical) + return FALSE; + *at = end; + return TRUE; + } + +} + +static gboolean +parse_v4_signature_subpackets (const guchar **at, + const guchar *end, + GcrRecord *record, + SigSubpacket *subpkt) +{ + gsize length; + guint8 sub_type; + const guchar *stop; + + while (*at != end) { + if (!read_new_length (at, end, &length) || + !read_byte (at, end, &sub_type) || + length == 0) + return FALSE; + + /* The length includes the sub_type */ + length--; + stop = *at + length; + if (stop > end) + return FALSE; + + /* Actually parse the sub packets */ + if (!parse_v4_signature_subpacket (at, stop, sub_type, record, subpkt)) + return FALSE; + if (*at != stop) + return FALSE; + } + + return TRUE; +} + +static GcrRecord * +uid_or_uat_find_for_self_signature (GPtrArray *records, + guint8 sig_type) +{ + GcrRecord *record; + GQuark schema; + + if (records->len == 0) + return NULL; + + switch (sig_type) { + /* Generic certification of a key or userid */ + case 0x10: case 0x11: case 0x12: case 0x13: + record = records->pdata[records->len - 1]; + schema = _gcr_record_get_schema (record); + if (schema == GCR_RECORD_SCHEMA_UID || + schema == GCR_RECORD_SCHEMA_UAT) + return record; + return NULL; + + default: + return NULL; + } + +} + +static GcrRecord * +key_or_sub_find_for_self_signature (GPtrArray *records, + guint8 sig_type, + const gchar *keyid) +{ + GcrRecord *record; + const gchar *check; + GQuark schema; + gint i; + + if (records->len == 0) + return NULL; + + switch (sig_type) { + /* Generic certification of a key or userid */ + case 0x10: case 0x11: case 0x12: case 0x13: + for (i = records->len - 1; i >= 0; i--) { + record = records->pdata[i]; + schema = _gcr_record_get_schema (record); + if (schema == GCR_RECORD_SCHEMA_PUB || schema == GCR_RECORD_SCHEMA_SEC) { + check = _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID); + return (check != NULL && g_str_equal (check, keyid)) ? record : NULL; + } + } + return NULL; + + /* (Primary) Subkey Binding Signature */ + case 0x18: case 0x19: + record = records->pdata[records->len - 1]; + schema = _gcr_record_get_schema (record); + if (schema == GCR_RECORD_SCHEMA_SUB) + return record; + return NULL; + + default: + return NULL; + } +} + +static void +pub_or_sub_set_key_caps (GcrRecord *record, + guint8 key_flags) +{ + GString *string; + GQuark schema; + + schema = _gcr_record_get_schema (record); + if (schema == GCR_RECORD_SCHEMA_SEC || schema == GCR_RECORD_SCHEMA_SSB) + return; + + string = g_string_sized_new (8); + if (key_flags & 0x02) + g_string_append_c (string, 's'); + if (key_flags & 0x01) + g_string_append_c (string, 'c'); + if (key_flags & 0x04 || key_flags & 0x08) + g_string_append_c (string, 'e'); + if (key_flags & 0x20) + g_string_append_c (string, 'a'); + + _gcr_record_take_raw (record, GCR_RECORD_PUB_CAPS, + g_string_free (string, FALSE)); +} + +static gboolean +parse_v4_signature (const guchar **at, + const guchar *end, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + guint8 sig_type; + guint8 key_algo; + guint8 hash_algo; + guint16 hashed_len; + guint16 unhashed_len; + guint16 left_bits; + GcrRecord *record; + GcrRecord *key, *uid; + const gchar *keyid; + gchar *value; + const guchar *stop; + gulong timestamp; + + /* Information to transfer back onto the key record */ + SigSubpacket subpkt = { 0, }; + subpkt.exportable = 1; + + if (!read_byte (at, end, &sig_type) || + !read_byte (at, end, &key_algo) || + !read_byte (at, end, &hash_algo) || + !read_uint16 (at, end, &hashed_len)) + return FALSE; + + /* Hashed subpackets which we use */ + record = _gcr_record_new (GCR_RECORD_SCHEMA_SIG, GCR_RECORD_SIG_MAX, ':'); + stop = *at + hashed_len; + if (stop > end || + !parse_v4_signature_subpackets (at, stop, record, &subpkt)) { + _gcr_record_free (record); + _gcr_record_free (subpkt.revocation); + return FALSE; + } + + /* Includes unhashed subpackets, which we skip over */ + if (!read_uint16 (at, end, &unhashed_len)) { + _gcr_record_free (record); + _gcr_record_free (subpkt.revocation); + return FALSE; + } + + stop = *at + unhashed_len; + if (stop > end || + !parse_v4_signature_subpackets (at, stop, record, &subpkt) || + !read_uint16 (at, end, &left_bits) || + !skip_signature_mpis (at, end, key_algo)) { + _gcr_record_free (record); + _gcr_record_free (subpkt.revocation); + return FALSE; + } + + if (subpkt.revocation) { + g_ptr_array_add (records, subpkt.revocation); + subpkt.revocation = NULL; + } + + /* Fill in information on previous key or subkey */ + keyid = _gcr_record_get_raw (record, GCR_RECORD_SIG_KEYID); + key = key_or_sub_find_for_self_signature (records, sig_type, keyid); + if (key != NULL) { + if (subpkt.key_expiry != 0) { + if (_gcr_record_get_ulong (key, GCR_RECORD_KEY_TIMESTAMP, ×tamp)) + _gcr_record_set_ulong (key, GCR_RECORD_KEY_EXPIRY, timestamp + subpkt.key_expiry); + } + if (subpkt.key_flags != 0) + pub_or_sub_set_key_caps (key, subpkt.key_flags); + } + + if (key && _gcr_record_get_schema (key) == GCR_RECORD_SCHEMA_PUB) { + uid = uid_or_uat_find_for_self_signature (records, sig_type); + if (uid != NULL) { + if (_gcr_record_get_ulong (record, GCR_RECORD_SIG_TIMESTAMP, ×tamp)) + _gcr_record_set_ulong (uid, GCR_RECORD_UID_TIMESTAMP, timestamp); + } + } + + if (flags & GCR_OPENPGP_PARSE_SIGNATURES) { + _gcr_record_set_uint (record, GCR_RECORD_SIG_ALGO, key_algo); + value = g_strdup_printf ("%02x%s", (guint)sig_type, + subpkt.exportable ? "x" : "l"); + _gcr_record_take_raw (record, GCR_RECORD_SIG_CLASS, value); + g_ptr_array_add (records, record); + } else { + _gcr_record_free (record); + } + + return TRUE; +} + +static gboolean +parse_signature (const guchar *beg, + const guchar **at, + const guchar *end, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + guint8 version; + + if (!read_byte (at, end, &version)) + return FALSE; + + if (version == 3) + return parse_v3_signature (at, end, flags, records); + else if (version == 4) + return parse_v4_signature (at, end, flags, records); + else + return FALSE; +} + +static GcrDataFormat +parse_openpgp_packet (const guchar *beg, + const guchar *at, + const guchar *end, + guint8 pkt_type, + GcrOpenpgpParseFlags flags, + GPtrArray *records) +{ + gboolean ret; + + switch (pkt_type) { + case OPENPGP_PKT_PUBLIC_KEY: + ret = parse_public_key_or_subkey (GCR_RECORD_SCHEMA_PUB, GCR_RECORD_PUB_MAX, + beg, &at, end, flags, records); + break; + case OPENPGP_PKT_PUBLIC_SUBKEY: + ret = parse_public_key_or_subkey (GCR_RECORD_SCHEMA_SUB, GCR_RECORD_PUB_MAX, + beg, &at, end, flags, records); + break; + case OPENPGP_PKT_USER_ID: + ret = parse_user_id (beg, &at, end, flags, records); + break; + case OPENPGP_PKT_ATTRIBUTE: + ret = parse_user_attribute (beg, &at, end, flags, records); + break; + case OPENPGP_PKT_SIGNATURE: + ret = parse_signature (beg, &at, end, flags, records); + break; + case OPENPGP_PKT_SECRET_KEY: + ret = parse_secret_key_or_subkey (GCR_RECORD_SCHEMA_SEC, + beg, &at, end, flags, records); + break; + case OPENPGP_PKT_SECRET_SUBKEY: + ret = parse_secret_key_or_subkey (GCR_RECORD_SCHEMA_SSB, + beg, &at, end, flags, records); + break; + + /* Stuff we don't want to be meddling with right now */ + case OPENPGP_PKT_RING_TRUST: + return GCR_SUCCESS; + + /* Ignore packets we don't understand */ + default: + return GCR_SUCCESS; + } + + /* Key packet had extra data */ + if (ret == TRUE && at != end) + ret = FALSE; + + return ret ? GCR_SUCCESS : GCR_ERROR_FAILURE; +} + +static void +append_key_capabilities (GString *string, + const gchar *caps) +{ + guint i; + gchar cap; + + for (i = 0; caps[i] != 0; i++) { + cap = g_ascii_toupper (caps[i]); + if (!strchr (string->str, cap)) + g_string_append_c (string, cap); + } +} + +static void +normalize_capabilities (GPtrArray *records) +{ + GString *string; + GQuark schema; + const gchar *caps; + guint i; + + /* Gather the capabilities of all subkeys into the primary key */ + string = g_string_new (_gcr_record_get_raw (records->pdata[0], GCR_RECORD_PUB_CAPS)); + for (i = 0; i < records->len; i++) { + schema = _gcr_record_get_schema (records->pdata[i]); + if (schema == GCR_RECORD_SCHEMA_PUB || schema == GCR_RECORD_SCHEMA_SUB) { + caps = _gcr_record_get_raw (records->pdata[i], GCR_RECORD_PUB_CAPS); + append_key_capabilities (string, caps); + } + } + _gcr_record_take_raw (records->pdata[0], GCR_RECORD_PUB_CAPS, + g_string_free (string, FALSE)); +} + +static gboolean +check_key_expiry (GcrRecord *record) +{ + gulong expiry; + time_t current; + + if (_gcr_record_get_ulong (record, GCR_RECORD_KEY_EXPIRY, &expiry)) { + if (expiry == 0) + return FALSE; + current = time (NULL); + if (current > expiry) + return TRUE; + } + + return FALSE; +} + +static void +normalize_key_records (GPtrArray *records) +{ + GQuark schema; + guchar trust = 0; + const gchar *prev; + gboolean force = FALSE; + guint i; + + if (records->len == 0) + return; + + schema = _gcr_record_get_schema (records->pdata[0]); + if (schema == GCR_RECORD_SCHEMA_PUB) { + + if (check_key_expiry (records->pdata[0])) { + trust = 'e'; + force = TRUE; + + /* Mark public keys as unknown trust */ + } else { + normalize_capabilities (records); + trust = 'o'; + force = FALSE; + } + + /* Ownertrust unknown, new to system */ + _gcr_record_set_char (records->pdata[0], GCR_RECORD_KEY_OWNERTRUST, 'o'); + + } else if (schema == GCR_RECORD_SCHEMA_SEC) { + + /* Trust doesn't make sense for secret keys */ + trust = 0; + force = FALSE; + } + + + /* Setup default trust if necessary */ + if (trust != 0) { + for (i = 0; i < records->len; i++) { + if (!force) { + prev = _gcr_record_get_raw (records->pdata[i], GCR_RECORD_TRUST); + if (prev != NULL && prev[0]) + continue; + } + schema = _gcr_record_get_schema (records->pdata[i]); + if (schema != GCR_RECORD_SCHEMA_SIG && schema != GCR_RECORD_SCHEMA_FPR) + _gcr_record_set_char (records->pdata[i], GCR_RECORD_TRUST, trust); + } + } +} + +typedef struct { + GcrOpenpgpCallback callback; + gpointer user_data; + guint count; + GBytes *backing; + GPtrArray *records; +} openpgp_parse_closure; + +static void +openpgp_parse_free (gpointer data) +{ + openpgp_parse_closure *closure = data; + g_ptr_array_unref (closure->records); + g_bytes_unref (closure->backing); + g_free (closure); +} + +static void +maybe_emit_openpgp_block (openpgp_parse_closure *closure, + const guchar *block, + const guchar *end) +{ + GBytes *outer; + gsize length; + GPtrArray *records; + + if (block == NULL || block == end) + return; + + g_assert (end != NULL); + g_assert (end > block); + + length = end - block; + closure->count++; + + records = closure->records; + closure->records = g_ptr_array_new_with_free_func (_gcr_record_free); + + outer = g_bytes_new_with_free_func (block, length, (GDestroyNotify)g_bytes_unref, + g_bytes_ref (closure->backing)); + if (closure->callback) + (closure->callback) (records, outer, closure->user_data); + g_bytes_unref (outer); + + g_ptr_array_unref (records); +} + +guint +_gcr_openpgp_parse (GBytes *data, + GcrOpenpgpParseFlags flags, + GcrOpenpgpCallback callback, + gpointer user_data) +{ + openpgp_parse_closure *closure; + const guchar *at; + const guchar *beg; + const guchar *end; + const guchar *block; + guint8 pkt_type; + GcrDataError res; + gsize length; + gboolean new_key; + guint ret; + + g_return_val_if_fail (data != NULL, 0); + + /* For libgcrypt */ + _gcr_initialize_library (); + + at = g_bytes_get_data (data, NULL); + end = at + g_bytes_get_size (data); + block = NULL; + + closure = g_new0 (openpgp_parse_closure, 1); + closure->callback = callback; + closure->user_data = user_data; + closure->backing = g_bytes_ref (data); + closure->records = g_ptr_array_new_with_free_func (_gcr_record_free); + + while (at != NULL && at != end) { + beg = at; + res = read_openpgp_packet (&at, end, &pkt_type, &length); + + if (res == GCR_SUCCESS) { + new_key = (pkt_type == OPENPGP_PKT_PUBLIC_KEY || + pkt_type == OPENPGP_PKT_SECRET_KEY); + if (flags & GCR_OPENPGP_PARSE_KEYS && new_key) + normalize_key_records (closure->records); + /* Start of a new set of packets, per key */ + if (!(flags & GCR_OPENPGP_PARSE_KEYS) || new_key) { + maybe_emit_openpgp_block (closure, block, beg); + block = beg; + } + if (!(flags & GCR_OPENPGP_PARSE_NO_RECORDS)) + parse_openpgp_packet (beg, at, at + length, pkt_type, + flags, closure->records); + } + + if (res != GCR_SUCCESS) { + if (block != NULL && block != beg) + maybe_emit_openpgp_block (closure, block, beg); + block = NULL; + break; + } + + at += length; + } + + if (flags & GCR_OPENPGP_PARSE_KEYS) + normalize_key_records (closure->records); + maybe_emit_openpgp_block (closure, block, at); + ret = closure->count; + openpgp_parse_free (closure); + return ret; +} diff --git a/gcr/gcr-openpgp.h b/gcr/gcr-openpgp.h new file mode 100644 index 0000000..f4825e1 --- /dev/null +++ b/gcr/gcr-openpgp.h @@ -0,0 +1,62 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GCR_OPENPGP_H__ +#define __GCR_OPENPGP_H__ + +#include + +#include + +typedef enum { + GCR_OPENPGP_ALGO_RSA = 1, + GCR_OPENPGP_ALGO_RSA_E = 2, + GCR_OPENPGP_ALGO_RSA_S = 3, + GCR_OPENPGP_ALGO_ELG_E = 16, + GCR_OPENPGP_ALGO_DSA = 17 +} GcrOpenpgpAlgo; + +typedef enum { + GCR_OPENPGP_PARSE_NONE = 0, + GCR_OPENPGP_PARSE_KEYS = 1 << 1, + GCR_OPENPGP_PARSE_NO_RECORDS = 1 << 2, + GCR_OPENPGP_PARSE_SIGNATURES = 1 << 3, + GCR_OPENPGP_PARSE_ATTRIBUTES = 1 << 4, +} GcrOpenpgpParseFlags; + +G_BEGIN_DECLS + +typedef void (*GcrOpenpgpCallback) (GPtrArray *records, + GBytes *outer, + gpointer user_data); + +guint _gcr_openpgp_parse (GBytes *data, + GcrOpenpgpParseFlags flags, + GcrOpenpgpCallback callback, + gpointer user_data); + +G_END_DECLS + +#endif /* __GCR_OPENPGP_H__ */ diff --git a/gcr/gcr-openssh.c b/gcr/gcr-openssh.c new file mode 100644 index 0000000..af4d550 --- /dev/null +++ b/gcr/gcr-openssh.c @@ -0,0 +1,604 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-openssh.h" +#include "gcr-internal.h" +#include "gcr-types.h" + +#include "gcr/gcr-oids.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-buffer.h" +#include "egg/egg-decimal.h" + +#include + +#include + +typedef struct { + GcrOpensshPubCallback callback; + gpointer user_data; +} OpensshPubClosure; + +static void +skip_spaces (const gchar ** line, + gsize *n_line) +{ + while (*n_line > 0 && (*line)[0] == ' ') { + (*line)++; + (*n_line)--; + } +} + +static gboolean +next_word (const gchar **line, + gsize *n_line, + const gchar **word, + gsize *n_word) +{ + const gchar *beg; + const gchar *end; + const gchar *at; + gboolean quotes; + + skip_spaces (line, n_line); + + if (!*n_line) { + *word = NULL; + *n_word = 0; + return FALSE; + } + + beg = at = *line; + end = beg + *n_line; + quotes = FALSE; + + do { + switch (*at) { + case '"': + quotes = !quotes; + at++; + break; + case ' ': + if (!quotes) + end = at; + else + at++; + break; + default: + at++; + break; + } + } while (at < end); + + *word = beg; + *n_word = end - beg; + (*line) += *n_word; + (*n_line) -= *n_word; + return TRUE; +} + +static gboolean +match_word (const gchar *word, + gsize n_word, + const gchar *matches) +{ + gsize len = strlen (matches); + if (len != n_word) + return FALSE; + return memcmp (word, matches, n_word) == 0; +} + +static gulong +keytype_to_algo (const gchar *algo, + gsize length) +{ + if (!algo) + return G_MAXULONG; + else if (match_word (algo, length, "ssh-rsa")) + return CKK_RSA; + else if (match_word (algo, length, "ssh-dss")) + return CKK_DSA; + else if (length >= 6 && strncmp (algo, "ecdsa-", 6) == 0) + return CKK_ECDSA; + return G_MAXULONG; +} + +static gboolean +read_decimal_mpi (const gchar *decimal, + gsize n_decimal, + GckBuilder *builder, + gulong attribute_type) +{ + gpointer data; + gsize n_data; + + data = egg_decimal_decode (decimal, n_decimal, &n_data); + if (data == NULL) + return FALSE; + + gck_builder_add_data (builder, attribute_type, data, n_data); + g_free (data); + return TRUE; +} + +static gint +atoin (const char *p, gint digits) +{ + gint ret = 0, base = 1; + while(--digits >= 0) { + if (p[digits] < '0' || p[digits] > '9') + return -1; + ret += (p[digits] - '0') * base; + base *= 10; + } + return ret; +} + +static GcrDataError +parse_v1_public_line (const gchar *line, + gsize length, + GBytes *backing, + GcrOpensshPubCallback callback, + gpointer user_data) +{ + const gchar *word_bits, *word_exponent, *word_modulus, *word_options, *outer; + gsize len_bits, len_exponent, len_modulus, len_options, n_outer; + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + gchar *label, *options; + GBytes *bytes; + gint bits; + + g_assert (line); + + outer = line; + n_outer = length; + options = NULL; + label = NULL; + + /* Eat space at the front */ + skip_spaces (&line, &length); + + /* Blank line or comment */ + if (length == 0 || line[0] == '#') + return GCR_ERROR_UNRECOGNIZED; + + /* + * If the line starts with a digit, then no options: + * + * 2048 35 25213680043....93533757 Label + * + * If the line doesn't start with a digit, then have options: + * + * option,option 2048 35 25213680043....93533757 Label + */ + if (g_ascii_isdigit (line[0])) { + word_options = NULL; + len_options = 0; + } else { + if (!next_word (&line, &length, &word_options, &len_options)) + return GCR_ERROR_UNRECOGNIZED; + } + + if (!next_word (&line, &length, &word_bits, &len_bits) || + !next_word (&line, &length, &word_exponent, &len_exponent) || + !next_word (&line, &length, &word_modulus, &len_modulus)) + return GCR_ERROR_UNRECOGNIZED; + + bits = atoin (word_bits, len_bits); + if (bits <= 0) + return GCR_ERROR_UNRECOGNIZED; + + if (!read_decimal_mpi (word_exponent, len_exponent, &builder, CKA_PUBLIC_EXPONENT) || + !read_decimal_mpi (word_modulus, len_modulus, &builder, CKA_MODULUS)) { + gck_builder_clear (&builder); + return GCR_ERROR_UNRECOGNIZED; + } + + gck_builder_add_ulong (&builder, CKA_KEY_TYPE, CKK_RSA); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); + + skip_spaces (&line, &length); + if (length > 0) { + label = g_strndup (line, length); + g_strstrip (label); + gck_builder_add_string (&builder, CKA_LABEL, label); + } + + if (word_options) + options = g_strndup (word_options, len_options); + + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + if (callback != NULL) { + bytes = g_bytes_new_with_free_func (outer, n_outer, + (GDestroyNotify)g_bytes_unref, + g_bytes_ref (backing)); + (callback) (attrs, label, options, bytes, user_data); + g_bytes_unref (bytes); + } + + gck_attributes_unref (attrs); + g_free (options); + g_free (label); + return GCR_SUCCESS; +} + +static gboolean +read_buffer_mpi_to_der (EggBuffer *buffer, + gsize *offset, + GckBuilder *builder, + gulong attribute_type) +{ + const guchar *data, *data_value; + GBytes *der_data = NULL; + gsize len, data_len; + GNode *asn = NULL; + gboolean rv = FALSE; + + if (!egg_buffer_get_byte_array (buffer, *offset, offset, &data, &len)) + return FALSE; + + asn = egg_asn1x_create (pk_asn1_tab, "ECPoint"); + if (!asn) + return FALSE; + + egg_asn1x_set_string_as_raw (asn, (guchar *)data, len, NULL); + der_data = egg_asn1x_encode (asn, g_realloc); + if (!der_data) + goto out; + + data_value = g_bytes_get_data (der_data, &data_len); + gck_builder_add_data (builder, attribute_type, data_value, data_len); + rv = TRUE; +out: + g_bytes_unref (der_data); + egg_asn1x_destroy (asn); + return rv; +} + +static gboolean +read_buffer_mpi (EggBuffer *buffer, + gsize *offset, + GckBuilder *builder, + gulong attribute_type) +{ + const guchar *data; + gsize len; + + if (!egg_buffer_get_byte_array (buffer, *offset, offset, &data, &len)) + return FALSE; + + gck_builder_add_data (builder, attribute_type, data, len); + return TRUE; +} + +static gboolean +read_v2_public_dsa (EggBuffer *buffer, + gsize *offset, + GckBuilder *builder) +{ + if (!read_buffer_mpi (buffer, offset, builder, CKA_PRIME) || + !read_buffer_mpi (buffer, offset, builder, CKA_SUBPRIME) || + !read_buffer_mpi (buffer, offset, builder, CKA_BASE) || + !read_buffer_mpi (buffer, offset, builder, CKA_VALUE)) { + return FALSE; + } + + gck_builder_add_ulong (builder, CKA_KEY_TYPE, CKK_DSA); + gck_builder_add_ulong (builder, CKA_CLASS, CKO_PUBLIC_KEY); + + return TRUE; +} + +static gboolean +read_v2_public_rsa (EggBuffer *buffer, + gsize *offset, + GckBuilder *builder) +{ + if (!read_buffer_mpi (buffer, offset, builder, CKA_PUBLIC_EXPONENT) || + !read_buffer_mpi (buffer, offset, builder, CKA_MODULUS)) { + return FALSE; + } + + gck_builder_add_ulong (builder, CKA_KEY_TYPE, CKK_RSA); + gck_builder_add_ulong (builder, CKA_CLASS, CKO_PUBLIC_KEY); + + return TRUE; +} + +static gboolean +read_v2_public_ecdsa (EggBuffer *buffer, + gsize *offset, + GckBuilder *builder) +{ + gconstpointer data; + GBytes *bytes; + GNode *asn; + GNode *node; + gchar *curve; + GQuark oid; + gsize len; + + /* The named curve */ + if (!egg_buffer_get_string (buffer, *offset, offset, + &curve, (EggBufferAllocator)g_realloc)) + return FALSE; + + if (g_strcmp0 (curve, "nistp256") == 0) { + oid = GCR_OID_EC_SECP256R1; + } else if (g_strcmp0 (curve, "nistp384") == 0) { + oid = GCR_OID_EC_SECP384R1; + } else if (g_strcmp0 (curve, "nistp521") == 0) { + oid = GCR_OID_EC_SECP521R1; + } else { + g_free (curve); + g_message ("unknown or unsupported curve in ssh public key"); + return FALSE; + } + + g_free (curve); + + asn = egg_asn1x_create (pk_asn1_tab, "ECParameters"); + g_return_val_if_fail (asn != NULL, FALSE); + + node = egg_asn1x_node (asn, "namedCurve", NULL); + if (!egg_asn1x_set_choice (asn, node)) + g_return_val_if_reached (FALSE); + + if (!egg_asn1x_set_oid_as_quark (node, oid)) + g_return_val_if_reached (FALSE); + + bytes = egg_asn1x_encode (asn, g_realloc); + g_return_val_if_fail (bytes != NULL, FALSE); + egg_asn1x_destroy (asn); + + data = g_bytes_get_data (bytes, &len); + gck_builder_add_data (builder, CKA_EC_PARAMS, data, len); + g_bytes_unref (bytes); + + /* need to convert to DER encoded OCTET STRING */ + if (!read_buffer_mpi_to_der (buffer, offset, builder, CKA_EC_POINT)) + return FALSE; + + gck_builder_add_ulong (builder, CKA_KEY_TYPE, CKK_ECDSA); + gck_builder_add_ulong (builder, CKA_CLASS, CKO_PUBLIC_KEY); + + return TRUE; +} + +static gboolean +read_v2_public_key (gulong algo, + gconstpointer data, + gsize n_data, + GckBuilder *builder) +{ + EggBuffer buffer; + gboolean ret; + gsize offset; + gchar *stype; + int alg; + + egg_buffer_init_static (&buffer, data, n_data); + offset = 0; + + /* The string algorithm */ + if (!egg_buffer_get_string (&buffer, offset, &offset, + &stype, (EggBufferAllocator)g_realloc)) + return FALSE; + + alg = keytype_to_algo (stype, stype ? strlen (stype) : 0); + g_free (stype); + + if (alg != algo) { + g_message ("invalid or mis-matched algorithm in ssh public key: %s", stype); + egg_buffer_uninit (&buffer); + return FALSE; + } + + switch (algo) { + case CKK_RSA: + ret = read_v2_public_rsa (&buffer, &offset, builder); + break; + case CKK_DSA: + ret = read_v2_public_dsa (&buffer, &offset, builder); + break; + case CKK_ECDSA: + ret = read_v2_public_ecdsa (&buffer, &offset, builder); + break; + default: + g_assert_not_reached (); + break; + } + + egg_buffer_uninit (&buffer); + return ret; +} + +static gboolean +decode_v2_public_key (gulong algo, + const gchar *data, + gsize n_data, + GckBuilder *builder) +{ + gpointer decoded; + gsize n_decoded; + gboolean ret; + guint save; + gint state; + + /* Decode the base64 key */ + save = state = 0; + decoded = g_malloc (n_data * 3 / 4); + n_decoded = g_base64_decode_step ((gchar*)data, n_data, decoded, &state, &save); + + if (!n_decoded) { + g_free (decoded); + return FALSE; + } + + /* Parse the actual key */ + ret = read_v2_public_key (algo, decoded, n_decoded, builder); + + g_free (decoded); + + return ret; +} + +static GcrDataError +parse_v2_public_line (const gchar *line, + gsize length, + GBytes *backing, + GcrOpensshPubCallback callback, + gpointer user_data) +{ + const gchar *word_options, *word_algo, *word_key; + gsize len_options, len_algo, len_key; + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attrs; + gchar *options; + gchar *label = NULL; + const gchar *outer = line; + gsize n_outer = length; + GBytes *bytes; + gulong algo; + + g_assert (line); + + /* Eat space at the front */ + skip_spaces (&line, &length); + + /* Blank line or comment */ + if (length == 0 || line[0] == '#') + return GCR_ERROR_UNRECOGNIZED; + + if (!next_word (&line, &length, &word_algo, &len_algo)) + return GCR_ERROR_UNRECOGNIZED; + + /* + * If the first word is not the algorithm, then we have options: + * + * option,option ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAI...EAz8Ji= Label here + * + * If the first word is the algorithm, then we have no options: + * + * ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAI...EAz8Ji= Label here + */ + algo = keytype_to_algo (word_algo, len_algo); + if (algo == G_MAXULONG) { + word_options = word_algo; + len_options = len_algo; + if (!next_word (&line, &length, &word_algo, &len_algo)) + return GCR_ERROR_UNRECOGNIZED; + algo = keytype_to_algo (word_algo, len_algo); + if (algo == G_MAXULONG) + return GCR_ERROR_UNRECOGNIZED; + } else { + word_options = NULL; + len_options = 0; + } + + /* Must have at least two words */ + if (!next_word (&line, &length, &word_key, &len_key)) + return GCR_ERROR_FAILURE; + + if (!decode_v2_public_key (algo, word_key, len_key, &builder)) { + gck_builder_clear (&builder); + return GCR_ERROR_FAILURE; + } + + if (word_options) + options = g_strndup (word_options, len_options); + else + options = NULL; + + /* The remainder of the line is the label */ + skip_spaces (&line, &length); + if (length > 0) { + label = g_strndup (line, length); + g_strstrip (label); + gck_builder_add_string (&builder, CKA_LABEL, label); + } + + attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + if (callback != NULL) { + bytes = g_bytes_new_with_free_func (outer, n_outer, + (GDestroyNotify)g_bytes_unref, + g_bytes_ref (backing)); + (callback) (attrs, label, options, bytes, user_data); + g_bytes_unref (bytes); + } + + gck_attributes_unref (attrs); + g_free (options); + g_free (label); + return GCR_SUCCESS; +} + +guint +_gcr_openssh_pub_parse (GBytes *data, + GcrOpensshPubCallback callback, + gpointer user_data) +{ + const gchar *line; + const gchar *end; + gsize length; + gboolean last; + GcrDataError res; + guint num_parsed; + + g_return_val_if_fail (data != NULL, FALSE); + + line = g_bytes_get_data (data, NULL); + length = g_bytes_get_size (data); + last = FALSE; + num_parsed = 0; + + for (;;) { + end = memchr (line, '\n', length); + if (end == NULL) { + end = line + length; + last = TRUE; + } + + if (line != end) { + res = parse_v2_public_line (line, end - line, data, callback, user_data); + if (res == GCR_ERROR_UNRECOGNIZED) + res = parse_v1_public_line (line, end - line, data, callback, user_data); + if (res == GCR_SUCCESS) + num_parsed++; + } + + if (last) + break; + + end++; + length -= (end - line); + line = end; + } + + return num_parsed; +} diff --git a/gcr/gcr-openssh.h b/gcr/gcr-openssh.h new file mode 100644 index 0000000..a179afa --- /dev/null +++ b/gcr/gcr-openssh.h @@ -0,0 +1,47 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GCR_OPENSSH_H__ +#define __GCR_OPENSSH_H__ + +#include + +#include + +G_BEGIN_DECLS + +typedef void (*GcrOpensshPubCallback) (GckAttributes *attrs, + const gchar *label, + const gchar *options, + GBytes *outer, + gpointer user_data); + +guint _gcr_openssh_pub_parse (GBytes *data, + GcrOpensshPubCallback callback, + gpointer user_data); + +G_END_DECLS + +#endif /* __GCR_OPENSSH_H__ */ diff --git a/gcr/gcr-parser.c b/gcr/gcr-parser.c new file mode 100644 index 0000000..cf5c44e --- /dev/null +++ b/gcr/gcr-parser.c @@ -0,0 +1,3459 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gck/gck.h" + +#include "gcr-internal.h" +#include "gcr-openpgp.h" +#include "gcr-openssh.h" +#include "gcr-parser.h" +#include "gcr-record.h" +#include "gcr-types.h" + +#include "gcr/gcr-marshal.h" +#include "gcr/gcr-oids.h" + +#include "egg/egg-armor.h" +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-dn.h" +#include "egg/egg-openssl.h" +#include "egg/egg-secure-memory.h" +#include "egg/egg-symkey.h" + +#include + +#include +#include + +/** + * SECTION:gcr-parser + * @title: GcrParser + * @short_description: Parser for certificate and key files + * + * A #GcrParser can parse various certificate and key files such as OpenSSL + * PEM files, DER encoded certifictes, PKCS\#8 keys and so on. Each various + * format is identified by a value in the #GcrDataFormat enumeration. + * + * In order to parse data, a new parser is created with gcr_parser_new() and + * then the #GcrParser::authenticate and #GcrParser::parsed signals should be + * connected to. Data is then fed to the parser via gcr_parser_parse_data() + * or gcr_parser_parse_stream(). + * + * During the #GcrParser::parsed signal the attributes that make up the currently + * parsed item can be retrieved using the gcr_parser_get_parsed_attributes() + * function. + */ + +/** + * GcrParser: + * + * A parser for parsing various types of files or data. + */ + +/** + * GcrParsed: + * + * A parsed item parsed by a #GcrParser. + */ + +/** + * GcrParserClass: + * @parent_class: The parent class + * @authenticate: The default handler for the authenticate signal. + * @parsed: The default handler for the parsed signal. + * + * The class for #GcrParser + */ + +/** + * GCR_DATA_ERROR: + * + * A domain for data errors with codes from #GcrDataError + */ + +/** + * GcrDataError: + * @GCR_ERROR_FAILURE: Failed to parse or serialize the data + * @GCR_ERROR_UNRECOGNIZED: The data was unrecognized or unsupported + * @GCR_ERROR_CANCELLED: The operation was cancelled + * @GCR_ERROR_LOCKED: The data was encrypted or locked and could not be unlocked. + * + * Values responding to error codes for parsing and serializing data. + */ + +enum { + PROP_0, + PROP_PARSED_LABEL, + PROP_PARSED_ATTRIBUTES, + PROP_PARSED_DESCRIPTION +}; + +enum { + AUTHENTICATE, + PARSED, + LAST_SIGNAL +}; + +#define SUCCESS 0 + +static guint signals[LAST_SIGNAL] = { 0 }; + +struct _GcrParsed { + gint refs; + GckBuilder builder; + GckAttributes *attrs; + const gchar *description; + gchar *label; + GBytes *data; + gboolean sensitive; + GcrDataFormat format; + gchar *filename; + struct _GcrParsed *next; +}; + +struct _GcrParserPrivate { + GTree *specific_formats; + gboolean normal_formats; + GPtrArray *passwords; + GcrParsed *parsed; + gchar *filename; +}; + +G_DEFINE_TYPE (GcrParser, gcr_parser, G_TYPE_OBJECT); + +typedef struct { + gint ask_state; + gint seen; +} PasswordState; + +#define PASSWORD_STATE_INIT { 0, 0 } + +typedef struct _ParserFormat { + gint format_id; + gint (*function) (GcrParser *self, GBytes *data); +} ParserFormat; + +/* Forward declarations */ +static const ParserFormat parser_normal[]; +static const ParserFormat parser_formats[]; +static ParserFormat* parser_format_lookup (gint format_id); + +EGG_SECURE_DECLARE (parser); + +/* ----------------------------------------------------------------------------- + * QUARK DEFINITIONS + */ + +/* + * PEM STRINGS + * The xxxxx in: ----- BEGIN xxxxx ------ + */ + +static GQuark PEM_CERTIFICATE; +static GQuark PEM_RSA_PRIVATE_KEY; +static GQuark PEM_DSA_PRIVATE_KEY; +static GQuark PEM_EC_PRIVATE_KEY; +static GQuark PEM_ANY_PRIVATE_KEY; +static GQuark PEM_ENCRYPTED_PRIVATE_KEY; +static GQuark PEM_PRIVATE_KEY; +static GQuark PEM_PKCS7; +static GQuark PEM_PKCS12; +static GQuark PEM_CERTIFICATE_REQUEST; +static GQuark PEM_PUBLIC_KEY; + +static GQuark ARMOR_PGP_PUBLIC_KEY_BLOCK; +static GQuark ARMOR_PGP_PRIVATE_KEY_BLOCK; + +static void +init_quarks (void) +{ + static volatile gsize quarks_inited = 0; + + if (g_once_init_enter (&quarks_inited)) { + + #define QUARK(name, value) \ + name = g_quark_from_static_string(value) + + QUARK (PEM_CERTIFICATE, "CERTIFICATE"); + QUARK (PEM_PRIVATE_KEY, "PRIVATE KEY"); + QUARK (PEM_RSA_PRIVATE_KEY, "RSA PRIVATE KEY"); + QUARK (PEM_DSA_PRIVATE_KEY, "DSA PRIVATE KEY"); + QUARK (PEM_EC_PRIVATE_KEY, "EC PRIVATE KEY"); + QUARK (PEM_ANY_PRIVATE_KEY, "ANY PRIVATE KEY"); + QUARK (PEM_ENCRYPTED_PRIVATE_KEY, "ENCRYPTED PRIVATE KEY"); + QUARK (PEM_PKCS7, "PKCS7"); + QUARK (PEM_PKCS12, "PKCS12"); + QUARK (PEM_CERTIFICATE_REQUEST, "CERTIFICATE REQUEST"); + QUARK (PEM_PUBLIC_KEY, "PUBLIC KEY"); + + QUARK (ARMOR_PGP_PRIVATE_KEY_BLOCK, "PGP PRIVATE KEY BLOCK"); + QUARK (ARMOR_PGP_PUBLIC_KEY_BLOCK, "PGP PUBLIC KEY BLOCK"); + + #undef QUARK + + g_once_init_leave (&quarks_inited, 1); + } +} + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static void +parsed_attribute (GcrParsed *parsed, + CK_ATTRIBUTE_TYPE type, + gconstpointer data, + gsize n_data) +{ + g_assert (parsed != NULL); + gck_builder_add_data (&parsed->builder, type, data, n_data); +} + +static void +parsed_attribute_bytes (GcrParsed *parsed, + CK_ATTRIBUTE_TYPE type, + GBytes *data) +{ + g_assert (parsed != NULL); + gck_builder_add_data (&parsed->builder, type, + g_bytes_get_data (data, NULL), + g_bytes_get_size (data)); +} + +static gboolean +parsed_asn1_number (GcrParsed *parsed, + GNode *asn, + const gchar *part, + CK_ATTRIBUTE_TYPE type) +{ + GBytes *value; + + g_assert (asn); + g_assert (parsed); + + value = egg_asn1x_get_integer_as_usg (egg_asn1x_node (asn, part, NULL)); + if (value == NULL) + return FALSE; + + parsed_attribute_bytes (parsed, type, value); + g_bytes_unref (value); + return TRUE; +} + +static gboolean +parsed_asn1_element (GcrParsed *parsed, + GNode *asn, + const gchar *part, + CK_ATTRIBUTE_TYPE type) +{ + GBytes *value; + + g_assert (asn); + g_assert (parsed); + + value = egg_asn1x_get_element_raw (egg_asn1x_node (asn, part, NULL)); + if (value == NULL) + return FALSE; + + parsed_attribute_bytes (parsed, type, value); + g_bytes_unref (value); + return TRUE; +} + +static gboolean +parsed_asn1_structure (GcrParsed *parsed, + GNode *asn, + CK_ATTRIBUTE_TYPE type) +{ + GBytes *value; + + g_assert (asn); + g_assert (parsed); + + value = egg_asn1x_encode (asn, g_realloc); + if (value == NULL) + return FALSE; + + parsed_attribute_bytes (parsed, type, value); + g_bytes_unref (value); + return TRUE; +} + +static void +parsed_ulong_attribute (GcrParsed *parsed, + CK_ATTRIBUTE_TYPE type, + gulong value) +{ + g_assert (parsed != NULL); + gck_builder_add_ulong (&parsed->builder, type, value); +} + +static void +parsed_boolean_attribute (GcrParsed *parsed, + CK_ATTRIBUTE_TYPE type, + gboolean value) +{ + g_assert (parsed != NULL); + gck_builder_add_boolean (&parsed->builder, type, value); +} + + +static void +parsing_block (GcrParsed *parsed, + gint format, + GBytes *data) +{ + g_assert (parsed != NULL); + g_assert (data != NULL); + g_assert (format != 0); + g_assert (parsed->data == NULL); + + parsed->format = format; + parsed->data = g_bytes_ref (data); +} + +static void +parsed_description (GcrParsed *parsed, + CK_OBJECT_CLASS klass) +{ + g_assert (parsed != NULL); + switch (klass) { + case CKO_PRIVATE_KEY: + parsed->description = _("Private Key"); + break; + case CKO_CERTIFICATE: + parsed->description = _("Certificate"); + break; + case CKO_PUBLIC_KEY: + parsed->description = _("Public Key"); + break; + case CKO_GCR_GNUPG_RECORDS: + parsed->description = _("PGP Key"); + break; + case CKO_GCR_CERTIFICATE_REQUEST: + parsed->description = _("Certificate Request"); + break; + default: + parsed->description = NULL; + break; + } +} + +static void +parsing_object (GcrParsed *parsed, + CK_OBJECT_CLASS klass) +{ + g_assert (parsed != NULL); + + gck_builder_clear (&parsed->builder); + if (parsed->sensitive) + gck_builder_init_full (&parsed->builder, GCK_BUILDER_SECURE_MEMORY); + else + gck_builder_init_full (&parsed->builder, GCK_BUILDER_NONE); + gck_builder_add_ulong (&parsed->builder, CKA_CLASS, klass); + parsed_description (parsed, klass); +} + +static void +parsed_attributes (GcrParsed *parsed, + GckAttributes *attrs) +{ + gulong klass; + + g_assert (parsed != NULL); + g_assert (attrs != NULL); + + if (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass)) + parsed_description (parsed, klass); + gck_builder_add_all (&parsed->builder, attrs); +} + +static void +parsed_label (GcrParsed *parsed, + const gchar *label) +{ + g_assert (parsed != NULL); + g_assert (parsed->label == NULL); + parsed->label = g_strdup (label); +} + +static GcrParsed * +push_parsed (GcrParser *self, + gboolean sensitive) +{ + GcrParsed *parsed = g_new0 (GcrParsed, 1); + parsed->refs = 0; + parsed->sensitive = sensitive; + parsed->next = self->pv->parsed; + parsed->filename = g_strdup (gcr_parser_get_filename (self)); + self->pv->parsed = parsed; + return parsed; +} + +static void +_gcr_parsed_free (GcrParsed *parsed) +{ + gck_builder_clear (&parsed->builder); + if (parsed->attrs) + gck_attributes_unref (parsed->attrs); + if (parsed->data) + g_bytes_unref (parsed->data); + g_free (parsed->label); + g_free (parsed->filename); + g_free (parsed); +} + +static void +pop_parsed (GcrParser *self, + GcrParsed *parsed) +{ + g_assert (parsed == self->pv->parsed); + self->pv->parsed = parsed->next; + _gcr_parsed_free (parsed); +} + +static gint +enum_next_password (GcrParser *self, PasswordState *state, const gchar **password) +{ + gboolean result; + + /* + * Next passes we look through all the passwords that the parser + * has seen so far. This is because different parts of a encrypted + * container (such as PKCS#12) often use the same password even + * if with different algorithms. + * + * If we didn't do this and the user chooses enters a password, + * but doesn't save it, they would get prompted for the same thing + * over and over, dumb. + */ + + /* Look in our list of passwords */ + if (state->seen < self->pv->passwords->len) { + g_assert (state->seen >= 0); + *password = g_ptr_array_index (self->pv->passwords, state->seen); + ++state->seen; + return SUCCESS; + } + + /* Fire off all the parsed property signals so anyone watching can update their state */ + g_object_notify (G_OBJECT (self), "parsed-description"); + g_object_notify (G_OBJECT (self), "parsed-attributes"); + g_object_notify (G_OBJECT (self), "parsed-label"); + + g_signal_emit (self, signals[AUTHENTICATE], 0, state->ask_state, &result); + ++state->ask_state; + + if (!result) + return GCR_ERROR_CANCELLED; + + /* Return any passwords added */ + if (state->seen < self->pv->passwords->len) { + g_assert (state->seen >= 0); + *password = g_ptr_array_index (self->pv->passwords, state->seen); + ++state->seen; + return SUCCESS; + } + + return GCR_ERROR_LOCKED; +} + +static void +parsed_fire (GcrParser *self, + GcrParsed *parsed) +{ + g_assert (GCR_IS_PARSER (self)); + g_assert (parsed != NULL); + g_assert (parsed == self->pv->parsed); + g_assert (parsed->attrs == NULL); + + parsed->attrs = gck_attributes_ref_sink (gck_builder_end (&parsed->builder)); + + g_object_notify (G_OBJECT (self), "parsed-description"); + g_object_notify (G_OBJECT (self), "parsed-attributes"); + g_object_notify (G_OBJECT (self), "parsed-label"); + + g_signal_emit (self, signals[PARSED], 0); +} + +/* ----------------------------------------------------------------------------- + * RSA PRIVATE KEY + */ + +static gint +parse_der_private_key_rsa (GcrParser *self, + GBytes *data) +{ + gint res = GCR_ERROR_UNRECOGNIZED; + GNode *asn = NULL; + gulong version; + GcrParsed *parsed; + + parsed = push_parsed (self, TRUE); + + asn = egg_asn1x_create_and_decode (pk_asn1_tab, "RSAPrivateKey", data); + if (!asn) + goto done; + + parsing_block (parsed, GCR_FORMAT_DER_PRIVATE_KEY_RSA, data); + parsing_object (parsed, CKO_PRIVATE_KEY); + parsed_ulong_attribute (parsed, CKA_KEY_TYPE, CKK_RSA); + parsed_boolean_attribute (parsed, CKA_PRIVATE, CK_TRUE); + res = GCR_ERROR_FAILURE; + + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "version", NULL), &version)) + goto done; + + /* We only support simple version */ + if (version != 0) { + res = GCR_ERROR_UNRECOGNIZED; + g_message ("unsupported version of RSA key: %lu", version); + goto done; + } + + if (!parsed_asn1_number (parsed, asn, "modulus", CKA_MODULUS) || + !parsed_asn1_number (parsed, asn, "publicExponent", CKA_PUBLIC_EXPONENT) || + !parsed_asn1_number (parsed, asn, "privateExponent", CKA_PRIVATE_EXPONENT) || + !parsed_asn1_number (parsed, asn, "prime1", CKA_PRIME_1) || + !parsed_asn1_number (parsed, asn, "prime2", CKA_PRIME_2) || + !parsed_asn1_number (parsed, asn, "coefficient", CKA_COEFFICIENT)) + goto done; + + parsed_fire (self, parsed); + res = SUCCESS; + +done: + egg_asn1x_destroy (asn); + if (res == GCR_ERROR_FAILURE) + g_message ("invalid RSA key"); + + pop_parsed (self, parsed); + return res; +} + +/* ----------------------------------------------------------------------------- + * DSA PRIVATE KEY + */ + +static gint +parse_der_private_key_dsa (GcrParser *self, + GBytes *data) +{ + gint ret = GCR_ERROR_UNRECOGNIZED; + GNode *asn = NULL; + GcrParsed *parsed; + + parsed = push_parsed (self, TRUE); + + asn = egg_asn1x_create_and_decode (pk_asn1_tab, "DSAPrivateKey", data); + if (!asn) + goto done; + + parsing_block (parsed, GCR_FORMAT_DER_PRIVATE_KEY_DSA, data); + parsing_object (parsed, CKO_PRIVATE_KEY); + parsed_ulong_attribute (parsed, CKA_KEY_TYPE, CKK_DSA); + parsed_boolean_attribute (parsed, CKA_PRIVATE, CK_TRUE); + ret = GCR_ERROR_FAILURE; + + if (!parsed_asn1_number (parsed, asn, "p", CKA_PRIME) || + !parsed_asn1_number (parsed, asn, "q", CKA_SUBPRIME) || + !parsed_asn1_number (parsed, asn, "g", CKA_BASE) || + !parsed_asn1_number (parsed, asn, "priv", CKA_VALUE)) + goto done; + + parsed_fire (self, parsed); + ret = SUCCESS; + +done: + egg_asn1x_destroy (asn); + if (ret == GCR_ERROR_FAILURE) + g_message ("invalid DSA key"); + + pop_parsed (self, parsed); + return ret; +} + +static gint +parse_der_private_key_dsa_parts (GcrParser *self, + GBytes *keydata, + GNode *params) +{ + gint ret = GCR_ERROR_UNRECOGNIZED; + GNode *asn_params = NULL; + GNode *asn_key = NULL; + GcrParsed *parsed; + + parsed = push_parsed (self, TRUE); + + asn_params = egg_asn1x_get_any_as (params, pk_asn1_tab, "DSAParameters"); + asn_key = egg_asn1x_create_and_decode (pk_asn1_tab, "DSAPrivatePart", keydata); + if (!asn_params || !asn_key) + goto done; + + parsing_object (parsed, CKO_PRIVATE_KEY); + parsed_ulong_attribute (parsed, CKA_KEY_TYPE, CKK_DSA); + parsed_boolean_attribute (parsed, CKA_PRIVATE, CK_TRUE); + ret = GCR_ERROR_FAILURE; + + if (!parsed_asn1_number (parsed, asn_params, "p", CKA_PRIME) || + !parsed_asn1_number (parsed, asn_params, "q", CKA_SUBPRIME) || + !parsed_asn1_number (parsed, asn_params, "g", CKA_BASE) || + !parsed_asn1_number (parsed, asn_key, NULL, CKA_VALUE)) + goto done; + + parsed_fire (self, parsed); + ret = SUCCESS; + +done: + egg_asn1x_destroy (asn_key); + egg_asn1x_destroy (asn_params); + if (ret == GCR_ERROR_FAILURE) + g_message ("invalid DSA key"); + + pop_parsed (self, parsed); + return ret; +} +/* ----------------------------------------------------------------------------- + * EC PRIVATE KEY + */ + +static gint +parse_der_private_key_ec (GcrParser *self, + GBytes *data) +{ + gint ret = GCR_ERROR_UNRECOGNIZED; + GNode *asn = NULL; + GBytes *value = NULL; + GBytes *pub = NULL; + GNode *asn_q = NULL; + GcrParsed *parsed; + guint bits; + gulong version; + + parsed = push_parsed (self, TRUE); + + asn = egg_asn1x_create_and_decode (pk_asn1_tab, "ECPrivateKey", data); + if (!asn) + goto done; + + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "version", NULL), &version)) + goto done; + + /* We only support simple version */ + if (version != 1) { + g_message ("unsupported version of EC key: %lu", version); + goto done; + } + + parsing_block (parsed, GCR_FORMAT_DER_PRIVATE_KEY_EC, data); + parsing_object (parsed, CKO_PRIVATE_KEY); + parsed_ulong_attribute (parsed, CKA_KEY_TYPE, CKK_EC); + parsed_boolean_attribute (parsed, CKA_PRIVATE, CK_TRUE); + ret = GCR_ERROR_FAILURE; + + if (!parsed_asn1_element (parsed, asn, "parameters", CKA_EC_PARAMS)) + goto done; + + value = egg_asn1x_get_string_as_usg (egg_asn1x_node (asn, "privateKey", NULL), egg_secure_realloc); + if (!value) + goto done; + + parsed_attribute_bytes (parsed, CKA_VALUE, value); + + pub = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "publicKey", NULL), &bits); + if (!pub || bits != 8 * g_bytes_get_size (pub)) + goto done; + asn_q = egg_asn1x_create (pk_asn1_tab, "ECPoint"); + if (!asn_q) + goto done; + egg_asn1x_set_string_as_bytes (asn_q, pub); + + if (!parsed_asn1_structure (parsed, asn_q, CKA_EC_POINT)) + goto done; + + parsed_fire (self, parsed); + ret = SUCCESS; + +done: + if (pub) + g_bytes_unref (pub); + if (value) + g_bytes_unref (value); + egg_asn1x_destroy (asn); + egg_asn1x_destroy (asn_q); + if (ret == GCR_ERROR_FAILURE) + g_message ("invalid EC key"); + + pop_parsed (self, parsed); + return ret; +} + +/* ----------------------------------------------------------------------------- + * PRIVATE KEY + */ + +static gint +parse_der_private_key (GcrParser *self, + GBytes *data) +{ + gint res; + + res = parse_der_private_key_rsa (self, data); + if (res == GCR_ERROR_UNRECOGNIZED) + res = parse_der_private_key_dsa (self, data); + if (res == GCR_ERROR_UNRECOGNIZED) + res = parse_der_private_key_ec (self, data); + + return res; +} + +/* ----------------------------------------------------------------------------- + * SUBJECT PUBLIC KEY + */ + +static gint +handle_subject_public_key_rsa (GcrParser *self, + GcrParsed *parsed, + GBytes *key, + GNode *params) +{ + gint res = GCR_ERROR_FAILURE; + GNode *asn = NULL; + + asn = egg_asn1x_create_and_decode (pk_asn1_tab, "RSAPublicKey", key); + if (!asn) + goto done; + + parsing_object (parsed, CKO_PUBLIC_KEY); + parsed_ulong_attribute (parsed, CKA_KEY_TYPE, CKK_RSA); + + if (!parsed_asn1_number (parsed, asn, "modulus", CKA_MODULUS) || + !parsed_asn1_number (parsed, asn, "publicExponent", CKA_PUBLIC_EXPONENT)) + goto done; + + res = SUCCESS; + +done: + egg_asn1x_destroy (asn); + return res; +} + +static gint +handle_subject_public_key_dsa (GcrParser *self, + GcrParsed *parsed, + GBytes *key, + GNode *params) +{ + gint res = GCR_ERROR_FAILURE; + GNode *key_asn = NULL; + GNode *param_asn = NULL; + + key_asn = egg_asn1x_create_and_decode (pk_asn1_tab, "DSAPublicPart", key); + param_asn = egg_asn1x_get_any_as (params, pk_asn1_tab, "DSAParameters"); + + if (!key_asn || !param_asn) + goto done; + + parsing_object (parsed, CKO_PUBLIC_KEY); + parsed_ulong_attribute (parsed, CKA_KEY_TYPE, CKK_DSA); + + if (!parsed_asn1_number (parsed, param_asn, "p", CKA_PRIME) || + !parsed_asn1_number (parsed, param_asn, "q", CKA_SUBPRIME) || + !parsed_asn1_number (parsed, param_asn, "g", CKA_BASE) || + !parsed_asn1_number (parsed, key_asn, NULL, CKA_VALUE)) + goto done; + + res = SUCCESS; + +done: + egg_asn1x_destroy (key_asn); + egg_asn1x_destroy (param_asn); + return res; +} + +static gint +handle_subject_public_key_ec (GcrParser *self, + GcrParsed *parsed, + GBytes *key, + GNode *params) +{ + gint ret = GCR_ERROR_FAILURE; + GBytes *bytes = NULL; + GNode *asn = NULL; + + parsing_object (parsed, CKO_PUBLIC_KEY); + parsed_ulong_attribute (parsed, CKA_KEY_TYPE, CKK_EC); + + bytes = egg_asn1x_encode (params, g_realloc); + parsed_attribute_bytes (parsed, CKA_EC_PARAMS, bytes); + g_bytes_unref (bytes); + + asn = egg_asn1x_create (pk_asn1_tab, "ECPoint"); + if (!asn) + goto done; + egg_asn1x_set_string_as_bytes (asn, key); + parsed_asn1_structure (parsed, asn, CKA_EC_POINT); + ret = SUCCESS; +done: + egg_asn1x_destroy (asn); + return ret; +} + +static gint +parse_der_subject_public_key (GcrParser *self, + GBytes *data) +{ + GcrParsed *parsed; + GNode *params; + GBytes *key; + GNode *asn = NULL; + GNode *node; + GQuark oid; + guint bits; + gint ret; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SubjectPublicKeyInfo", data); + if (asn == NULL) + return GCR_ERROR_UNRECOGNIZED; + + parsed = push_parsed (self, TRUE); + parsing_block (parsed, GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY, data); + + node = egg_asn1x_node (asn, "algorithm", "algorithm", NULL); + oid = egg_asn1x_get_oid_as_quark (node); + + params = egg_asn1x_node (asn, "algorithm", "parameters", NULL); + + node = egg_asn1x_node (asn, "subjectPublicKey", NULL); + key = egg_asn1x_get_bits_as_raw (node, &bits); + + if (oid == GCR_OID_PKIX1_RSA) + ret = handle_subject_public_key_rsa (self, parsed, key, params); + + else if (oid == GCR_OID_PKIX1_DSA) + ret = handle_subject_public_key_dsa (self, parsed, key, params); + + else if (oid == GCR_OID_PKIX1_EC) + ret = handle_subject_public_key_ec (self, parsed, key, params); + + else + ret = GCR_ERROR_UNRECOGNIZED; + + g_bytes_unref (key); + + if (ret == SUCCESS) + parsed_fire (self, parsed); + + pop_parsed (self, parsed); + + egg_asn1x_destroy (asn); + return ret; +} + +/* ----------------------------------------------------------------------------- + * PKCS8 + */ + +static gint +parse_der_pkcs8_plain (GcrParser *self, + GBytes *data) +{ + gint ret; + CK_KEY_TYPE key_type; + GQuark key_algo; + GBytes *keydata = NULL; + GNode *params = NULL; + GNode *asn = NULL; + GcrParsed *parsed; + + parsed = push_parsed (self, TRUE); + ret = GCR_ERROR_UNRECOGNIZED; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-8-PrivateKeyInfo", data); + if (!asn) + goto done; + + parsing_block (parsed, GCR_FORMAT_DER_PKCS8_PLAIN, data); + ret = GCR_ERROR_FAILURE; + key_type = GCK_INVALID; + + key_algo = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "privateKeyAlgorithm", "algorithm", NULL)); + if (!key_algo) + goto done; + else if (key_algo == GCR_OID_PKIX1_RSA) + key_type = CKK_RSA; + else if (key_algo == GCR_OID_PKIX1_DSA) + key_type = CKK_DSA; + else if (key_algo == GCR_OID_PKIX1_EC) + key_type = CKK_EC; + + if (key_type == GCK_INVALID) { + ret = GCR_ERROR_UNRECOGNIZED; + goto done; + } + + keydata = egg_asn1x_get_string_as_bytes (egg_asn1x_node (asn, "privateKey", NULL)); + if (!keydata) + goto done; + + params = egg_asn1x_node (asn, "privateKeyAlgorithm", "parameters", NULL); + + ret = SUCCESS; + +done: + if (ret == SUCCESS) { + switch (key_type) { + case CKK_RSA: + ret = parse_der_private_key_rsa (self, keydata); + break; + case CKK_DSA: + /* Try the normal sane format */ + ret = parse_der_private_key_dsa (self, keydata); + + /* Otherwise try the two part format that everyone seems to like */ + if (ret == GCR_ERROR_UNRECOGNIZED && params) + ret = parse_der_private_key_dsa_parts (self, keydata, params); + break; + case CKK_EC: + ret = parse_der_private_key_ec (self, keydata); + break; + + default: + g_message ("invalid or unsupported key type in PKCS#8 key"); + ret = GCR_ERROR_UNRECOGNIZED; + break; + }; + + } else if (ret == GCR_ERROR_FAILURE) { + g_message ("invalid PKCS#8 key"); + } + + if (keydata) + g_bytes_unref (keydata); + egg_asn1x_destroy (asn); + pop_parsed (self, parsed); + return ret; +} + +static gint +parse_der_pkcs8_encrypted (GcrParser *self, + GBytes *data) +{ + PasswordState pstate = PASSWORD_STATE_INIT; + GNode *asn = NULL; + gcry_cipher_hd_t cih = NULL; + gcry_error_t gcry; + gint ret, r; + GQuark scheme; + guchar *crypted = NULL; + GNode *params = NULL; + GBytes *cbytes; + gsize n_crypted; + const gchar *password; + GcrParsed *parsed; + gint l; + + parsed = push_parsed (self, FALSE); + ret = GCR_ERROR_UNRECOGNIZED; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-8-EncryptedPrivateKeyInfo", data); + if (!asn) + goto done; + + parsing_block (parsed, GCR_FORMAT_DER_PKCS8_ENCRYPTED, data); + ret = GCR_ERROR_FAILURE; + + /* Figure out the type of encryption */ + scheme = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "encryptionAlgorithm", "algorithm", NULL)); + if (!scheme) + goto done; + + params = egg_asn1x_node (asn, "encryptionAlgorithm", "parameters", NULL); + + /* Loop to try different passwords */ + for (;;) { + + g_assert (cih == NULL); + + r = enum_next_password (self, &pstate, &password); + if (r != SUCCESS) { + ret = r; + break; + } + + /* Parse the encryption stuff into a cipher. */ + if (!egg_symkey_read_cipher (scheme, password, -1, params, &cih)) + break; + + crypted = egg_asn1x_get_string_as_raw (egg_asn1x_node (asn, "encryptedData", NULL), egg_secure_realloc, &n_crypted); + if (!crypted) + break; + + gcry = gcry_cipher_decrypt (cih, crypted, n_crypted, NULL, 0); + gcry_cipher_close (cih); + cih = NULL; + + if (gcry != 0) { + g_warning ("couldn't decrypt pkcs8 data: %s", gcry_strerror (gcry)); + break; + } + + /* Unpad the DER data */ + l = egg_asn1x_element_length (crypted, n_crypted); + if (l > 0) + n_crypted = l; + + cbytes = g_bytes_new_with_free_func (crypted, n_crypted, + egg_secure_free, crypted); + crypted = NULL; + + /* Try to parse the resulting key */ + r = parse_der_pkcs8_plain (self, cbytes); + g_bytes_unref (cbytes); + + if (r != GCR_ERROR_UNRECOGNIZED) { + ret = r; + break; + } + + /* We assume unrecognized data, is a bad encryption key */ + } + +done: + if (cih) + gcry_cipher_close (cih); + egg_asn1x_destroy (asn); + egg_secure_free (crypted); + + pop_parsed (self, parsed); + return ret; +} + +static gint +parse_der_pkcs8 (GcrParser *self, + GBytes *data) +{ + gint ret; + + ret = parse_der_pkcs8_plain (self, data); + if (ret == GCR_ERROR_UNRECOGNIZED) + ret = parse_der_pkcs8_encrypted (self, data); + + return ret; +} + +/* ----------------------------------------------------------------------------- + * CERTIFICATE + */ + +static gint +parse_der_certificate (GcrParser *self, + GBytes *data) +{ + gchar *name = NULL; + GcrParsed *parsed; + GNode *node; + GNode *asn; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", data); + if (asn == NULL) + return GCR_ERROR_UNRECOGNIZED; + + parsed = push_parsed (self, FALSE); + + parsing_block (parsed, GCR_FORMAT_DER_CERTIFICATE_X509, data); + parsing_object (parsed, CKO_CERTIFICATE); + parsed_ulong_attribute (parsed, CKA_CERTIFICATE_TYPE, CKC_X_509); + + node = egg_asn1x_node (asn, "tbsCertificate", NULL); + g_return_val_if_fail (node != NULL, GCR_ERROR_FAILURE); + + if (gcr_parser_get_parsed_label (self) == NULL) + name = egg_dn_read_part (egg_asn1x_node (node, "subject", "rdnSequence", NULL), "CN"); + + if (name != NULL) { + parsed_label (parsed, name); + g_free (name); + } + + parsed_attribute_bytes (parsed, CKA_VALUE, data); + parsed_asn1_element (parsed, node, "subject", CKA_SUBJECT); + parsed_asn1_element (parsed, node, "issuer", CKA_ISSUER); + parsed_asn1_number (parsed, node, "serialNumber", CKA_SERIAL_NUMBER); + parsed_fire (self, parsed); + + egg_asn1x_destroy (asn); + + pop_parsed (self, parsed); + return SUCCESS; +} + +/* ----------------------------------------------------------------------------- + * PKCS7 + */ + +static gint +handle_pkcs7_signed_data (GcrParser *self, + GNode *content) +{ + GNode *asn = NULL; + GNode *node; + gint ret; + GBytes *certificate; + int i; + + ret = GCR_ERROR_UNRECOGNIZED; + + asn = egg_asn1x_get_any_as (content, pkix_asn1_tab, "pkcs-7-SignedData"); + if (!asn) + goto done; + + for (i = 0; TRUE; ++i) { + + node = egg_asn1x_node (asn, "certificates", i + 1, NULL); + + /* No more certificates? */ + if (node == NULL) + break; + + certificate = egg_asn1x_get_element_raw (node); + ret = parse_der_certificate (self, certificate); + g_bytes_unref (certificate); + + if (ret != SUCCESS) + goto done; + } + + /* TODO: Parse out all the CRLs */ + + ret = SUCCESS; + +done: + egg_asn1x_destroy (asn); + return ret; +} + +static gint +parse_der_pkcs7 (GcrParser *self, + GBytes *data) +{ + GNode *asn = NULL; + GNode *node; + gint ret; + GNode *content = NULL; + GQuark oid; + GcrParsed *parsed; + + parsed = push_parsed (self, FALSE); + ret = GCR_ERROR_UNRECOGNIZED; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-7-ContentInfo", data); + if (!asn) + goto done; + + parsing_block (parsed, GCR_FORMAT_DER_PKCS7, data); + ret = GCR_ERROR_FAILURE; + + node = egg_asn1x_node (asn, "contentType", NULL); + if (!node) + goto done; + + oid = egg_asn1x_get_oid_as_quark (node); + g_return_val_if_fail (oid, GCR_ERROR_FAILURE); + + /* Outer most one must just be plain data */ + if (oid != GCR_OID_PKCS7_SIGNED_DATA) { + g_message ("unsupported outer content type in pkcs7: %s", g_quark_to_string (oid)); + goto done; + } + + content = egg_asn1x_node (asn, "content", NULL); + if (!content) + goto done; + + ret = handle_pkcs7_signed_data (self, content); + +done: + egg_asn1x_destroy (asn); + pop_parsed (self, parsed); + return ret; +} + +/* ----------------------------------------------------------------------------- + * PKCS12 + */ + +static gint +handle_pkcs12_cert_bag (GcrParser *self, + GBytes *data) +{ + GNode *asn = NULL; + GNode *asn_content = NULL; + guchar *certificate = NULL; + GNode *element = NULL; + gsize n_certificate; + GBytes *bytes; + gint ret; + + ret = GCR_ERROR_UNRECOGNIZED; + asn = egg_asn1x_create_and_decode_full (pkix_asn1_tab, "pkcs-12-CertBag", + data, EGG_ASN1X_NO_STRICT); + if (!asn) + goto done; + + ret = GCR_ERROR_FAILURE; + + element = egg_asn1x_node (asn, "certValue", NULL); + if (!element) + goto done; + + asn_content = egg_asn1x_get_any_as (element, pkix_asn1_tab, "pkcs-7-Data"); + if (!asn_content) + goto done; + + certificate = egg_asn1x_get_string_as_raw (asn_content, NULL, &n_certificate); + if (!certificate) + goto done; + + bytes = g_bytes_new_take (certificate, n_certificate); + ret = parse_der_certificate (self, bytes); + g_bytes_unref (bytes); + +done: + egg_asn1x_destroy (asn_content); + egg_asn1x_destroy (asn); + return ret; +} + +static gchar * +parse_pkcs12_bag_friendly_name (GNode *asn) +{ + guint count, i; + GQuark oid; + GNode *node; + GNode *asn_str; + gchar *result; + + if (asn == NULL) + return NULL; + + count = egg_asn1x_count (asn); + for (i = 1; i <= count; i++) { + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, i, "type", NULL)); + if (oid == GCR_OID_PKCS9_ATTRIBUTE_FRIENDLY) { + node = egg_asn1x_node (asn, i, "values", 1, NULL); + if (node != NULL) { + asn_str = egg_asn1x_get_any_as (node, pkix_asn1_tab, "BMPString"); + if (asn_str) { + result = egg_asn1x_get_bmpstring_as_utf8 (asn_str); + egg_asn1x_destroy (asn_str); + return result; + } + } + } + } + + return NULL; +} + +static gint +handle_pkcs12_bag (GcrParser *self, + GBytes *data) +{ + GNode *asn = NULL; + gint ret, r; + guint count = 0; + GQuark oid; + GNode *value; + GBytes *element = NULL; + gchar *friendly; + guint i; + GcrParsed *parsed; + + ret = GCR_ERROR_UNRECOGNIZED; + + asn = egg_asn1x_create_and_decode_full (pkix_asn1_tab, "pkcs-12-SafeContents", + data, EGG_ASN1X_NO_STRICT); + if (!asn) + goto done; + + ret = GCR_ERROR_FAILURE; + + /* Get the number of elements in this bag */ + count = egg_asn1x_count (asn); + + /* + * Now inside each bag are multiple elements. Who comes up + * with this stuff? + */ + for (i = 1; i <= count; i++) { + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, i, "bagId", NULL)); + if (!oid) + goto done; + + value = egg_asn1x_node (asn, i, "bagValue", NULL); + if (!value) + goto done; + + element = egg_asn1x_get_element_raw (value); + parsed = push_parsed (self, FALSE); + + friendly = parse_pkcs12_bag_friendly_name (egg_asn1x_node (asn, i, "bagAttributes", NULL)); + if (friendly != NULL) { + parsed_label (parsed, friendly); + g_free (friendly); + } + + /* A normal unencrypted key */ + if (oid == GCR_OID_PKCS12_BAG_PKCS8_KEY) { + r = parse_der_pkcs8_plain (self, element); + + /* A properly encrypted key */ + } else if (oid == GCR_OID_PKCS12_BAG_PKCS8_ENCRYPTED_KEY) { + r = parse_der_pkcs8_encrypted (self, element); + + /* A certificate */ + } else if (oid == GCR_OID_PKCS12_BAG_CERTIFICATE) { + r = handle_pkcs12_cert_bag (self, element); + + /* TODO: GCR_OID_PKCS12_BAG_CRL */ + } else { + r = GCR_ERROR_UNRECOGNIZED; + } + + if (element != NULL) + g_bytes_unref (element); + + pop_parsed (self, parsed); + + if (r == GCR_ERROR_FAILURE || + r == GCR_ERROR_CANCELLED || + r == GCR_ERROR_LOCKED) { + ret = r; + goto done; + } + } + + ret = SUCCESS; + +done: + egg_asn1x_destroy (asn); + return ret; +} + +static gint +handle_pkcs12_encrypted_bag (GcrParser *self, + GNode *bag) +{ + PasswordState pstate = PASSWORD_STATE_INIT; + GNode *asn = NULL; + gcry_cipher_hd_t cih = NULL; + gcry_error_t gcry; + guchar *crypted = NULL; + GNode *params = NULL; + gsize n_crypted; + const gchar *password; + GBytes *cbytes; + GQuark scheme; + gint ret, r; + gint l; + + ret = GCR_ERROR_UNRECOGNIZED; + + asn = egg_asn1x_get_any_as_full (bag, pkix_asn1_tab, "pkcs-7-EncryptedData", + EGG_ASN1X_NO_STRICT); + if (!asn) + goto done; + + ret = GCR_ERROR_FAILURE; + + /* Check the encryption schema OID */ + scheme = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "encryptedContentInfo", "contentEncryptionAlgorithm", "algorithm", NULL)); + if (!scheme) + goto done; + + params = egg_asn1x_node (asn, "encryptedContentInfo", "contentEncryptionAlgorithm", "parameters", NULL); + if (!params) + goto done; + + /* Loop to try different passwords */ + for (;;) { + + g_assert (cih == NULL); + + r = enum_next_password (self, &pstate, &password); + if (r != SUCCESS) { + ret = r; + goto done; + } + + /* Parse the encryption stuff into a cipher. */ + if (!egg_symkey_read_cipher (scheme, password, -1, params, &cih)) { + ret = GCR_ERROR_FAILURE; + goto done; + } + + crypted = egg_asn1x_get_string_as_raw (egg_asn1x_node (asn, "encryptedContentInfo", "encryptedContent", NULL), + egg_secure_realloc, &n_crypted); + if (!crypted) + goto done; + + gcry = gcry_cipher_decrypt (cih, crypted, n_crypted, NULL, 0); + gcry_cipher_close (cih); + cih = NULL; + + if (gcry != 0) { + g_warning ("couldn't decrypt pkcs12 data: %s", gcry_strerror (gcry)); + goto done; + } + + /* Unpad the DER data */ + l = egg_asn1x_element_length (crypted, n_crypted); + if (l > 0) + n_crypted = l; + + cbytes = g_bytes_new_with_free_func (crypted, n_crypted, egg_secure_free, crypted); + crypted = NULL; + + /* Try to parse the resulting key */ + r = handle_pkcs12_bag (self, cbytes); + g_bytes_unref (cbytes); + + if (r != GCR_ERROR_UNRECOGNIZED) { + ret = r; + break; + } + + /* We assume unrecognized data is a bad encryption key */ + } + +done: + if (cih) + gcry_cipher_close (cih); + egg_asn1x_destroy (asn); + egg_secure_free (crypted); + return ret; +} + +static gint +handle_pkcs12_safe (GcrParser *self, + GBytes *data) +{ + GNode *asn = NULL; + GNode *asn_content = NULL; + gint ret, r; + GNode *bag; + GBytes *content; + GQuark oid; + guint i; + GNode *node; + + ret = GCR_ERROR_UNRECOGNIZED; + + asn = egg_asn1x_create_and_decode_full (pkix_asn1_tab, "pkcs-12-AuthenticatedSafe", + data, EGG_ASN1X_NO_STRICT); + if (!asn) + goto done; + + ret = GCR_ERROR_FAILURE; + + /* + * Inside each PKCS12 safe there are multiple bags. + */ + for (i = 0; TRUE; ++i) { + node = egg_asn1x_node (asn, i + 1, "contentType", NULL); + + /* All done? no more bags */ + if (!node) + break; + + oid = egg_asn1x_get_oid_as_quark (node); + + bag = egg_asn1x_node (asn, i + 1, "content", NULL); + if (!bag) + goto done; + + /* A non encrypted bag, just parse */ + if (oid == GCR_OID_PKCS7_DATA) { + + egg_asn1x_destroy (asn_content); + asn_content = egg_asn1x_get_any_as_full (bag, pkix_asn1_tab, + "pkcs-7-Data", EGG_ASN1X_NO_STRICT); + if (!asn_content) + goto done; + + content = egg_asn1x_get_string_as_bytes (asn_content); + if (!content) + goto done; + + r = handle_pkcs12_bag (self, content); + g_bytes_unref (content); + + /* Encrypted data first needs decryption */ + } else if (oid == GCR_OID_PKCS7_ENCRYPTED_DATA) { + r = handle_pkcs12_encrypted_bag (self, bag); + + /* Hmmmm, not sure what this is */ + } else { + g_warning ("unrecognized type of safe content in pkcs12: %s", g_quark_to_string (oid)); + r = GCR_ERROR_UNRECOGNIZED; + } + + if (r == GCR_ERROR_FAILURE || + r == GCR_ERROR_CANCELLED || + r == GCR_ERROR_LOCKED) { + ret = r; + goto done; + } + } + + ret = SUCCESS; + +done: + egg_asn1x_destroy (asn); + egg_asn1x_destroy (asn_content); + return ret; +} + +static gint +verify_pkcs12_safe (GcrParser *self, + GNode *asn, + GBytes *content) +{ + PasswordState pstate = PASSWORD_STATE_INIT; + const gchar *password; + gcry_md_hd_t mdh = NULL; + const guchar *mac_digest; + gsize mac_len; + guchar *digest = NULL; + gsize n_digest; + GQuark algorithm; + GNode *mac_data; + int ret, r; + + ret = GCR_ERROR_FAILURE; + + /* + * The MAC is optional (and outside the encryption no less). I wonder + * what the designers (ha) of PKCS#12 were trying to achieve + */ + + mac_data = egg_asn1x_node (asn, "macData", NULL); + if (mac_data == NULL) + return SUCCESS; + + algorithm = egg_asn1x_get_oid_as_quark (egg_asn1x_node (mac_data, "mac", + "digestAlgorithm", "algorithm", NULL)); + if (!algorithm) + goto done; + + digest = egg_asn1x_get_string_as_raw (egg_asn1x_node (mac_data, "mac", "digest", NULL), NULL, &n_digest); + if (!digest) + goto done; + + /* Loop to try different passwords */ + for (;;) { + g_assert (mdh == NULL); + + r = enum_next_password (self, &pstate, &password); + if (r != SUCCESS) { + ret = r; + goto done; + } + + /* Parse the encryption stuff into a cipher. */ + if (!egg_symkey_read_mac (algorithm, password, -1, mac_data, &mdh, &mac_len)) { + ret = GCR_ERROR_FAILURE; + goto done; + } + + /* If not the right length, then that's really broken */ + if (mac_len != n_digest) { + r = GCR_ERROR_FAILURE; + + } else { + gcry_md_write (mdh, g_bytes_get_data (content, NULL), g_bytes_get_size (content)); + mac_digest = gcry_md_read (mdh, 0); + g_return_val_if_fail (mac_digest, GCR_ERROR_FAILURE); + r = memcmp (mac_digest, digest, n_digest) == 0 ? SUCCESS : GCR_ERROR_LOCKED; + } + + gcry_md_close (mdh); + mdh = NULL; + + if (r != GCR_ERROR_LOCKED) { + ret = r; + break; + } + } + +done: + if (mdh) + gcry_md_close (mdh); + g_free (digest); + return ret; + +} + +static gint +parse_der_pkcs12 (GcrParser *self, + GBytes *data) +{ + GNode *asn = NULL; + gint ret; + GNode *content = NULL; + GBytes *string = NULL; + GQuark oid; + GcrParsed *parsed; + + parsed = push_parsed (self, FALSE); + ret = GCR_ERROR_UNRECOGNIZED; + + /* + * Because PKCS#12 files, the bags specifically, are notorious for + * being crappily constructed and are often break rules such as DER + * sorting order etc.. we parse the DER in a non-strict fashion. + * + * The rules in DER are designed for X.509 certificates, so there is + * only one way to represent a given certificate (although they fail + * at that as well). But with PKCS#12 we don't have such high + * requirements, and we can slack off on our validation. + */ + + asn = egg_asn1x_create_and_decode_full (pkix_asn1_tab, "pkcs-12-PFX", + data, EGG_ASN1X_NO_STRICT); + if (!asn) + goto done; + + parsing_block (parsed, GCR_FORMAT_DER_PKCS12, data); + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "authSafe", "contentType", NULL)); + if (!oid) + goto done; + + /* Outer most one must just be plain data */ + if (oid != GCR_OID_PKCS7_DATA) { + g_message ("unsupported safe content type in pkcs12: %s", g_quark_to_string (oid)); + goto done; + } + + content = egg_asn1x_get_any_as (egg_asn1x_node (asn, "authSafe", "content", NULL), + pkix_asn1_tab, "pkcs-7-Data"); + if (!content) + goto done; + + string = egg_asn1x_get_string_as_bytes (content); + if (!string) + goto done; + + ret = verify_pkcs12_safe (self, asn, string); + if (ret == SUCCESS) + ret = handle_pkcs12_safe (self, string); + +done: + if (content) + egg_asn1x_destroy (content); + if (string) + g_bytes_unref (string); + egg_asn1x_destroy (asn); + pop_parsed (self, parsed); + return ret; +} + +/* ----------------------------------------------------------------------------- + * CERTIFICATE REQUESTS + */ + +static gint +parse_der_pkcs10 (GcrParser *self, + GBytes *data) +{ + GNode *asn = NULL; + GNode *node; + GcrParsed *parsed; + gchar *name = NULL; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-10-CertificationRequest", data); + if (!asn) + return GCR_ERROR_UNRECOGNIZED; + + parsed = push_parsed (self, FALSE); + parsing_block (parsed, GCR_FORMAT_DER_PKCS10, data); + + parsing_object (parsed, CKO_GCR_CERTIFICATE_REQUEST); + parsed_ulong_attribute (parsed, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_PKCS10); + + node = egg_asn1x_node (asn, "certificationRequestInfo", NULL); + g_return_val_if_fail (node != NULL, GCR_ERROR_FAILURE); + + if (gcr_parser_get_parsed_label (self) == NULL) + name = egg_dn_read_part (egg_asn1x_node (node, "subject", "rdnSequence", NULL), "CN"); + + if (name != NULL) { + parsed_label (parsed, name); + g_free (name); + } + + parsed_attribute_bytes (parsed, CKA_VALUE, data); + parsed_asn1_element (parsed, node, "subject", CKA_SUBJECT); + parsed_fire (self, parsed); + + egg_asn1x_destroy (asn); + + pop_parsed (self, parsed); + return SUCCESS; +} + +static gint +parse_der_spkac (GcrParser *self, + GBytes *data) +{ + GNode *asn = NULL; + GcrParsed *parsed; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SignedPublicKeyAndChallenge", data); + if (!asn) + return GCR_ERROR_UNRECOGNIZED; + + parsed = push_parsed (self, FALSE); + parsing_block (parsed, GCR_FORMAT_DER_SPKAC, data); + + parsing_object (parsed, CKO_GCR_CERTIFICATE_REQUEST); + parsed_ulong_attribute (parsed, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_SPKAC); + + parsed_attribute_bytes (parsed, CKA_VALUE, data); + parsed_fire (self, parsed); + + egg_asn1x_destroy (asn); + + pop_parsed (self, parsed); + return SUCCESS; +} + +static gint +parse_base64_spkac (GcrParser *self, + GBytes *dat) +{ + const gchar *PREFIX = "SPKAC="; + const gsize PREFIX_LEN = 6; + + GcrParsed *parsed; + guchar *spkac; + gsize n_spkac; + const guchar *data; + GBytes *bytes; + gsize n_data; + gint ret; + data = g_bytes_get_data (dat, &n_data); + + if (n_data > PREFIX_LEN && memcmp (PREFIX, data, PREFIX_LEN)) + return GCR_ERROR_UNRECOGNIZED; + + parsed = push_parsed (self, FALSE); + parsing_block (parsed, GCR_FORMAT_DER_SPKAC, dat); + + data += PREFIX_LEN; + n_data -= PREFIX_LEN; + + spkac = g_base64_decode ((const gchar *)data, &n_spkac); + if (spkac != NULL) { + bytes = g_bytes_new_take (spkac, n_spkac); + ret = parse_der_spkac (self, bytes); + g_bytes_unref (bytes); + } else { + ret = GCR_ERROR_FAILURE; + } + + pop_parsed (self, parsed); + return ret; +} + +/* ----------------------------------------------------------------------------- + * OPENPGP + */ + +static void +on_openpgp_packet (GPtrArray *records, + GBytes *outer, + gpointer user_data) +{ + GcrParser *self = GCR_PARSER (user_data); + GcrParsed *parsed; + gchar *string; + + /* + * If it's an openpgp packet that doesn't contain a key, then + * just ignore it here. + */ + if (records->len == 0) + return; + + parsed = push_parsed (self, FALSE); + + /* All we can do is the packet bounds */ + parsing_block (parsed, GCR_FORMAT_OPENPGP_PACKET, outer); + parsing_object (parsed, CKO_GCR_GNUPG_RECORDS); + string = _gcr_records_format (records); + parsed_attribute (parsed, CKA_VALUE, string, strlen (string)); + parsed_fire (self, parsed); + pop_parsed (self, parsed); + + g_free (string); +} + +static gint +parse_openpgp_packets (GcrParser *self, + GBytes *data) +{ + gint num_parsed; + + num_parsed = _gcr_openpgp_parse (data, + GCR_OPENPGP_PARSE_KEYS | + GCR_OPENPGP_PARSE_ATTRIBUTES | + GCR_OPENPGP_PARSE_SIGNATURES, + on_openpgp_packet, self); + + if (num_parsed == 0) + return GCR_ERROR_UNRECOGNIZED; + return SUCCESS; +} + +/* ----------------------------------------------------------------------------- + * ARMOR PARSING + */ + +static gboolean +formats_for_armor_type (GQuark armor_type, + gint *inner_format, + gint *outer_format) +{ + gint dummy; + if (!inner_format) + inner_format = &dummy; + if (!outer_format) + outer_format = &dummy; + + if (armor_type == PEM_RSA_PRIVATE_KEY) { + *inner_format = GCR_FORMAT_DER_PRIVATE_KEY_RSA; + *outer_format = GCR_FORMAT_PEM_PRIVATE_KEY_RSA; + } else if (armor_type == PEM_DSA_PRIVATE_KEY) { + *inner_format = GCR_FORMAT_DER_PRIVATE_KEY_DSA; + *outer_format = GCR_FORMAT_PEM_PRIVATE_KEY_DSA; + } else if (armor_type == PEM_EC_PRIVATE_KEY) { + *inner_format = GCR_FORMAT_DER_PRIVATE_KEY_EC; + *outer_format = GCR_FORMAT_PEM_PRIVATE_KEY_EC; + } else if (armor_type == PEM_ANY_PRIVATE_KEY) { + *inner_format = GCR_FORMAT_DER_PRIVATE_KEY; + *outer_format = GCR_FORMAT_PEM_PRIVATE_KEY; + } else if (armor_type == PEM_PRIVATE_KEY) { + *inner_format = GCR_FORMAT_DER_PKCS8_PLAIN; + *outer_format = GCR_FORMAT_PEM_PKCS8_PLAIN; + } else if (armor_type == PEM_ENCRYPTED_PRIVATE_KEY) { + *inner_format = GCR_FORMAT_DER_PKCS8_ENCRYPTED; + *outer_format = GCR_FORMAT_PEM_PKCS8_ENCRYPTED; + } else if (armor_type == PEM_CERTIFICATE) { + *inner_format = GCR_FORMAT_DER_CERTIFICATE_X509; + *outer_format = GCR_FORMAT_PEM_CERTIFICATE_X509; + } else if (armor_type == PEM_PKCS7) { + *inner_format = GCR_FORMAT_DER_PKCS7; + *outer_format = GCR_FORMAT_PEM_PKCS7; + } else if (armor_type == PEM_CERTIFICATE_REQUEST) { + *inner_format = GCR_FORMAT_DER_PKCS10; + *outer_format = GCR_FORMAT_PEM_PKCS10; + } else if (armor_type == PEM_PKCS12) { + *inner_format = GCR_FORMAT_DER_PKCS12; + *outer_format = GCR_FORMAT_PEM_PKCS12; + } else if (armor_type == PEM_PUBLIC_KEY) { + *inner_format = GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY; + *outer_format = GCR_FORMAT_PEM_PUBLIC_KEY; + } else if (armor_type == ARMOR_PGP_PRIVATE_KEY_BLOCK) { + *inner_format = GCR_FORMAT_OPENPGP_PACKET; + *outer_format = GCR_FORMAT_OPENPGP_ARMOR; + } else if (armor_type == ARMOR_PGP_PUBLIC_KEY_BLOCK) { + *inner_format = GCR_FORMAT_OPENPGP_PACKET; + *outer_format = GCR_FORMAT_OPENPGP_ARMOR; + } else { + return FALSE; + } + + return TRUE; +} + +static gint +handle_plain_pem (GcrParser *self, + gint format_id, + gint want_format, + GBytes *data) +{ + ParserFormat *format; + + if (want_format != 0 && want_format != format_id) + return GCR_ERROR_UNRECOGNIZED; + + format = parser_format_lookup (format_id); + if (format == NULL) + return GCR_ERROR_UNRECOGNIZED; + + return (format->function) (self, data); +} + +static gint +handle_encrypted_pem (GcrParser *self, + gint format_id, + gint want_format, + GHashTable *headers, + GBytes *data) +{ + PasswordState pstate = PASSWORD_STATE_INIT; + const gchar *password; + guchar *decrypted; + gsize n_decrypted; + const gchar *val; + GBytes *dbytes; + gint res; + gint l; + + g_assert (GCR_IS_PARSER (self)); + g_assert (headers); + + val = g_hash_table_lookup (headers, "DEK-Info"); + if (!val) { + g_message ("missing encryption header"); + return GCR_ERROR_FAILURE; + } + + for (;;) { + + res = enum_next_password (self, &pstate, &password); + if (res != SUCCESS) + break; + + /* Decrypt, this will result in garble if invalid password */ + decrypted = egg_openssl_decrypt_block (val, password, -1, data, &n_decrypted); + if (!decrypted) { + res = GCR_ERROR_FAILURE; + break; + } + + /* Unpad the DER data */ + l = egg_asn1x_element_length (decrypted, n_decrypted); + if (l > 0) + n_decrypted = l; + + dbytes = g_bytes_new_with_free_func (decrypted, n_decrypted, + egg_secure_free, decrypted); + decrypted = NULL; + + /* Try to parse */ + res = handle_plain_pem (self, format_id, want_format, dbytes); + g_bytes_unref (dbytes); + + /* Unrecognized is a bad password */ + if (res != GCR_ERROR_UNRECOGNIZED) + break; + } + + return res; +} + +typedef struct { + GcrParser *parser; + gint result; + gint want_format; +} HandlePemArgs; + +static void +handle_pem_data (GQuark type, + GBytes *data, + GBytes *outer, + GHashTable *headers, + gpointer user_data) +{ + HandlePemArgs *args = (HandlePemArgs*)user_data; + gint res = GCR_ERROR_FAILURE; + gboolean encrypted = FALSE; + const gchar *val; + gint inner_format; + gint outer_format; + GcrParsed *parsed; + + /* Something already failed to parse */ + if (args->result == GCR_ERROR_FAILURE) + return; + + if (!formats_for_armor_type (type, &inner_format, &outer_format)) + return; + + parsed = push_parsed (args->parser, FALSE); + + /* Fill in information necessary for prompting */ + parsing_block (parsed, outer_format, outer); + + /* See if it's encrypted PEM all openssl like*/ + if (headers) { + val = g_hash_table_lookup (headers, "Proc-Type"); + if (val && strcmp (val, "4,ENCRYPTED") == 0) + encrypted = TRUE; + } + + if (encrypted) + res = handle_encrypted_pem (args->parser, inner_format, + args->want_format, headers, + data); + else + res = handle_plain_pem (args->parser, inner_format, + args->want_format, data); + + pop_parsed (args->parser, parsed); + + if (res != GCR_ERROR_UNRECOGNIZED) { + if (args->result == GCR_ERROR_UNRECOGNIZED) + args->result = res; + else if (res > args->result) + args->result = res; + } +} + +static gint +handle_pem_format (GcrParser *self, + gint subformat, + GBytes *data) +{ + HandlePemArgs ctx = { self, GCR_ERROR_UNRECOGNIZED, subformat }; + guint found; + + if (g_bytes_get_size (data) == 0) + return GCR_ERROR_UNRECOGNIZED; + + found = egg_armor_parse (data, handle_pem_data, &ctx); + + if (found == 0) + return GCR_ERROR_UNRECOGNIZED; + + return ctx.result; +} + + +static gint +parse_pem (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, 0, data); +} + +static gint +parse_pem_private_key_rsa (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PRIVATE_KEY_RSA, data); +} + +static gint +parse_pem_private_key_dsa (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PRIVATE_KEY_DSA, data); +} + +static gint +parse_pem_private_key_ec (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PRIVATE_KEY_EC, data); +} + +static gint +parse_pem_public_key (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY, data); +} + +static gint +parse_pem_certificate (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_CERTIFICATE_X509, data); +} + +static gint +parse_pem_pkcs8_plain (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PKCS8_PLAIN, data); +} + +static gint +parse_pem_pkcs8_encrypted (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PKCS8_ENCRYPTED, data); +} + +static gint +parse_pem_pkcs7 (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PKCS7, data); +} + +static gint +parse_pem_pkcs10 (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PKCS10, data); +} + +static gint +parse_pem_pkcs12 (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_DER_PKCS12, data); +} + +static gint +parse_openpgp_armor (GcrParser *self, + GBytes *data) +{ + return handle_pem_format (self, GCR_FORMAT_OPENPGP_PACKET, data); +} + +/* ----------------------------------------------------------------------------- + * OPENSSH + */ + +static void +on_openssh_public_key_parsed (GckAttributes *attrs, + const gchar *label, + const gchar *options, + GBytes *outer, + gpointer user_data) +{ + GcrParser *self = GCR_PARSER (user_data); + GcrParsed *parsed; + + parsed = push_parsed (self, FALSE); + parsing_block (parsed, GCR_FORMAT_OPENSSH_PUBLIC, outer); + parsed_attributes (parsed, attrs); + parsed_label (parsed, label); + parsed_fire (self, parsed); + pop_parsed (self, parsed); +} + +static gint +parse_openssh_public (GcrParser *self, + GBytes *data) +{ + guint num_parsed; + + num_parsed = _gcr_openssh_pub_parse (data, on_openssh_public_key_parsed, self); + + if (num_parsed == 0) + return GCR_ERROR_UNRECOGNIZED; + return SUCCESS; +} + +/* ----------------------------------------------------------------------------- + * FORMATS + */ + +/** + * GcrDataFormat: + * @GCR_FORMAT_ALL: Represents all the formats, when enabling or disabling + * @GCR_FORMAT_INVALID: Not a valid format + * @GCR_FORMAT_DER_PRIVATE_KEY: DER encoded private key + * @GCR_FORMAT_DER_PRIVATE_KEY_RSA: DER encoded RSA private key + * @GCR_FORMAT_DER_PRIVATE_KEY_DSA: DER encoded DSA private key + * @GCR_FORMAT_DER_PRIVATE_KEY_EC: DER encoded EC private key + * @GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY: DER encoded SubjectPublicKeyInfo + * @GCR_FORMAT_DER_CERTIFICATE_X509: DER encoded X.509 certificate + * @GCR_FORMAT_DER_PKCS7: DER encoded PKCS\#7 container file which can contain certificates + * @GCR_FORMAT_DER_PKCS8: DER encoded PKCS\#8 file which can contain a key + * @GCR_FORMAT_DER_PKCS8_PLAIN: Unencrypted DER encoded PKCS\#8 file which can contain a key + * @GCR_FORMAT_DER_PKCS8_ENCRYPTED: Encrypted DER encoded PKCS\#8 file which can contain a key + * @GCR_FORMAT_DER_PKCS10: DER encoded PKCS\#10 certificate request file + * @GCR_FORMAT_DER_PKCS12: DER encoded PKCS\#12 file which can contain certificates and/or keys + * @GCR_FORMAT_OPENSSH_PUBLIC: OpenSSH v1 or v2 public key + * @GCR_FORMAT_OPENPGP_PACKET: OpenPGP key packet(s) + * @GCR_FORMAT_OPENPGP_ARMOR: OpenPGP public or private key armor encoded data + * @GCR_FORMAT_PEM: An OpenSSL style PEM file with unspecified contents + * @GCR_FORMAT_PEM_PRIVATE_KEY: An OpenSSL style PEM file with a private key + * @GCR_FORMAT_PEM_PRIVATE_KEY_RSA: An OpenSSL style PEM file with a private RSA key + * @GCR_FORMAT_PEM_PRIVATE_KEY_DSA: An OpenSSL style PEM file with a private DSA key + * @GCR_FORMAT_PEM_PRIVATE_KEY_EC: An OpenSSL style PEM file with a private EC key + * @GCR_FORMAT_PEM_CERTIFICATE_X509: An OpenSSL style PEM file with an X.509 certificate + * @GCR_FORMAT_PEM_PKCS7: An OpenSSL style PEM file containing PKCS\#7 + * @GCR_FORMAT_PEM_PKCS8_PLAIN: Unencrypted OpenSSL style PEM file containing PKCS\#8 + * @GCR_FORMAT_PEM_PKCS8_ENCRYPTED: Encrypted OpenSSL style PEM file containing PKCS\#8 + * @GCR_FORMAT_PEM_PKCS10: An OpenSSL style PEM file containing PKCS\#10 + * @GCR_FORMAT_PEM_PKCS12: An OpenSSL style PEM file containing PKCS\#12 + * @GCR_FORMAT_PEM_PUBLIC_KEY: An OpenSSL style PEM file containing a SubjectPublicKeyInfo + * @GCR_FORMAT_DER_SPKAC: DER encoded SPKAC as generated by HTML5 keygen element + * @GCR_FORMAT_BASE64_SPKAC: OpenSSL style SPKAC data + * + * The various format identifiers. + */ + +/* + * In order of parsing when no formats specified. We put formats earlier + * if the parser can quickly detect whether GCR_ERROR_UNRECOGNIZED or not + */ + +static const ParserFormat parser_normal[] = { + { GCR_FORMAT_PEM, parse_pem }, + { GCR_FORMAT_BASE64_SPKAC, parse_base64_spkac }, + { GCR_FORMAT_DER_PRIVATE_KEY_RSA, parse_der_private_key_rsa }, + { GCR_FORMAT_DER_PRIVATE_KEY_DSA, parse_der_private_key_dsa }, + { GCR_FORMAT_DER_PRIVATE_KEY_EC, parse_der_private_key_ec }, + { GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY, parse_der_subject_public_key }, + { GCR_FORMAT_DER_CERTIFICATE_X509, parse_der_certificate }, + { GCR_FORMAT_DER_PKCS7, parse_der_pkcs7 }, + { GCR_FORMAT_DER_PKCS8_PLAIN, parse_der_pkcs8_plain }, + { GCR_FORMAT_DER_PKCS8_ENCRYPTED, parse_der_pkcs8_encrypted }, + { GCR_FORMAT_DER_PKCS12, parse_der_pkcs12 }, + { GCR_FORMAT_OPENSSH_PUBLIC, parse_openssh_public }, + { GCR_FORMAT_OPENPGP_PACKET, parse_openpgp_packets }, + { GCR_FORMAT_OPENPGP_ARMOR, parse_openpgp_armor }, + { GCR_FORMAT_DER_PKCS10, parse_der_pkcs10 }, + { GCR_FORMAT_DER_SPKAC, parse_der_spkac }, +}; + +/* Must be in format_id numeric order */ +static const ParserFormat parser_formats[] = { + { GCR_FORMAT_DER_PRIVATE_KEY, parse_der_private_key }, + { GCR_FORMAT_DER_PRIVATE_KEY_RSA, parse_der_private_key_rsa }, + { GCR_FORMAT_DER_PRIVATE_KEY_DSA, parse_der_private_key_dsa }, + { GCR_FORMAT_DER_PRIVATE_KEY_EC, parse_der_private_key_ec }, + { GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY, parse_der_subject_public_key }, + { GCR_FORMAT_DER_CERTIFICATE_X509, parse_der_certificate }, + { GCR_FORMAT_DER_PKCS7, parse_der_pkcs7 }, + { GCR_FORMAT_DER_PKCS8, parse_der_pkcs8 }, + { GCR_FORMAT_DER_PKCS8_PLAIN, parse_der_pkcs8_plain }, + { GCR_FORMAT_DER_PKCS8_ENCRYPTED, parse_der_pkcs8_encrypted }, + { GCR_FORMAT_DER_PKCS10, parse_der_pkcs10 }, + { GCR_FORMAT_DER_SPKAC, parse_der_spkac }, + { GCR_FORMAT_BASE64_SPKAC, parse_base64_spkac }, + { GCR_FORMAT_DER_PKCS12, parse_der_pkcs12 }, + { GCR_FORMAT_OPENSSH_PUBLIC, parse_openssh_public }, + { GCR_FORMAT_OPENPGP_PACKET, parse_openpgp_packets }, + { GCR_FORMAT_OPENPGP_ARMOR, parse_openpgp_armor }, + { GCR_FORMAT_PEM, parse_pem }, + { GCR_FORMAT_PEM_PRIVATE_KEY_RSA, parse_pem_private_key_rsa }, + { GCR_FORMAT_PEM_PRIVATE_KEY_DSA, parse_pem_private_key_dsa }, + { GCR_FORMAT_PEM_CERTIFICATE_X509, parse_pem_certificate }, + { GCR_FORMAT_PEM_PKCS7, parse_pem_pkcs7 }, + { GCR_FORMAT_PEM_PKCS8_PLAIN, parse_pem_pkcs8_plain }, + { GCR_FORMAT_PEM_PKCS8_ENCRYPTED, parse_pem_pkcs8_encrypted }, + { GCR_FORMAT_PEM_PKCS12, parse_pem_pkcs12 }, + { GCR_FORMAT_PEM_PKCS10, parse_pem_pkcs10 }, + { GCR_FORMAT_PEM_PRIVATE_KEY_EC, parse_pem_private_key_ec }, + { GCR_FORMAT_PEM_PUBLIC_KEY, parse_pem_public_key }, +}; + +static int +compar_id_to_parser_format (const void *a, const void *b) +{ + const gint *format_id = a; + const ParserFormat *format = b; + + g_assert (format_id); + g_assert (format); + + if (format->format_id == *format_id) + return 0; + return (*format_id < format->format_id) ? -1 : 1; +} + +static ParserFormat* +parser_format_lookup (gint format_id) +{ + return bsearch (&format_id, parser_formats, G_N_ELEMENTS (parser_formats), + sizeof (parser_formats[0]), compar_id_to_parser_format); +} + +static gint +compare_pointers (gconstpointer a, gconstpointer b) +{ + if (a == b) + return 0; + return a < b ? -1 : 1; +} + +typedef struct _ForeachArgs { + GcrParser *parser; + GBytes *data; + gint result; +} ForeachArgs; + +static gboolean +parser_format_foreach (gpointer key, gpointer value, gpointer data) +{ + ForeachArgs *args = data; + ParserFormat *format = key; + gint result; + + g_assert (format); + g_assert (format->function); + g_assert (GCR_IS_PARSER (args->parser)); + + result = (format->function) (args->parser, args->data); + if (result != GCR_ERROR_UNRECOGNIZED) { + args->result = result; + return TRUE; + } + + /* Keep going */ + return FALSE; +} + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + + +static GObject* +gcr_parser_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + GcrParser *self = GCR_PARSER (G_OBJECT_CLASS (gcr_parser_parent_class)->constructor(type, n_props, props)); + g_return_val_if_fail (self, NULL); + + /* Always try to parse with NULL and empty passwords first */ + gcr_parser_add_password (self, NULL); + gcr_parser_add_password (self, ""); + + return G_OBJECT (self); +} + +static void +gcr_parser_init (GcrParser *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_PARSER, GcrParserPrivate); + self->pv->passwords = g_ptr_array_new (); + self->pv->normal_formats = TRUE; +} + +static void +gcr_parser_dispose (GObject *obj) +{ + GcrParser *self = GCR_PARSER (obj); + gsize i; + + g_assert (!self->pv->parsed); + + if (self->pv->specific_formats) + g_tree_destroy (self->pv->specific_formats); + self->pv->specific_formats = NULL; + + for (i = 0; i < self->pv->passwords->len; ++i) + egg_secure_strfree (g_ptr_array_index (self->pv->passwords, i)); + g_ptr_array_set_size (self->pv->passwords, 0); + + G_OBJECT_CLASS (gcr_parser_parent_class)->dispose (obj); +} + +static void +gcr_parser_finalize (GObject *obj) +{ + GcrParser *self = GCR_PARSER (obj); + + g_assert (!self->pv->parsed); + + g_ptr_array_free (self->pv->passwords, TRUE); + self->pv->passwords = NULL; + + g_free (self->pv->filename); + self->pv->filename = NULL; + + G_OBJECT_CLASS (gcr_parser_parent_class)->finalize (obj); +} + +static void +gcr_parser_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_parser_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrParser *self = GCR_PARSER (obj); + + switch (prop_id) { + case PROP_PARSED_ATTRIBUTES: + g_value_set_boxed (value, gcr_parser_get_parsed_attributes (self)); + break; + case PROP_PARSED_LABEL: + g_value_set_string (value, gcr_parser_get_parsed_label (self)); + break; + case PROP_PARSED_DESCRIPTION: + g_value_set_string (value, gcr_parser_get_parsed_description (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_parser_class_init (GcrParserClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gint i; + + gobject_class->constructor = gcr_parser_constructor; + gobject_class->dispose = gcr_parser_dispose; + gobject_class->finalize = gcr_parser_finalize; + gobject_class->set_property = gcr_parser_set_property; + gobject_class->get_property = gcr_parser_get_property; + + /** + * GcrParser:parsed-attributes: + * + * Get the attributes that make up the currently parsed item. This is + * generally only valid during a #GcrParser::parsed signal. + */ + g_type_class_add_private (gobject_class, sizeof (GcrParserPrivate)); + + g_object_class_install_property (gobject_class, PROP_PARSED_ATTRIBUTES, + g_param_spec_boxed ("parsed-attributes", "Parsed Attributes", "Parsed PKCS#11 attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READABLE)); + + /** + * GcrParser:parsed-label: + * + * The label of the currently parsed item. This is generally + * only valid during a #GcrParser::parsed signal. + */ + g_object_class_install_property (gobject_class, PROP_PARSED_LABEL, + g_param_spec_string ("parsed-label", "Parsed Label", "Parsed item label", + "", G_PARAM_READABLE)); + + /** + * GcrParser:parsed-description: + * + * The description of the type of the currently parsed item. This is generally + * only valid during a #GcrParser::parsed signal. + */ + g_object_class_install_property (gobject_class, PROP_PARSED_DESCRIPTION, + g_param_spec_string ("parsed-description", "Parsed Description", "Parsed item description", + "", G_PARAM_READABLE)); + + /** + * GcrParser::authenticate: + * @self: the parser + * @count: the number of times this item has been authenticated + * + * This signal is emitted when an item needs to be unlocked or decrypted before + * it can be parsed. The @count argument specifies the number of times + * the signal has been emitted for a given item. This can be used to + * display a message saying the previous password was incorrect. + * + * Typically the gcr_parser_add_password() function is called in + * response to this signal. + * + * If %FALSE is returned, then the authentication was not handled. If + * no handlers return %TRUE then the item is not parsed and an error + * with the code %GCR_ERROR_CANCELLED will be raised. + * + * Returns: Whether the authentication was handled. + */ + signals[AUTHENTICATE] = g_signal_new ("authenticate", GCR_TYPE_PARSER, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrParserClass, authenticate), + g_signal_accumulator_true_handled, NULL, _gcr_marshal_BOOLEAN__INT, + G_TYPE_BOOLEAN, 1, G_TYPE_INT); + + /** + * GcrParser::parsed: + * @self: the parser + * + * This signal is emitted when an item is sucessfully parsed. To access + * the information about the item use the gcr_parser_get_parsed_label(), + * gcr_parser_get_parsed_attributes() and gcr_parser_get_parsed_description() + * functions. + */ + signals[PARSED] = g_signal_new ("parsed", GCR_TYPE_PARSER, + G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GcrParserClass, parsed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + init_quarks (); + _gcr_initialize_library (); + + /* Check that the format tables are in order */ + for (i = 1; i < G_N_ELEMENTS (parser_formats); ++i) + g_assert (parser_formats[i].format_id >= parser_formats[i - 1].format_id); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_parser_new: + * + * Create a new #GcrParser + * + * Returns: (transfer full): a newly allocated #GcrParser + */ +GcrParser * +gcr_parser_new (void) +{ + return g_object_new (GCR_TYPE_PARSER, NULL); +} + +/** + * gcr_parser_add_password: + * @self: The parser + * @password: (allow-none): a password to try + * + * Add a password to the set of passwords to try when parsing locked or encrypted + * items. This is usually called from the #GcrParser::authenticate signal. + */ +void +gcr_parser_add_password (GcrParser *self, const gchar *password) +{ + g_return_if_fail (GCR_IS_PARSER (self)); + g_ptr_array_add (self->pv->passwords, egg_secure_strdup (password)); +} + +/** + * gcr_parser_parse_bytes: + * @self: The parser + * @data: the data to parse + * @error: A location to raise an error on failure. + * + * Parse the data. The #GcrParser::parsed and #GcrParser::authenticate signals + * may fire during the parsing. + * + * Returns: Whether the data was parsed successfully or not. + */ +gboolean +gcr_parser_parse_bytes (GcrParser *self, + GBytes *data, + GError **error) +{ + ForeachArgs args = { self, NULL, GCR_ERROR_UNRECOGNIZED }; + const gchar *message = NULL; + gint i; + + g_return_val_if_fail (GCR_IS_PARSER (self), FALSE); + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + if (g_bytes_get_size (data) > 0) { + args.data = g_bytes_ref (data); + + /* Just the specific formats requested */ + if (self->pv->specific_formats) { + g_tree_foreach (self->pv->specific_formats, parser_format_foreach, &args); + + /* All the 'normal' formats */ + } else if (self->pv->normal_formats) { + for (i = 0; i < G_N_ELEMENTS (parser_normal); ++i) { + if (parser_format_foreach ((gpointer)(parser_normal + i), + (gpointer)(parser_normal + i), &args)) + break; + } + } + + g_bytes_unref (args.data); + } + + switch (args.result) { + case SUCCESS: + return TRUE; + case GCR_ERROR_CANCELLED: + message = _("The operation was cancelled"); + break; + case GCR_ERROR_UNRECOGNIZED: + message = _("Unrecognized or unsupported data."); + break; + case GCR_ERROR_FAILURE: + message = _("Could not parse invalid or corrupted data."); + break; + case GCR_ERROR_LOCKED: + message = _("The data is locked"); + break; + default: + g_assert_not_reached (); + break; + }; + + g_set_error_literal (error, GCR_DATA_ERROR, args.result, message); + return FALSE; +} + +/** + * gcr_parser_parse_data: + * @self: The parser + * @data: (array length=n_data): the data to parse + * @n_data: The length of the data + * @error: A location to raise an error on failure. + * + * Parse the data. The #GcrParser::parsed and #GcrParser::authenticate signals + * may fire during the parsing. + * + * A copy of the data will be made. Use gcr_parser_parse_bytes() to avoid this. + * + * Returns: Whether the data was parsed successfully or not. + */ +gboolean +gcr_parser_parse_data (GcrParser *self, + const guchar *data, + gsize n_data, + GError **error) +{ + GBytes *bytes; + gboolean ret; + + g_return_val_if_fail (GCR_IS_PARSER (self), FALSE); + g_return_val_if_fail (data || !n_data, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + bytes = g_bytes_new (data, n_data); + ret = gcr_parser_parse_bytes (self, bytes, error); + g_bytes_unref (bytes); + + return ret; +} + +/** + * gcr_parser_format_enable: + * @self: The parser + * @format: The format identifier + * + * Enable parsing of the given format. Use %GCR_FORMAT_ALL to enable all the formats. + */ +void +gcr_parser_format_enable (GcrParser *self, + GcrDataFormat format) +{ + const ParserFormat *form; + guint i; + + g_return_if_fail (GCR_IS_PARSER (self)); + + if (!self->pv->specific_formats) + self->pv->specific_formats = g_tree_new (compare_pointers); + + if (format != -1) { + form = parser_format_lookup (format); + g_return_if_fail (form); + g_tree_insert (self->pv->specific_formats, + (gpointer)form, (gpointer)form); + } else { + for (i = 0; i < G_N_ELEMENTS (parser_formats); i++) { + form = &parser_formats[i]; + g_tree_insert (self->pv->specific_formats, (gpointer)form, + (gpointer)form); + } + } +} + +/** + * gcr_parser_format_disable: + * @self: The parser + * @format: The format identifier + * + * Disable parsing of the given format. Use %GCR_FORMAT_ALL to disable all the formats. + */ +void +gcr_parser_format_disable (GcrParser *self, + GcrDataFormat format) +{ + ParserFormat *form; + + g_return_if_fail (GCR_IS_PARSER (self)); + + if (format == -1) { + if (self->pv->specific_formats) + g_tree_destroy (self->pv->specific_formats); + self->pv->specific_formats = NULL; + self->pv->normal_formats = FALSE; + } + + if (!self->pv->specific_formats) + return; + + form = parser_format_lookup (format); + g_return_if_fail (form); + + g_tree_remove (self->pv->specific_formats, form); +} + +/** + * gcr_parser_format_supported: + * @self: The parser + * @format: The format identifier + * + * Check whether the given format is supported by the parser. + * + * Returns: Whether the format is supported. + */ +gboolean +gcr_parser_format_supported (GcrParser *self, + GcrDataFormat format) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), FALSE); + g_return_val_if_fail (format != GCR_FORMAT_ALL, FALSE); + g_return_val_if_fail (format != GCR_FORMAT_INVALID, FALSE); + return parser_format_lookup (format) ? TRUE : FALSE; +} + +/** + * gcr_parser_get_parsed: + * @self: a parser + * + * Get the currently parsed item + * + * Returns: (transfer none): the currently parsed item + */ +GcrParsed * +gcr_parser_get_parsed (GcrParser *self) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), NULL); + return self->pv->parsed; +} + +GType +gcr_parsed_get_type (void) +{ + static volatile gsize initialized = 0; + static GType type = 0; + if (g_once_init_enter (&initialized)) { + type = g_boxed_type_register_static ("GcrParsed", + (GBoxedCopyFunc)gcr_parsed_ref, + (GBoxedFreeFunc)gcr_parsed_unref); + g_once_init_leave (&initialized, 1); + } + return type; +} + +/** + * gcr_parser_get_filename: + * @self: a parser item + * + * Get the filename of the parser item. + * + * Returns: the filename set on the parser, or %NULL + */ +const gchar * +gcr_parser_get_filename (GcrParser *self) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), NULL); + return self->pv->filename; +} + +/** + * gcr_parser_set_filename: + * @self: a parser item + * @filename: (allow-none): a string of the filename of the parser item + * + * Sets the filename of the parser item. + */ +void +gcr_parser_set_filename (GcrParser *self, + const gchar *filename) +{ + g_return_if_fail (GCR_IS_PARSER (self)); + g_free (self->pv->filename); + self->pv->filename = g_strdup (filename); +} + +/** + * gcr_parsed_ref: + * @parsed: a parsed item + * + * Add a reference to a parsed item. An item may not be shared across threads + * until it has been referenced at least once. + * + * Returns: (transfer full): the parsed item + */ +GcrParsed * +gcr_parsed_ref (GcrParsed *parsed) +{ + GcrParsed *copy; + + g_return_val_if_fail (parsed != NULL, NULL); + + /* Already had a reference */ + if (g_atomic_int_add (&parsed->refs, 1) >= 1) + return parsed; + + /* If this is the first reference, flatten the stack of parsed */ + copy = g_new0 (GcrParsed, 1); + copy->refs = 1; + copy->label = g_strdup (gcr_parsed_get_label (parsed)); + copy->filename = g_strdup (gcr_parsed_get_filename (parsed)); + copy->attrs = gcr_parsed_get_attributes (parsed); + copy->format = gcr_parsed_get_format (parsed); + if (copy->attrs) + gck_attributes_ref (copy->attrs); + copy->description = gcr_parsed_get_description (parsed); + copy->next = NULL; + + /* Find the block of data to copy */ + while (parsed != NULL) { + if (parsed->data != NULL) { + copy->data = g_bytes_ref (parsed->data); + copy->sensitive = parsed->sensitive; + break; + } + parsed = parsed->next; + } + + return copy; +} + +/** + * gcr_parsed_unref: + * @parsed: a parsed item + * + * Unreferences a parsed item which was referenced with gcr_parsed_ref() + */ +void +gcr_parsed_unref (gpointer parsed) +{ + GcrParsed *par = parsed; + + g_return_if_fail (parsed != NULL); + + if (g_atomic_int_dec_and_test (&par->refs)) { + _gcr_parsed_free (parsed); + } +} + +/** + * gcr_parser_get_parsed_description: + * @self: The parser + * + * Get a description for the type of the currently parsed item. This is generally + * only valid during the #GcrParser::parsed signal. + * + * Returns: (allow-none): the description for the current item; this is owned by + * the parser and should not be freed + */ +const gchar* +gcr_parser_get_parsed_description (GcrParser *self) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), NULL); + g_return_val_if_fail (self->pv->parsed != NULL, NULL); + + return gcr_parsed_get_description (self->pv->parsed); +} + +/** + * gcr_parsed_get_description: + * @parsed: a parsed item + * + * Get the descirption for a parsed item. + * + * Returns: (allow-none): the description + */ +const gchar* +gcr_parsed_get_description (GcrParsed *parsed) +{ + while (parsed != NULL) { + if (parsed->description != NULL) + return parsed->description; + parsed = parsed->next; + } + + return NULL; +} + +/** + * gcr_parser_get_parsed_attributes: + * @self: The parser + * + * Get the attributes which make up the currently parsed item. This is generally + * only valid during the #GcrParser::parsed signal. + * + * Returns: (transfer none) (allow-none): the attributes for the current item, + * which are owned by the parser and should not be freed + */ +GckAttributes * +gcr_parser_get_parsed_attributes (GcrParser *self) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), NULL); + g_return_val_if_fail (self->pv->parsed != NULL, NULL); + + return gcr_parsed_get_attributes (self->pv->parsed); +} + +/** + * gcr_parsed_get_attributes: + * @parsed: a parsed item + * + * Get the attributes which make up the parsed item. + * + * Returns: (transfer none) (allow-none): the attributes for the item; these + * are owned by the parsed item and should not be freed + */ +GckAttributes * +gcr_parsed_get_attributes (GcrParsed *parsed) +{ + while (parsed != NULL) { + if (parsed->attrs != NULL) + return parsed->attrs; + parsed = parsed->next; + } + + return NULL; +} + +/** + * gcr_parser_get_parsed_label: + * @self: The parser + * + * Get the label of the currently parsed item. This is generally only valid + * during the #GcrParser::parsed signal. + * + * Returns: (allow-none): the label of the currently parsed item. The value is + * owned by the parser and should not be freed. + */ +const gchar* +gcr_parser_get_parsed_label (GcrParser *self) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), NULL); + g_return_val_if_fail (self->pv->parsed != NULL, NULL); + + return gcr_parsed_get_label (self->pv->parsed); +} + +/** + * gcr_parsed_get_label: + * @parsed: a parsed item + * + * Get the label for the parsed item. + * + * Returns: (allow-none): the label for the item + */ +const gchar* +gcr_parsed_get_label (GcrParsed *parsed) +{ + while (parsed != NULL) { + if (parsed->label != NULL) + return parsed->label; + parsed = parsed->next; + } + + return NULL; +} + +/** + * gcr_parser_get_parsed_block: + * @self: a parser + * @n_block: a location to place the size of the block + * + * Get the raw data block that represents this parsed object. This is only + * valid during the #GcrParser::parsed signal. + * + * Returns: (transfer none) (array length=n_block) (allow-none): the raw data + * block of the currently parsed item; the value is owned by the parser + * and should not be freed + */ +const guchar * +gcr_parser_get_parsed_block (GcrParser *self, + gsize *n_block) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), NULL); + g_return_val_if_fail (n_block != NULL, NULL); + g_return_val_if_fail (self->pv->parsed != NULL, NULL); + + return gcr_parsed_get_data (self->pv->parsed, n_block); +} + + +/** + * gcr_parser_get_parsed_bytes: + * @self: a parser + * + * Get the raw data block that represents this parsed object. This is only + * valid during the #GcrParser::parsed signal. + * + * Returns: (transfer none): the raw data block of the currently parsed item + */ +GBytes * +gcr_parser_get_parsed_bytes (GcrParser *self) +{ + return gcr_parsed_get_bytes (self->pv->parsed); +} + +/** + * gcr_parsed_get_data: + * @parsed: a parsed item + * @n_data: location to store size of returned data + * + * Get the raw data block for the parsed item. + * + * Returns: (transfer none) (array length=n_data) (allow-none): the raw data of + * the parsed item, or %NULL + */ +const guchar * +gcr_parsed_get_data (GcrParsed *parsed, + gsize *n_data) +{ + GBytes *bytes; + + g_return_val_if_fail (n_data != NULL, NULL); + + bytes = gcr_parsed_get_bytes (parsed); + if (bytes == NULL) { + *n_data = 0; + return NULL; + } + + return g_bytes_get_data (bytes, n_data); +} + +/** + * gcr_parsed_get_bytes: + * @parsed: a parsed item + * + * Get the raw data block for the parsed item. + * + * Returns: (transfer none): the raw data of the parsed item, or %NULL + */ +GBytes * +gcr_parsed_get_bytes (GcrParsed *parsed) +{ + while (parsed != NULL) { + if (parsed->data != NULL) + return parsed->data; + parsed = parsed->next; + } + + return NULL; +} + +/** + * gcr_parser_get_parsed_format: + * @self: a parser + * + * Get the format of the raw data block that represents this parsed object. + * This corresponds with the data returned from gcr_parser_get_parsed_block(). + * + * This is only valid during the #GcrParser::parsed signal. + * + * Returns: the data format of the currently parsed item + */ +GcrDataFormat +gcr_parser_get_parsed_format (GcrParser *self) +{ + g_return_val_if_fail (GCR_IS_PARSER (self), 0); + g_return_val_if_fail (self->pv->parsed != NULL, 0); + + return gcr_parsed_get_format (self->pv->parsed); +} + +/** + * gcr_parsed_get_format: + * @parsed: a parsed item + * + * Get the format of the parsed item. + * + * Returns: the data format of the item + */ +GcrDataFormat +gcr_parsed_get_format (GcrParsed *parsed) +{ + while (parsed != NULL) { + if (parsed->data != NULL) + return parsed->format; + parsed = parsed->next; + } + + return 0; +} + +/** + * gcr_parsed_get_filename: + * @parsed: a parsed item + * + * Get the filename of the parsed item. + * + * Returns: (transfer none): the filename of + * the parsed item, or %NULL + */ +const gchar * +gcr_parsed_get_filename (GcrParsed *parsed) +{ + g_return_val_if_fail (parsed != NULL, NULL); + return parsed->filename; +} +/* --------------------------------------------------------------------------------- + * STREAM PARSING + */ + +#define GCR_TYPE_PARSING (gcr_parsing_get_type ()) +#define GCR_PARSING(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PARSING, GcrParsing)) +#define GCR_IS_PARSING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PARSING)) + +typedef struct _GcrParsing { + GObjectClass parent; + + GcrParser *parser; + gboolean async; + GCancellable *cancel; + + /* Failure information */ + GError *error; + gboolean complete; + + /* Operation state */ + GInputStream *input; + GByteArray *buffer; + + /* Async callback stuff */ + GAsyncReadyCallback callback; + gpointer user_data; + +} GcrParsing; + +typedef struct _GcrParsingClass { + GObjectClass parent_class; +} GcrParsingClass; + +/* State forward declarations */ +static void state_cancelled (GcrParsing *self, gboolean async); +static void state_failure (GcrParsing *self, gboolean async); +static void state_complete (GcrParsing *self, gboolean async); +static void state_parse_buffer (GcrParsing *self, gboolean async); +static void state_read_buffer (GcrParsing *self, gboolean async); + +/* Other forward declarations */ +static GType gcr_parsing_get_type (void) G_GNUC_CONST; +static void gcr_parsing_async_result_init (GAsyncResultIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrParsing, gcr_parsing, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, gcr_parsing_async_result_init)); + +#define BLOCK 4096 + +static void +next_state (GcrParsing *self, void (*state) (GcrParsing*, gboolean)) +{ + g_assert (GCR_IS_PARSING (self)); + g_assert (state); + + if (self->cancel && g_cancellable_is_cancelled (self->cancel)) + state = state_cancelled; + + (state) (self, self->async); +} + +static void +state_complete (GcrParsing *self, gboolean async) +{ + g_assert (GCR_IS_PARSING (self)); + g_assert (!self->complete); + self->complete = TRUE; + if (async && self->callback != NULL) + (self->callback) (G_OBJECT (self->parser), G_ASYNC_RESULT (self), self->user_data); +} + +static void +state_failure (GcrParsing *self, gboolean async) +{ + g_assert (GCR_IS_PARSING (self)); + g_assert (self->error); + next_state (self, state_complete); +} + +static void +state_cancelled (GcrParsing *self, gboolean async) +{ + g_assert (GCR_IS_PARSING (self)); + if (self->cancel && g_cancellable_is_cancelled (self->cancel)) + g_cancellable_cancel (self->cancel); + if (self->error) + g_error_free (self->error); + self->error = g_error_new_literal (GCR_DATA_ERROR, GCR_ERROR_CANCELLED, _("The operation was cancelled")); + next_state (self, state_failure); +} + +static void +state_parse_buffer (GcrParsing *self, gboolean async) +{ + GError *error = NULL; + GBytes *bytes; + gboolean ret; + + g_assert (GCR_IS_PARSING (self)); + g_assert (self->buffer); + + bytes = g_byte_array_free_to_bytes (self->buffer); + self->buffer = NULL; + ret = gcr_parser_parse_bytes (self->parser, bytes, &error); + g_bytes_unref (bytes); + + if (ret == TRUE) { + next_state (self, state_complete); + } else { + g_propagate_error (&self->error, error); + next_state (self, state_failure); + } +} + +static void +complete_read_buffer (GcrParsing *self, gssize count, GError *error) +{ + g_assert (GCR_IS_PARSING (self)); + g_assert (self->buffer); + + /* A failure */ + if (count == -1) { + g_propagate_error (&self->error, error); + next_state (self, state_failure); + } else { + + g_return_if_fail (count >= 0 && count <= BLOCK); + g_byte_array_set_size (self->buffer, self->buffer->len - (BLOCK - count)); + + /* Finished reading */ + if (count == 0) + next_state (self, state_parse_buffer); + + /* Read the next block */ + else + next_state (self, state_read_buffer); + } + +} + +static void +on_read_buffer (GObject *obj, GAsyncResult *res, gpointer user_data) +{ + GError *error = NULL; + gssize count; + + count = g_input_stream_read_finish (G_INPUT_STREAM (obj), res, &error); + complete_read_buffer (user_data, count, error); +} + +static void +state_read_buffer (GcrParsing *self, gboolean async) +{ + GError *error = NULL; + gssize count; + gsize at; + + g_assert (GCR_IS_PARSING (self)); + g_assert (G_IS_INPUT_STREAM (self->input)); + + if (!self->buffer) + self->buffer = g_byte_array_sized_new (BLOCK); + + at = self->buffer->len; + g_byte_array_set_size (self->buffer, at + BLOCK); + + if (async) { + g_input_stream_read_async (self->input, self->buffer->data + at, + BLOCK, G_PRIORITY_DEFAULT, self->cancel, + on_read_buffer, self); + } else { + count = g_input_stream_read (self->input, self->buffer->data + at, + BLOCK, self->cancel, &error); + complete_read_buffer (self, count, error); + } +} + +static void +gcr_parsing_init (GcrParsing *self) +{ + +} + +static void +gcr_parsing_finalize (GObject *obj) +{ + GcrParsing *self = GCR_PARSING (obj); + + g_object_unref (self->parser); + self->parser = NULL; + + g_object_unref (self->input); + self->input = NULL; + + if (self->cancel) + g_object_unref (self->cancel); + self->cancel = NULL; + + g_clear_error (&self->error); + + if (self->buffer) + g_byte_array_free (self->buffer, TRUE); + self->buffer = NULL; + + G_OBJECT_CLASS (gcr_parsing_parent_class)->finalize (obj); +} + +static void +gcr_parsing_class_init (GcrParsingClass *klass) +{ + G_OBJECT_CLASS (klass)->finalize = gcr_parsing_finalize; +} + +static gpointer +gcr_parsing_real_get_user_data (GAsyncResult *base) +{ + g_return_val_if_fail (GCR_IS_PARSING (base), NULL); + return GCR_PARSING (base)->user_data; +} + +static GObject* +gcr_parsing_real_get_source_object (GAsyncResult *base) +{ + g_return_val_if_fail (GCR_IS_PARSING (base), NULL); + return G_OBJECT (GCR_PARSING (base)->parser); +} + +static void +gcr_parsing_async_result_init (GAsyncResultIface *iface) +{ + iface->get_source_object = gcr_parsing_real_get_source_object; + iface->get_user_data = gcr_parsing_real_get_user_data; +} + +static GcrParsing* +gcr_parsing_new (GcrParser *parser, GInputStream *input, GCancellable *cancel) +{ + GcrParsing *self; + + g_assert (GCR_IS_PARSER (parser)); + g_assert (G_IS_INPUT_STREAM (input)); + + self = g_object_new (GCR_TYPE_PARSING, NULL); + self->parser = g_object_ref (parser); + self->input = g_object_ref (input); + if (cancel) + self->cancel = g_object_ref (cancel); + + return self; +} + +/** + * gcr_parser_parse_stream: + * @self: The parser + * @input: The input stream + * @cancellable: An optional cancellation object + * @error: A location to raise an error on failure + * + * Parse items from the data in a #GInputStream. This function may block while + * reading from the input stream. Use gcr_parser_parse_stream_async() for + * a non-blocking variant. + * + * The #GcrParser::parsed and #GcrParser::authenticate signals + * may fire during the parsing. + * + * Returns: Whether the parsing completed successfully or not. + */ +gboolean +gcr_parser_parse_stream (GcrParser *self, GInputStream *input, GCancellable *cancellable, + GError **error) +{ + GcrParsing *parsing; + gboolean result; + + g_return_val_if_fail (GCR_IS_PARSER (self), FALSE); + g_return_val_if_fail (G_IS_INPUT_STREAM (input), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + parsing = gcr_parsing_new (self, input, cancellable); + parsing->async = FALSE; + + next_state (parsing, state_read_buffer); + g_assert (parsing->complete); + + result = gcr_parser_parse_stream_finish (self, G_ASYNC_RESULT (parsing), error); + g_object_unref (parsing); + + return result; +} + +/** + * gcr_parser_parse_stream_async: + * @self: The parser + * @input: The input stream + * @cancellable: An optional cancellation object + * @callback: Called when the operation result is ready. + * @user_data: Data to pass to callback + * + * Parse items from the data in a #GInputStream. This function completes + * asyncronously and doesn't block. + * + * The #GcrParser::parsed and #GcrParser::authenticate signals + * may fire during the parsing. + */ +void +gcr_parser_parse_stream_async (GcrParser *self, GInputStream *input, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GcrParsing *parsing; + + g_return_if_fail (GCR_IS_PARSER (self)); + g_return_if_fail (G_IS_INPUT_STREAM (input)); + + parsing = gcr_parsing_new (self, input, cancellable); + parsing->async = TRUE; + parsing->callback = callback; + parsing->user_data = user_data; + + next_state (parsing, state_read_buffer); +} + +/** + * gcr_parser_parse_stream_finish: + * @self: The parser + * @result:The operation result + * @error: A location to raise an error on failure + * + * Complete an operation to parse a stream. + * + * Returns: Whether the parsing completed successfully or not. + */ +gboolean +gcr_parser_parse_stream_finish (GcrParser *self, GAsyncResult *result, GError **error) +{ + GcrParsing *parsing; + + g_return_val_if_fail (GCR_IS_PARSING (result), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + parsing = GCR_PARSING (result); + g_return_val_if_fail (parsing->complete, FALSE); + + if (parsing->error) { + g_propagate_error (error, parsing->error); + return FALSE; + } + + return TRUE; +} diff --git a/gcr/gcr-parser.h b/gcr/gcr-parser.h new file mode 100644 index 0000000..4f53a78 --- /dev/null +++ b/gcr/gcr-parser.h @@ -0,0 +1,149 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_PARSER_H__ +#define __GCR_PARSER_H__ + +#include +#include + +#include "gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_PARSER (gcr_parser_get_type ()) +#define GCR_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PARSER, GcrParser)) +#define GCR_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PARSER, GcrParserClass)) +#define GCR_IS_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PARSER)) +#define GCR_IS_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PARSER)) +#define GCR_PARSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PARSER, GcrParserClass)) + +typedef struct _GcrParser GcrParser; +typedef struct _GcrParserClass GcrParserClass; +typedef struct _GcrParserPrivate GcrParserPrivate; +typedef struct _GcrParsed GcrParsed; + +struct _GcrParser { + GObject parent; + + /*< private >*/ + GcrParserPrivate *pv; +}; + +struct _GcrParserClass { + GObjectClass parent_class; + + /* signals --------------------------------------------------------- */ + + /* A callback for each password needed */ + gboolean (*authenticate) (GcrParser *self, gint count); + + void (*parsed) (GcrParser *self); +}; + +GType gcr_parser_get_type (void); + +GcrParser* gcr_parser_new (void); + +void gcr_parser_format_enable (GcrParser *self, + GcrDataFormat format); + +void gcr_parser_format_disable (GcrParser *self, + GcrDataFormat format); + +gboolean gcr_parser_format_supported (GcrParser *self, + GcrDataFormat format); + +gboolean gcr_parser_parse_bytes (GcrParser *self, + GBytes *data, + GError **error); + +gboolean gcr_parser_parse_data (GcrParser *self, + const guchar *data, + gsize n_data, + GError **error); + +gboolean gcr_parser_parse_stream (GcrParser *self, + GInputStream *input, + GCancellable *cancellable, + GError **error); + +void gcr_parser_parse_stream_async (GcrParser *self, + GInputStream *input, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_parser_parse_stream_finish (GcrParser *self, + GAsyncResult *result, + GError **error); + +void gcr_parser_add_password (GcrParser *self, + const gchar *password); + +GcrParsed * gcr_parser_get_parsed (GcrParser *self); + +const gchar* gcr_parser_get_parsed_label (GcrParser *self); + +const gchar* gcr_parser_get_parsed_description (GcrParser *self); + +GckAttributes* gcr_parser_get_parsed_attributes (GcrParser *self); + +const guchar * gcr_parser_get_parsed_block (GcrParser *self, + gsize *n_block); + +GBytes * gcr_parser_get_parsed_bytes (GcrParser *self); + +GcrDataFormat gcr_parser_get_parsed_format (GcrParser *self); + +const gchar* gcr_parser_get_filename (GcrParser *self); + +void gcr_parser_set_filename (GcrParser *self, + const gchar *filename); + +#define GCR_TYPE_PARSED (gcr_parsed_get_type ()) + +GType gcr_parsed_get_type (void) G_GNUC_CONST; + +GcrParsed * gcr_parsed_ref (GcrParsed *parsed); + +void gcr_parsed_unref (gpointer parsed); + +const gchar* gcr_parsed_get_label (GcrParsed *parsed); + +const gchar* gcr_parsed_get_description (GcrParsed *parsed); + +GckAttributes* gcr_parsed_get_attributes (GcrParsed *parsed); + +const guchar * gcr_parsed_get_data (GcrParsed *parsed, + gsize *n_data); + +GBytes * gcr_parsed_get_bytes (GcrParsed *parsed); + +GcrDataFormat gcr_parsed_get_format (GcrParsed *parsed); + +const gchar* gcr_parsed_get_filename (GcrParsed *parsed); + +G_END_DECLS + +#endif /* __GCR_PARSER_H__ */ diff --git a/gcr/gcr-pkcs11-certificate.c b/gcr/gcr-pkcs11-certificate.c new file mode 100644 index 0000000..a89d7c5 --- /dev/null +++ b/gcr/gcr-pkcs11-certificate.c @@ -0,0 +1,448 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-pkcs11-certificate.h" + +#include "gcr-certificate.h" +#include "gcr-internal.h" +#include "gcr-library.h" + +#include + +#include + +/** + * SECTION:gcr-pkcs11-certificate + * @title: GcrPkcs11Certificate + * @short_description: A certificate loaded from PKCS\#11 storage + * + * A #GcrPkcs11Certificate is a certificate loaded from a PKCS\#11 storage. + * It is also a valid #GckObject and can be used as such. + * + * Use gcr_pkcs11_certificate_lookup_issuer() to lookup the issuer of a given + * certificate in the PKCS\#11 store. + * + * Various common PKCS\#11 certificate attributes are automatically loaded and + * are available via gcr_pkcs11_certificate_get_attributes(). + */ + +/** + * GcrPkcs11Certificate: + * + * A certificate loaded from PKCS\#11 storage. + */ + +/** + * GcrPkcs11CertificateClass: + * + * The class for #GcrPkcs11Certificate. + */ + +enum { + PROP_0, + PROP_ATTRIBUTES +}; + +struct _GcrPkcs11CertificatePrivate { + GckAttributes *attrs; +}; + +static void gcr_certificate_iface (GcrCertificateIface *iface); +G_DEFINE_TYPE_WITH_CODE (GcrPkcs11Certificate, gcr_pkcs11_certificate, GCK_TYPE_OBJECT, + GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE (); + G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, gcr_certificate_iface); +); + +typedef struct { + GckAttributes *search; + GcrCertificate *result; +} lookup_issuer_closure; + +static void +lookup_issuer_free (gpointer data) +{ + lookup_issuer_closure *closure = data; + gck_attributes_unref (closure->search); + g_clear_object (&closure->result); + g_free (closure); +} + +static GckAttributes * +prepare_lookup_certificate_issuer (GcrCertificate *cert) +{ + GckBuilder builder = GCK_BUILDER_INIT; + gpointer data; + gsize n_data; + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); + + data = gcr_certificate_get_issuer_raw (cert, &n_data); + gck_builder_add_data (&builder, CKA_SUBJECT, data, n_data); + g_free (data); + + return gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static GcrCertificate* +perform_lookup_certificate (GckAttributes *search, + GCancellable *cancellable, + GError **error) +{ + GcrCertificate *cert; + GckObject *object; + GckAttributes *attrs; + GckModule *module; + GckSession *session; + GckEnumerator *en; + GList *modules; + + if (!gcr_pkcs11_initialize (cancellable, error)) + return NULL; + + modules = gcr_pkcs11_get_modules (); + en = gck_modules_enumerate_objects (modules, search, 0); + gck_list_unref_free (modules); + + object = gck_enumerator_next (en, cancellable, error); + g_object_unref (en); + + if (object == NULL) + return NULL; + + /* + * Only the CKA_VALUE, CKA_CLASS and CKA_CERTIFICATE_TYPE + * is strictly necessary here, but we get more attrs. + */ + attrs = gck_object_get (object, cancellable, error, + CKA_VALUE, CKA_LABEL, + CKA_ID, CKA_CLASS, + CKA_CERTIFICATE_TYPE, + CKA_ISSUER, + CKA_SERIAL_NUMBER, + GCK_INVALID); + + if (attrs == NULL) { + g_object_unref (object); + return NULL; + } + + module = gck_object_get_module (object); + session = gck_object_get_session (object); + + cert = g_object_new (GCR_TYPE_PKCS11_CERTIFICATE, + "module", module, + "handle", gck_object_get_handle (object), + "session", session, + "attributes", attrs, + NULL); + + g_object_unref (module); + g_object_unref (session); + g_object_unref (object); + + gck_attributes_unref (attrs); + + return cert; +} + +static void +thread_lookup_certificate (GSimpleAsyncResult *res, GObject *object, GCancellable *cancel) +{ + lookup_issuer_closure *closure; + GError *error = NULL; + + closure = g_simple_async_result_get_op_res_gpointer (res); + closure->result = perform_lookup_certificate (closure->search, cancel, &error); + + if (error != NULL) { + g_simple_async_result_set_from_error (res, error); + g_clear_error (&error); + } +} + +/* ---------------------------------------------------------------------------- + * OBJECT + */ + +static GObject* +gcr_pkcs11_certificate_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + gpointer obj = G_OBJECT_CLASS (gcr_pkcs11_certificate_parent_class)->constructor (type, n_props, props); + GckAttributes *attrs; + const GckAttribute *attr; + gulong value; + + attrs = gcr_pkcs11_certificate_get_attributes (obj); + g_return_val_if_fail (attrs, NULL); + + if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &value) || + value != CKO_CERTIFICATE) { + g_warning ("attributes don't contain a certificate with: %s", + "CKA_CLASS == CKO_CERTIFICATE"); + return NULL; + } + + if (!gck_attributes_find_ulong (attrs, CKA_CERTIFICATE_TYPE, &value) || + value != CKC_X_509) { + g_warning ("attributes don't contain a certificate with: %s", + "CKA_CERTIFICATE_TYPE == CKC_X_509"); + return NULL; + } + + attr = gck_attributes_find (attrs, CKA_VALUE); + if (!attr || !attr->value || attr->length == 0 || attr->length == G_MAXULONG) { + g_warning ("attributes don't contain a valid: CKA_VALUE"); + return NULL; + } + + return obj; +} + +static void +gcr_pkcs11_certificate_init (GcrPkcs11Certificate *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_PKCS11_CERTIFICATE, GcrPkcs11CertificatePrivate); +} + +static void +gcr_pkcs11_certificate_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrPkcs11Certificate *self = GCR_PKCS11_CERTIFICATE (obj); + + switch (prop_id) { + case PROP_ATTRIBUTES: + g_return_if_fail (self->pv->attrs == NULL); + self->pv->attrs = g_value_dup_boxed (value); + g_return_if_fail (self->pv->attrs != NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_pkcs11_certificate_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrPkcs11Certificate *self = GCR_PKCS11_CERTIFICATE (obj); + + switch (prop_id) { + case PROP_ATTRIBUTES: + g_value_set_boxed (value, gcr_pkcs11_certificate_get_attributes (self)); + break; + default: + gcr_certificate_mixin_get_property (obj, prop_id, value, pspec); + break; + } +} + +static void +gcr_pkcs11_certificate_finalize (GObject *obj) +{ + GcrPkcs11Certificate *self = GCR_PKCS11_CERTIFICATE (obj); + + gck_attributes_unref (self->pv->attrs); + + G_OBJECT_CLASS (gcr_pkcs11_certificate_parent_class)->finalize (obj); +} + +static void +gcr_pkcs11_certificate_class_init (GcrPkcs11CertificateClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructor = gcr_pkcs11_certificate_constructor; + gobject_class->get_property = gcr_pkcs11_certificate_get_property; + gobject_class->set_property = gcr_pkcs11_certificate_set_property; + gobject_class->finalize = gcr_pkcs11_certificate_finalize; + + /** + * GcrPkcs11Certificate:attributes: + * + * Automatically loaded attributes for this certificate. + */ + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the renderer", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (gobject_class, sizeof (GcrPkcs11CertificatePrivate)); + + gcr_certificate_mixin_class_init (gobject_class); + _gcr_initialize_library (); +} + +static const guchar * +gcr_pkcs11_certificate_get_der_data (GcrCertificate *cert, + gsize *n_data) +{ + GcrPkcs11Certificate *self = GCR_PKCS11_CERTIFICATE (cert); + const GckAttribute *attr; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (n_data, NULL); + g_return_val_if_fail (self->pv->attrs, NULL); + + attr = gck_attributes_find (self->pv->attrs, CKA_VALUE); + g_return_val_if_fail (attr && attr->length != 0 && attr->length != G_MAXULONG, NULL); + *n_data = attr->length; + return attr->value; +} + +static void +gcr_certificate_iface (GcrCertificateIface *iface) +{ + iface->get_der_data = gcr_pkcs11_certificate_get_der_data; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_pkcs11_certificate_get_attributes: + * @self: A #GcrPkcs11Certificate + * + * Access the automatically loaded attributes for this certificate. + * + * Returns: (transfer none): the certificate attributes + */ +GckAttributes * +gcr_pkcs11_certificate_get_attributes (GcrPkcs11Certificate *self) +{ + g_return_val_if_fail (GCR_IS_PKCS11_CERTIFICATE (self), NULL); + return self->pv->attrs; +} + +/** + * gcr_pkcs11_certificate_lookup_issuer: + * @certificate: a #GcrCertificate + * @cancellable: a #GCancellable + * @error: a #GError, or NULL + * + * Lookup a the issuer of a @certificate in the PKCS\#11 storage. The + * lookup is done using the issuer DN of the certificate. No certificate chain + * verification is done. Use a crypto library to make trust decisions. + * + * This call may block, see gcr_pkcs11_certificate_lookup_issuer() for the + * non-blocking version. + * + * Will return %NULL if no issuer certificate is found. Use @error to determine + * if an error occurred. + * + * Returns: (transfer full): a new #GcrPkcs11Certificate, or %NULL + */ +GcrCertificate * +gcr_pkcs11_certificate_lookup_issuer (GcrCertificate *certificate, GCancellable *cancellable, + GError **error) +{ + GckAttributes *search; + GcrCertificate *issuer; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (certificate), NULL); + + if (!gcr_pkcs11_initialize (cancellable, error)) + return NULL; + + search = prepare_lookup_certificate_issuer (certificate); + g_return_val_if_fail (search, FALSE); + + issuer = perform_lookup_certificate (search, cancellable, error); + gck_attributes_unref (search); + + return issuer; +} + +/** + * gcr_pkcs11_certificate_lookup_issuer_async: + * @certificate: a #GcrCertificate + * @cancellable: a #GCancellable + * @callback: a #GAsyncReadyCallback to call when the operation completes + * @user_data: the data to pass to callback function + * + * Lookup a the issuer of a @certificate in the PKCS\#11 storage. The + * lookup is done using the issuer DN of the certificate. No certificate chain + * verification is done. Use a crypto library to make trust decisions. + * + * When the operation is finished, callback will be called. You can then call + * gcr_pkcs11_certificate_lookup_issuer_finish() to get the result of the + * operation. + */ +void +gcr_pkcs11_certificate_lookup_issuer_async (GcrCertificate *certificate, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GSimpleAsyncResult *async; + lookup_issuer_closure *closure; + + g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); + + async = g_simple_async_result_new (G_OBJECT (certificate), callback, user_data, + gcr_pkcs11_certificate_lookup_issuer_async); + closure = g_new0 (lookup_issuer_closure, 1); + closure->search = prepare_lookup_certificate_issuer (certificate); + g_return_if_fail (closure->search); + g_simple_async_result_set_op_res_gpointer (async, closure, lookup_issuer_free); + + g_simple_async_result_run_in_thread (async, thread_lookup_certificate, + G_PRIORITY_DEFAULT, cancellable); + + g_object_unref (async); +} + +/** + * gcr_pkcs11_certificate_lookup_issuer_finish: + * @result: the #GAsyncResult passed to the callback + * @error: a #GError, or NULL + * + * Finishes an asynchronous operation started by + * gcr_pkcs11_certificate_lookup_issuer_async(). + * + * Will return %NULL if no issuer certificate is found. Use @error to determine + * if an error occurred. + * + * Returns: (transfer full): a new #GcrPkcs11Certificate, or %NULL + */ +GcrCertificate * +gcr_pkcs11_certificate_lookup_issuer_finish (GAsyncResult *result, GError **error) +{ + lookup_issuer_closure *closure; + GObject *source; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + source = g_async_result_get_source_object (result); + g_return_val_if_fail (g_simple_async_result_is_valid (result, source, + gcr_pkcs11_certificate_lookup_issuer_async), NULL); + g_object_unref (source); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return NULL; + + closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); + if (closure->result != NULL) + g_object_ref (closure->result); + return closure->result; +} diff --git a/gcr/gcr-pkcs11-certificate.h b/gcr/gcr-pkcs11-certificate.h new file mode 100644 index 0000000..5928a87 --- /dev/null +++ b/gcr/gcr-pkcs11-certificate.h @@ -0,0 +1,77 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_PKCS11_CERTIFICATE_H__ +#define __GCR_PKCS11_CERTIFICATE_H__ + +#include "gcr-types.h" +#include "gcr-certificate.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_PKCS11_CERTIFICATE (gcr_pkcs11_certificate_get_type ()) +#define GCR_PKCS11_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PKCS11_CERTIFICATE, GcrPkcs11Certificate)) +#define GCR_PKCS11_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PKCS11_CERTIFICATE, GcrPkcs11CertificateClass)) +#define GCR_IS_PKCS11_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PKCS11_CERTIFICATE)) +#define GCR_IS_PKCS11_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PKCS11_CERTIFICATE)) +#define GCR_PKCS11_CERTIFICATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PKCS11_CERTIFICATE, GcrPkcs11CertificateClass)) + +typedef struct _GcrPkcs11Certificate GcrPkcs11Certificate; +typedef struct _GcrPkcs11CertificateClass GcrPkcs11CertificateClass; +typedef struct _GcrPkcs11CertificatePrivate GcrPkcs11CertificatePrivate; + +struct _GcrPkcs11Certificate { + GckObject parent; + + /*< private >*/ + GcrPkcs11CertificatePrivate *pv; +}; + +struct _GcrPkcs11CertificateClass { + /*< private >*/ + GckObjectClass parent_class; +}; + +GType gcr_pkcs11_certificate_get_type (void); + +GckAttributes* gcr_pkcs11_certificate_get_attributes (GcrPkcs11Certificate *self); + +GcrCertificate* gcr_pkcs11_certificate_lookup_issuer (GcrCertificate *certificate, + GCancellable *cancellable, + GError **error); + +void gcr_pkcs11_certificate_lookup_issuer_async (GcrCertificate *certificate, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GcrCertificate* gcr_pkcs11_certificate_lookup_issuer_finish (GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __GCR_PKCS11_CERTIFICATE_H__ */ diff --git a/gcr/gcr-pkcs11-importer.c b/gcr/gcr-pkcs11-importer.c new file mode 100644 index 0000000..b86c645 --- /dev/null +++ b/gcr/gcr-pkcs11-importer.c @@ -0,0 +1,945 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-fingerprint.h" +#include "gcr-icons.h" +#include "gcr-internal.h" +#include "gcr-library.h" +#include "gcr-import-interaction.h" +#include "gcr-internal.h" +#include "gcr-parser.h" +#include "gcr-pkcs11-importer.h" + +#include "egg/egg-hex.h" + +#include + +#include + +#include + +enum { + PROP_0, + PROP_LABEL, + PROP_ICON, + PROP_INTERACTION, + PROP_SLOT, + PROP_IMPORTED, + PROP_QUEUED, + PROP_URI +}; + +typedef struct _GcrPkcs11ImporterClass GcrPkcs11ImporterClass; + +struct _GcrPkcs11Importer { + GObject parent; + GckSlot *slot; + GList *objects; + GckSession *session; + GQueue *queue; + GTlsInteraction *interaction; + gboolean any_private; +}; + +struct _GcrPkcs11ImporterClass { + GObjectClass parent_class; +}; + +typedef struct { + GcrPkcs11Importer *importer; + GCancellable *cancellable; + gboolean prompted; + gboolean async; + GckBuilder *supplement; +} GcrImporterData; + +/* State forward declarations */ +static void state_cancelled (GSimpleAsyncResult *res, + gboolean async); + +static void state_complete (GSimpleAsyncResult *res, + gboolean async); + +static void state_create_object (GSimpleAsyncResult *res, + gboolean async); + +static void state_supplement (GSimpleAsyncResult *res, + gboolean async); + +static void state_open_session (GSimpleAsyncResult *res, + gboolean async); + +static void _gcr_pkcs11_importer_init_iface (GcrImporterIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrPkcs11Importer, _gcr_pkcs11_importer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, _gcr_pkcs11_importer_init_iface); +); + +#define BLOCK 4096 + +static void +gcr_importer_data_free (gpointer data) +{ + GcrImporterData *state = data; + + g_clear_object (&state->cancellable); + g_clear_object (&state->importer); + gck_builder_unref (state->supplement); + g_free (state); +} + +static void +next_state (GSimpleAsyncResult *res, + void (*state) (GSimpleAsyncResult *, gboolean)) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + + g_assert (state); + + if (g_cancellable_is_cancelled (data->cancellable)) + state = state_cancelled; + + (state) (res, data->async); +} + +/* --------------------------------------------------------------------------------- + * COMPLETE + */ + +static void +state_complete (GSimpleAsyncResult *res, + gboolean async) +{ + g_simple_async_result_complete (res); +} + +static void +state_cancelled (GSimpleAsyncResult *res, + gboolean async) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GError *error = NULL; + + if (data->cancellable && !g_cancellable_is_cancelled (data->cancellable)) + g_cancellable_cancel (data->cancellable); + + g_cancellable_set_error_if_cancelled (data->cancellable, &error); + g_simple_async_result_take_error (res, error); + next_state (res, state_complete); +} + +/* --------------------------------------------------------------------------------- + * CREATE OBJECTS + */ + +static void +complete_create_object (GSimpleAsyncResult *res, + GckObject *object, + GError *error) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrPkcs11Importer *self = data->importer; + + if (object == NULL) { + g_simple_async_result_take_error (res, error); + next_state (res, state_complete); + + } else { + self->objects = g_list_append (self->objects, object); + next_state (res, state_create_object); + } +} + +static void +on_create_object (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GError *error = NULL; + GckObject *object; + + object = gck_session_create_object_finish (GCK_SESSION (source), result, &error); + complete_create_object (res, object, error); + g_object_unref (res); +} + +static void +state_create_object (GSimpleAsyncResult *res, + gboolean async) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrPkcs11Importer *self = data->importer; + GckAttributes *attrs; + GckObject *object; + GError *error = NULL; + + /* No more objects */ + if (g_queue_is_empty (self->queue)) { + next_state (res, state_complete); + + } else { + + /* Pop first one off the list */ + attrs = g_queue_pop_head (self->queue); + g_assert (attrs != NULL); + + if (async) { + gck_session_create_object_async (self->session, attrs, + data->cancellable, on_create_object, + g_object_ref (res)); + } else { + object = gck_session_create_object (self->session, attrs, + data->cancellable, &error); + complete_create_object (res, object, error); + } + + gck_attributes_unref (attrs); + } +} + +/* --------------------------------------------------------------------------------- + * SUPPLEMENTING and FIXING UP + */ + +typedef struct { + GckAttributes *certificate; + GckAttributes *private_key; +} CertificateKeyPair; + +static void +supplement_with_attributes (GckBuilder *builder, + GckAttributes *supplements) +{ + const GckAttribute *supplement; + gint i; + + for (i = 0; i < gck_attributes_count (supplements); i++) { + supplement = gck_attributes_at (supplements, i); + if (!gck_attribute_is_invalid (supplement) && supplement->length != 0) + gck_builder_add_attribute (builder, supplement); + } +} + +static void +supplement_id_for_data (GckBuilder *builder, + guchar *nonce, + gsize n_once, + gpointer data, + gsize n_data) +{ + gcry_md_hd_t mdh; + gcry_error_t gcry; + + if (gck_builder_find (builder, CKA_ID) != NULL) + return; + + gcry = gcry_md_open (&mdh, GCRY_MD_SHA1, 0); + g_return_if_fail (gcry == 0); + + gcry_md_write (mdh, nonce, n_once); + gcry_md_write (mdh, data, n_data); + + gck_builder_add_data (builder, CKA_ID, + gcry_md_read (mdh, 0), + gcry_md_get_algo_dlen (GCRY_MD_SHA1)); + + gcry_md_close (mdh); +} + +static void +supplement_attributes (GcrPkcs11Importer *self, + GckAttributes *supplements) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GHashTable *pairs; + GHashTable *paired; + CertificateKeyPair *pair; + gboolean supplemented = FALSE; + GckAttributes *attrs; + gulong klass; + guchar *finger; + gchar *fingerprint; + guchar nonce[20]; + GHashTableIter iter; + gsize n_finger; + GQueue *queue; + GList *l; + + /* A table of certificate/key pairs by fingerprint */ + pairs = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + + for (l = self->queue->head; l != NULL; l = g_list_next (l)) { + attrs = l->data; + if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass)) + g_return_if_reached (); + + /* Make a string fingerprint for this guy */ + finger = gcr_fingerprint_from_attributes (attrs, G_CHECKSUM_SHA1, + &n_finger); + if (finger) { + fingerprint = egg_hex_encode (finger, n_finger); + g_free (finger); + + pair = g_hash_table_lookup (pairs, fingerprint); + if (pair == NULL) { + pair = g_new0 (CertificateKeyPair, 1); + g_hash_table_insert (pairs, fingerprint, pair); + } else { + g_free (fingerprint); + } + } else { + pair = NULL; + } + + fingerprint = NULL; + gck_builder_add_all (&builder, attrs); + gck_builder_set_boolean (&builder, CKA_TOKEN, CK_TRUE); + + switch (klass) { + case CKO_CERTIFICATE: + gck_builder_set_boolean (&builder, CKA_PRIVATE, FALSE); + break; + case CKO_PRIVATE_KEY: + gck_builder_set_boolean (&builder, CKA_PRIVATE, TRUE); + gck_builder_add_boolean (&builder, CKA_DECRYPT, TRUE); + gck_builder_add_boolean (&builder, CKA_SIGN, TRUE); + gck_builder_add_boolean (&builder, CKA_SIGN_RECOVER, TRUE); + gck_builder_add_boolean (&builder, CKA_UNWRAP, TRUE); + gck_builder_add_boolean (&builder, CKA_SENSITIVE, TRUE); + break; + } + + gck_attributes_unref (attrs); + l->data = attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + + switch (klass) { + case CKO_CERTIFICATE: + if (pair != NULL && pair->certificate == NULL) + pair->certificate = attrs; + break; + case CKO_PRIVATE_KEY: + if (pair != NULL && pair->private_key == NULL) + pair->private_key = attrs; + break; + } + } + + /* For generation of CKA_ID's */ + gcry_create_nonce (nonce, sizeof (nonce)); + + /* A table for marking which attributes are in the pairs table */ + paired = g_hash_table_new (g_direct_hash, g_direct_equal); + + /* Now move everything in pairs to the front */ + queue = g_queue_new (); + g_hash_table_iter_init (&iter, pairs); + while (g_hash_table_iter_next (&iter, (gpointer *)&fingerprint, (gpointer *)&pair)) { + if (pair->certificate != NULL && pair->private_key != NULL) { + /* + * Generate a CKA_ID based on the fingerprint and nonce, + * and do the same CKA_ID for both private key and certificate. + */ + + gck_builder_add_all (&builder, pair->private_key); + supplement_with_attributes (&builder, supplements); + supplement_id_for_data (&builder, nonce, sizeof (nonce), + fingerprint, strlen (fingerprint)); + g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder))); + g_hash_table_insert (paired, pair->private_key, "present"); + + gck_builder_add_all (&builder, pair->certificate); + supplement_with_attributes (&builder, supplements); + supplement_id_for_data (&builder, nonce, sizeof (nonce), + fingerprint, strlen (fingerprint)); + g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder))); + g_hash_table_insert (paired, pair->certificate, "present"); + + /* Used the suplements for the pairs, don't use for unpaired stuff */ + supplemented = TRUE; + } + } + + /* Go through the old queue, and look for anything not paired */ + for (l = self->queue->head; l != NULL; l = g_list_next (l)) { + attrs = l->data; + if (!g_hash_table_lookup (paired, attrs)) { + gck_builder_add_all (&builder, attrs); + if (!supplemented) + supplement_with_attributes (&builder, supplements); + + /* + * Generate a CKA_ID based on the location of attrs in, + * memory, since this together with the nonce should + * be unique. + */ + supplement_id_for_data (&builder, nonce, sizeof (nonce), + &attrs, sizeof (gpointer)); + + g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder))); + } + } + + /* And swap the new queue into place */ + g_queue_foreach (self->queue, (GFunc)gck_attributes_unref, NULL); + g_queue_free (self->queue); + self->queue = queue; + + g_hash_table_destroy (paired); + g_hash_table_destroy (pairs); +} + +static void +complete_supplement (GSimpleAsyncResult *res, + GError *error) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GckAttributes *attributes; + + if (error == NULL) { + attributes = gck_attributes_ref_sink (gck_builder_end (data->supplement)); + supplement_attributes (data->importer, attributes); + gck_attributes_unref (attributes); + + next_state (res, state_create_object); + } else { + g_simple_async_result_take_error (res, error); + next_state (res, state_complete); + } +} + +static void +on_supplement_done (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrPkcs11Importer *self = data->importer; + GError *error = NULL; + + gcr_import_interaction_supplement_finish (GCR_IMPORT_INTERACTION (self->interaction), + result, &error); + complete_supplement (res, error); + g_object_unref (res); +} + +static void +state_supplement (GSimpleAsyncResult *res, + gboolean async) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrPkcs11Importer *self = data->importer; + GError *error = NULL; + + if (self->interaction == NULL || !GCR_IS_IMPORT_INTERACTION (self->interaction)) { + complete_supplement (res, NULL); + + } else if (async) { + gcr_import_interaction_supplement_async (GCR_IMPORT_INTERACTION (self->interaction), + data->supplement, data->cancellable, + on_supplement_done, g_object_ref (res)); + + } else { + gcr_import_interaction_supplement (GCR_IMPORT_INTERACTION (self->interaction), + data->supplement, data->cancellable, &error); + complete_supplement (res, error); + } +} + +static void +supplement_prep (GSimpleAsyncResult *res) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrPkcs11Importer *self = data->importer; + const GckAttribute *the_label = NULL; + const GckAttribute *attr; + gboolean first = TRUE; + GList *l; + + if (data->supplement) + gck_builder_unref (data->supplement); + data->supplement = gck_builder_new (GCK_BUILDER_NONE); + + /* Do we have a consistent label across all objects? */ + for (l = self->queue->head; l != NULL; l = g_list_next (l)) { + attr = gck_attributes_find (l->data, CKA_LABEL); + if (first) + the_label = attr; + else if (!gck_attribute_equal (the_label, attr)) + the_label = NULL; + first = FALSE; + } + + /* If consistent label, set that in supplement data */ + if (the_label != NULL) + gck_builder_add_data (data->supplement, CKA_LABEL, the_label->value, the_label->length); + else + gck_builder_add_empty (data->supplement, CKA_LABEL); + + if (GCR_IS_IMPORT_INTERACTION (self->interaction)) + gcr_import_interaction_supplement_prep (GCR_IMPORT_INTERACTION (self->interaction), + data->supplement); +} + +/* --------------------------------------------------------------------------------- + * OPEN SESSION + */ + +static void +complete_open_session (GSimpleAsyncResult *res, + GckSession *session, + GError *error) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrPkcs11Importer *self = data->importer; + + if (!session) { + g_simple_async_result_take_error (res, error); + next_state (res, state_complete); + + } else { + g_clear_object (&self->session); + self->session = session; + next_state (res, state_supplement); + } +} + +static void +on_open_session (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GError *error = NULL; + GckSession *session; + + session = gck_session_open_finish (result, &error); + complete_open_session (res, session, error); + g_object_unref (res); +} + +static void +state_open_session (GSimpleAsyncResult *res, + gboolean async) +{ + GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrPkcs11Importer *self = data->importer; + guint options = GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER; + GckSession *session; + GError *error = NULL; + + if (async) { + gck_session_open_async (self->slot, options, self->interaction, + data->cancellable, on_open_session, g_object_ref (res)); + } else { + session = gck_session_open (self->slot, options, self->interaction, + data->cancellable, &error); + complete_open_session (res, session, error); + } +} + +static void +_gcr_pkcs11_importer_init (GcrPkcs11Importer *self) +{ + self->queue = g_queue_new (); +} + +static void +_gcr_pkcs11_importer_dispose (GObject *obj) +{ + GcrPkcs11Importer *self = GCR_PKCS11_IMPORTER (obj); + + gck_list_unref_free (self->objects); + self->objects = NULL; + g_clear_object (&self->session); + g_clear_object (&self->interaction); + + while (!g_queue_is_empty (self->queue)) + gck_attributes_unref (g_queue_pop_head (self->queue)); + + G_OBJECT_CLASS (_gcr_pkcs11_importer_parent_class)->dispose (obj); +} + +static void +_gcr_pkcs11_importer_finalize (GObject *obj) +{ + GcrPkcs11Importer *self = GCR_PKCS11_IMPORTER (obj); + + g_queue_free (self->queue); + g_clear_object (&self->slot); + + G_OBJECT_CLASS (_gcr_pkcs11_importer_parent_class)->finalize (obj); +} + +static void +_gcr_pkcs11_importer_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrPkcs11Importer *self = GCR_PKCS11_IMPORTER (obj); + + switch (prop_id) { + case PROP_SLOT: + self->slot = g_value_dup_object (value); + g_return_if_fail (self->slot); + break; + case PROP_INTERACTION: + g_clear_object (&self->interaction); + self->interaction = g_value_dup_object (value); + g_object_notify (G_OBJECT (self), "interaction"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static gchar * +calculate_label (GcrPkcs11Importer *self) +{ + GckTokenInfo *info; + gchar *result; + + info = gck_slot_get_token_info (self->slot); + result = g_strdup (info->label); + gck_token_info_free (info); + + return result; +} + +static GIcon * +calculate_icon (GcrPkcs11Importer *self, + GckTokenInfo *token_info) +{ + GckTokenInfo *info = NULL; + GIcon *result; + + if (token_info == NULL) + info = token_info = gck_slot_get_token_info (self->slot); + result = gcr_icon_for_token (token_info); + gck_token_info_free (info); + + return result; +} + +static gchar * +calculate_uri (GcrPkcs11Importer *self) +{ + GckUriData *data; + gchar *uri; + + data = gck_uri_data_new (); + data->token_info = gck_slot_get_token_info (self->slot); + uri = gck_uri_build (data, GCK_URI_FOR_TOKEN); + data->token_info = NULL; + gck_uri_data_free (data); + + return uri; +} + +static void +_gcr_pkcs11_importer_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrPkcs11Importer *self = GCR_PKCS11_IMPORTER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_take_string (value, calculate_label (self)); + break; + case PROP_ICON: + g_value_take_object (value, calculate_icon (self, NULL)); + break; + case PROP_SLOT: + g_value_set_object (value, _gcr_pkcs11_importer_get_slot (self)); + break; + case PROP_IMPORTED: + g_value_take_boxed (value, _gcr_pkcs11_importer_get_imported (self)); + break; + case PROP_QUEUED: + g_value_set_pointer (value, _gcr_pkcs11_importer_get_queued (self)); + break; + case PROP_INTERACTION: + g_value_set_object (value, self->interaction); + break; + case PROP_URI: + g_value_take_string (value, calculate_uri (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_pkcs11_importer_class_init (GcrPkcs11ImporterClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GckBuilder builder = GCK_BUILDER_INIT; + + gobject_class->dispose = _gcr_pkcs11_importer_dispose; + gobject_class->finalize = _gcr_pkcs11_importer_finalize; + gobject_class->set_property = _gcr_pkcs11_importer_set_property; + gobject_class->get_property = _gcr_pkcs11_importer_get_property; + + g_object_class_override_property (gobject_class, PROP_LABEL, "label"); + g_object_class_override_property (gobject_class, PROP_ICON, "icon"); + g_object_class_override_property (gobject_class, PROP_INTERACTION, "interaction"); + g_object_class_override_property (gobject_class, PROP_URI, "uri"); + + g_object_class_install_property (gobject_class, PROP_SLOT, + g_param_spec_object ("slot", "Slot", "PKCS#11 slot to import data into", + GCK_TYPE_SLOT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, PROP_IMPORTED, + g_param_spec_boxed ("imported", "Imported", "Imported objects", + GCK_TYPE_LIST, G_PARAM_READABLE)); + + g_object_class_install_property (gobject_class, PROP_QUEUED, + g_param_spec_pointer ("queued", "Queued", "Queued attributes", + G_PARAM_READABLE)); + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); + gcr_importer_register (GCR_TYPE_PKCS11_IMPORTER, gck_builder_end (&builder)); + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); + gcr_importer_register (GCR_TYPE_PKCS11_IMPORTER, gck_builder_end (&builder)); + + _gcr_initialize_library (); +} + +static GList * +list_all_slots (void) +{ + GList *modules; + GList *results; + + modules = gcr_pkcs11_get_modules (); + results = gck_modules_get_slots (modules, TRUE); + gck_list_unref_free (modules); + + return results; +} + +static const char *token_blacklist[] = { + "pkcs11:manufacturer=Gnome%20Keyring;serial=1:SECRET:MAIN", + "pkcs11:manufacturer=Gnome%20Keyring;serial=1%3aXDG%3aDEFAULT", + NULL +}; + +static gboolean +is_slot_importable (GckSlot *slot, + GckTokenInfo *token) +{ + GError *error = NULL; + GckUriData *uri; + gboolean match; + guint i; + + if (token->flags & CKF_WRITE_PROTECTED) { + g_debug ("token is not importable: %s: write protected", token->label); + return FALSE; + } + if (!(token->flags & CKF_TOKEN_INITIALIZED)) { + g_debug ("token is not importable: %s: not initialized", token->label); + return FALSE; + } + if ((token->flags & CKF_LOGIN_REQUIRED) && + !(token->flags & CKF_USER_PIN_INITIALIZED)) { + g_debug ("token is not importable: %s: user pin not initialized", token->label); + return FALSE; + } + + for (i = 0; token_blacklist[i] != NULL; i++) { + uri = gck_uri_parse (token_blacklist[i], GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE, &error); + if (uri == NULL) { + g_warning ("couldn't parse pkcs11 blacklist uri: %s", error->message); + g_clear_error (&error); + continue; + } + + match = gck_slot_match (slot, uri); + gck_uri_data_free (uri); + + if (match) { + g_debug ("token is not importable: %s: on the black list", token->label); + return FALSE; + } + } + + return TRUE; +} + +static GList * +_gcr_pkcs11_importer_create_for_parsed (GcrParsed *parsed) +{ + GcrImporter *self; + GList *slots, *l; + GList *results = NULL; + GckTokenInfo *token_info; + gboolean importable; + + slots = list_all_slots (); + for (l = slots; l != NULL; l = g_list_next (l)) { + token_info = gck_slot_get_token_info (l->data); + importable = is_slot_importable (l->data, token_info); + + if (importable) { + g_debug ("creating importer for token: %s", token_info->label); + self = _gcr_pkcs11_importer_new (l->data); + if (!gcr_importer_queue_for_parsed (self, parsed)) + g_assert_not_reached (); + results = g_list_prepend (results, self); + } + + gck_token_info_free (token_info); + } + gck_list_unref_free (slots); + + return g_list_reverse (results); +} + +static gboolean +_gcr_pkcs11_importer_queue_for_parsed (GcrImporter *importer, + GcrParsed *parsed) +{ + GcrPkcs11Importer *self = GCR_PKCS11_IMPORTER (importer); + GckAttributes *attrs; + const gchar *label; + + attrs = gcr_parsed_get_attributes (parsed); + label = gcr_parsed_get_label (parsed); + _gcr_pkcs11_importer_queue (self, label, attrs); + + return TRUE; +} + +static void +_gcr_pkcs11_importer_import_async (GcrImporter *importer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + GcrImporterData *data; + + res = g_simple_async_result_new (G_OBJECT (importer), callback, user_data, + _gcr_pkcs11_importer_import_async); + data = g_new0 (GcrImporterData, 1); + data->async = TRUE; + data->importer = g_object_ref (importer); + data->cancellable = cancellable ? g_object_ref (cancellable) : NULL; + g_simple_async_result_set_op_res_gpointer (res, data, gcr_importer_data_free); + + supplement_prep (res); + + next_state (res, state_open_session); + g_object_unref (res); +} + +static gboolean +_gcr_pkcs11_importer_import_finish (GcrImporter *importer, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (importer), + _gcr_pkcs11_importer_import_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +static void +_gcr_pkcs11_importer_init_iface (GcrImporterIface *iface) +{ + iface->create_for_parsed = _gcr_pkcs11_importer_create_for_parsed; + iface->queue_for_parsed = _gcr_pkcs11_importer_queue_for_parsed; + iface->import_async = _gcr_pkcs11_importer_import_async; + iface->import_finish = _gcr_pkcs11_importer_import_finish; +} + +/** + * _gcr_pkcs11_importer_new: + * + * Create a new #GcrPkcs11Importer. + * + * Returns: (transfer full) (type Gcr.Pkcs11Importer): the new importer + */ +GcrImporter * +_gcr_pkcs11_importer_new (GckSlot *slot) +{ + g_return_val_if_fail (GCK_IS_SLOT (slot), NULL); + + return g_object_new (GCR_TYPE_PKCS11_IMPORTER, + "slot", slot, + NULL); +} + +GckSlot * +_gcr_pkcs11_importer_get_slot (GcrPkcs11Importer *self) +{ + g_return_val_if_fail (GCR_IS_PKCS11_IMPORTER (self), NULL); + return self->slot; +} + +GList * +_gcr_pkcs11_importer_get_imported (GcrPkcs11Importer *self) +{ + g_return_val_if_fail (GCR_IS_PKCS11_IMPORTER (self), NULL); + return g_list_copy (self->objects); +} + +GList * +_gcr_pkcs11_importer_get_queued (GcrPkcs11Importer *self) +{ + g_return_val_if_fail (GCR_IS_PKCS11_IMPORTER (self), NULL); + return g_list_copy (self->queue->head); +} + +void +_gcr_pkcs11_importer_queue (GcrPkcs11Importer *self, + const gchar *label, + GckAttributes *attrs) +{ + GckBuilder builder = GCK_BUILDER_INIT; + + g_return_if_fail (GCR_IS_PKCS11_IMPORTER (self)); + g_return_if_fail (attrs != NULL); + + if (label != NULL && !gck_attributes_find (attrs, CKA_LABEL)) { + gck_builder_add_all (&builder, attrs); + gck_builder_add_string (&builder, CKA_LABEL, label); + attrs = gck_builder_end (&builder); + } + + g_queue_push_tail (self->queue, gck_attributes_ref_sink (attrs)); +} diff --git a/gcr/gcr-pkcs11-importer.h b/gcr/gcr-pkcs11-importer.h new file mode 100644 index 0000000..20f0381 --- /dev/null +++ b/gcr/gcr-pkcs11-importer.h @@ -0,0 +1,60 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GCR_PKCS11_IMPORTER_H__ +#define __GCR_PKCS11_IMPORTER_H__ + +#include "gcr-importer.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_PKCS11_IMPORTER (_gcr_pkcs11_importer_get_type ()) +#define GCR_PKCS11_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PKCS11_IMPORTER, GcrPkcs11Importer)) +#define GCR_PKCS11_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PKCS11_IMPORTER, GcrPkcs11ImporterClass)) +#define GCR_IS_PKCS11_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PKCS11_IMPORTER)) +#define GCR_IS_PKCS11_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PKCS11_IMPORTER)) +#define GCR_PKCS11_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PKCS11_IMPORTER, GcrPkcs11ImporterClass)) + +typedef struct _GcrPkcs11Importer GcrPkcs11Importer; + + +GType _gcr_pkcs11_importer_get_type (void); + +GcrImporter * _gcr_pkcs11_importer_new (GckSlot *slot); + +void _gcr_pkcs11_importer_queue (GcrPkcs11Importer *self, + const gchar *label, + GckAttributes *attrs); + +GckSlot * _gcr_pkcs11_importer_get_slot (GcrPkcs11Importer *self); + +GList * _gcr_pkcs11_importer_get_queued (GcrPkcs11Importer *self); + +GList * _gcr_pkcs11_importer_get_imported (GcrPkcs11Importer *self); + +G_END_DECLS + +#endif /* __GCR_PKCS11_IMPORTER_H__ */ diff --git a/gcr/gcr-prompt.c b/gcr/gcr-prompt.c new file mode 100644 index 0000000..d1e71a4 --- /dev/null +++ b/gcr/gcr-prompt.c @@ -0,0 +1,1074 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-prompt.h" + +#include + +/** + * SECTION:gcr-prompt + * @title: GcrPrompt + * @short_description: a user prompt + * + * A #GcrPrompt represents a prompt displayed to the user. It is an interface + * with various implementations. + * + * Various properties are set on the prompt, and then the prompt is displayed + * the various prompt methods like gcr_prompt_password_run(). + * + * A #GcrPrompt may be used to display multiple related prompts. Most + * implemantions do not hide the window between display of multiple related + * prompts, and the #GcrPrompt must be closed or destroyed in order to make + * it go away. This allows the user to see that the prompts are related. + * + * Use #GcrPromptDialog to create an in-process GTK+ dialog prompt. Use + * #GcrSystemPrompt to create a system prompt in a prompter process. + * + * The prompt implementation will always display the GcrPrompt:message property, + * but may choose not to display the GcrPrompt:description or GcrPrompt:title + * properties. + */ + +/** + * GcrPrompt: + * + * Represents a #GcrPrompt displayed to the user. + */ + +/** + * GcrPromptIface: + * @parent_iface: parent interface + * @prompt_password_async: begin a password prompt + * @prompt_password_finish: complete a password prompt + * @prompt_confirm_async: begin a confirm prompt + * @prompt_confirm_finish: complete a confirm prompt + * @prompt_close: close a prompt + * + * The interface for implementing #GcrPrompt. + */ + +/** + * GcrPromptReply: + * @GCR_PROMPT_REPLY_CONTINUE: the user replied with 'ok' + * @GCR_PROMPT_REPLY_CANCEL: the prompt was cancelled + * + * Various replies returned by gcr_prompt_confirm() and friends. + */ + +enum { + PROMPT_CLOSE, + NUM_SIGNALS +}; + +static guint signals[NUM_SIGNALS]; + +typedef struct { + GAsyncResult *result; + GMainLoop *loop; + GMainContext *context; +} RunClosure; + +typedef GcrPromptIface GcrPromptInterface; + +static void gcr_prompt_default_init (GcrPromptIface *iface); + +G_DEFINE_INTERFACE (GcrPrompt, gcr_prompt, G_TYPE_OBJECT); + +static void +gcr_prompt_default_init (GcrPromptIface *iface) +{ + static gsize initialized = 0; + + if (g_once_init_enter (&initialized)) { + + /** + * GcrPrompt:title: + * + * The title of the prompt. + * + * A prompt implementation may choose not to display the prompt title. The + * #GcrPrompt:message should contain relevant information. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("title", "Title", "Prompt title", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:message: + * + * The prompt message for the user. + * + * A prompt implementation should always display this message. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("message", "Message", "Prompt message", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:description: + * + * The detailed description of the prompt. + * + * A prompt implementation may choose not to display this detailed description. + * The prompt message should contain relevant information. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("description", "Description", "Prompt description", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:warning: + * + * A prompt warning displayed on the prompt, or %NULL for no warning. + * + * This is a warning like "The password is incorrect." usually displayed to the + * user about a previous 'unsuccessful' prompt. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("warning", "Warning", "Prompt warning", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:password-new: + * + * Whether the prompt will prompt for a new password. + * + * This will cause the prompt implementation to ask the user to confirm the + * password and/or display other relevant user interface for creating a new + * password. + */ + g_object_interface_install_property (iface, + g_param_spec_boolean ("password-new", "Password new", "Whether prompting for a new password", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:password-strength: + * + * Indication of the password strength. + * + * Prompts will return a zero value if the password is empty, and a value + * greater than zero if the password has any characters. + * + * This is only valid after a successful prompt for a password. + */ + g_object_interface_install_property (iface, + g_param_spec_int ("password-strength", "Password strength", "String of new password", + 0, G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:choice-label: + * + * The label for the additional choice. + * + * If this is a non-%NULL value then an additional boolean choice will be + * displayed by the prompt allowing the user to select or deselect it. + * + * If %NULL, then no additional choice is displayed. + * + * The initial value of the choice can be set with #GcrPrompt:choice-chosen. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("choice-label", "Choice label", "Label for prompt choice", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:choice-chosen: + * + * Whether the additional choice is chosen or not. + * + * The additional choice would have been setup using #GcrPrompt:choice-label. + */ + g_object_interface_install_property (iface, + g_param_spec_boolean ("choice-chosen", "Choice chosen", "Whether prompt choice is chosen", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:caller-window: + * + * The string handle of the caller's window. + * + * The caller window indicates to the prompt which window is prompting the + * user. The prompt may choose to ignore this information or use it in whatever + * way it sees fit. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("caller-window", "Caller window", "Window ID of application window requesting prompt", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:continue-label: + * + * The label for the continue button in the prompt. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("continue-label", "Continue label", "Continue button label", + _("Continue"), G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt:cancel-label: + * + * The label for the cancel button in the prompt. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("cancel-label", "Cancel label", "Cancel button label", + _("Cancel"), G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GcrPrompt::prompt-close: + * + * Action signal fired when the prompt is to be closed. After the default + * handler has run, the prompt is closed. The various prompting methods + * will return results as if the user dismissed the prompt. + * + * You can use the gcr_prompt_close() method to emit this signal. + */ + signals[PROMPT_CLOSE] = g_signal_new ("prompt-close", GCR_TYPE_PROMPT, G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GcrPromptIface, prompt_close), + NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 0); + + g_once_init_leave (&initialized, 1); + } +} + +static void +run_closure_end (gpointer data) +{ + RunClosure *closure = data; + g_clear_object (&closure->result); + g_main_loop_unref (closure->loop); + if (closure->context != NULL) { + g_main_context_pop_thread_default (closure->context); + g_main_context_unref (closure->context); + } + g_free (closure); +} + +static RunClosure * +run_closure_begin (GMainContext *context) +{ + RunClosure *closure = g_new0 (RunClosure, 1); + closure->loop = g_main_loop_new (context, FALSE); + closure->result = NULL; + + /* We assume ownership of context reference */ + closure->context = context; + if (closure->context != NULL) + g_main_context_push_thread_default (closure->context); + + return closure; +} + +static void +on_run_complete (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + RunClosure *closure = user_data; + g_return_if_fail (closure->result == NULL); + closure->result = g_object_ref (result); + g_main_loop_quit (closure->loop); +} + +/** + * gcr_prompt_reset: + * @prompt: the prompt + * + * Reset the contents and properties of the prompt. + */ +void +gcr_prompt_reset (GcrPrompt *prompt) +{ + GParamSpec **params; + GcrPromptIface *iface; + guint i, n_params; + + g_return_if_fail (GCR_IS_PROMPT (prompt)); + + iface = GCR_PROMPT_GET_INTERFACE (prompt); + params = g_object_interface_list_properties (iface, &n_params); + + g_object_freeze_notify (G_OBJECT (prompt)); + + for (i = 0; i < n_params; i++) { + if (!(params[i]->flags & G_PARAM_WRITABLE)) + continue; + + if (params[i]->value_type == G_TYPE_STRING) + g_object_set (prompt, params[i]->name, + ((GParamSpecString *)params[i])->default_value, + NULL); + + else if (params[i]->value_type == G_TYPE_INT) + g_object_set (prompt, params[i]->name, + ((GParamSpecInt *)params[i])->default_value, + NULL); + + else if (params[i]->value_type == G_TYPE_BOOLEAN) + g_object_set (prompt, params[i]->name, + ((GParamSpecBoolean *)params[i])->default_value, + NULL); + + else + g_assert_not_reached (); + } + + g_free (params); + + g_object_thaw_notify (G_OBJECT (prompt)); +} + +/** + * gcr_prompt_get_title: + * @prompt: the prompt + * + * Gets the title of the prompt. + * + * A prompt implementation may choose not to display the prompt title. The + * prompt message should contain relevant information. + * + * Returns: (transfer full): a newly allocated string containing the prompt + * title. + */ +gchar * +gcr_prompt_get_title (GcrPrompt *prompt) +{ + gchar *title = NULL; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_object_get (prompt, "title", &title, NULL); + return title; +} + +/** + * gcr_prompt_set_title: + * @prompt: the prompt + * @title: the prompt title + * + * Sets the title of the prompt. + * + * A prompt implementation may choose not to display the prompt title. The + * prompt message should contain relevant information. + */ +void +gcr_prompt_set_title (GcrPrompt *prompt, + const gchar *title) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "title", title, NULL); +} + +/** + * gcr_prompt_get_message: + * @prompt: the prompt + * + * Gets the prompt message for the user. + * + * A prompt implementation should always display this message. + * + * Returns: (transfer full): a newly allocated string containing the detailed + * description of the prompt + */ +gchar * +gcr_prompt_get_message (GcrPrompt *prompt) +{ + gchar *message = NULL; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_object_get (prompt, "message", &message, NULL); + return message; +} + +/** + * gcr_prompt_set_message: + * @prompt: the prompt + * @message: the prompt message + * + * Sets the prompt message for the user. + * + * A prompt implementation should always display this message. + */ +void +gcr_prompt_set_message (GcrPrompt *prompt, + const gchar *message) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "message", message, NULL); +} + +/** + * gcr_prompt_get_description: + * @prompt: the prompt + * + * Get the detailed description of the prompt. + * + * A prompt implementation may choose not to display this detailed description. + * The prompt message should contain relevant information. + * + * Returns: (transfer full): a newly allocated string containing the detailed + * description of the prompt + */ +gchar * +gcr_prompt_get_description (GcrPrompt *prompt) +{ + gchar *description = NULL; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_object_get (prompt, "description", &description, NULL); + return description; +} + +/** + * gcr_prompt_set_description: + * @prompt: the prompt + * @description: the detailed description + * + * Set the detailed description of the prompt. + * + * A prompt implementation may choose not to display this detailed description. + * Use gcr_prompt_set_message() to set a general message containing relevant + * information. + */ +void +gcr_prompt_set_description (GcrPrompt *prompt, + const gchar *description) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "description", description, NULL); +} + +/** + * gcr_prompt_get_warning: + * @prompt: the prompt + * + * Get a prompt warning displayed on the prompt. + * + * This is a warning like "The password is incorrect." usually displayed to the + * user about a previous 'unsuccessful' prompt. + * + * If this string is %NULL then no warning is displayed. + * + * Returns: (transfer full): a newly allocated string containing the prompt + * warning, or %NULL if no warning + */ +gchar * +gcr_prompt_get_warning (GcrPrompt *prompt) +{ + gchar *warning = NULL; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_object_get (prompt, "warning", &warning, NULL); + return warning; +} + +/** + * gcr_prompt_set_warning: + * @prompt: the prompt + * @warning: (allow-none): the warning or %NULL + * + * Set a prompt warning displayed on the prompt. + * + * This is a warning like "The password is incorrect." usually displayed to the + * user about a previous 'unsuccessful' prompt. + * + * If this string is %NULL then no warning is displayed. + */ +void +gcr_prompt_set_warning (GcrPrompt *prompt, + const gchar *warning) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "warning", warning, NULL); +} + +/** + * gcr_prompt_get_choice_label: + * @prompt: the prompt + * + * Get the label for the additional choice. + * + * This will be %NULL if no additional choice is being displayed. + * + * Returns: (transfer full): a newly allocated string containing the additional + * choice or %NULL + */ +gchar * +gcr_prompt_get_choice_label (GcrPrompt *prompt) +{ + gchar *choice_label = NULL; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_object_get (prompt, "choice-label", &choice_label, NULL); + return choice_label; +} + +/** + * gcr_prompt_set_choice_label: + * @prompt: the prompt + * @choice_label: (allow-none): the additional choice or %NULL + * + * Set the label for the additional choice. + * + * If this is a non-%NULL value then an additional boolean choice will be + * displayed by the prompt allowing the user to select or deselect it. + * + * The initial value of the choice can be set with the + * gcr_prompt_set_choice_label() method. + * + * If this is %NULL, then no additional choice is being displayed. + */ +void +gcr_prompt_set_choice_label (GcrPrompt *prompt, + const gchar *choice_label) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "choice-label", choice_label, NULL); +} + +/** + * gcr_prompt_get_choice_chosen: + * @prompt: the prompt + * + * Get whether the additional choice was chosen or not. + * + * The additional choice would have been setup using + * gcr_prompt_set_choice_label(). + * + * Returns: whether chosen + */ +gboolean +gcr_prompt_get_choice_chosen (GcrPrompt *prompt) +{ + gboolean choice_chosen; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), FALSE); + g_object_get (prompt, "choice-chosen", &choice_chosen, NULL); + return choice_chosen; +} + +/** + * gcr_prompt_set_choice_chosen: + * @prompt: the prompt + * @chosen: whether chosen + * + * Set whether the additional choice is chosen or not. + * + * The additional choice should be set up using gcr_prompt_set_choice_label(). + */ +void +gcr_prompt_set_choice_chosen (GcrPrompt *prompt, + gboolean chosen) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "choice-chosen", chosen, NULL); +} + +/** + * gcr_prompt_get_password_new: + * @prompt: the prompt + * + * Get whether the prompt will prompt for a new password. + * + * This will cause the prompt implementation to ask the user to confirm the + * password and/or display other relevant user interface for creating a new + * password. + * + * Returns: whether in new password mode or not + */ +gboolean +gcr_prompt_get_password_new (GcrPrompt *prompt) +{ + gboolean password_new; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), FALSE); + g_object_get (prompt, "password-new", &password_new, NULL); + return password_new; +} + +/** + * gcr_prompt_set_password_new: + * @prompt: the prompt + * @new_password: whether in new password mode or not + * + * Set whether the prompt will prompt for a new password. + * + * This will cause the prompt implementation to ask the user to confirm the + * password and/or display other relevant user interface for creating a new + * password. + */ +void +gcr_prompt_set_password_new (GcrPrompt *prompt, + gboolean new_password) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "password-new", new_password, NULL); +} + +/** + * gcr_prompt_get_password_strength: + * @prompt: the prompt + * + * Get indication of the password strength. + * + * Prompts will return a zero value if the password is empty, and a value + * greater than zero if the password has any characters. + * + * This is only valid after a successful prompt for a password. + * + * Returns: zero if the password is empty, greater than zero if not + */ +gint +gcr_prompt_get_password_strength (GcrPrompt *prompt) +{ + gboolean password_strength; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), 0); + g_object_get (prompt, "password-strength", &password_strength, NULL); + return password_strength; +} + +/** + * gcr_prompt_get_caller_window: + * @prompt: the prompt + * + * Get the string handle of the caller's window. + * + * The caller window indicates to the prompt which window is prompting the + * user. The prompt may choose to ignore this information or use it in whatever + * way it sees fit. + * + * Returns: (transfer full): a newly allocated string containing the string + * handle of the window. + */ +gchar * +gcr_prompt_get_caller_window (GcrPrompt *prompt) +{ + gchar *caller_window = NULL; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_object_get (prompt, "caller-window", &caller_window, NULL); + return caller_window; +} + +/** + * gcr_prompt_set_caller_window: + * @prompt: the prompt + * @window_id: the window id + * + * Set the string handle of the caller's window. + * + * The caller window indicates to the prompt which window is prompting the + * user. The prompt may choose to ignore this information or use it in whatever + * way it sees fit. + */ +void +gcr_prompt_set_caller_window (GcrPrompt *prompt, + const gchar *window_id) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "caller-window", window_id, NULL); +} + +/** + * gcr_prompt_get_continue_label: + * @prompt: the prompt + * + * Get the label for the continue button. + * + * This is the button that results in a %GCR_PROMPT_REPLY_CONTINUE reply + * from the prompt. + * + * Returns: (transfer full): a newly allocated string containing the label + */ +gchar * +gcr_prompt_get_continue_label (GcrPrompt *prompt) +{ + gchar *continue_label = NULL; + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_object_get (prompt, "continue-label", &continue_label, NULL); + return continue_label; +} + +/** + * gcr_prompt_set_continue_label: + * @prompt: the prompt + * @continue_label: the label + * + * Set the label for the continue button. + * + * This is the button that results in a %GCR_PROMPT_REPLY_CONTINUE reply + * from the prompt. + */ +void +gcr_prompt_set_continue_label (GcrPrompt *prompt, + const gchar *continue_label) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "continue-label", continue_label, NULL); +} + +/** + * gcr_prompt_get_cancel_label: + * @prompt: the prompt + * + * Get the label for the cancel button. + * + * This is the button that results in a %GCR_PROMPT_REPLY_CANCEL reply + * from the prompt. + * + * Returns: (transfer full): a newly allocated string containing the label + */ +gchar * +gcr_prompt_get_cancel_label (GcrPrompt *prompt) +{ + gchar *cancel_label = NULL; + g_object_get (prompt, "cancel-label", &cancel_label, NULL); + return cancel_label; +} + +/** + * gcr_prompt_set_cancel_label: + * @prompt: the prompt + * @cancel_label: the label + * + * Set the label for the continue button. + * + * This is the button that results in a %GCR_PROMPT_REPLY_CANCEL reply + * from the prompt. + */ +void +gcr_prompt_set_cancel_label (GcrPrompt *prompt, + const gchar *cancel_label) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_object_set (prompt, "cancel-label", cancel_label, NULL); +} + +/** + * gcr_prompt_password_async: + * @prompt: a prompt + * @cancellable: optional cancellation object + * @callback: called when the operation completes + * @user_data: data to pass to the callback + * + * Prompts for password. Set the various properties on the prompt before calling + * this method to explain which password should be entered. + * + * This method will return immediately and complete asynchronously. + */ +void +gcr_prompt_password_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrPromptIface *iface; + + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + iface = GCR_PROMPT_GET_INTERFACE (prompt); + g_return_if_fail (iface->prompt_password_async); + + (iface->prompt_password_async) (prompt, cancellable, callback, user_data); +} + +/** + * gcr_prompt_password_finish: + * @prompt: a prompt + * @result: asynchronous result passed to callback + * @error: location to place error on failure + * + * Complete an operation to prompt for a password. + * + * A password will be returned if the user enters a password successfully. + * The returned password is valid until the next time a method is called + * to display another prompt. + * + * %NULL will be returned if the user cancels or if an error occurs. Check the + * @error argument to tell the difference. + * + * Returns: the password owned by the prompt, or %NULL + */ +const gchar * +gcr_prompt_password_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + GcrPromptIface *iface; + + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + iface = GCR_PROMPT_GET_INTERFACE (prompt); + g_return_val_if_fail (iface->prompt_password_async, NULL); + + return (iface->prompt_password_finish) (prompt, result, error); +} + +/** + * gcr_prompt_password: + * @prompt: a prompt + * @cancellable: optional cancellation object + * @error: location to place error on failure + * + * Prompts for password. Set the various properties on the prompt before calling + * this method to explain which password should be entered. + * + * This method will block until the a response is returned from the prompter. + * + * A password will be returned if the user enters a password successfully. + * The returned password is valid until the next time a method is called + * to display another prompt. + * + * %NULL will be returned if the user cancels or if an error occurs. Check the + * @error argument to tell the difference. + * + * Returns: the password owned by the prompt, or %NULL + */ +const gchar * +gcr_prompt_password (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error) +{ + RunClosure *closure; + const gchar *reply; + + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + closure = run_closure_begin (g_main_context_new ()); + + gcr_prompt_password_async (prompt, cancellable, on_run_complete, closure); + + g_main_loop_run (closure->loop); + + reply = gcr_prompt_password_finish (prompt, closure->result, error); + run_closure_end (closure); + + return reply; +} + +/** + * gcr_prompt_password_run: + * @prompt: a prompt + * @cancellable: optional cancellation object + * @error: location to place error on failure + * + * Prompts for password. Set the various properties on the prompt before calling + * this method to explain which password should be entered. + * + * This method will block until the a response is returned from the prompter + * and will run a main loop similar to a gtk_dialog_run(). The application + * will remain responsive but care must be taken to handle reentrancy issues. + * + * A password will be returned if the user enters a password successfully. + * The returned password is valid until the next time a method is called + * to display another prompt. + * + * %NULL will be returned if the user cancels or if an error occurs. Check the + * @error argument to tell the difference. + * + * Returns: the password owned by the prompt, or %NULL + */ +const gchar * +gcr_prompt_password_run (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error) +{ + RunClosure *closure; + const gchar *reply; + + g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + closure = run_closure_begin (NULL); + + gcr_prompt_password_async (prompt, cancellable, on_run_complete, closure); + + g_main_loop_run (closure->loop); + + reply = gcr_prompt_password_finish (prompt, closure->result, error); + run_closure_end (closure); + + return reply; +} + +/** + * gcr_prompt_confirm_async: + * @prompt: a prompt + * @cancellable: optional cancellation object + * @callback: called when the operation completes + * @user_data: data to pass to the callback + * + * Prompts for confirmation asking a cancel/continue style question. + * Set the various properties on the prompt before calling this method to + * represent the question correctly. + * + * This method will return immediately and complete asynchronously. + */ +void +gcr_prompt_confirm_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrPromptIface *iface; + + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + iface = GCR_PROMPT_GET_INTERFACE (prompt); + g_return_if_fail (iface->prompt_confirm_async); + + (iface->prompt_confirm_async) (prompt, cancellable, callback, user_data); +} + +/** + * gcr_prompt_confirm_finish: + * @prompt: a prompt + * @result: asynchronous result passed to callback + * @error: location to place error on failure + * + * Complete an operation to prompt for confirmation. + * + * %GCR_PROMPT_REPLY_CONTINUE will be returned if the user confirms the prompt. The + * return value will also be %GCR_PROMPT_REPLY_CANCEL if the user cancels or if + * an error occurs. Check the @error argument to tell the difference. + * + * Returns: the reply from the prompt + */ +GcrPromptReply +gcr_prompt_confirm_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + GcrPromptIface *iface; + + g_return_val_if_fail (GCR_IS_PROMPT (prompt), GCR_PROMPT_REPLY_CANCEL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), GCR_PROMPT_REPLY_CANCEL); + g_return_val_if_fail (error == NULL || *error == NULL, GCR_PROMPT_REPLY_CANCEL); + + iface = GCR_PROMPT_GET_INTERFACE (prompt); + g_return_val_if_fail (iface->prompt_confirm_async, GCR_PROMPT_REPLY_CANCEL); + + return (iface->prompt_confirm_finish) (prompt, result, error); +} + +/** + * gcr_prompt_confirm: + * @prompt: a prompt + * @cancellable: optional cancellation object + * @error: location to place error on failure + * + * Prompts for confirmation asking a cancel/continue style question. + * Set the various properties on the prompt before calling this function to + * represent the question correctly. + * + * This method will block until the a response is returned from the prompter. + * + * %GCR_PROMPT_REPLY_CONTINUE will be returned if the user confirms the prompt. The + * return value will also be %GCR_PROMPT_REPLY_CANCEL if the user cancels or if + * an error occurs. Check the @error argument to tell the difference. + * + * Returns: the reply from the prompt + */ +GcrPromptReply +gcr_prompt_confirm (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error) +{ + RunClosure *closure; + GcrPromptReply reply; + + g_return_val_if_fail (GCR_IS_PROMPT (prompt), GCR_PROMPT_REPLY_CANCEL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), GCR_PROMPT_REPLY_CANCEL); + g_return_val_if_fail (error == NULL || *error == NULL, GCR_PROMPT_REPLY_CANCEL); + + closure = run_closure_begin (g_main_context_new ()); + + gcr_prompt_confirm_async (prompt, cancellable, on_run_complete, closure); + + g_main_loop_run (closure->loop); + + reply = gcr_prompt_confirm_finish (prompt, closure->result, error); + run_closure_end (closure); + + return reply; +} + +/** + * gcr_prompt_confirm_run: + * @prompt: a prompt + * @cancellable: optional cancellation object + * @error: location to place error on failure + * + * Prompts for confirmation asking a cancel/continue style question. + * Set the various properties on the prompt before calling this function to + * represent the question correctly. + * + * This method will block until the a response is returned from the prompter + * and will run a main loop similar to a gtk_dialog_run(). The application + * will remain responsive but care must be taken to handle reentrancy issues. + * + * %GCR_PROMPT_REPLY_CONTINUE will be returned if the user confirms the prompt. The + * return value will also be %GCR_PROMPT_REPLY_CANCEL if the user cancels or if + * an error occurs. Check the @error argument to tell the difference. + * + * Returns: the reply from the prompt + */ +GcrPromptReply +gcr_prompt_confirm_run (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error) +{ + RunClosure *closure; + GcrPromptReply reply; + + g_return_val_if_fail (GCR_IS_PROMPT (prompt), GCR_PROMPT_REPLY_CANCEL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), GCR_PROMPT_REPLY_CANCEL); + g_return_val_if_fail (error == NULL || *error == NULL, GCR_PROMPT_REPLY_CANCEL); + + closure = run_closure_begin (NULL); + + gcr_prompt_confirm_async (prompt, cancellable, on_run_complete, closure); + + g_main_loop_run (closure->loop); + + reply = gcr_prompt_confirm_finish (prompt, closure->result, error); + run_closure_end (closure); + + return reply; +} + +/** + * gcr_prompt_close: + * @prompt: a prompt + * + * Closes the prompt so that in can no longer be used to prompt. The various + * prompt methods will return results as if the user dismissed the prompt. + * + * The prompt may also be closed by the implementor of the #GcrPrompt object. + * + * This emits the GcrPrompt::prompt-close signal on the prompt object. + */ +void +gcr_prompt_close (GcrPrompt *prompt) +{ + g_return_if_fail (GCR_IS_PROMPT (prompt)); + g_signal_emit (prompt, signals[PROMPT_CLOSE], 0); +} diff --git a/gcr/gcr-prompt.h b/gcr/gcr-prompt.h new file mode 100644 index 0000000..56b9339 --- /dev/null +++ b/gcr/gcr-prompt.h @@ -0,0 +1,166 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_PROMPT_H__ +#define __GCR_PROMPT_H__ + +#include "gcr-types.h" + +#include + +G_BEGIN_DECLS + +typedef enum { + GCR_PROMPT_REPLY_CANCEL = 0, + GCR_PROMPT_REPLY_CONTINUE = 1, +} GcrPromptReply; + +#define GCR_TYPE_PROMPT (gcr_prompt_get_type ()) +#define GCR_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PROMPT, GcrPrompt)) +#define GCR_IS_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PROMPT)) +#define GCR_PROMPT_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_PROMPT, GcrPromptIface)) + +typedef struct _GcrPrompt GcrPrompt; +typedef struct _GcrPromptIface GcrPromptIface; + +struct _GcrPromptIface { + GTypeInterface parent_iface; + + void (* prompt_password_async) (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + const gchar * (* prompt_password_finish) (GcrPrompt *prompt, + GAsyncResult *result, + GError **error); + + void (* prompt_confirm_async) (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GcrPromptReply (* prompt_confirm_finish) (GcrPrompt *prompt, + GAsyncResult *result, + GError **error); + + void (* prompt_close) (GcrPrompt *prompt); +}; + +GType gcr_prompt_get_type (void); + +void gcr_prompt_reset (GcrPrompt *prompt); + +gchar * gcr_prompt_get_title (GcrPrompt *prompt); + +void gcr_prompt_set_title (GcrPrompt *prompt, + const gchar *title); + +gchar * gcr_prompt_get_message (GcrPrompt *prompt); + +void gcr_prompt_set_message (GcrPrompt *prompt, + const gchar *message); + +gchar * gcr_prompt_get_description (GcrPrompt *prompt); + +void gcr_prompt_set_description (GcrPrompt *prompt, + const gchar *description); + +gchar * gcr_prompt_get_warning (GcrPrompt *prompt); + +void gcr_prompt_set_warning (GcrPrompt *prompt, + const gchar *warning); + +gchar * gcr_prompt_get_choice_label (GcrPrompt *prompt); + +void gcr_prompt_set_choice_label (GcrPrompt *prompt, + const gchar *choice_label); + +gboolean gcr_prompt_get_choice_chosen (GcrPrompt *prompt); + +void gcr_prompt_set_choice_chosen (GcrPrompt *prompt, + gboolean chosen); + +gboolean gcr_prompt_get_password_new (GcrPrompt *prompt); + +void gcr_prompt_set_password_new (GcrPrompt *prompt, + gboolean new_password); + +gint gcr_prompt_get_password_strength (GcrPrompt *prompt); + +gchar * gcr_prompt_get_caller_window (GcrPrompt *prompt); + +void gcr_prompt_set_caller_window (GcrPrompt *prompt, + const gchar *window_id); + +gchar * gcr_prompt_get_continue_label (GcrPrompt *prompt); + +void gcr_prompt_set_continue_label (GcrPrompt *prompt, + const gchar *continue_label); + +gchar * gcr_prompt_get_cancel_label (GcrPrompt *prompt); + +void gcr_prompt_set_cancel_label (GcrPrompt *prompt, + const gchar *cancel_label); + +void gcr_prompt_password_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +const gchar * gcr_prompt_password_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error); + +const gchar * gcr_prompt_password (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error); + +const gchar * gcr_prompt_password_run (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error); + +void gcr_prompt_confirm_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GcrPromptReply gcr_prompt_confirm_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error); + +GcrPromptReply gcr_prompt_confirm (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error); + +GcrPromptReply gcr_prompt_confirm_run (GcrPrompt *prompt, + GCancellable *cancellable, + GError **error); + +void gcr_prompt_close (GcrPrompt *prompt); + +G_END_DECLS + +#endif /* __GCR_PROMPT_H__ */ diff --git a/gcr/gcr-record.c b/gcr/gcr-record.c new file mode 100644 index 0000000..d5cad5a --- /dev/null +++ b/gcr/gcr-record.c @@ -0,0 +1,859 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-record.h" + +#include "egg/egg-timegm.h" + +#include +#include +#include + +#define MAX_COLUMNS 32 + +typedef struct { + gpointer next; + gsize n_value; + gchar value[1]; + /* Hangs off the end */ +} GcrRecordBlock; + +struct _GcrRecord { + GcrRecordBlock *block; + const gchar *columns[MAX_COLUMNS]; + guint n_columns; + gchar delimiter; +}; + +G_DEFINE_BOXED_TYPE (GcrRecord, _gcr_record, _gcr_record_copy, _gcr_record_free); + +static GcrRecordBlock * +record_block_new (const gchar *value, + gsize length) +{ + GcrRecordBlock *block; + + block = g_malloc (sizeof (GcrRecordBlock) + length); + block->next = NULL; + block->n_value = length; + + if (value != NULL) { + memcpy (block->value, value, length); + block->value[length] = 0; + } else { + block->value[0] = 0; + } + + return block; +} + +static GcrRecordBlock * +record_block_take (gchar *value, + gsize length) +{ + GcrRecordBlock *block; + + g_assert (value); + + block = g_realloc (value, sizeof (GcrRecordBlock) + length); + memmove (((gchar*)block) + G_STRUCT_OFFSET (GcrRecordBlock, value), + block, length); + block->next = NULL; + block->n_value = length; + block->value[length] = 0; + + return block; +} + +static GcrRecord * +record_flatten (GcrRecord *record) +{ + GcrRecord *result; + GcrRecordBlock *block; + gsize total; + gsize at; + gsize len; + guint i; + + /* Calculate the length of what we need */ + total = 0; + for (i = 0; i < record->n_columns; i++) + total += strlen (record->columns[i]) + 1; + + /* Allocate a new GcrRecordData which will hold all that */ + result = g_slice_new0 (GcrRecord); + result->block = block = record_block_new (NULL, total); + + at = 0; + for (i = 0; i < record->n_columns; i++) { + len = strlen (record->columns[i]); + result->columns[i] = block->value + at; + memcpy ((gchar *)result->columns[i], record->columns[i], len + 1); + at += len + 1; + } + + result->n_columns = record->n_columns; + result->delimiter = record->delimiter; + g_assert (at == total); + + return result; +} + +static void +print_record_to_string (GcrRecord *record, + GString *string) +{ + guint i; + + for (i = 0; i < record->n_columns; i++) { + g_string_append (string, record->columns[i]); + g_string_append_c (string, record->delimiter); + } +} + +gchar * +_gcr_record_format (GcrRecord *record) +{ + GString *string; + + g_return_val_if_fail (record, NULL); + + string = g_string_new (""); + print_record_to_string (record, string); + return g_string_free (string, FALSE); +} + +GcrRecord * +_gcr_record_new (GQuark schema, + guint n_columns, + gchar delimiter) +{ + GcrRecord *result; + guint i; + + result = g_slice_new0 (GcrRecord); + result->block = NULL; + result->delimiter = delimiter; + + for (i = 0; i < n_columns; i++) + result->columns[i] = ""; + result->columns[0] = g_quark_to_string (schema); + result->n_columns = n_columns; + + return result; +} + +GcrRecord * +_gcr_record_copy (GcrRecord *record) +{ + return record_flatten (record); +} + +static GcrRecord * +take_and_parse_internal (GcrRecordBlock *block, + gchar delimiter, + gboolean allow_empty) +{ + GcrRecord *result; + gchar *at, *beg, *end; + + g_assert (block); + + result = g_slice_new0 (GcrRecord); + result->block = block; + result->delimiter = delimiter; + + g_debug ("parsing line %s", block->value); + + at = block->value; + for (;;) { + if (result->n_columns >= MAX_COLUMNS) { + g_debug ("too many record (%d) in gnupg line", MAX_COLUMNS); + _gcr_record_free (result); + return NULL; + } + + beg = at; + result->columns[result->n_columns] = beg; + + at = strchr (beg, delimiter); + if (at == NULL) { + end = (block->value + block->n_value) - 1; + } else { + at[0] = '\0'; + end = at; + at++; + } + + if (allow_empty || end > beg) + result->n_columns++; + + if (at == NULL) + break; + } + + return result; +} + +GcrRecord* +_gcr_record_parse_colons (const gchar *line, gssize n_line) +{ + g_return_val_if_fail (line, NULL); + if (n_line < 0) + n_line = strlen (line); + return take_and_parse_internal (record_block_new (line, n_line), ':', TRUE); +} + +GcrRecord* +_gcr_record_parse_spaces (const gchar *line, gssize n_line) +{ + g_return_val_if_fail (line, NULL); + if (n_line < 0) + n_line = strlen (line); + return take_and_parse_internal (record_block_new (line, n_line), ' ', FALSE); +} + +guint +_gcr_record_get_count (GcrRecord *record) +{ + g_return_val_if_fail (record, 0); + return record->n_columns; +} + +static void +record_take_column (GcrRecord *record, + guint column, + GcrRecordBlock *block) +{ + g_assert (block->next == NULL); + block->next = record->block; + record->block = block; + + g_assert (column < record->n_columns); + record->columns[column] = block->value; +} + +static const char HEXC_LOWER[] = "0123456789abcdef"; + +/* Will return NULL if unescaping failed or not needed */ +static gchar * +c_colons_unescape (const gchar *source, + gsize *length) +{ + const gchar *p = source, *octal, *hex; + gchar *dest = NULL; + gchar *q = dest; + gchar *pos; + + while (*p) { + if (*p == '\\') { + if (dest == NULL) { + dest = g_malloc (strlen (source) + 1); + memcpy (dest, source, (p - source)); + q = dest + (p - source); + } + + p++; + switch (*p) { + case '\0': /* invalid trailing backslash */ + g_free (dest); + return NULL; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + *q = 0; + octal = p; + while ((p < octal + 3) && (*p >= '0') && (*p <= '7')) { + *q = (*q * 8) + (*p - '0'); + p++; + } + q++; + p--; + break; + case 'x': + *q = 0; + hex = p; + while (p < hex + 2) { + pos = strchr (HEXC_LOWER, g_ascii_tolower (*p)); + if (pos == 0) { /* invalid bad hex character */ + g_free (dest); + return NULL; + } + *q = (*q * 16) + (pos - HEXC_LOWER); + p++; + } + q++; + p--; + break; + case 'b': + *q++ = '\b'; + break; + case 'f': + *q++ = '\f'; + break; + case 'n': + *q++ = '\n'; + break; + case 'r': + *q++ = '\r'; + break; + case 't': + *q++ = '\t'; + break; + default: /* Also handles \" and \\ */ + *q++ = *p; + break; + } + } else if (q != NULL) { + *q++ = *p; + } + p++; + } + + if (q != NULL) { + *q = 0; + if (length) + *length = q - dest; + } + + return dest; +} + +/* Will return NULL if no escaping needed */ +static gchar * +c_colons_escape (const gchar *source, + const gchar extra, + gsize *length) +{ + const guchar *p; + gchar *dest = NULL; + gchar *q = NULL; + gchar escape; + gsize off; + + g_return_val_if_fail (source != NULL, NULL); + + p = (guchar *) source; + + while (*p) { + escape = 0; + switch (*p) { + case '\b': + escape = 'b'; + break; + case '\f': + escape = 'f'; + break; + case '\n': + escape = 'n'; + break; + case '\r': + escape = 'r'; + break; + case '\t': + escape = 't'; + break; + case '\\': + escape = '\\'; + break; + case '"': + escape = '"'; + break; + } + + if (escape != 0 || *p < ' ' || *p >= 0x127 || *p == extra) { + if (dest == NULL) { + /* Each source byte needs maximally four destination chars (\xff) */ + dest = g_malloc (strlen (source) * 4 + 1); + off = (gchar *)p - source; + memcpy (dest, source, off); + q = dest + off; + } + + if (escape) { + *q++ = '\\'; + *q++ = escape; + } else { + *q++ = '\\'; + *q++ = 'x'; + *q++ = HEXC_LOWER[*p >> 4 & 0xf]; + *q++ = HEXC_LOWER[*p & 0xf]; + } + } else if (q != NULL) { + *q++ = *p; + } + p++; + } + + if (q != NULL) { + *q = 0; + if (length) + *length = q - dest; + } + + return dest; +} + +gchar* +_gcr_record_get_string (GcrRecord *record, guint column) +{ + const gchar *value; + gchar *text = NULL; + + g_return_val_if_fail (record, NULL); + + value = _gcr_record_get_raw (record, column); + if (!value) + return NULL; + + text = c_colons_unescape (value, NULL); + if (text != NULL) + value = text; + + /* If it's not UTF-8, we guess that it's latin1 */ + if (!g_utf8_validate (value, -1, NULL)) { + gchar *conv = g_convert (value, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); + g_free (text); + value = text = conv; + } + + /* + * latin1 to utf-8 conversion can't really fail, just produce + * garbage... so there's no need to check here. + */ + + return (text == value) ? text : g_strdup (value); +} + +void +_gcr_record_set_string (GcrRecord *record, + guint column, + const gchar *string) +{ + GcrRecordBlock *block; + gchar *escaped; + + g_return_if_fail (record != NULL); + g_return_if_fail (string != NULL); + g_return_if_fail (column < record->n_columns); + + escaped = c_colons_escape (string, record->delimiter, NULL); + if (escaped != NULL) + block = record_block_take (escaped, strlen (escaped)); + else + block = record_block_new (string, strlen (string)); + + record_take_column (record, column, block); +} + +gchar +_gcr_record_get_char (GcrRecord *record, + guint column) +{ + const gchar *value; + + g_return_val_if_fail (record, 0); + + value = _gcr_record_get_raw (record, column); + if (!value) + return 0; + + if (value[0] != 0 && value[1] == 0) + return value[0]; + + return 0; +} + +void +_gcr_record_set_char (GcrRecord *record, + guint column, + gchar value) +{ + g_return_if_fail (record != NULL); + g_return_if_fail (column < record->n_columns); + g_return_if_fail (value != 0); + + record_take_column (record, column, record_block_new (&value, 1)); +} + +gboolean +_gcr_record_get_uint (GcrRecord *record, guint column, guint *value) +{ + const gchar *raw; + gint64 result; + gchar *end = NULL; + + g_return_val_if_fail (record, FALSE); + + raw = _gcr_record_get_raw (record, column); + if (raw == NULL) + return FALSE; + + result = g_ascii_strtoll (raw, &end, 10); + if (!end || end[0]) { + g_debug ("invalid unsigned integer value: %s", raw); + return FALSE; + } + + if (result < 0 || result > G_MAXUINT32) { + g_debug ("unsigned integer value is out of range: %s", raw); + return FALSE; + } + + if (value) + *value = (guint)result; + return TRUE; +} + +void +_gcr_record_set_uint (GcrRecord *record, + guint column, + guint value) +{ + gchar *escaped; + + g_return_if_fail (record != NULL); + g_return_if_fail (column < record->n_columns); + + escaped = g_strdup_printf ("%u", value); + record_take_column (record, column, + record_block_take (escaped, strlen (escaped))); +} + +gboolean +_gcr_record_get_ulong (GcrRecord *record, + guint column, + gulong *value) +{ + const gchar *raw; + gint64 result; + gchar *end = NULL; + + g_return_val_if_fail (record, FALSE); + + raw = _gcr_record_get_raw (record, column); + if (raw == NULL) + return FALSE; + + result = g_ascii_strtoull (raw, &end, 10); + if (!end || end[0]) { + g_debug ("invalid unsigned long value: %s", raw); + return FALSE; + } + + if (result < 0 || result > G_MAXULONG) { + g_debug ("unsigned long value is out of range: %s", raw); + return FALSE; + } + + if (value) + *value = (guint)result; + return TRUE; + +} + +void +_gcr_record_set_ulong (GcrRecord *record, + guint column, + gulong value) +{ + gchar *escaped; + + g_return_if_fail (record != NULL); + g_return_if_fail (column < record->n_columns); + + escaped = g_strdup_printf ("%lu", value); + record_take_column (record, column, + record_block_take (escaped, strlen (escaped))); +} + +GDateTime * +_gcr_record_get_date (GcrRecord *record, + guint column) +{ + const gchar *raw; + gulong result; + gchar *end = NULL; + struct tm tm; + + g_return_val_if_fail (record, NULL); + + raw = _gcr_record_get_raw (record, column); + if (raw == NULL) + return NULL; + + /* Try to parse as a number */ + result = strtoul (raw, &end, 10); + if (end != NULL && end[0] == '\0') { + if (result == 0) + return NULL; + else + return g_date_time_new_from_unix_utc (result); + } + + /* Try to parse as a date */ + memset (&tm, 0, sizeof (tm)); + end = strptime (raw, "%Y-%m-%d", &tm); + if (!end || end[0]) { + g_debug ("invalid date value: %s", raw); + return NULL; + } + + return g_date_time_new_utc (tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, 0, 0, 0); +} + +/** + * _gcr_record_get_base64: + * @record: The record + * @column: The column to decode. + * @n_data: Location to return size of returned data. + * + * Decode a column of a record as base64 data. + * + * Returns: (transfer full): The decoded value, or %NULL if not found. + */ +gpointer +_gcr_record_get_base64 (GcrRecord *record, guint column, gsize *n_data) +{ + const gchar *raw; + + g_return_val_if_fail (record, NULL); + + raw = _gcr_record_get_raw (record, column); + if (raw == NULL) + return NULL; + + return g_base64_decode (raw, n_data); +} + +void +_gcr_record_set_base64 (GcrRecord *record, + guint column, + gconstpointer data, + gsize n_data) +{ + GcrRecordBlock *block; + gint state, save; + gsize estimate; + gsize length; + + g_return_if_fail (record != NULL); + g_return_if_fail (column < record->n_columns); + + estimate = n_data * 4 / 3 + n_data * 4 / (3 * 65) + 7; + block = record_block_new (NULL, estimate); + + /* The actual base64 data, without line breaks */ + state = save = 0; + length = g_base64_encode_step ((guchar *)data, n_data, FALSE, + block->value, &state, &save); + length += g_base64_encode_close (TRUE, block->value + length, + &state, &save); + block->value[length] = 0; + g_assert (length < estimate); + + g_strchomp (block->value); + record_take_column (record, column, block); +} + +const gchar* +_gcr_record_get_raw (GcrRecord *record, guint column) +{ + g_return_val_if_fail (record, NULL); + + if (column >= record->n_columns) { + g_debug ("only %d columns exist, tried to access %d", + record->n_columns, column); + return NULL; + } + + return record->columns[column]; +} + +void +_gcr_record_set_raw (GcrRecord *record, + guint column, + const gchar *value) +{ + g_return_if_fail (record != NULL); + g_return_if_fail (value != NULL); + g_return_if_fail (column < record->n_columns); + + record_take_column (record, column, + record_block_new (value, strlen (value))); +} + +void +_gcr_record_take_raw (GcrRecord *record, + guint column, + gchar *value) +{ + g_return_if_fail (record != NULL); + g_return_if_fail (value != NULL); + g_return_if_fail (column < record->n_columns); + + record_take_column (record, column, + record_block_take (value, strlen (value))); +} + +void +_gcr_record_free (gpointer record) +{ + GcrRecordBlock *block, *next; + GcrRecord *rec = record; + + if (!record) + return; + + for (block = rec->block; block != NULL; block = next) { + next = block->next; + g_free (block); + } + + g_slice_free (GcrRecord, record); +} + +GQuark +_gcr_record_get_schema (GcrRecord *record) +{ + const gchar *value; + + value = _gcr_record_get_raw (record, GCR_RECORD_SCHEMA); + if (value != NULL) + return g_quark_try_string (value); + return 0; +} + +GcrRecord * +_gcr_records_find (GPtrArray *records, + GQuark schema) +{ + guint i; + + g_return_val_if_fail (records, NULL); + g_return_val_if_fail (schema, NULL); + + for (i = 0; i < records->len; i++) { + if (schema == _gcr_record_get_schema (records->pdata[i])) + return records->pdata[i]; + } + + return NULL; +} + +gchar * +_gcr_records_format (GPtrArray *records) +{ + GString *string; + guint i; + + g_return_val_if_fail (records, NULL); + + string = g_string_new (""); + for (i = 0; i < records->len; i++) { + print_record_to_string (records->pdata[i], string); + g_string_append_c (string, '\n'); + } + return g_string_free (string, FALSE); +} + +static gchar ** +strnsplit (const gchar *string, + gsize length, + gchar delimiter) +{ + GSList *string_list = NULL, *slist; + gchar **str_array, *s; + guint n = 0; + const gchar *remainder; + const gchar *end; + + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (delimiter != '\0', NULL); + + end = string + length; + remainder = string; + s = memchr (remainder, delimiter, end - remainder); + if (s) + { + while (s) + { + gsize len; + + len = s - remainder; + string_list = g_slist_prepend (string_list, + g_strndup (remainder, len)); + n++; + remainder = s + 1; + s = memchr (remainder, delimiter, end - remainder); + } + } + if (*string) + { + n++; + string_list = g_slist_prepend (string_list, g_strndup (remainder, end - remainder)); + } + + str_array = g_new (gchar*, n + 1); + + str_array[n--] = NULL; + for (slist = string_list; slist; slist = slist->next) + str_array[n--] = slist->data; + + g_slist_free (string_list); + + return str_array; +} + +GPtrArray * +_gcr_records_parse_colons (gconstpointer data, + gssize n_data) +{ + GPtrArray *result = NULL; + GcrRecordBlock *block; + GcrRecord *record; + gchar **lines; + guint i; + + lines = strnsplit (data, n_data, '\n'); + result = g_ptr_array_new_with_free_func (_gcr_record_free); + + for (i = 0; lines[i] != NULL; i++) { + block = record_block_take (lines[i], strlen (lines[i])); + record = take_and_parse_internal (block, ':', TRUE); + if (record == NULL) { + g_ptr_array_unref (result); + result = NULL; + break; + } + g_ptr_array_add (result, record); + } + + /* Free any not done */ + for (; lines[i] != NULL; i++) + g_free (lines[i]); + + /* Individual lines already freed */ + g_free (lines); + + return result; +} diff --git a/gcr/gcr-record.h b/gcr/gcr-record.h new file mode 100644 index 0000000..755de10 --- /dev/null +++ b/gcr/gcr-record.h @@ -0,0 +1,279 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_RECORD_H +#define GCR_RECORD_H + +#include +#include + +/* + * Gnupg's official format for listing keys is in the '--with-colons' format. + * This is documented in doc/DETAILS in the gnupg distribution. Looks like: + * + * pub:f:1024:17:6C7EE1B8621CC013:899817715:1055898235::m:::scESC: + * fpr:::::::::ECAF7590EB3443B5C7CF3ACB6C7EE1B8621CC013: + * uid:f::::::::Werner Koch : + * uid:f::::::::Werner Koch : + * sub:f:1536:16:06AD222CADF6A6E1:919537416:1036177416:::::e: + * fpr:::::::::CF8BCC4B18DE08FCD8A1615906AD222CADF6A6E1: + * sub:r:1536:20:5CE086B5B5A18FF4:899817788:1025961788:::::esc: + * fpr:::::::::AB059359A3B81F410FCFF97F5CE086B5B5A18FF4: + * + * Each row is colon delimeted, and has a certain 'schema'. The first item + * in the row tells us the schema. Then the various columns are numbered, + * (schema is zero). + */ + +G_BEGIN_DECLS + +#define GCR_RECORD_SCHEMA_ATTRIBUTE (g_quark_from_static_string ("ATTRIBUTE")) +#define GCR_RECORD_SCHEMA_IMPORT_OK (g_quark_from_static_string ("IMPORT_OK")) +#define GCR_RECORD_SCHEMA_FPR (g_quark_from_static_string ("fpr")) +#define GCR_RECORD_SCHEMA_PUB (g_quark_from_static_string ("pub")) +#define GCR_RECORD_SCHEMA_SUB (g_quark_from_static_string ("sub")) +#define GCR_RECORD_SCHEMA_SEC (g_quark_from_static_string ("sec")) +#define GCR_RECORD_SCHEMA_SSB (g_quark_from_static_string ("ssb")) +#define GCR_RECORD_SCHEMA_UID (g_quark_from_static_string ("uid")) +#define GCR_RECORD_SCHEMA_UAT (g_quark_from_static_string ("uat")) +#define GCR_RECORD_SCHEMA_XA1 (g_quark_from_static_string ("xa1")) +#define GCR_RECORD_SCHEMA_SIG (g_quark_from_static_string ("sig")) +#define GCR_RECORD_SCHEMA_RVK (g_quark_from_static_string ("rvk")) + +/* Common columns for schemas */ +typedef enum { + GCR_RECORD_SCHEMA = 0, + GCR_RECORD_TRUST = 1, +} GcrRecordColumns; + +/* + * Columns for ATTRIBUTE status message. eg: + * [GNUPG:] ATTRIBUTE FBAFC70D60AE13D560764062B547B5580EEB5A80 10604 1 1 1 1227936754 0 1 + */ +typedef enum { + GCR_RECORD_ATTRIBUTE_KEY_FINGERPRINT = 1, + GCR_RECORD_ATTRIBUTE_LENGTH = 2, + GCR_RECORD_ATTRIBUTE_TYPE = 3, + GCR_RECORD_ATTRIBUTE_TIMESTAMP = 6, + GCR_RECORD_ATTRIBUTE_EXPIRY = 7, + GCR_RECORD_ATTRIBUTE_FLAGS = 8 +} GcrRecordAttributeColumns; + +/* + * Columns for IMPORT_OK and IMPORT_PROBLEM status message. eg: + * [GNUPG:] IMPORT_OK 1 6BD9050FD8FC941B43412DCC68B7AB8957548DCD + * [GNUPG:] IMPORT_PROBLEM 1 + */ +typedef enum { + GCR_RECORD_IMPORT_REASON = 1, + GCR_RECORD_IMPORT_FINGERPRINT +} GcrRecordImportColumns; + +/* + * Columns for fpr schema, add them as they're used. eg: + * fpr:::::::::ECAF7590EB3443B5C7CF3ACB6C7EE1B8621CC013: + */ +typedef enum { + GCR_RECORD_FPR_FINGERPRINT = 9, + GCR_RECORD_FPR_MAX = 10 +} GcrRecordFprColumns; + +/* + * Columns for pub, sec, sub, and ssb schemas. eg: + * pub:f:1024:17:6C7EE1B8621CC013:899817715:1055898235::m:::scESC: + */ +typedef enum { + GCR_RECORD_KEY_BITS = 2, + GCR_RECORD_KEY_ALGO = 3, + GCR_RECORD_KEY_KEYID = 4, + GCR_RECORD_KEY_TIMESTAMP = 5, + GCR_RECORD_KEY_EXPIRY = 6, + GCR_RECORD_KEY_OWNERTRUST = 8, +} GcrRecordKeyColumns; + +typedef enum { + GCR_RECORD_PUB_CAPS = 11, + GCR_RECORD_PUB_MAX = 12 +} GcrRecordPubColumns; + +typedef enum { + GCR_RECORD_SEC_MAX = 15 +} GcrRecordSecColumns; + +/* + * Columns for uid schema, add them as they're used. eg: + * uid:u::::1024442705::7A5C6648DAA1F5D12BD80BBED538439ABAFEE203::Test : + */ +typedef enum { + GCR_RECORD_UID_TIMESTAMP = 5, + GCR_RECORD_UID_EXPIRY = 6, + GCR_RECORD_UID_FINGERPRINT = 7, + GCR_RECORD_UID_USERID = 9, + GCR_RECORD_UID_MAX = 10, +} GcrRecordUidColumns; + +/* + * Columns for sig schema. eg: + * sig:::17:FAD3A86D2505A4D5:1291829838::::Stef Walter :10x: + */ +typedef enum { + GCR_RECORD_SIG_STATUS = 1, + GCR_RECORD_SIG_ALGO = 3, + GCR_RECORD_SIG_KEYID = 4, + GCR_RECORD_SIG_TIMESTAMP = 5, + GCR_RECORD_SIG_EXPIRY = 6, + GCR_RECORD_SIG_USERID = 9, + GCR_RECORD_SIG_CLASS = 10, + GCR_RECORD_SIG_MAX = 11, +} GcrRecordSigColumns; + +/* + * Columns for rvk schema. eg: + * rvk:::17::::::3FC732041D23E9EA66DDB5009C9DBC21DF74DC61:80: + */ +typedef enum { + GCR_RECORD_RVK_ALGO = 3, + GCR_RECORD_RVK_FINGERPRINT = 9, + GCR_RECORD_RVK_CLASS = 10, + GCR_RECORD_RVK_MAX = 11, +} GcrRecordRvkColumns; + +/* + * Columns for uat schema, add them as they're used. eg: + * uat:u::::1024442705::7A5C6648DAA1F5D12BD80BBED538439ABAFEE203::1 3233: + */ +typedef enum { + GCR_RECORD_UAT_TRUST = 1, + GCR_RECORD_UAT_FINGERPRINT = 7, + GCR_RECORD_UAT_COUNT_SIZE = 9, + GCR_RECORD_UAT_MAX = 10, +} GcrRecordUatColumns; + +/* + * Columns for xa1 schema. This is a schema that we've invented ourselves + * for representing the actual data of openpgp attribute packets. eg: + * xa1:e:10838:1:::1998-02-02:0:ECAF7590EB3443B5C7CF3ACB6C7EE1B8621CC013::... + */ +typedef enum { + GCR_RECORD_XA1_TRUST = 1, + GCR_RECORD_XA1_LENGTH = 2, + GCR_RECORD_XA1_TYPE = 3, + GCR_RECORD_XA1_TIMESTAMP = 5, + GCR_RECORD_XA1_EXPIRY = 6, + GCR_RECORD_XA1_FINGERPRINT = 7, + GCR_RECORD_XA1_DATA = 9, + GCR_RECORD_XA1_MAX = 11, +} GcrRecordXa1Columns; + +typedef struct _GcrRecord GcrRecord; + +#define GCR_TYPE_RECORD (_gcr_record_get_type ()) + +GType _gcr_record_get_type (void) G_GNUC_CONST; + +GcrRecord * _gcr_record_new (GQuark schema, + guint n_columns, + gchar delimiter); + +GcrRecord* _gcr_record_copy (GcrRecord *record); + +GcrRecord* _gcr_record_parse_colons (const gchar *line, + gssize n_line); + +GcrRecord* _gcr_record_parse_spaces (const gchar *line, + gssize n_line); + +gchar * _gcr_record_format (GcrRecord *record); + +void _gcr_record_free (gpointer record); + +guint _gcr_record_get_count (GcrRecord *record); + +gchar _gcr_record_get_char (GcrRecord *record, + guint column); + +void _gcr_record_set_char (GcrRecord *record, + guint column, + gchar value); + +gchar* _gcr_record_get_string (GcrRecord *record, + guint column); + +void _gcr_record_set_string (GcrRecord *record, + guint column, + const gchar *value); + +gboolean _gcr_record_get_uint (GcrRecord *record, + guint column, + guint *value); + +void _gcr_record_set_uint (GcrRecord *record, + guint column, + guint value); + +gboolean _gcr_record_get_ulong (GcrRecord *record, + guint column, + gulong *value); + +void _gcr_record_set_ulong (GcrRecord *record, + guint column, + gulong value); + +GDateTime * _gcr_record_get_date (GcrRecord *record, + guint column); + +gpointer _gcr_record_get_base64 (GcrRecord *record, + guint column, + gsize *n_data); + +void _gcr_record_set_base64 (GcrRecord *record, + guint column, + gconstpointer data, + gsize n_data); + +const gchar* _gcr_record_get_raw (GcrRecord *record, + guint column); + +void _gcr_record_set_raw (GcrRecord *record, + guint column, + const gchar *value); + +void _gcr_record_take_raw (GcrRecord *record, + guint column, + gchar *value); + +GQuark _gcr_record_get_schema (GcrRecord *record); + +GPtrArray * _gcr_records_parse_colons (gconstpointer data, + gssize n_data); + +gchar * _gcr_records_format (GPtrArray *records); + +GcrRecord * _gcr_records_find (GPtrArray *records, + GQuark schema); + +G_END_DECLS + +#endif /* GCR_RECORD_H */ diff --git a/gcr/gcr-secret-exchange.c b/gcr/gcr-secret-exchange.c new file mode 100644 index 0000000..1b53eff --- /dev/null +++ b/gcr/gcr-secret-exchange.c @@ -0,0 +1,877 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-secret-exchange.h" + +#include "egg/egg-dh.h" +#include "egg/egg-hkdf.h" +#include "egg/egg-libgcrypt.h" +#include "egg/egg-padding.h" +#include "egg/egg-secure-memory.h" + +#include +#include + +EGG_SECURE_DECLARE (secret_exchange); + +/** + * SECTION:gcr-secret-exchange + * @title: GcrSecretExchange + * @short_description: Exchange secrets between processes in an unexposed way. + * + * Allows exchange of secrets between two processes on the same system without + * exposing those secrets to things like loggers, non-pageable memory etc. + * + * This does not protect against active attacks like MITM attacks. + * + * Each side creates a #GcrSecretExchange object, and one of the sides calls + * gcr_secret_exchange_begin(). This creates a string, which should be passed + * to the other side. Each side passes the strings it receives into + * gcr_secret_exchange_receive(). + * + * In order to send a reply (either with or without a secret) use + * gcr_secret_exchange_send(). A side must have had gcr_secret_exchange_receive() + * successfully called before it can use gcr_secret_exchange_send(). + * + * The #GcrSecretExchange objects can be used for multiple iterations of the + * conversation, or for just one request/reply. The only limitation being that + * the initial request cannot contain a secret. + * + * Caveat: Information about the approximate length (rounded up to the nearest + * 16 bytes) may be leaked. If this is considered inacceptable, do not use + * #GcrSecretExchange. + */ + +/** + * GcrSecretExchange: + * + * An object representing one side of a secret exchange. + */ + +/** + * GcrSecretExchangeClass: + * + * The class for #GcrSecretExchange + */ + +/** + * GCR_SECRET_EXCHANGE_PROTOCOL_1: + * + * The current secret exchange protocol. Key agreement is done using DH with the + * 1536 bit IKE parameter group. Keys are derived using SHA256 with HKDF. The + * transport encryption is done with 128 bit AES. + */ + +#define SECRET_EXCHANGE_PROTOCOL_1_PREFIX "[" GCR_SECRET_EXCHANGE_PROTOCOL_1 "]\n" + +enum { + PROP_0, + PROP_PROTOCOL +}; + +typedef struct _GcrSecretExchangeDefault GcrSecretExchangeDefault; + +struct _GcrSecretExchangePrivate { + GcrSecretExchangeDefault *default_exchange; + GDestroyNotify destroy_exchange; + gboolean explicit_protocol; + gboolean generated; + guchar *publi; + gsize n_publi; + gboolean derived; + gchar *secret; + gsize n_secret; +}; + +G_DEFINE_TYPE (GcrSecretExchange, gcr_secret_exchange, G_TYPE_OBJECT); + +static void +key_file_set_base64 (GKeyFile *key_file, const gchar *section, + const gchar *field, gconstpointer data, gsize n_data) +{ + gchar *value; + + value = g_base64_encode (data, n_data); + g_key_file_set_value (key_file, section, field, value); + g_free (value); +} + +static gpointer +key_file_get_base64 (GKeyFile *key_file, const gchar *section, + const gchar *field, gsize *n_result) +{ + gpointer result = NULL; + gchar *data; + + g_return_val_if_fail (key_file, NULL); + g_return_val_if_fail (section, NULL); + g_return_val_if_fail (field, NULL); + g_return_val_if_fail (n_result, NULL); + + data = g_key_file_get_value (key_file, section, field, NULL); + if (data != NULL) + result = g_base64_decode (data, n_result); + g_free (data); + return result; +} + +static void +gcr_secret_exchange_init (GcrSecretExchange *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_SECRET_EXCHANGE, + GcrSecretExchangePrivate); +} + + +static void +gcr_secret_exchange_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrSecretExchange *self = GCR_SECRET_EXCHANGE (obj); + const gchar *protocol; + + switch (prop_id) { + case PROP_PROTOCOL: + protocol = g_value_get_string (value); + if (protocol == NULL) { + g_debug ("automatically selecting secret exchange protocol"); + + } else { + if (g_str_equal (protocol, GCR_SECRET_EXCHANGE_PROTOCOL_1)) { + g_debug ("explicitly using secret exchange protocol: %s", + GCR_SECRET_EXCHANGE_PROTOCOL_1); + self->pv->explicit_protocol = TRUE; + } else { + g_warning ("the GcrSecretExchange protocol %s is unsupported defaulting to %s", + protocol, GCR_SECRET_EXCHANGE_PROTOCOL_1); + } + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_secret_exchange_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrSecretExchange *self = GCR_SECRET_EXCHANGE (obj); + + switch (prop_id) { + case PROP_PROTOCOL: + g_value_set_string (value, gcr_secret_exchange_get_protocol (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +clear_secret_exchange (GcrSecretExchange *self) +{ + g_free (self->pv->publi); + self->pv->publi = NULL; + self->pv->n_publi = 0; + self->pv->derived = FALSE; + self->pv->generated = TRUE; + egg_secure_free (self->pv->secret); + self->pv->secret = NULL; + self->pv->n_secret = 0; +} + +static void +gcr_secret_exchange_finalize (GObject *obj) +{ + GcrSecretExchange *self = GCR_SECRET_EXCHANGE (obj); + + if (self->pv->destroy_exchange) + (self->pv->destroy_exchange) (self->pv->default_exchange); + + clear_secret_exchange (self); + + G_OBJECT_CLASS (gcr_secret_exchange_parent_class)->finalize (obj); +} + +/** + * gcr_secret_exchange_new: + * @protocol: (allow-none): the exchange protocol to use + * + * Create a new secret exchange object. + * + * Specify a protocol of %NULL to allow any protocol. This is especially + * relevant on the side of the exchange that does not call + * gcr_secret_exchange_begin(), that is the originator. Currently the only + * protocol supported is %GCR_SECRET_EXCHANGE_PROTOCOL_1. + * + * Returns: (transfer full): A new #GcrSecretExchange object + */ +GcrSecretExchange * +gcr_secret_exchange_new (const gchar *protocol) +{ + return g_object_new (GCR_TYPE_SECRET_EXCHANGE, + "protocol", protocol, + NULL); +} + +/** + * gcr_secret_exchange_get_protocol: + * @self: a #GcrSecretExchange object + * Get the secret exchange protocol. + * + * Will return %NULL if no protocol was specified, and either + * gcr_secret_exchange_begin() or gcr_secret_exchange_receive() have not been + * called successfully. + * + * Returns: the protocol or %NULL + */ +const gchar * +gcr_secret_exchange_get_protocol (GcrSecretExchange *self) +{ + g_return_val_if_fail (GCR_IS_SECRET_EXCHANGE (self), NULL); + if (self->pv->explicit_protocol || self->pv->generated) + return GCR_SECRET_EXCHANGE_PROTOCOL_1; + return NULL; +} + +/** + * gcr_secret_exchange_begin: + * @self: a #GcrSecretExchange object + * + * Begin the secret exchange. The resulting string should be sent to the other + * side of the exchange. The other side should use gcr_secret_exchange_receive() + * to process the string. + * + * Returns: (transfer full): A newly allocated string to be sent to the other + * side of the secret exchange + */ +gchar * +gcr_secret_exchange_begin (GcrSecretExchange *self) +{ + GcrSecretExchangeClass *klass; + GKeyFile *output; + gchar *result; + + g_return_val_if_fail (GCR_IS_SECRET_EXCHANGE (self), NULL); + + klass = GCR_SECRET_EXCHANGE_GET_CLASS (self); + g_return_val_if_fail (klass->generate_exchange_key, NULL); + + clear_secret_exchange (self); + + output = g_key_file_new (); + + if (!(klass->generate_exchange_key) (self, GCR_SECRET_EXCHANGE_PROTOCOL_1, + &self->pv->publi, &self->pv->n_publi)) + g_return_val_if_reached (NULL); + self->pv->generated = TRUE; + + key_file_set_base64 (output, GCR_SECRET_EXCHANGE_PROTOCOL_1, "public", + self->pv->publi, self->pv->n_publi); + + result = g_key_file_to_data (output, NULL, NULL); + g_return_val_if_fail (result != NULL, NULL); + + g_strchug (result); + + gchar *string = g_strescape (result, ""); + g_debug ("beginning the secret exchange: %s", string); + g_free (string); + + if (!g_str_has_prefix (result, SECRET_EXCHANGE_PROTOCOL_1_PREFIX)) + g_warning ("the prepared data does not have the correct protocol prefix"); + + g_key_file_free (output); + + return result; +} + +static gboolean +derive_key (GcrSecretExchange *self, + GKeyFile *input) +{ + GcrSecretExchangeClass *klass; + gboolean ret; + guchar *peer; + gsize n_peer; + + klass = GCR_SECRET_EXCHANGE_GET_CLASS (self); + g_return_val_if_fail (klass->derive_transport_key, FALSE); + + g_debug ("deriving shared transport key"); + + peer = key_file_get_base64 (input, GCR_SECRET_EXCHANGE_PROTOCOL_1, "public", &n_peer); + if (peer == NULL) { + g_message ("secret-exchange: invalid or missing 'public' argument"); + return FALSE; + } + + ret = (klass->derive_transport_key) (self, peer, n_peer); + self->pv->derived = ret; + + g_free (peer); + return ret; +} + +static gboolean +perform_decrypt (GcrSecretExchange *self, + GKeyFile *input, + guchar **secret, + gsize *n_secret) +{ + GcrSecretExchangeClass *klass; + gpointer iv, value; + guchar *result; + gsize n_result, n_iv, n_value; + gboolean ret; + + klass = GCR_SECRET_EXCHANGE_GET_CLASS (self); + g_return_val_if_fail (klass->decrypt_transport_data, FALSE); + + iv = key_file_get_base64 (input, GCR_SECRET_EXCHANGE_PROTOCOL_1, "iv", &n_iv); + + value = key_file_get_base64 (input, GCR_SECRET_EXCHANGE_PROTOCOL_1, "secret", &n_value); + if (value == NULL) { + g_message ("secret-exchange: invalid or missing value"); + g_free (iv); + return FALSE; + } + + ret = (klass->decrypt_transport_data) (self, egg_secure_realloc, value, n_value, + iv, n_iv, &result, &n_result); + + g_free (value); + g_free (iv); + + if (!ret) + return FALSE; + + /* Reallocate a null terminator */ + if (result) { + result = egg_secure_realloc (result, n_result + 1); + result[n_result] = 0; + } + + *secret = result; + *n_secret = n_result; + + return TRUE; +} + +/** + * gcr_secret_exchange_receive: + * @self: a #GcrSecretExchange object + * @exchange: the string received + * + * Receive a string from the other side of secret exchange. This string will + * have been created by gcr_secret_exchange_begin() or gcr_secret_exchange_send(). + * + * After this call completes successfully the value returned from + * gcr_secret_exchange_get_secret() will have changed. + * + * Returns: whether the string was successfully parsed and received + */ +gboolean +gcr_secret_exchange_receive (GcrSecretExchange *self, + const gchar *exchange) +{ + GcrSecretExchangeClass *klass; + gchar *secret = NULL; + gsize n_secret = 0; + GKeyFile *input; + gboolean ret; + + g_return_val_if_fail (GCR_IS_SECRET_EXCHANGE (self), FALSE); + g_return_val_if_fail (exchange != NULL, FALSE); + + klass = GCR_SECRET_EXCHANGE_GET_CLASS (self); + g_return_val_if_fail (klass->generate_exchange_key, FALSE); + g_return_val_if_fail (klass->derive_transport_key, FALSE); + + gchar *string = g_strescape (exchange, ""); + g_debug ("receiving secret exchange: %s", string); + g_free (string); + + /* Parse the input */ + input = g_key_file_new (); + if (!g_key_file_load_from_data (input, exchange, strlen (exchange), + G_KEY_FILE_NONE, NULL)) { + g_key_file_free (input); + g_message ("couldn't parse secret exchange data"); + return FALSE; + } + + if (!self->pv->generated) { + if (!(klass->generate_exchange_key) (self, GCR_SECRET_EXCHANGE_PROTOCOL_1, + &self->pv->publi, &self->pv->n_publi)) + g_return_val_if_reached (FALSE); + self->pv->generated = TRUE; + } + + ret = TRUE; + + if (!self->pv->derived) { + if (!derive_key (self, input)) + ret = FALSE; + } + + if (ret && g_key_file_has_key (input, GCR_SECRET_EXCHANGE_PROTOCOL_1, "secret", NULL)) + ret = perform_decrypt (self, input, (guchar **)&secret, &n_secret); + + if (ret) { + egg_secure_free (self->pv->secret); + self->pv->secret = secret; + self->pv->n_secret = n_secret; + } + + g_key_file_free (input); + return ret; +} + +/** + * gcr_secret_exchange_get_secret: + * @self: a #GcrSecretExchange object + * @secret_len: (allow-none): optionally, a location to store the length of returned secret + * + * Returns the last secret received. If no secret has yet been received this + * will return %NULL. The string is owned by the #GcrSecretExchange object + * and will be valid until the next time that gcr_secret_exchange_receive() + * is called on this object, or the object is destroyed. + * + * Depending on the secret passed into the other side of the secret exchange, + * the result may be a binary string. It does however have a null terminator, + * so if you're certain that it is does not contain arbitrary binary data, + * it can be used as a string. + * + * Returns: (transfer none) (array length=secret_len): the last secret received + */ +const gchar * +gcr_secret_exchange_get_secret (GcrSecretExchange *self, + gsize *secret_len) +{ + g_return_val_if_fail (GCR_IS_SECRET_EXCHANGE (self), NULL); + + if (secret_len) + *secret_len = self->pv->n_secret; + return self->pv->secret; +} + +static gboolean +perform_encrypt (GcrSecretExchange *self, + GKeyFile *output, + const gchar *secret, + gsize n_secret) +{ + GcrSecretExchangeClass *klass; + guchar *result, *iv; + gsize n_result, n_iv; + + klass = GCR_SECRET_EXCHANGE_GET_CLASS (self); + g_return_val_if_fail (klass->encrypt_transport_data, FALSE); + + if (!(klass->encrypt_transport_data) (self, g_realloc, (const guchar *)secret, + n_secret, &iv, &n_iv, &result, &n_result)) + return FALSE; + + key_file_set_base64 (output, GCR_SECRET_EXCHANGE_PROTOCOL_1, "secret", result, n_result); + key_file_set_base64 (output, GCR_SECRET_EXCHANGE_PROTOCOL_1, "iv", iv, n_iv); + + g_free (result); + g_free (iv); + + return TRUE; +} + +/** + * gcr_secret_exchange_send: + * @self: a #GcrSecretExchange object + * @secret: (allow-none): optionally, a secret to send to the other side + * @secret_len: length of @secret, or -1 if null terminated + * + * Send a reply to the other side of the secret exchange, optionally sending a + * secret. + * + * gcr_secret_exchange_receive() must have been successfully called at least + * once on this object. In other words this object must have received data + * from the other side of the secret exchange, before we can send a secret. + * + * Returns: (transfer full): a newly allocated string to be sent to the other + * side of the secret exchange + */ +gchar * +gcr_secret_exchange_send (GcrSecretExchange *self, + const gchar *secret, + gssize secret_len) +{ + GKeyFile *output; + gchar *result; + + g_return_val_if_fail (GCR_IS_SECRET_EXCHANGE (self), NULL); + + if (!self->pv->derived) { + g_warning ("gcr_secret_exchange_receive() must be called " + "before calling this function"); + return NULL; + } + + output = g_key_file_new (); + key_file_set_base64 (output, GCR_SECRET_EXCHANGE_PROTOCOL_1, "public", self->pv->publi, + self->pv->n_publi); + + if (secret != NULL) { + if (secret_len < 0) + secret_len = strlen (secret); + if (!perform_encrypt (self, output, secret, secret_len)) { + g_key_file_free (output); + return NULL; + } + } + + result = g_key_file_to_data (output, NULL, NULL); + g_return_val_if_fail (result != NULL, NULL); + + g_strchug (result); + + gchar *string = g_strescape (result, ""); + g_debug ("sending the secret exchange: %s", string); + g_free (string); + + if (!g_str_has_prefix (result, SECRET_EXCHANGE_PROTOCOL_1_PREFIX)) + g_warning ("the prepared data does not have the correct protocol prefix: %s", result); + + g_key_file_free (output); + return result; +} + +/* + * This is the only set we support so far. It includes: + * - DH with the 1536 ike modp group for key exchange + * - HKDF SHA256 for hashing of the key to appropriate size + * - AES 128 CBC for encryption + * - PKCS#7 style padding + */ + +#define EXCHANGE_1_IKE_NAME "ietf-ike-grp-modp-1536" +#define EXCHANGE_1_KEY_LENGTH 16 +#define EXCHANGE_1_IV_LENGTH 16 +#define EXCHANGE_1_HASH_ALGO "sha256" +#define EXCHANGE_1_CIPHER_ALGO GCRY_CIPHER_AES128 +#define EXCHANGE_1_CIPHER_MODE GCRY_CIPHER_MODE_CBC + +struct _GcrSecretExchangeDefault { + gcry_mpi_t prime; + gcry_mpi_t base; + gcry_mpi_t pub; + gcry_mpi_t priv; + gpointer key; +}; + +static guchar * +mpi_to_data (gcry_mpi_t mpi, + gsize *n_data) +{ + gcry_error_t gcry; + guchar *data; + + /* Get the size */ + gcry = gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, n_data, mpi); + g_return_val_if_fail (gcry == 0, NULL); + + data = g_malloc0 (*n_data); + + /* Write into buffer */ + gcry = gcry_mpi_print (GCRYMPI_FMT_USG, data, *n_data, n_data, mpi); + g_return_val_if_fail (gcry == 0, NULL); + + return data; +} + +static gcry_mpi_t +mpi_from_data (const guchar *data, + gsize n_data) +{ + gcry_mpi_t mpi; + gcry_error_t gcry; + + gcry = gcry_mpi_scan (&mpi, GCRYMPI_FMT_USG, data, n_data, NULL); + return (gcry == 0) ? mpi : NULL; +} + +static void +gcr_secret_exchange_default_free (gpointer to_free) +{ + GcrSecretExchangeDefault *data = to_free; + gcry_mpi_release (data->prime); + gcry_mpi_release (data->base); + gcry_mpi_release (data->pub); + gcry_mpi_release (data->priv); + if (data->key) { + egg_secure_clear (data->key, EXCHANGE_1_KEY_LENGTH); + egg_secure_free (data->key); + } + g_free (data); +} + +static gboolean +gcr_secret_exchange_default_generate_exchange_key (GcrSecretExchange *exchange, + const gchar *scheme, + guchar **public_key, + gsize *n_public_key) +{ + GcrSecretExchangeDefault *data = exchange->pv->default_exchange; + + g_debug ("generating public key"); + + if (data == NULL) { + data = g_new0 (GcrSecretExchangeDefault, 1); + if (!egg_dh_default_params (EXCHANGE_1_IKE_NAME, &data->prime, &data->base)) + g_return_val_if_reached (FALSE); + + exchange->pv->default_exchange = data; + exchange->pv->destroy_exchange = gcr_secret_exchange_default_free; + } + + gcry_mpi_release (data->priv); + data->priv = NULL; + gcry_mpi_release (data->pub); + data->pub = NULL; + egg_secure_free (data->key); + data->key = NULL; + + if (!egg_dh_gen_pair (data->prime, data->base, 0, + &data->pub, &data->priv)) + g_return_val_if_reached (FALSE); + + *public_key = mpi_to_data (data->pub, n_public_key); + return *public_key != NULL; +} + +static gboolean +gcr_secret_exchange_default_derive_transport_key (GcrSecretExchange *exchange, + const guchar *peer, + gsize n_peer) +{ + GcrSecretExchangeDefault *data = exchange->pv->default_exchange; + gpointer ikm; + gsize n_ikm; + gcry_mpi_t mpi; + + g_debug ("deriving transport key"); + + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (data->priv != NULL, FALSE); + + mpi = mpi_from_data (peer, n_peer); + if (mpi == NULL) { + g_debug ("invalid peer mpi"); + return FALSE; + } + + /* Build up a key we can use */ + ikm = egg_dh_gen_secret (mpi, data->priv, data->prime, &n_ikm); + g_return_val_if_fail (ikm != NULL, FALSE); + + if (data->key == NULL) + data->key = egg_secure_alloc (EXCHANGE_1_KEY_LENGTH); + + if (!egg_hkdf_perform (EXCHANGE_1_HASH_ALGO, ikm, n_ikm, NULL, 0, + NULL, 0, data->key, EXCHANGE_1_KEY_LENGTH)) + g_return_val_if_reached (FALSE); + + egg_secure_free (ikm); + gcry_mpi_release (mpi); + + return TRUE; +} + +static gboolean +gcr_secret_exchange_default_encrypt_transport_data (GcrSecretExchange *exchange, + GckAllocator allocator, + const guchar *plain_text, + gsize n_plain_text, + guchar **iv, + gsize *n_iv, + guchar **cipher_text, + gsize *n_cipher_text) +{ + GcrSecretExchangeDefault *data = exchange->pv->default_exchange; + gcry_cipher_hd_t cih; + gcry_error_t gcry; + guchar *padded; + gsize n_result; + guchar *result; + gsize pos; + + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (data->key != NULL, FALSE); + + g_debug ("encrypting data"); + + gcry = gcry_cipher_open (&cih, EXCHANGE_1_CIPHER_ALGO, EXCHANGE_1_CIPHER_MODE, 0); + if (gcry != 0) { + g_warning ("couldn't create aes cipher context: %s", gcry_strerror (gcry)); + g_free (iv); + return FALSE; + } + + *iv = (allocator) (NULL, EXCHANGE_1_IV_LENGTH); + g_return_val_if_fail (*iv != NULL, FALSE); + gcry_create_nonce (*iv, EXCHANGE_1_IV_LENGTH); + *n_iv = EXCHANGE_1_IV_LENGTH; + + /* 16 = 128 bits */ + gcry = gcry_cipher_setkey (cih, data->key, EXCHANGE_1_KEY_LENGTH); + g_return_val_if_fail (gcry == 0, FALSE); + + /* 16 = 128 bits */ + gcry = gcry_cipher_setiv (cih, *iv, EXCHANGE_1_IV_LENGTH); + g_return_val_if_fail (gcry == 0, FALSE); + + /* Pad the text properly */ + if (!egg_padding_pkcs7_pad (egg_secure_realloc, 16, plain_text, n_plain_text, + (gpointer*)&padded, &n_result)) + g_return_val_if_reached (FALSE); + result = (allocator) (NULL, n_result); + g_return_val_if_fail (result != NULL, FALSE); + + for (pos = 0; pos < n_result; pos += 16) { + gcry = gcry_cipher_encrypt (cih, result + pos, 16, padded + pos, 16); + g_return_val_if_fail (gcry == 0, FALSE); + } + + gcry_cipher_close (cih); + + egg_secure_clear (padded, n_result); + egg_secure_free (padded); + + *cipher_text = result; + *n_cipher_text = n_result; + return TRUE; +} + +static gboolean +gcr_secret_exchange_default_decrypt_transport_data (GcrSecretExchange *exchange, + GckAllocator allocator, + const guchar *cipher_text, + gsize n_cipher_text, + const guchar *iv, + gsize n_iv, + guchar **plain_text, + gsize *n_plain_text) +{ + GcrSecretExchangeDefault *data = exchange->pv->default_exchange; + guchar* padded; + guchar* result; + gsize n_result; + gsize pos; + gcry_cipher_hd_t cih; + gcry_error_t gcry; + + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (data->key != NULL, FALSE); + + g_debug ("decrypting data"); + + if (iv == NULL || n_iv != EXCHANGE_1_IV_LENGTH) { + g_message ("secret-exchange: invalid or missing iv"); + return FALSE; + } + + if (n_cipher_text % 16 != 0) { + g_message ("secret-message: invalid length for cipher text"); + return FALSE; + } + + gcry = gcry_cipher_open (&cih, EXCHANGE_1_CIPHER_ALGO, EXCHANGE_1_CIPHER_MODE, 0); + if (gcry != 0) { + g_warning ("couldn't create aes cipher context: %s", gcry_strerror (gcry)); + return FALSE; + } + + /* 16 = 128 bits */ + gcry = gcry_cipher_setkey (cih, data->key, EXCHANGE_1_KEY_LENGTH); + g_return_val_if_fail (gcry == 0, FALSE); + + /* 16 = 128 bits */ + gcry = gcry_cipher_setiv (cih, iv, n_iv); + g_return_val_if_fail (gcry == 0, FALSE); + + /* Allocate memory for the result */ + padded = (allocator) (NULL, n_cipher_text); + g_return_val_if_fail (padded != NULL, FALSE); + + for (pos = 0; pos < n_cipher_text; pos += 16) { + gcry = gcry_cipher_decrypt (cih, padded + pos, 16, (guchar *)cipher_text + pos, 16); + g_return_val_if_fail (gcry == 0, FALSE); + } + + gcry_cipher_close (cih); + + if (!egg_padding_pkcs7_unpad (allocator, 16, padded, n_cipher_text, + (gpointer*)&result, &n_result)) + result = NULL; + + /* Free the padded text */ + (allocator) (padded, 0); + + *plain_text = result; + *n_plain_text = n_result; + return TRUE; +} + +static void +gcr_secret_exchange_class_init (GcrSecretExchangeClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = gcr_secret_exchange_get_property; + gobject_class->set_property = gcr_secret_exchange_set_property; + gobject_class->finalize = gcr_secret_exchange_finalize; + + klass->generate_exchange_key = gcr_secret_exchange_default_generate_exchange_key; + klass->derive_transport_key = gcr_secret_exchange_default_derive_transport_key; + klass->decrypt_transport_data = gcr_secret_exchange_default_decrypt_transport_data; + klass->encrypt_transport_data = gcr_secret_exchange_default_encrypt_transport_data; + + g_type_class_add_private (gobject_class, sizeof (GcrSecretExchangePrivate)); + + egg_libgcrypt_initialize (); + + /** + * GcrSecretExchange:protocol: + * + * The protocol being used for the exchange. + * + * Will be %NULL if no protocol was specified when creating this object, + * and either gcr_secret_exchange_begin() or gcr_secret_exchange_receive() + * have not been called successfully. + */ + g_object_class_install_property (gobject_class, PROP_PROTOCOL, + g_param_spec_string ("protocol", "Protocol", "Exchange protocol", + GCR_SECRET_EXCHANGE_PROTOCOL_1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} diff --git a/gcr/gcr-secret-exchange.h b/gcr/gcr-secret-exchange.h new file mode 100644 index 0000000..bf8a876 --- /dev/null +++ b/gcr/gcr-secret-exchange.h @@ -0,0 +1,111 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_SECRET_EXCHANGE_H__ +#define __GCR_SECRET_EXCHANGE_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GCR_SECRET_EXCHANGE_PROTOCOL_1 "sx-aes-1" + +#define GCR_TYPE_SECRET_EXCHANGE (gcr_secret_exchange_get_type ()) +#define GCR_SECRET_EXCHANGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_SECRET_EXCHANGE, GcrSecretExchange)) +#define GCR_SECRET_EXCHANGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_SECRET_EXCHANGE, GcrSecretExchangeClass)) +#define GCR_IS_SECRET_EXCHANGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_SECRET_EXCHANGE)) +#define GCR_IS_SECRET_EXCHANGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_SECRET_EXCHANGE)) +#define GCR_SECRET_EXCHANGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_SECRET_EXCHANGE, GcrSecretExchangeClass)) + +typedef struct _GcrSecretExchange GcrSecretExchange; +typedef struct _GcrSecretExchangeClass GcrSecretExchangeClass; +typedef struct _GcrSecretExchangePrivate GcrSecretExchangePrivate; + +struct _GcrSecretExchange { + /*< private >*/ + GObject parent; + GcrSecretExchangePrivate *pv; +}; + +struct _GcrSecretExchangeClass { + /*< private >*/ + GObjectClass parent_class; + + /* virtual methods, not used publicly */ + gboolean (*generate_exchange_key) (GcrSecretExchange *exchange, + const gchar *scheme, + guchar **public_key, + gsize *n_public_key); + + gboolean (*derive_transport_key) (GcrSecretExchange *exchange, + const guchar *peer, + gsize n_peer); + + gboolean (*encrypt_transport_data) (GcrSecretExchange *exchange, + GckAllocator allocator, + const guchar *plain_text, + gsize n_plain_text, + guchar **parameter, + gsize *n_parameter, + guchar **cipher_text, + gsize *n_cipher_text); + + gboolean (*decrypt_transport_data) (GcrSecretExchange *exchange, + GckAllocator allocator, + const guchar *cipher_text, + gsize n_cipher_text, + const guchar *parameter, + gsize n_parameter, + guchar **plain_text, + gsize *n_plain_text); + + gpointer dummy[6]; +}; + +/* Caller side functions */ + +GType gcr_secret_exchange_get_type (void); + +GcrSecretExchange * gcr_secret_exchange_new (const gchar *protocol); + +const gchar * gcr_secret_exchange_get_protocol (GcrSecretExchange *self); + +gchar * gcr_secret_exchange_begin (GcrSecretExchange *self); + +gboolean gcr_secret_exchange_receive (GcrSecretExchange *self, + const gchar *exchange); + +gchar * gcr_secret_exchange_send (GcrSecretExchange *self, + const gchar *secret, + gssize secret_len); + +const gchar * gcr_secret_exchange_get_secret (GcrSecretExchange *self, + gsize *secret_len); + +G_END_DECLS + +#endif /* __GCR_SECRET_EXCHANGE_H__ */ diff --git a/gcr/gcr-secure-memory.c b/gcr/gcr-secure-memory.c new file mode 100644 index 0000000..c7651f5 --- /dev/null +++ b/gcr/gcr-secure-memory.c @@ -0,0 +1,245 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-secure-memory.c - library for allocating memory that is non-pageable + + Copyright (C) 2007 Stefan Walter + Copyright (C) 2012 Red Hat Inc. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr-secure-memory.h" + +#include "egg/egg-secure-memory.h" + +#include + +#include + +/** + * SECTION:gcr-secure-memory + * @title: Non-pageable Memory + * @short_description: Secure non-pageable memory + * + * Normal allocated memory can be paged to disk at the whim of the operating + * system. This can be a problem for sensitive information like passwords, keys + * and secrets. + * + * The Gcr library holds passwords and keys in non-pageable, or locked memory. + * This is only possible if the OS contains support for it. + * + * These functions allow applications to use secure memory to hold passwords + * and other sensitive information. + */ + +/** + * gcr_secure_memory_new: (skip) + * @type: C type of the objects to allocate + * @n_objects: number of objects to allocate + * + * Allocate objects in non-pageable memory. + * + * Returns: (transfer full): the new block of memory + **/ + +/** + * gcr_secure_memory_alloc: (skip) + * @size: The new desired size of the memory block. + * + * Allocate a block of non-pageable memory. + * + * If non-pageable memory cannot be allocated then normal memory will be + * returned. + * + * Return value: (transfer full): new memory block which should be freed + * with gcr_secure_memory_free() + **/ +gpointer +gcr_secure_memory_alloc (gsize size) +{ + gpointer memory; + + /* Try to allocate secure memory */ + memory = egg_secure_alloc_full ("gcr-secure-memory", size, + EGG_SECURE_USE_FALLBACK); + + /* Our fallback will always allocate */ + g_assert (memory != NULL); + + return memory; +} + +/** + * gcr_secure_memory_try_alloc: (skip) + * @size: new desired size of the memory block + * + * Allocate a block of non-pageable memory. + * + * If non-pageable memory cannot be allocated, then %NULL is returned. + * + * Return value: (transfer full): new block, or %NULL if memory cannot be + * allocated; memory block should be freed with gcr_secure_memory_free() + */ +gpointer +gcr_secure_memory_try_alloc (gsize size) +{ + return egg_secure_alloc_full ("gcr-secure-memory", size, 0); +} + +/** + * gcr_secure_memory_realloc: (skip) + * @memory: (allow-none): pointer to reallocate or %NULL to allocate a new block + * @size: new desired size of the memory block, or 0 to free the memory + * + * Reallocate a block of non-pageable memory. + * + * Glib memory is also reallocated correctly. If called with a null pointer, + * then a new block of memory is allocated. If called with a zero size, + * then the block of memory is freed. + * + * If non-pageable memory cannot be allocated then normal memory will be + * returned. + * + * Return value: (transfer full): new block, or %NULL if the block was + * freed; memory block should be freed with gcr_secure_memory_free() + */ +gpointer +gcr_secure_memory_realloc (gpointer memory, + gsize size) +{ + gpointer new_memory; + + if (!memory) { + return gcr_secure_memory_alloc (size); + } else if (!size) { + gcr_secure_memory_free (memory); + return NULL; + } else if (!egg_secure_check (memory)) { + return g_realloc (memory, size); + } + + /* First try and ask secure memory to reallocate */ + new_memory = egg_secure_realloc_full ("gcr-secure-memory", memory, + size, EGG_SECURE_USE_FALLBACK); + + g_assert (new_memory != NULL); + + return new_memory; +} + +/** + * gcr_secure_memory_try_realloc: (skip) + * @memory: (allow-none): pointer to reallocate or %NULL to allocate a new block + * @size: new desired size of the memory block + * + * Reallocate a block of non-pageable memory. + * + * Glib memory is also reallocated correctly when passed to this function. + * If called with a null pointer, then a new block of memory is allocated. + * If called with a zero size, then the block of memory is freed. + * + * If memory cannot be allocated, %NULL is returned and the original block + * of memory remains intact. + * + * Return value: (transfer full): the new block, or %NULL if memory cannot be + * allocated; the memory block should be freed with gcr_secure_memory_free() + */ +gpointer +gcr_secure_memory_try_realloc (gpointer memory, + gsize size) +{ + gpointer new_memory; + + if (!memory) { + return gcr_secure_memory_try_alloc (size); + } else if (!size) { + gcr_secure_memory_free (memory); + return NULL; + } else if (!egg_secure_check (memory)) { + return g_try_realloc (memory, size); + } + + /* First try and ask secure memory to reallocate */ + new_memory = egg_secure_realloc_full ("gcr-secure-memory", memory, + size, 0); + + /* Might be NULL if reallocation failed. */ + return new_memory; +} + +/** + * gcr_secure_memory_free: (skip) + * @memory: (allow-none): pointer to the beginning of the block of memory to free + * + * Free a block of non-pageable memory. + * + * Glib memory is also freed correctly when passed to this function. If called + * with a %NULL pointer then no action is taken. + */ +void +gcr_secure_memory_free (gpointer memory) +{ + if (!memory) + return; + egg_secure_free_full (memory, EGG_SECURE_USE_FALLBACK); +} + +/** + * gcr_secure_memory_is_secure: (skip) + * @memory: pointer to check + * + * Check if a pointer is in non-pageable memory allocated by. + * + * Returns: whether the memory is secure non-pageable memory allocated by the + * Gcr library or not + */ +gboolean +gcr_secure_memory_is_secure (gpointer memory) +{ + return egg_secure_check (memory) ? TRUE : FALSE; +} + +/** + * gcr_secure_memory_strdup: (skip) + * @string: (allow-none): null terminated string to copy + * + * Copy a string into non-pageable memory. If the input string is %NULL, then + * %NULL will be returned. + * + * Returns: copied string, should be freed with gcr_secure_memory_free() + */ +gchar * +gcr_secure_memory_strdup (const gchar* string) +{ + return egg_secure_strdup_full ("gcr-secure-memory", string, + EGG_SECURE_USE_FALLBACK); +} + +/** + * gcr_secure_memory_strfree: (skip) + * @string: (allow-none): null terminated string to fere + * + * Free a string, whether securely allocated using these functions or not. + * This will also clear out the contents of the string so they do not + * remain in memory. + */ +void +gcr_secure_memory_strfree (gchar *string) +{ + egg_secure_strfree (string); +} diff --git a/gcr/gcr-secure-memory.h b/gcr/gcr-secure-memory.h new file mode 100644 index 0000000..2d562fc --- /dev/null +++ b/gcr/gcr-secure-memory.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-secure-memory.h - library for allocating memory that is non-pageable + + Copyright (C) 2007 Stefan Walter + Copyright (C) 2012 Red Hat Inc. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_SECURE_MEMORY_H +#define GCR_SECURE_MEMORY_H + +#include + +G_BEGIN_DECLS + +#define gcr_secure_memory_new(type, n_objects) \ + ((type *)(gcr_secure_memory_alloc (sizeof (type) * (n_objects)))) + +gpointer gcr_secure_memory_alloc (gsize size); + +gpointer gcr_secure_memory_try_alloc (gsize size); + +gpointer gcr_secure_memory_realloc (gpointer memory, + gsize size); + +gpointer gcr_secure_memory_try_realloc (gpointer memory, + gsize size); + +void gcr_secure_memory_free (gpointer memory); + +gboolean gcr_secure_memory_is_secure (gpointer memory); + +gchar * gcr_secure_memory_strdup (const gchar *string); + +void gcr_secure_memory_strfree (gchar *string); + +G_END_DECLS + +#endif /* GCR_SECURE_MEMORY_H */ diff --git a/gcr/gcr-simple-certificate.c b/gcr/gcr-simple-certificate.c new file mode 100644 index 0000000..4007639 --- /dev/null +++ b/gcr/gcr-simple-certificate.c @@ -0,0 +1,183 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-certificate.h" +#include "gcr-comparable.h" +#include "gcr-internal.h" +#include "gcr-simple-certificate.h" + +#include + +/** + * SECTION:gcr-simple-certificate + * @title: GcrSimpleCertificate + * @short_description: A certificate loaded from a memory buffer + * + * An implementation of #GcrCertificate which loads a certificate from DER + * data already located in memory. + * + * To create a #GcrSimpleCertificate object use the + * gcr_simple_certificate_new() or gcr_simple_certificate_new_static() + * functions. + */ + +/** + * GcrSimpleCertificate: + * + * A #GcrCertificate which represents a certificate already in memory. + */ + +/** + * GcrSimpleCertificateClass: + * @parent_class: The parent class + * + * The class for #GcrSimpleCertificate. + */ + +struct _GcrSimpleCertificatePrivate { + const guchar *data; + gsize n_data; + guchar *owned; +}; + +/* Forward declarations */ +static void gcr_simple_certificate_iface_init (GcrCertificateIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrSimpleCertificate, gcr_simple_certificate, G_TYPE_OBJECT, + GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE (); + G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, gcr_simple_certificate_iface_init); +); + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static void +gcr_simple_certificate_init (GcrSimpleCertificate *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_SIMPLE_CERTIFICATE, GcrSimpleCertificatePrivate); +} + +static void +gcr_simple_certificate_real_finalize (GObject *obj) +{ + GcrSimpleCertificate *self = GCR_SIMPLE_CERTIFICATE (obj); + + g_free (self->pv->owned); + self->pv->owned = NULL; + self->pv->data = NULL; + self->pv->n_data = 0; + + G_OBJECT_CLASS (gcr_simple_certificate_parent_class)->finalize (obj); +} + +static void +gcr_simple_certificate_class_init (GcrSimpleCertificateClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = gcr_simple_certificate_real_finalize; + gobject_class->get_property = gcr_certificate_mixin_get_property; + + g_type_class_add_private (gobject_class, sizeof (GcrSimpleCertificatePrivate)); + + gcr_certificate_mixin_class_init (gobject_class); + _gcr_initialize_library (); +} + +static const guchar * +gcr_simple_certificate_get_der_data (GcrCertificate *cert, + gsize *n_data) +{ + GcrSimpleCertificate *self = GCR_SIMPLE_CERTIFICATE (cert); + + g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); + g_return_val_if_fail (n_data, NULL); + g_return_val_if_fail (self->pv->data, NULL); + + /* This is called when we're not a base class */ + *n_data = self->pv->n_data; + return self->pv->data; +} + +static void +gcr_simple_certificate_iface_init (GcrCertificateIface *iface) +{ + iface->get_der_data = gcr_simple_certificate_get_der_data; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_simple_certificate_new: + * @data: (array length=n_data): the raw DER certificate data + * @n_data: The length of @data + * + * Create a new #GcrSimpleCertificate for the raw DER data. The @data memory is + * copied so you can dispose of it after this function returns. + * + * Returns: (transfer full) (type Gcr.SimpleCertificate): a new #GcrSimpleCertificate + */ +GcrCertificate * +gcr_simple_certificate_new (const guchar *data, + gsize n_data) +{ + GcrSimpleCertificate *cert; + + g_return_val_if_fail (data, NULL); + g_return_val_if_fail (n_data, NULL); + + cert = g_object_new (GCR_TYPE_SIMPLE_CERTIFICATE, NULL); + + cert->pv->data = cert->pv->owned = g_memdup (data, n_data); + cert->pv->n_data = n_data; + return GCR_CERTIFICATE (cert); +} + +/** + * gcr_simple_certificate_new_static: (skip) + * @data: (array length=n_data): The raw DER certificate data + * @n_data: The length of @data + * + * Create a new #GcrSimpleCertificate for the raw DER data. The @data memory is + * not copied and must persist until the #GcrSimpleCertificate object is + * destroyed. + * + * Returns: (transfer full) (type Gcr.SimpleCertificate): a new #GcrSimpleCertificate + */ +GcrCertificate * +gcr_simple_certificate_new_static (const guchar *data, + gsize n_data) +{ + GcrSimpleCertificate *cert; + + g_return_val_if_fail (data, NULL); + g_return_val_if_fail (n_data, NULL); + + cert = g_object_new (GCR_TYPE_SIMPLE_CERTIFICATE, NULL); + + cert->pv->owned = NULL; + cert->pv->data = data; + cert->pv->n_data = n_data; + return GCR_CERTIFICATE (cert); +} diff --git a/gcr/gcr-simple-certificate.h b/gcr/gcr-simple-certificate.h new file mode 100644 index 0000000..9e6d2fc --- /dev/null +++ b/gcr/gcr-simple-certificate.h @@ -0,0 +1,65 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_SIMPLE_CERTIFICATE_H__ +#define __GCR_SIMPLE_CERTIFICATE_H__ + +#include + +#include "gcr-certificate.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_SIMPLE_CERTIFICATE (gcr_simple_certificate_get_type ()) +#define GCR_SIMPLE_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_SIMPLE_CERTIFICATE, GcrSimpleCertificate)) +#define GCR_SIMPLE_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_SIMPLE_CERTIFICATE, GcrSimpleCertificateClass)) +#define GCR_IS_SIMPLE_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_SIMPLE_CERTIFICATE)) +#define GCR_IS_SIMPLE_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_SIMPLE_CERTIFICATE)) +#define GCR_SIMPLE_CERTIFICATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_SIMPLE_CERTIFICATE, GcrSimpleCertificateClass)) + +typedef struct _GcrSimpleCertificate GcrSimpleCertificate; +typedef struct _GcrSimpleCertificateClass GcrSimpleCertificateClass; +typedef struct _GcrSimpleCertificatePrivate GcrSimpleCertificatePrivate; + +struct _GcrSimpleCertificate { + GObject parent; + + /*< private >*/ + GcrSimpleCertificatePrivate *pv; +}; + +struct _GcrSimpleCertificateClass { + GObjectClass parent_class; +}; + +GType gcr_simple_certificate_get_type (void); + +GcrCertificate * gcr_simple_certificate_new (const guchar *data, + gsize n_data); + +GcrCertificate * gcr_simple_certificate_new_static (const guchar *data, + gsize n_data); + +G_END_DECLS + +#endif /* __GCR_SIMPLE_CERTIFICATE_H__ */ diff --git a/gcr/gcr-simple-collection.c b/gcr/gcr-simple-collection.c new file mode 100644 index 0000000..def00f0 --- /dev/null +++ b/gcr/gcr-simple-collection.c @@ -0,0 +1,206 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-collection.h" +#include "gcr-deprecated-base.h" +#include "gcr-internal.h" +#include "gcr-simple-collection.h" + +#include + +/** + * SECTION:gcr-simple-collection + * @title: GcrSimpleCollection + * @short_description: A simple implementation of GcrCollection + * + * A simple implementation of #GcrCollection, which you can add and remove + * objects from. Use gcr_simple_collection_add() to do this + * gcr_simple_collection_remove(). + */ + +/** + * GcrSimpleCollection: + * + * A simple implementation of #GcrCollection. + */ + +/** + * GcrSimpleCollectionClass: + * @parent_class: The parent class + * + * The class for #GcrSimpleCollection. + */ + +struct _GcrSimpleCollectionPrivate { + GHashTable *items; +}; + +static void gcr_collection_iface (GcrCollectionIface *iface); +G_DEFINE_TYPE_WITH_CODE (GcrSimpleCollection, gcr_simple_collection, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_collection_iface)); + +#define UNUSED_VALUE GUINT_TO_POINTER (1) + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static void +gcr_simple_collection_init (GcrSimpleCollection *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_SIMPLE_COLLECTION, GcrSimpleCollectionPrivate); + self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); +} + +static void +gcr_simple_collection_dispose (GObject *obj) +{ + GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (obj); + + g_hash_table_remove_all (self->pv->items); + + G_OBJECT_CLASS (gcr_simple_collection_parent_class)->dispose (obj); +} + +static void +gcr_simple_collection_finalize (GObject *obj) +{ + GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (obj); + + g_assert (self->pv->items); + g_assert (g_hash_table_size (self->pv->items) == 0); + g_hash_table_destroy (self->pv->items); + self->pv->items = NULL; + + G_OBJECT_CLASS (gcr_simple_collection_parent_class)->finalize (obj); +} + +static void +gcr_simple_collection_class_init (GcrSimpleCollectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = gcr_simple_collection_dispose; + gobject_class->finalize = gcr_simple_collection_finalize; + g_type_class_add_private (gobject_class, sizeof (GcrSimpleCollectionPrivate)); +} + +static guint +gcr_simple_collection_real_get_length (GcrCollection *coll) +{ + GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (coll); + return g_hash_table_size (self->pv->items); +} + +static GList* +gcr_simple_collection_real_get_objects (GcrCollection *coll) +{ + GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (coll); + return g_hash_table_get_keys (self->pv->items); +} + +static gboolean +gcr_simple_collection_real_contains (GcrCollection *collection, + GObject *object) +{ + GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (collection); + return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE; +} + +static void +gcr_collection_iface (GcrCollectionIface *iface) +{ + iface->get_length = gcr_simple_collection_real_get_length; + iface->get_objects = gcr_simple_collection_real_get_objects; + iface->contains = gcr_simple_collection_real_contains; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_simple_collection_new: + * + * Create a new #GcrSimpleCollection. + * + * Returns: (transfer full) (type Gcr.SimpleCollection): a newly allocated + * collection, which should be freed with g_object_unref() + */ +GcrCollection * +gcr_simple_collection_new (void) +{ + return g_object_new (GCR_TYPE_SIMPLE_COLLECTION, NULL); +} + +/** + * gcr_simple_collection_add: + * @self: The collection + * @object: The object to add + * + * Add an object to this collection + */ +void +gcr_simple_collection_add (GcrSimpleCollection *self, GObject *object) +{ + g_return_if_fail (GCR_IS_SIMPLE_COLLECTION (self)); + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (!g_hash_table_lookup (self->pv->items, object)); + g_hash_table_insert (self->pv->items, g_object_ref (object), UNUSED_VALUE); + gcr_collection_emit_added (GCR_COLLECTION (self), object); +} + +/** + * gcr_simple_collection_remove: + * @self: The collection + * @object: The object to remove from the collection + * + * Remove an object from the collection. + */ +void +gcr_simple_collection_remove (GcrSimpleCollection *self, GObject *object) +{ + g_return_if_fail (GCR_IS_SIMPLE_COLLECTION (self)); + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (g_hash_table_lookup (self->pv->items, object)); + g_object_ref (object); + g_hash_table_remove (self->pv->items, object); + gcr_collection_emit_removed (GCR_COLLECTION (self), object); + g_object_unref (object); +} + +/** + * gcr_simple_collection_contains: + * @self: The collection + * @object: The object to check + * + * Check if the collection contains a certain object. + * + * Deprecated: use gcr_collection_contains() instead + * + * Returns: %TRUE if the collection contains the object. + */ +gboolean +gcr_simple_collection_contains (GcrSimpleCollection *self, GObject *object) +{ + g_return_val_if_fail (GCR_IS_SIMPLE_COLLECTION (self), FALSE); + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + return gcr_collection_contains (GCR_COLLECTION (self), object); +} diff --git a/gcr/gcr-simple-collection.h b/gcr/gcr-simple-collection.h new file mode 100644 index 0000000..4799b62 --- /dev/null +++ b/gcr/gcr-simple-collection.h @@ -0,0 +1,63 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_SIMPLE_COLLECTION_H__ +#define __GCR_SIMPLE_COLLECTION_H__ + +#include "gcr-collection.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_SIMPLE_COLLECTION (gcr_simple_collection_get_type ()) +#define GCR_SIMPLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrSimpleCollection)) +#define GCR_SIMPLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION, GcrSimpleCollectionClass)) +#define GCR_IS_SIMPLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION)) +#define GCR_IS_SIMPLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION)) +#define GCR_SIMPLE_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION, GcrSimpleCollectionClass)) + +typedef struct _GcrSimpleCollection GcrSimpleCollection; +typedef struct _GcrSimpleCollectionClass GcrSimpleCollectionClass; +typedef struct _GcrSimpleCollectionPrivate GcrSimpleCollectionPrivate; + +struct _GcrSimpleCollection { + GObject parent; + + /*< private >*/ + GcrSimpleCollectionPrivate *pv; +}; + +struct _GcrSimpleCollectionClass { + GObjectClass parent_class; +}; + +GType gcr_simple_collection_get_type (void); + +GcrCollection* gcr_simple_collection_new (void); + +void gcr_simple_collection_add (GcrSimpleCollection *self, + GObject *object); + +void gcr_simple_collection_remove (GcrSimpleCollection *self, + GObject *object); + +G_END_DECLS + +#endif /* __GCR_SIMPLE_COLLECTION_H__ */ diff --git a/gcr/gcr-single-collection.c b/gcr/gcr-single-collection.c new file mode 100644 index 0000000..85a0ebb --- /dev/null +++ b/gcr/gcr-single-collection.c @@ -0,0 +1,155 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-collection.h" +#include "gcr-single-collection.h" + +#include + +/** + * GcrSingleCollection: + * + * A single implementation of #GcrCollection. + */ + +struct _GcrSingleCollection { + GObject parent; + GObject *object; +}; + +/** + * GcrSingleCollectionClass: + * @parent_class: The parent class + * + * The class for #GcrSingleCollection. + */ + +struct _GcrSingleCollectionClass { + GObjectClass parent_class; +}; + +static void _gcr_single_collection_iface (GcrCollectionIface *iface); +G_DEFINE_TYPE_WITH_CODE (GcrSingleCollection, _gcr_single_collection, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, _gcr_single_collection_iface)); + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static void +_gcr_single_collection_init (GcrSingleCollection *self) +{ + +} + +static void +_gcr_single_collection_dispose (GObject *obj) +{ + GcrSingleCollection *self = GCR_SINGLE_COLLECTION (obj); + + _gcr_single_collection_set_object (self, NULL); + + G_OBJECT_CLASS (_gcr_single_collection_parent_class)->dispose (obj); +} + +static void +_gcr_single_collection_class_init (GcrSingleCollectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = _gcr_single_collection_dispose; +} + +static guint +_gcr_single_collection_real_get_length (GcrCollection *coll) +{ + GcrSingleCollection *self = GCR_SINGLE_COLLECTION (coll); + return self->object == NULL ? 0 : 1; +} + +static GList* +_gcr_single_collection_real_get_objects (GcrCollection *coll) +{ + GcrSingleCollection *self = GCR_SINGLE_COLLECTION (coll); + return self->object == NULL ? NULL : g_list_append (NULL, self->object); +} + +static gboolean +_gcr_single_collection_real_contains (GcrCollection *collection, + GObject *object) +{ + GcrSingleCollection *self = GCR_SINGLE_COLLECTION (collection); + return self->object == object; +} + +static void +_gcr_single_collection_iface (GcrCollectionIface *iface) +{ + iface->get_length = _gcr_single_collection_real_get_length; + iface->get_objects = _gcr_single_collection_real_get_objects; + iface->contains = _gcr_single_collection_real_contains; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +GcrCollection * +_gcr_single_collection_new (GObject *object) +{ + GcrSingleCollection *self; + + self = g_object_new (GCR_TYPE_SINGLE_COLLECTION, NULL); + _gcr_single_collection_set_object (self, object); + + return GCR_COLLECTION (self); +} + +GObject * +_gcr_single_collection_get_object (GcrSingleCollection *self) +{ + g_return_val_if_fail (GCR_IS_SINGLE_COLLECTION (self), NULL); + return self->object; +} + +void +_gcr_single_collection_set_object (GcrSingleCollection *self, + GObject *object) +{ + GObject *obj; + + g_return_if_fail (GCR_IS_SINGLE_COLLECTION (self)); + g_return_if_fail (object == NULL || G_IS_OBJECT (object)); + + if (object == self->object) + return; + + if (self->object) { + obj = self->object; + self->object = NULL; + gcr_collection_emit_removed (GCR_COLLECTION (self), obj); + g_object_unref (obj); + } + + if (object) { + self->object = g_object_ref (object); + gcr_collection_emit_added (GCR_COLLECTION (self), self->object); + } +} diff --git a/gcr/gcr-single-collection.h b/gcr/gcr-single-collection.h new file mode 100644 index 0000000..a2392f5 --- /dev/null +++ b/gcr/gcr-single-collection.h @@ -0,0 +1,52 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_SINGLE_COLLECTION_H__ +#define __GCR_SINGLE_COLLECTION_H__ + +#include "gcr-collection.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_SINGLE_COLLECTION (_gcr_single_collection_get_type ()) +#define GCR_SINGLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrSingleCollection)) +#define GCR_SINGLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION, GcrSingleCollectionClass)) +#define GCR_IS_SINGLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION)) +#define GCR_IS_SINGLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION)) +#define GCR_SINGLE_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION, GcrSingleCollectionClass)) + +typedef struct _GcrSingleCollection GcrSingleCollection; +typedef struct _GcrSingleCollectionClass GcrSingleCollectionClass; + +GType _gcr_single_collection_get_type (void); + +GcrCollection * _gcr_single_collection_new (GObject *object); + +GObject * _gcr_single_collection_get_object (GcrSingleCollection *self); + +void _gcr_single_collection_set_object (GcrSingleCollection *self, + GObject *object); + +G_END_DECLS + +#endif /* __GCR_SINGLE_COLLECTION_H__ */ diff --git a/gcr/gcr-ssh-askpass.c b/gcr/gcr-ssh-askpass.c new file mode 100644 index 0000000..3261916 --- /dev/null +++ b/gcr/gcr-ssh-askpass.c @@ -0,0 +1,541 @@ +/* + * Copyright (C) 2014 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Auther: Stef Walter + */ + +#include "config.h" + +#include "gcr-ssh-askpass.h" + +#include +#include +#include + +#include +#include + +#include +#include + +/* Used from tests to override location */ +const char *gcr_ssh_askpass_executable = LIBEXECDIR "/gcr-ssh-askpass"; + +/** + * SECTION:gcr-ssh-askpass + * @title: GcrSshAskpass + * @short_description: Allows an ssh command to callback for a password + * + * When used as the setup function while spawning an ssh command like ssh-add + * or ssh, this allows callbacks for passwords on the provided interaction. + */ + +/** + * GcrSshAskpass: + * + * An object containing the password prompting state. + */ + +/** + * GcrSshAskpassClass: + * + * The class for #GcrSshAskpass + */ + +enum { + PROP_0, + PROP_INTERACTION +}; + +struct _GcrSshAskpass { + GObject parent; + GTlsInteraction *interaction; + gchar *directory; + gchar *socket; + guint source; + gint fd; + GCancellable *cancellable; + GMainContext *context; +}; + +struct _GcrSshAskpassClass { + GObjectClass parent; +}; + +G_DEFINE_TYPE (GcrSshAskpass, gcr_ssh_askpass, G_TYPE_OBJECT); + +static void +gcr_ssh_askpass_init (GcrSshAskpass *self) +{ + self->cancellable = g_cancellable_new (); + self->context = g_main_context_ref_thread_default (); +} + +static void +gcr_ssh_askpass_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrSshAskpass *self = GCR_SSH_ASKPASS (obj); + + switch (prop_id) { + case PROP_INTERACTION: + self->interaction = g_value_dup_object (value); + g_return_if_fail (self->interaction != NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_ssh_askpass_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrSshAskpass *self = GCR_SSH_ASKPASS (obj); + + switch (prop_id) { + case PROP_INTERACTION: + g_value_set_object (value, gcr_ssh_askpass_get_interaction (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static gboolean +write_all (gint fd, + const guchar *buf, + gsize len) +{ + guint all = len; + int res; + + while (len > 0) { + res = write (fd, buf, len); + if (res <= 0) { + if (errno == EAGAIN || errno == EINTR) + continue; + if (errno != EPIPE) + g_warning ("couldn't write %u bytes to client: %s", all, + res < 0 ? g_strerror (errno) : ""); + return FALSE; + } else { + len -= res; + buf += res; + } + } + return TRUE; +} + +static GString * +read_all_into_string (gint fd) +{ + GString *input = g_string_new (""); + gsize len; + gssize ret; + + for (;;) { + len = input->len; + g_string_set_size (input, len + 256); + ret = read (fd, input->str + len, 256); + if (ret < 0) { + if (errno != EINTR && errno != EAGAIN) { + g_critical ("couldn't read from gcr-ssh-askpass: %s", g_strerror (errno)); + g_string_free (input, TRUE); + return NULL; + } + } else if (ret == 0) { + return input; + } else { + input->len = len + ret; + input->str[input->len] = '\0'; + } + } +} + +typedef struct { + gint fd; + GTlsInteraction *interaction; + GCancellable *cancellable; +} AskpassContext; + +static gpointer +askpass_thread (gpointer data) +{ + AskpassContext *ctx = data; + gboolean success = FALSE; + GTlsPassword *password = NULL; + GTlsInteractionResult res; + GError *error = NULL; + const guchar *value; + GString *input; + gsize length; + + input = read_all_into_string (ctx->fd); + if (!input) + goto out; + + if (input->len == 0) + g_string_append (input, _("Enter your OpenSSH passphrase")); + + g_debug ("asking for ssh-askpass password: %s", input->str); + + password = g_tls_password_new (G_TLS_PASSWORD_NONE, input->str); + res = g_tls_interaction_invoke_ask_password (ctx->interaction, password, ctx->cancellable, &error); + + g_debug ("ask password returned %d", res); + + success = FALSE; + if (res == G_TLS_INTERACTION_HANDLED) { + value = g_tls_password_get_value (password, &length); + if (write_all (ctx->fd, (const guchar *)value, length)) + g_debug ("password written to gcr-ssh-askpass"); + else + g_message ("failed to write password to gcr-ssh-askpass"); + success = TRUE; + } else if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_warning ("couldn't prompt for password: %s", error->message); + } else { + g_debug ("unhandled or cancelled ask password"); + } + +out: + if (!success) { + g_debug ("writing failure to gcr-ssh-askpass"); + write_all (ctx->fd, (const guchar *)"\xff", 1); + } + if (password) + g_object_unref (password); + if (input) + g_string_free (input, TRUE); + g_clear_error (&error); + + g_close (ctx->fd, NULL); + g_object_unref (ctx->interaction); + g_object_unref (ctx->cancellable); + g_free (ctx); + + return NULL; +} + +static gboolean +askpass_accept (gint fd, + GIOCondition cond, + gpointer user_data) +{ + GcrSshAskpass *self = user_data; + AskpassContext *ctx; + struct sockaddr_un addr; + socklen_t addrlen; + GThread *thread; + gint new_fd; + + addrlen = sizeof (addr); + new_fd = accept (fd, (struct sockaddr *) &addr, &addrlen); + if (new_fd < 0) { + if (errno != EAGAIN && errno != EINTR) + g_warning ("couldn't accept new control request: %s", g_strerror (errno)); + return TRUE; + } + + g_debug ("accepted new connection from gcr-ssh-askpass"); + + ctx = g_new0 (AskpassContext, 1); + ctx->fd = new_fd; + ctx->interaction = g_object_ref (self->interaction); + ctx->cancellable = g_object_ref (self->cancellable); + + thread = g_thread_new ("ssh-askpass", askpass_thread, ctx); + g_thread_unref (thread); + + return TRUE; +} + +static void +gcr_ssh_askpass_constructed (GObject *obj) +{ + GcrSshAskpass *self = GCR_SSH_ASKPASS (obj); + struct sockaddr_un addr; + + G_OBJECT_CLASS (gcr_ssh_askpass_parent_class)->constructed (obj); + + self->directory = g_build_filename (g_get_user_runtime_dir (), "ssh-askpass.XXXXXX", NULL); + if (!g_mkdtemp_full (self->directory, 0700)) { + g_warning ("couldn't create temporary directory: %s: %s", self->directory, g_strerror (errno)); + return; + } + + self->socket = g_build_filename (self->directory, "socket", NULL); + + self->fd = socket (AF_UNIX, SOCK_STREAM, 0); + if (self->fd < 0) { + g_warning ("couldn't open socket: %s", g_strerror (errno)); + return; + } + + if (!g_unix_set_fd_nonblocking (self->fd, TRUE, NULL)) + g_return_if_reached (); + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + g_strlcpy (addr.sun_path, self->socket, sizeof (addr.sun_path)); + if (bind (self->fd, (struct sockaddr*) &addr, sizeof (addr)) < 0) { + g_warning ("couldn't bind to askpass socket: %s: %s", self->socket, g_strerror (errno)); + return; + } + + if (listen (self->fd, 128) < 0) { + g_warning ("couldn't listen on askpass socket: %s: %s", self->socket, g_strerror (errno)); + return; + } + + g_debug ("listening for gcr-ssh-askpass at: %s", self->socket); + + self->source = g_unix_fd_add (self->fd, G_IO_IN, askpass_accept, self); +} + +static void +gcr_ssh_askpass_dispose (GObject *obj) +{ + GcrSshAskpass *self = GCR_SSH_ASKPASS (obj); + + g_cancellable_cancel (self->cancellable); + + if (self->source) { + g_source_remove (self->source); + self->source = 0; + } + + if (self->fd >= 0) { + g_close (self->fd, NULL); + self->fd = -1; + } + + if (self->socket) { + g_unlink (self->socket); + g_free (self->socket); + self->socket = NULL; + } + + if (self->directory) { + g_rmdir (self->directory); + g_free (self->directory); + self->directory = NULL; + } + + if (self->interaction) { + g_object_unref (self->interaction); + self->interaction = NULL; + } + + G_OBJECT_CLASS (gcr_ssh_askpass_parent_class)->dispose (obj); +} + +static void +gcr_ssh_askpass_finalize (GObject *obj) +{ + GcrSshAskpass *self = GCR_SSH_ASKPASS (obj); + + g_object_unref (self->cancellable); + g_main_context_unref (self->context); + + G_OBJECT_CLASS (gcr_ssh_askpass_parent_class)->finalize (obj); +} + +/** + * gcr_ssh_askpass_new: + * @interaction: the interaction to use for prompting paswords + * + * Create a new GcrSshAskpass object which can be used to spawn an + * ssh command and prompt for any necessary passwords. + * + * Use the gcr_ssh_askpass_child_setup() function as a callback with + * g_spawn_sync(), g_spawn_async() or g_spawn_async_with_pipes(). + * + * Returns: (transfer full): A new #GcrSshAskpass object + */ +GcrSshAskpass * +gcr_ssh_askpass_new (GTlsInteraction *interaction) +{ + g_return_val_if_fail (G_IS_TLS_INTERACTION (interaction), NULL); + return g_object_new (GCR_TYPE_SSH_ASKPASS, + "interaction", interaction, + NULL); +} + +/** + * gcr_ssh_askpass_get_interaction: + * @self: a #GcrSshAskpass object + * + * Get the interaction associated with this object. + * + * Returns: (transfer none): the interaction + */ +GTlsInteraction * +gcr_ssh_askpass_get_interaction (GcrSshAskpass *self) +{ + g_return_val_if_fail (GCR_IS_SSH_ASKPASS (self), NULL); + return self->interaction; +} + +/** + * gcr_ssh_askpass_child_setup: + * @askpass: a #GcrSshAskpass object + * + * Use this function as a callback setup function passed to g_spawn_sync(), + * g_spawn_async(), g_spawn_async_with_pipes(). + */ +void +gcr_ssh_askpass_child_setup (gpointer askpass) +{ + GcrSshAskpass *self = askpass; + + g_setenv ("SSH_ASKPASS", gcr_ssh_askpass_executable, TRUE); + + /* ssh wants DISPLAY set in order to use SSH_ASKPASS */ + if (!g_getenv ("DISPLAY")) + g_setenv ("DISPLAY", "x", TRUE); + + /* For communicating back with ourselves */ + if (self->socket) + g_setenv ("GCR_SSH_ASKPASS_SOCKET", self->socket, TRUE); + + /* Close the control terminal */ + setsid (); +} + +static void +gcr_ssh_askpass_class_init (GcrSshAskpassClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = gcr_ssh_askpass_get_property; + gobject_class->set_property = gcr_ssh_askpass_set_property; + gobject_class->constructed = gcr_ssh_askpass_constructed; + gobject_class->dispose = gcr_ssh_askpass_dispose; + gobject_class->finalize = gcr_ssh_askpass_finalize; + + /** + * GcrSshAskpass:interaction: + * + * The interaction used to prompt for passwords. + */ + g_object_class_install_property (gobject_class, PROP_INTERACTION, + g_param_spec_object ("interaction", "Interaction", "Interaction", + G_TYPE_TLS_INTERACTION, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +#ifdef GCR_SSH_ASKPASS_TOOL + +#include "egg/egg-secure-memory.h" + +EGG_SECURE_DEFINE_GLIB_GLOBALS (); +EGG_SECURE_DECLARE ("ssh-askpass"); + +int +main (int argc, + char *argv[]) +{ + GString *message; + struct sockaddr_un addr; + const gchar *path; + guchar *buf; + gint count; + gint i; + int ret; + int fd; + + path = g_getenv ("GCR_SSH_ASKPASS_SOCKET"); + if (path == NULL) { + g_printerr ("gcr-ssh-askpass: this program is not meant to be run directly"); + return 2; + } + + fd = socket (AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + g_warning ("couldn't open socket: %s", g_strerror (errno)); + return -1; + } + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + g_strlcpy (addr.sun_path, path, sizeof (addr.sun_path)); + if (connect (fd, (struct sockaddr*) &addr, sizeof (addr)) < 0) { + g_warning ("couldn't connect to askpass socket: %s: %s", path, g_strerror (errno)); + return -1; + } + + message = g_string_new (""); + if (argc > 1) { + for (i = 1; i < argc; i++) { + if (i == 1) + g_string_append_c (message, ' '); + g_string_append (message, argv[i]); + } + } + + if (!write_all (fd, (const guchar *)message->str, message->len)) { + g_string_free (message, TRUE); + return -1; + } + g_string_free (message, TRUE); + + if (shutdown (fd, SHUT_WR) < 0) { + g_warning ("couldn't shutdown socket: %s", g_strerror (errno)); + return -1; + } + + count = 0; + buf = egg_secure_alloc (128); + + for (;;) { + ret = read (fd, buf, 128); + if (ret < 0) { + if (errno != EINTR && errno != EAGAIN) { + if (errno != ECONNRESET) { + g_critical ("couldn't read from ssh-askpass socket: %s", + g_strerror (errno)); + } + egg_secure_free (buf); + return -1; + } + ret = 0; + } else if (ret == 0) { + break; + } else if (!write_all (1, buf, ret)) { + egg_secure_free (buf); + return -1; + } + count += ret; + } + + if (count == 1 && buf[0] == 0xff) { + egg_secure_free (buf); + return -1; + } + + egg_secure_free (buf); + return 0; +} + +#endif /* GCR_SSH_ASKPASS_TOOL */ diff --git a/gcr/gcr-ssh-askpass.h b/gcr/gcr-ssh-askpass.h new file mode 100644 index 0000000..634011d --- /dev/null +++ b/gcr/gcr-ssh-askpass.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2014 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_SSH_ASKPASS_H__ +#define __GCR_SSH_ASKPASS_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_SSH_ASKPASS (gcr_ssh_askpass_get_type ()) +#define GCR_SSH_ASKPASS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_SSH_ASKPASS, GcrSshAskpass)) +#define GCR_SSH_ASKPASS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_SSH_ASKPASS, GcrSshAskpassClass)) +#define GCR_IS_SSH_ASKPASS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_SSH_ASKPASS)) +#define GCR_IS_SSH_ASKPASS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_SSH_ASKPASS)) +#define GCR_SSH_ASKPASS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_SSH_ASKPASS, GcrSshAskpassClass)) + +typedef struct _GcrSshAskpass GcrSshAskpass; +typedef struct _GcrSshAskpassClass GcrSshAskpassClass; + +GType gcr_ssh_askpass_get_type (void); + +GcrSshAskpass * gcr_ssh_askpass_new (GTlsInteraction *interaction); + +GTlsInteraction * gcr_ssh_askpass_get_interaction (GcrSshAskpass *self); + +void gcr_ssh_askpass_child_setup (gpointer askpass); + +G_END_DECLS + +#endif /* __GCR_SSH_ASKPASS_H__ */ diff --git a/gcr/gcr-subject-public-key.c b/gcr/gcr-subject-public-key.c new file mode 100644 index 0000000..1621d95 --- /dev/null +++ b/gcr/gcr-subject-public-key.c @@ -0,0 +1,1104 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ +#include "config.h" + +#include "gcr-subject-public-key.h" +#include "gcr-types.h" + +#include "gcr/gcr-oids.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-error.h" + +#include + +#include + +static gboolean +check_object_basics (GckBuilder *builder, + gulong *klass, + gulong *type) +{ + g_assert (klass != NULL); + g_assert (type != NULL); + + if (!gck_builder_find_ulong (builder, CKA_CLASS, klass)) + return FALSE; + + if (*klass == CKO_PUBLIC_KEY || *klass == CKO_PRIVATE_KEY) + return gck_builder_find_ulong (builder, CKA_KEY_TYPE, type); + + else if (*klass == CKO_CERTIFICATE) + return gck_builder_find_ulong (builder, CKA_CERTIFICATE_TYPE, type); + + *type = GCK_INVALID; + return FALSE; +} + +static gboolean +load_object_basics (GckObject *object, + GckBuilder *builder, + GCancellable *cancellable, + gulong *klass, + gulong *type, + GError **lerror) +{ + gulong attr_types[] = { CKA_CLASS, CKA_KEY_TYPE, CKA_CERTIFICATE_TYPE }; + GckAttributes *attrs; + GError *error = NULL; + + g_assert (klass != NULL); + g_assert (type != NULL); + + if (check_object_basics (builder, klass, type)) { + g_debug ("already loaded: class = %lu, type = %lu", *klass, *type); + return TRUE; + } + + attrs = gck_object_cache_lookup (object, attr_types, G_N_ELEMENTS (attr_types), + cancellable, &error); + if (error != NULL) { + g_debug ("couldn't load: %s", error->message); + g_propagate_error (lerror, error); + return FALSE; + } + + gck_builder_set_all (builder, attrs); + gck_attributes_unref (attrs); + + if (!check_object_basics (builder, klass, type)) + return FALSE; + + g_debug ("loaded: class = %lu, type = %lu", *klass, *type); + return TRUE; +} + +static gboolean +check_x509_attributes (GckBuilder *builder) +{ + const GckAttribute *value = gck_builder_find (builder, CKA_VALUE); + return (value && !gck_attribute_is_invalid (value)); +} + +static gboolean +load_x509_attributes (GckObject *object, + GckBuilder *builder, + GCancellable *cancellable, + GError **lerror) +{ + gulong attr_types[] = { CKA_VALUE }; + GckAttributes *attrs; + GError *error = NULL; + + if (check_x509_attributes (builder)) { + g_debug ("already loaded"); + return TRUE; + } + + attrs = gck_object_cache_lookup (object, attr_types, G_N_ELEMENTS (attr_types), + cancellable, &error); + if (error != NULL) { + g_debug ("couldn't load: %s", error->message); + g_propagate_error (lerror, error); + return FALSE; + } + + gck_builder_set_all (builder, attrs); + gck_attributes_unref (attrs); + + return check_x509_attributes (builder); +} + +static gboolean +check_rsa_attributes (GckBuilder *builder) +{ + const GckAttribute *modulus; + const GckAttribute *exponent; + + modulus = gck_builder_find (builder, CKA_MODULUS); + exponent = gck_builder_find (builder, CKA_PUBLIC_EXPONENT); + + return (modulus && !gck_attribute_is_invalid (modulus) && + exponent && !gck_attribute_is_invalid (exponent)); +} + +static gboolean +load_rsa_attributes (GckObject *object, + GckBuilder *builder, + GCancellable *cancellable, + GError **lerror) +{ + gulong attr_types[] = { CKA_MODULUS, CKA_PUBLIC_EXPONENT }; + GckAttributes *attrs; + GError *error = NULL; + + if (check_rsa_attributes (builder)) { + g_debug ("rsa attributes already loaded"); + return TRUE; + } + + attrs = gck_object_cache_lookup (object, attr_types, G_N_ELEMENTS (attr_types), + cancellable, &error); + if (error != NULL) { + g_debug ("couldn't load rsa attributes: %s", error->message); + g_propagate_error (lerror, error); + return FALSE; + } + + gck_builder_set_all (builder, attrs); + gck_attributes_unref (attrs); + + return check_rsa_attributes (builder); +} + +static GckObject * +lookup_public_key (GckObject *object, + GCancellable *cancellable, + GError **lerror) +{ + GckBuilder builder = GCK_BUILDER_INIT; + gulong attr_types[] = { CKA_ID }; + GckAttributes *attrs; + GError *error = NULL; + GckSession *session; + GckObject *result; + const GckAttribute *id; + GList *objects; + + attrs = gck_object_cache_lookup (object, attr_types, G_N_ELEMENTS (attr_types), + cancellable, &error); + if (error != NULL) { + g_debug ("couldn't load private key id: %s", error->message); + g_propagate_error (lerror, error); + return NULL; + } + + id = gck_attributes_find (attrs, CKA_ID); + if (id == NULL || gck_attribute_is_invalid (id)) { + gck_attributes_unref (attrs); + g_debug ("couldn't load private key id"); + g_set_error_literal (lerror, GCK_ERROR, CKR_ATTRIBUTE_TYPE_INVALID, + gck_message_from_rv (CKR_ATTRIBUTE_TYPE_INVALID)); + return NULL; + } + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); + gck_builder_add_attribute (&builder, id); + gck_attributes_unref (attrs); + + session = gck_object_get_session (object); + objects = gck_session_find_objects (session, gck_builder_end (&builder), cancellable, &error); + g_object_unref (session); + + if (error != NULL) { + g_debug ("couldn't lookup public key: %s", error->message); + g_propagate_error (lerror, error); + return NULL; + } + + if (!objects) + return NULL; + + result = g_object_ref (objects->data); + gck_list_unref_free (objects); + + return result; +} + +static gboolean +check_dsa_attributes (GckBuilder *builder) +{ + const GckAttribute *prime; + const GckAttribute *subprime; + const GckAttribute *base; + const GckAttribute *value; + + prime = gck_builder_find (builder, CKA_PRIME); + subprime = gck_builder_find (builder, CKA_SUBPRIME); + base = gck_builder_find (builder, CKA_BASE); + value = gck_builder_find (builder, CKA_VALUE); + + return (prime && !gck_attribute_is_invalid (prime) && + subprime && !gck_attribute_is_invalid (subprime) && + base && !gck_attribute_is_invalid (base) && + value && !gck_attribute_is_invalid (value)); +} + +static gboolean +load_dsa_attributes (GckObject *object, + GckBuilder *builder, + GCancellable *cancellable, + GError **lerror) +{ + gulong attr_types[] = { CKA_PRIME, CKA_SUBPRIME, CKA_BASE, CKA_VALUE }; + GError *error = NULL; + GckAttributes *loaded; + GckObject *publi; + gulong klass; + + if (check_dsa_attributes (builder)) + return TRUE; + + if (!gck_builder_find_ulong (builder, CKA_CLASS, &klass)) + g_return_val_if_reached (FALSE); + + /* If it's a private key, find the public one */ + if (klass == CKO_PRIVATE_KEY) + publi = lookup_public_key (object, cancellable, lerror); + + else + publi = g_object_ref (object); + + if (!publi) + return FALSE; + + loaded = gck_object_cache_lookup (publi, attr_types, G_N_ELEMENTS (attr_types), + cancellable, &error); + g_object_unref (publi); + + if (error != NULL) { + g_debug ("couldn't load rsa attributes: %s", error->message); + g_propagate_error (lerror, error); + return FALSE; + } + + /* We've made sure to load info from the public key, so change class */ + gck_builder_set_ulong (builder, CKA_CLASS, CKO_PUBLIC_KEY); + + gck_builder_set_all (builder, loaded); + gck_attributes_unref (loaded); + + return check_dsa_attributes (builder); +} + +static gboolean +check_ec_attributes (GckBuilder *builder) +{ + const GckAttribute *ec_params; + const GckAttribute *ec_point; + + ec_params = gck_builder_find (builder, CKA_EC_PARAMS); + ec_point = gck_builder_find (builder, CKA_EC_POINT); + + return (ec_params && !gck_attribute_is_invalid (ec_params) && + ec_point && !gck_attribute_is_invalid (ec_point)); +} + + +static gboolean +load_ec_attributes (GckObject *object, + GckBuilder *builder, + GCancellable *cancellable, + GError **lerror) +{ + gulong attr_types[] = { CKA_EC_PARAMS, CKA_EC_POINT }; + GckAttributes *attrs; + GError *error = NULL; + GckObject *publi; + gulong klass; + + if (check_ec_attributes (builder)) { + g_debug ("ec attributes already loaded"); + return TRUE; + } + + if (!gck_builder_find_ulong (builder, CKA_CLASS, &klass)) + g_return_val_if_reached (FALSE); + + /* If it's a private key, find the public one */ + if (klass == CKO_PRIVATE_KEY) + publi = lookup_public_key (object, cancellable, lerror); + + else + publi = g_object_ref (object); + + if (!publi) + return FALSE; + + attrs = gck_object_cache_lookup (publi, attr_types, G_N_ELEMENTS (attr_types), + cancellable, &error); + g_object_unref (publi); + + if (error != NULL) { + g_debug ("couldn't load ec attributes: %s", error->message); + g_propagate_error (lerror, error); + return FALSE; + } + + gck_builder_set_all (builder, attrs); + gck_attributes_unref (attrs); + + return check_ec_attributes (builder); +} + +static gboolean +load_attributes (GckObject *object, + GckBuilder *builder, + GCancellable *cancellable, + GError **lerror) +{ + gboolean ret = FALSE; + gulong klass; + gulong type; + + if (!load_object_basics (object, builder, cancellable, + &klass, &type, lerror)) + return FALSE; + + switch (klass) { + + case CKO_CERTIFICATE: + switch (type) { + case CKC_X_509: + ret = load_x509_attributes (object, builder, cancellable, lerror); + break; + default: + g_debug ("unsupported certificate type: %lu", type); + break; + } + break; + + case CKO_PUBLIC_KEY: + case CKO_PRIVATE_KEY: + switch (type) { + case CKK_RSA: + ret = load_rsa_attributes (object, builder, cancellable, lerror); + break; + case CKK_DSA: + ret = load_dsa_attributes (object, builder, cancellable, lerror); + break; + case CKK_EC: + ret = load_ec_attributes (object, builder, cancellable, lerror); + break; + default: + g_debug ("unsupported key type: %lu", type); + break; + } + break; + + default: + g_debug ("unsupported class: %lu", type); + break; + } + + if (ret == FALSE && lerror != NULL && *lerror == NULL) { + g_set_error_literal (lerror, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED, + _("Unrecognized or unavailable attributes for key")); + } + + return ret; +} + +static gboolean +check_attributes (GckBuilder *builder) +{ + gulong klass; + gulong type; + + if (!check_object_basics (builder, &klass, &type)) + return FALSE; + + switch (klass) { + + case CKO_CERTIFICATE: + switch (type) { + case CKC_X_509: + return check_x509_attributes (builder); + default: + return FALSE; + } + + case CKO_PUBLIC_KEY: + case CKO_PRIVATE_KEY: + switch (type) { + case CKK_RSA: + return check_rsa_attributes (builder); + case CKK_DSA: + return check_dsa_attributes (builder); + case CKK_EC: + return check_ec_attributes (builder); + default: + return FALSE; + } + + default: + return FALSE; + } +} + +static void +lookup_attributes (GckObject *object, + GckBuilder *builder) +{ + GckObjectCache *oakey; + GckAttributes *attrs; + + if (GCK_IS_OBJECT_CACHE (object)) { + oakey = GCK_OBJECT_CACHE (object); + attrs = gck_object_cache_get_attributes (oakey); + if (attrs != NULL) { + gck_builder_add_all (builder, attrs); + gck_attributes_unref (attrs); + } + } +} + +GNode * +_gcr_subject_public_key_load (GckObject *key, + GCancellable *cancellable, + GError **error) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attributes; + GNode *asn; + + g_return_val_if_fail (GCK_IS_OBJECT (key), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + lookup_attributes (key, &builder); + + if (!check_attributes (&builder)) { + if (!load_attributes (key, &builder, cancellable, error)) { + gck_builder_clear (&builder); + return NULL; + } + } + + attributes = gck_builder_end (&builder); + asn = _gcr_subject_public_key_for_attributes (attributes); + if (asn == NULL) { + g_set_error_literal (error, GCK_ERROR, CKR_TEMPLATE_INCONSISTENT, + _("Couldn’t build public key")); + } + + gck_attributes_unref (attributes); + return asn; +} + +typedef struct { + GckObject *object; + GckBuilder builder; +} LoadClosure; + +static void +load_closure_free (gpointer data) +{ + LoadClosure *closure = data; + g_object_unref (closure->object); + gck_builder_clear (&closure->builder); + g_slice_free (LoadClosure, closure); +} + +static void +thread_key_attributes (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + LoadClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GError *error = NULL; + + if (!load_attributes (closure->object, &closure->builder, cancellable, &error)) + g_simple_async_result_take_error (res, error); +} + +void +_gcr_subject_public_key_load_async (GckObject *key, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + LoadClosure *closure; + + g_return_if_fail (GCK_IS_OBJECT (key)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + res = g_simple_async_result_new (NULL, callback, user_data, + _gcr_subject_public_key_load_async); + + closure = g_slice_new0 (LoadClosure); + closure->object = g_object_ref (key); + lookup_attributes (key, &closure->builder); + g_simple_async_result_set_op_res_gpointer (res, closure, load_closure_free); + + if (check_attributes (&closure->builder)) { + g_simple_async_result_complete_in_idle (res); + g_object_unref (res); + return; + } + + g_simple_async_result_run_in_thread (res, thread_key_attributes, + G_PRIORITY_DEFAULT, cancellable); + g_object_unref (res); +} + +GNode * +_gcr_subject_public_key_load_finish (GAsyncResult *result, + GError **error) +{ + GckAttributes *attributes; + GSimpleAsyncResult *res; + LoadClosure *closure; + GNode *asn; + + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, + _gcr_subject_public_key_load_async), NULL); + + res = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (res, error)) + return NULL; + + closure = g_simple_async_result_get_op_res_gpointer (res); + attributes = gck_attributes_ref_sink (gck_builder_end (&closure->builder)); + asn = _gcr_subject_public_key_for_attributes (attributes); + if (asn == NULL) { + g_set_error_literal (error, GCK_ERROR, CKR_TEMPLATE_INCONSISTENT, + _("Couldn’t build public key")); + } + + gck_attributes_unref (attributes); + return asn; +} + +static gboolean +rsa_subject_public_key_from_attributes (GckAttributes *attrs, + GNode *info_asn) +{ + const GckAttribute *modulus; + const GckAttribute *exponent; + GNode *key_asn; + GNode *params_asn; + GBytes *key; + GBytes *usg; + + modulus = gck_attributes_find (attrs, CKA_MODULUS); + exponent = gck_attributes_find (attrs, CKA_PUBLIC_EXPONENT); + if (modulus == NULL || gck_attribute_is_invalid (modulus) || + exponent == NULL || gck_attribute_is_invalid (exponent)) + return FALSE; + + key_asn = egg_asn1x_create (pk_asn1_tab, "RSAPublicKey"); + g_return_val_if_fail (key_asn, FALSE); + + params_asn = egg_asn1x_create (pk_asn1_tab, "RSAParameters"); + g_return_val_if_fail (params_asn, FALSE); + + usg = g_bytes_new_with_free_func (modulus->value, modulus->length, + gck_attributes_unref, + gck_attributes_ref (attrs)); + egg_asn1x_set_integer_as_usg (egg_asn1x_node (key_asn, "modulus", NULL), usg); + g_bytes_unref (usg); + + usg = g_bytes_new_with_free_func (exponent->value, exponent->length, + gck_attributes_unref, + gck_attributes_ref (attrs)); + egg_asn1x_set_integer_as_usg (egg_asn1x_node (key_asn, "publicExponent", NULL), usg); + g_bytes_unref (usg); + + key = egg_asn1x_encode (key_asn, NULL); + egg_asn1x_destroy (key_asn); + + egg_asn1x_set_null (params_asn); + + egg_asn1x_set_bits_as_raw (egg_asn1x_node (info_asn, "subjectPublicKey", NULL), + key, g_bytes_get_size (key) * 8); + + egg_asn1x_set_oid_as_quark (egg_asn1x_node (info_asn, "algorithm", "algorithm", NULL), GCR_OID_PKIX1_RSA); + egg_asn1x_set_any_from (egg_asn1x_node (info_asn, "algorithm", "parameters", NULL), params_asn); + + egg_asn1x_destroy (params_asn); + g_bytes_unref (key); + return TRUE; +} + +static gboolean +dsa_subject_public_key_from_private (GNode *key_asn, + const GckAttribute *ap, + const GckAttribute *aq, + const GckAttribute *ag, + const GckAttribute *ax) +{ + gcry_mpi_t mp, mq, mg, mx, my; + size_t n_buffer; + gcry_error_t gcry; + unsigned char *buffer; + + gcry = gcry_mpi_scan (&mp, GCRYMPI_FMT_USG, ap->value, ap->length, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + + gcry = gcry_mpi_scan (&mq, GCRYMPI_FMT_USG, aq->value, aq->length, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + + gcry = gcry_mpi_scan (&mg, GCRYMPI_FMT_USG, ag->value, ag->length, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + + gcry = gcry_mpi_scan (&mx, GCRYMPI_FMT_USG, ax->value, ax->length, NULL); + g_return_val_if_fail (gcry == 0, FALSE); + + /* Calculate the public part from the private */ + my = gcry_mpi_snew (gcry_mpi_get_nbits (mx)); + g_return_val_if_fail (my, FALSE); + gcry_mpi_powm (my, mg, mx, mp); + + gcry = gcry_mpi_aprint (GCRYMPI_FMT_STD, &buffer, &n_buffer, my); + g_return_val_if_fail (gcry == 0, FALSE); + egg_asn1x_take_integer_as_raw (key_asn, g_bytes_new_with_free_func (buffer, n_buffer, + gcry_free, buffer)); + + gcry_mpi_release (mp); + gcry_mpi_release (mq); + gcry_mpi_release (mg); + gcry_mpi_release (mx); + gcry_mpi_release (my); + + return TRUE; +} + +static gboolean +dsa_subject_public_key_from_attributes (GckAttributes *attrs, + gulong klass, + GNode *info_asn) +{ + const GckAttribute *value, *g, *q, *p; + GNode *key_asn, *params_asn; + GBytes *key; + + p = gck_attributes_find (attrs, CKA_PRIME); + q = gck_attributes_find (attrs, CKA_SUBPRIME); + g = gck_attributes_find (attrs, CKA_BASE); + value = gck_attributes_find (attrs, CKA_VALUE); + + if (p == NULL || gck_attribute_is_invalid (p) || + q == NULL || gck_attribute_is_invalid (q) || + g == NULL || gck_attribute_is_invalid (g) || + value == NULL || gck_attribute_is_invalid (value)) + return FALSE; + + key_asn = egg_asn1x_create (pk_asn1_tab, "DSAPublicPart"); + g_return_val_if_fail (key_asn, FALSE); + + params_asn = egg_asn1x_create (pk_asn1_tab, "DSAParameters"); + g_return_val_if_fail (params_asn, FALSE); + + egg_asn1x_take_integer_as_usg (egg_asn1x_node (params_asn, "p", NULL), + g_bytes_new_with_free_func (p->value, p->length, + gck_attributes_unref, + gck_attributes_ref (attrs))); + egg_asn1x_take_integer_as_usg (egg_asn1x_node (params_asn, "q", NULL), + g_bytes_new_with_free_func (q->value, q->length, + gck_attributes_unref, + gck_attributes_ref (attrs))); + egg_asn1x_take_integer_as_usg (egg_asn1x_node (params_asn, "g", NULL), + g_bytes_new_with_free_func (g->value, g->length, + gck_attributes_unref, + gck_attributes_ref (attrs))); + + /* Are these attributes for a public or private key? */ + if (klass == CKO_PRIVATE_KEY) { + + /* We need to calculate the public from the private key */ + if (!dsa_subject_public_key_from_private (key_asn, p, q, g, value)) + g_return_val_if_reached (FALSE); + + } else if (klass == CKO_PUBLIC_KEY) { + egg_asn1x_take_integer_as_usg (key_asn, + g_bytes_new_with_free_func (value->value, value->length, + gck_attributes_unref, + gck_attributes_ref (attrs))); + } else { + g_assert_not_reached (); + } + + key = egg_asn1x_encode (key_asn, NULL); + egg_asn1x_destroy (key_asn); + + egg_asn1x_set_bits_as_raw (egg_asn1x_node (info_asn, "subjectPublicKey", NULL), + key, g_bytes_get_size (key) * 8); + egg_asn1x_set_any_from (egg_asn1x_node (info_asn, "algorithm", "parameters", NULL), params_asn); + + egg_asn1x_set_oid_as_quark (egg_asn1x_node (info_asn, "algorithm", "algorithm", NULL), GCR_OID_PKIX1_DSA); + + g_bytes_unref (key); + egg_asn1x_destroy (params_asn); + return TRUE; +} + +static gboolean +ec_subject_public_key_from_attributes (GckAttributes *attrs, + gulong klass, + GNode *info_asn) +{ + const GckAttribute *ec_params, *ec_point; + GNode *params_asn, *point_asn; + GBytes *bytes, *key_bytes; + + ec_params = gck_attributes_find (attrs, CKA_EC_PARAMS); + ec_point = gck_attributes_find (attrs, CKA_EC_POINT); + + if (ec_params == NULL || gck_attribute_is_invalid (ec_params) || + ec_point == NULL || gck_attribute_is_invalid (ec_point)) + return FALSE; + + bytes = g_bytes_new_with_free_func (ec_params->value, ec_params->length, + gck_attributes_unref, gck_attributes_ref (attrs)); + params_asn = egg_asn1x_create_and_decode (pk_asn1_tab, "ECParameters", bytes); + g_bytes_unref (bytes); + + if (params_asn == NULL) + return FALSE; + + bytes = g_bytes_new_with_free_func (ec_point->value, ec_point->length, + gck_attributes_unref, gck_attributes_ref (attrs)); + point_asn = egg_asn1x_create_and_decode (pk_asn1_tab, "ECPoint", bytes); + g_bytes_unref (bytes); + + if (point_asn == NULL) { + egg_asn1x_destroy (params_asn); + return FALSE; + } + key_bytes = egg_asn1x_get_string_as_bytes (point_asn); + egg_asn1x_destroy (point_asn); + if (key_bytes == NULL) { + egg_asn1x_destroy (params_asn); + return FALSE; + } + + egg_asn1x_set_bits_as_raw (egg_asn1x_node (info_asn, "subjectPublicKey", NULL), + key_bytes, g_bytes_get_size (key_bytes) * 8); + egg_asn1x_set_any_from (egg_asn1x_node (info_asn, "algorithm", "parameters", NULL), params_asn); + + egg_asn1x_set_oid_as_quark (egg_asn1x_node (info_asn, "algorithm", "algorithm", NULL), GCR_OID_PKIX1_EC); + + g_bytes_unref (key_bytes); + egg_asn1x_destroy (params_asn); + return TRUE; +} + +static GNode * +cert_subject_public_key_from_attributes (GckAttributes *attributes) +{ + const GckAttribute *attr; + GBytes *bytes; + GNode *cert; + GNode *asn; + + attr = gck_attributes_find (attributes, CKA_VALUE); + if (attr == NULL || gck_attribute_is_invalid (attr)) { + g_debug ("no value attribute for certificate"); + return NULL; + } + + bytes = g_bytes_new_with_free_func (attr->value, attr->length, + gck_attributes_unref, + gck_attributes_ref (attributes)); + cert = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes); + g_bytes_unref (bytes); + + if (cert == NULL) { + g_debug ("couldn't parse certificate value"); + return NULL; + } + + asn = egg_asn1x_node (cert, "tbsCertificate", "subjectPublicKeyInfo", NULL); + g_return_val_if_fail (asn != NULL, NULL); + + /* Remove the subject public key out of the certificate */ + g_node_unlink (asn); + egg_asn1x_destroy (cert); + + return asn; +} + +GNode * +_gcr_subject_public_key_for_attributes (GckAttributes *attributes) +{ + gboolean ret = FALSE; + gulong key_type; + gulong klass; + GNode *asn = NULL; + + if (!gck_attributes_find_ulong (attributes, CKA_CLASS, &klass)) { + g_debug ("no class in attributes"); + return NULL; + } + + if (klass == CKO_CERTIFICATE) { + return cert_subject_public_key_from_attributes (attributes); + + } else if (klass == CKO_PUBLIC_KEY || klass == CKO_PRIVATE_KEY) { + if (!gck_attributes_find_ulong (attributes, CKA_KEY_TYPE, &key_type)) { + g_debug ("no key type in attributes"); + return NULL; + } + + asn = egg_asn1x_create (pkix_asn1_tab, "SubjectPublicKeyInfo"); + g_return_val_if_fail (asn, NULL); + + if (key_type == CKK_RSA) { + ret = rsa_subject_public_key_from_attributes (attributes, asn); + + } else if (key_type == CKK_DSA) { + ret = dsa_subject_public_key_from_attributes (attributes, klass, asn); + + } else if (key_type == CKK_ECDSA) { + ret = ec_subject_public_key_from_attributes (attributes, klass, asn); + + } else { + g_debug ("unsupported key type: %lu", key_type); + ret = FALSE; + } + + + if (ret == FALSE) { + egg_asn1x_destroy (asn); + asn = NULL; + } + } + + return asn; +} + +static guint +calculate_rsa_key_size (GBytes *data) +{ + GNode *asn; + GBytes *content; + guint key_size; + + asn = egg_asn1x_create_and_decode (pk_asn1_tab, "RSAPublicKey", data); + g_return_val_if_fail (asn, 0); + + content = egg_asn1x_get_value_raw (egg_asn1x_node (asn, "modulus", NULL)); + if (!content) + g_return_val_if_reached (0); + + egg_asn1x_destroy (asn); + + /* Removes the complement */ + key_size = (g_bytes_get_size (content) / 2) * 2 * 8; + + g_bytes_unref (content); + return key_size; +} + +static guint +attributes_rsa_key_size (GckAttributes *attrs) +{ + const GckAttribute *attr; + gulong bits; + + attr = gck_attributes_find (attrs, CKA_MODULUS); + + /* Calculate the bit length, and remove the complement */ + if (attr != NULL) + return (attr->length / 2) * 2 * 8; + + if (gck_attributes_find_ulong (attrs, CKA_MODULUS_BITS, &bits)) + return (gint)bits; + + return 0; +} + +static guint +calculate_dsa_params_size (GNode *params) +{ + GNode *asn; + GBytes *content; + guint key_size; + + asn = egg_asn1x_get_any_as (params, pk_asn1_tab, "DSAParameters"); + g_return_val_if_fail (asn, 0); + + content = egg_asn1x_get_value_raw (egg_asn1x_node (asn, "p", NULL)); + if (!content) + g_return_val_if_reached (0); + + egg_asn1x_destroy (asn); + + /* Removes the complement */ + key_size = (g_bytes_get_size (content) / 2) * 2 * 8; + + g_bytes_unref (content); + return key_size; +} + +static guint +attributes_dsa_key_size (GckAttributes *attrs) +{ + const GckAttribute *attr; + gulong bits; + + attr = gck_attributes_find (attrs, CKA_PRIME); + + /* Calculate the bit length, and remove the complement */ + if (attr != NULL) + return (attr->length / 2) * 2 * 8; + + if (gck_attributes_find_ulong (attrs, CKA_PRIME_BITS, &bits)) + return (gint)bits; + + return 0; +} + +static guint +named_curve_size (GNode *params) +{ + GQuark oid; + guint size; + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (params, "namedCurve", NULL)); + if (oid == GCR_OID_EC_SECP192R1) + size = 192; + else if (oid == GCR_OID_EC_SECT163K1) + size = 163; + else if (oid == GCR_OID_EC_SECT163R2) + size = 163; + else if (oid == GCR_OID_EC_SECP224R1) + size = 224; + else if (oid == GCR_OID_EC_SECT233K1) + size = 233; + else if (oid == GCR_OID_EC_SECT233R1) + size = 233; + else if (oid == GCR_OID_EC_SECP256R1) + size = 256; + else if (oid == GCR_OID_EC_SECT283K1) + size = 283; + else if (oid == GCR_OID_EC_SECT283R1) + size = 283; + else if (oid == GCR_OID_EC_SECP384R1) + size = 384; + else if (oid == GCR_OID_EC_SECT409K1) + size = 409; + else if (oid == GCR_OID_EC_SECT409R1) + size = 409; + else if (oid == GCR_OID_EC_SECP521R1) + size = 521; + else if (oid == GCR_OID_EC_SECP571K1) + size = 571; + else if (oid == GCR_OID_EC_SECT571R1) + size = 571; + else + size = 0; + return size; + +} + +static guint +calculate_ec_params_size (GNode *params) +{ + GNode *asn; + guint size; + + asn = egg_asn1x_get_any_as (params, pk_asn1_tab, "ECParameters"); + g_return_val_if_fail (asn, 0); + + size = named_curve_size (asn); + egg_asn1x_destroy (asn); + + return size; +} + +static guint +attributes_ec_params_size (GckAttributes *attrs) +{ + GNode *asn; + const GckAttribute *attr; + GBytes *bytes; + guint size = 0; + + attr = gck_attributes_find (attrs, CKA_EC_PARAMS); + + /* Calculate the bit length, and remove the complement */ + if (attr && !gck_attribute_is_invalid (attr)) { + bytes = g_bytes_new_with_free_func (attr->value, attr->length, + gck_attributes_unref, + gck_attributes_ref (attrs)); + asn = egg_asn1x_create_and_decode (pk_asn1_tab, "ECParameters", bytes); + g_bytes_unref (bytes); + + if (asn) + size = named_curve_size (asn); + egg_asn1x_destroy (asn); + } + + return size; +} + +guint +_gcr_subject_public_key_calculate_size (GNode *subject_public_key) +{ + GBytes *key; + GNode *params; + guint key_size = 0; + guint n_bits; + GQuark oid; + + /* Figure out the algorithm */ + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key, + "algorithm", "algorithm", NULL)); + g_return_val_if_fail (oid != 0, 0); + + /* RSA keys are stored in the main subjectPublicKey field */ + if (oid == GCR_OID_PKIX1_RSA) { + key = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &n_bits); + g_return_val_if_fail (key != NULL, 0); + key_size = calculate_rsa_key_size (key); + g_bytes_unref (key); + + /* The DSA key size is discovered by the prime in params */ + } else if (oid == GCR_OID_PKIX1_DSA) { + params = egg_asn1x_node (subject_public_key, "algorithm", "parameters", NULL); + key_size = calculate_dsa_params_size (params); + + } else if (oid == GCR_OID_PKIX1_EC) { + params = egg_asn1x_node (subject_public_key, "algorithm", "parameters", NULL); + key_size = calculate_ec_params_size (params); + + } else { + g_message ("unsupported key algorithm: %s", g_quark_to_string (oid)); + } + + return key_size; +} + +guint +_gcr_subject_public_key_attributes_size (GckAttributes *attrs) +{ + gulong key_type; + + if (!gck_attributes_find_ulong (attrs, CKA_KEY_TYPE, &key_type)) + return 0; + + switch (key_type) { + case CKK_RSA: + return attributes_rsa_key_size (attrs); + case CKK_DSA: + return attributes_dsa_key_size (attrs); + case CKK_EC: + return attributes_ec_params_size (attrs); + default: + g_message ("unsupported key algorithm: %lu", key_type); + return 0; + } +} diff --git a/gcr/gcr-subject-public-key.h b/gcr/gcr-subject-public-key.h new file mode 100644 index 0000000..9e7c1d9 --- /dev/null +++ b/gcr/gcr-subject-public-key.h @@ -0,0 +1,55 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_SUBJECT_PUBLIC_KEY_H +#define GCR_SUBJECT_PUBLIC_KEY_H + +#include + +#include + +G_BEGIN_DECLS + +GNode * _gcr_subject_public_key_for_attributes (GckAttributes *attributes); + +GNode * _gcr_subject_public_key_load (GckObject *key, + GCancellable *cancellable, + GError **error); + +void _gcr_subject_public_key_load_async (GckObject *key, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GNode * _gcr_subject_public_key_load_finish (GAsyncResult *result, + GError **error); + +guint _gcr_subject_public_key_calculate_size (GNode *subject_public_key); + +guint _gcr_subject_public_key_attributes_size (GckAttributes *attributes); + +G_END_DECLS + +#endif /* GCR_CERTIFICATE_H */ diff --git a/gcr/gcr-system-prompt.c b/gcr/gcr-system-prompt.c new file mode 100644 index 0000000..d45efd8 --- /dev/null +++ b/gcr/gcr-system-prompt.c @@ -0,0 +1,1651 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-dbus-constants.h" +#include "gcr-internal.h" +#include "gcr-library.h" +#include "gcr-prompt.h" +#include "gcr-secret-exchange.h" +#include "gcr-system-prompt.h" + +#include "gcr/gcr-dbus-generated.h" + +#include "egg/egg-error.h" + +#include + +/** + * SECTION:gcr-system-prompt + * @title: GcrSystemPrompt + * @short_description: a system modal prompt + * + * A #GcrPrompt implementation which calls to the system prompter to + * display prompts in a system modal fashion. + * + * Since the system prompter usually only displays one prompt at a time, you + * may have to wait for the prompt to be displayed. Use gcr_system_prompt_open() + * or a related function to open a prompt. Since this can take a long time, you + * should always check that the prompt is still needed after it is opened. A + * previous prompt may have already provided the information needed and you + * may no longer need to prompt. + * + * Use gcr_system_prompt_close() to close the prompt when you're done with it. + */ + +/** + * GcrSystemPrompt: + * + * A #GcrPrompt which shows a system prompt. This is usually a system modal + * dialog. + */ + +/** + * GcrSystemPromptClass: + * @parent_class: parent class + * + * The class for #GcrSystemPrompt. + */ + +/** + * GCR_SYSTEM_PROMPT_ERROR: + * + * The domain for errors returned from GcrSystemPrompt methods. + */ + +/** + * GcrSystemPromptError: + * @GCR_SYSTEM_PROMPT_IN_PROGRESS: another prompt is already in progress + * + * No error returned by the #GcrSystemPrompt is suitable for display or + * to the user. + * + * If the system prompter can only show one prompt at a time, and there is + * already a prompt being displayed, and the timeout waiting to open the + * prompt expires, then %GCR_SYSTEM_PROMPT_IN_PROGRESS is returned. + */ + +enum { + PROP_0, + PROP_BUS_NAME, + PROP_SECRET_EXCHANGE, + PROP_TIMEOUT_SECONDS, + + PROP_TITLE, + PROP_MESSAGE, + PROP_DESCRIPTION, + PROP_WARNING, + PROP_PASSWORD_NEW, + PROP_PASSWORD_STRENGTH, + PROP_CHOICE_LABEL, + PROP_CHOICE_CHOSEN, + PROP_CALLER_WINDOW, + PROP_CONTINUE_LABEL, + PROP_CANCEL_LABEL +}; + +struct _GcrSystemPromptPrivate { + gchar *prompter_bus_name; + GcrSecretExchange *exchange; + gboolean received; + GHashTable *properties; + GHashTable *dirty_properties; + gint timeout_seconds; + + GDBusConnection *connection; + gboolean begun_prompting; + gboolean closed; + guint prompt_registered; + gchar *prompt_path; + gchar *prompt_owner; + + GSimpleAsyncResult *pending; + gchar *last_response; +}; + +static void gcr_system_prompt_prompt_iface (GcrPromptIface *iface); + +static void gcr_system_prompt_initable_iface (GInitableIface *iface); + +static void gcr_system_prompt_async_initable_iface (GAsyncInitableIface *iface); + +static void perform_init_async (GcrSystemPrompt *self, + GSimpleAsyncResult *res); + +G_DEFINE_TYPE_WITH_CODE (GcrSystemPrompt, gcr_system_prompt, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_system_prompt_prompt_iface); + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, gcr_system_prompt_initable_iface); + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, gcr_system_prompt_async_initable_iface); +); + +static gint unique_prompt_id = 0; + +typedef struct { + GSource *timeout; + GSource *waiting; + GMainContext *context; + GCancellable *cancellable; + guint watch_id; +} CallClosure; + +static void +call_closure_free (gpointer data) +{ + CallClosure *closure = data; + if (closure->timeout) { + g_source_destroy (closure->timeout); + g_source_unref (closure->timeout); + } + if (closure->waiting) { + g_source_destroy (closure->waiting); + g_source_unref (closure->waiting); + } + if (closure->watch_id) + g_bus_unwatch_name (closure->watch_id); + g_object_unref (closure->cancellable); + g_free (data); +} + +static void +on_propagate_cancelled (GCancellable *cancellable, + gpointer user_data) +{ + /* Propagate the cancelled signal */ + GCancellable *cancel = G_CANCELLABLE (user_data); + g_cancellable_cancel (cancel); +} + +static CallClosure * +call_closure_new (GCancellable *cancellable) +{ + CallClosure *call; + + /* + * We use our own cancellable object, since we cancel it it in + * situations other than when the caller cancels. + */ + + call = g_new0 (CallClosure, 1); + call->cancellable = g_cancellable_new (); + + if (cancellable) { + g_cancellable_connect (cancellable, G_CALLBACK (on_propagate_cancelled), + g_object_ref (call->cancellable), g_object_unref); + } + + return call; +} + +static void +gcr_system_prompt_init (GcrSystemPrompt *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_SYSTEM_PROMPT, + GcrSystemPromptPrivate); + + self->pv->timeout_seconds = -1; + self->pv->properties = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, (GDestroyNotify)g_variant_unref); + self->pv->dirty_properties = g_hash_table_new (g_direct_hash, g_direct_equal); +} + +static const gchar * +prompt_get_string_property (GcrSystemPrompt *self, + const gchar *property_name, + gboolean collapse_empty_to_null) +{ + const gchar *value = NULL; + GVariant *variant; + gconstpointer key; + + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPT (self), NULL); + + key = g_intern_string (property_name); + variant = g_hash_table_lookup (self->pv->properties, key); + if (variant != NULL) { + value = g_variant_get_string (variant, NULL); + if (collapse_empty_to_null && value != NULL && value[0] == '\0') + value = NULL; + } + + return value; +} + +static void +prompt_set_string_property (GcrSystemPrompt *self, + const gchar *property_name, + const gchar *value) +{ + GVariant *variant; + gpointer key; + + g_return_if_fail (GCR_IS_SYSTEM_PROMPT (self)); + + key = (gpointer)g_intern_string (property_name); + variant = g_variant_ref_sink (g_variant_new_string (value ? value : "")); + g_hash_table_insert (self->pv->properties, key, variant); + g_hash_table_insert (self->pv->dirty_properties, key, key); + g_object_notify (G_OBJECT (self), property_name); +} + +static gint +prompt_get_int_property (GcrSystemPrompt *self, + const gchar *property_name) +{ + GVariant *variant; + gconstpointer key; + + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPT (self), 0); + + key = g_intern_string (property_name); + variant = g_hash_table_lookup (self->pv->properties, key); + if (variant != NULL) + return g_variant_get_int32 (variant); + + return 0; +} + +static gboolean +prompt_get_boolean_property (GcrSystemPrompt *self, + const gchar *property_name) +{ + GVariant *variant; + gconstpointer key; + + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPT (self), FALSE); + + key = g_intern_string (property_name); + variant = g_hash_table_lookup (self->pv->properties, key); + if (variant != NULL) + return g_variant_get_boolean (variant); + + return FALSE; +} + +static void +prompt_set_boolean_property (GcrSystemPrompt *self, + const gchar *property_name, + gboolean value) +{ + GVariant *variant; + gpointer key; + + g_return_if_fail (GCR_IS_SYSTEM_PROMPT (self)); + + key = (gpointer)g_intern_string (property_name); + variant = g_variant_ref_sink (g_variant_new_boolean (value)); + g_hash_table_insert (self->pv->properties, key, variant); + g_hash_table_insert (self->pv->dirty_properties, key, key); + g_object_notify (G_OBJECT (self), property_name); +} + +static void +gcr_system_prompt_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (obj); + + switch (prop_id) { + case PROP_BUS_NAME: + g_assert (self->pv->prompter_bus_name == NULL); + self->pv->prompter_bus_name = g_value_dup_string (value); + break; + case PROP_SECRET_EXCHANGE: + if (self->pv->exchange) { + g_warning ("The secret exchange is already in use, and cannot be changed"); + return; + } + self->pv->exchange = g_value_dup_object (value); + g_object_notify (G_OBJECT (self), "secret-exchange"); + break; + case PROP_TIMEOUT_SECONDS: + self->pv->timeout_seconds = g_value_get_int (value); + break; + case PROP_TITLE: + prompt_set_string_property (self, "title", g_value_get_string (value)); + break; + case PROP_MESSAGE: + prompt_set_string_property (self, "message", g_value_get_string (value)); + break; + case PROP_DESCRIPTION: + prompt_set_string_property (self, "description", g_value_get_string (value)); + break; + case PROP_WARNING: + prompt_set_string_property (self, "warning", g_value_get_string (value)); + break; + case PROP_PASSWORD_NEW: + prompt_set_boolean_property (self, "password-new", g_value_get_boolean (value)); + break; + case PROP_CHOICE_LABEL: + prompt_set_string_property (self, "choice-label", g_value_get_string (value)); + break; + case PROP_CHOICE_CHOSEN: + prompt_set_boolean_property (self, "choice-chosen", g_value_get_boolean (value)); + break; + case PROP_CALLER_WINDOW: + prompt_set_string_property (self, "caller-window", g_value_get_string (value)); + break; + case PROP_CONTINUE_LABEL: + prompt_set_string_property (self, "continue-label", g_value_get_string (value)); + break; + case PROP_CANCEL_LABEL: + prompt_set_string_property (self, "cancel-label", g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_system_prompt_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (obj); + + switch (prop_id) { + case PROP_BUS_NAME: + g_value_set_string (value, self->pv->prompter_bus_name); + break; + case PROP_SECRET_EXCHANGE: + g_value_set_object (value, gcr_system_prompt_get_secret_exchange (self)); + break; + case PROP_TITLE: + g_value_set_string (value, prompt_get_string_property (self, "title", FALSE)); + break; + case PROP_MESSAGE: + g_value_set_string (value, prompt_get_string_property (self, "message", FALSE)); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, prompt_get_string_property (self, "description", FALSE)); + break; + case PROP_WARNING: + g_value_set_string (value, prompt_get_string_property (self, "warning", TRUE)); + break; + case PROP_PASSWORD_NEW: + g_value_set_boolean (value, prompt_get_boolean_property (self, "password-new")); + break; + case PROP_PASSWORD_STRENGTH: + g_value_set_int (value, prompt_get_int_property (self, "password-strength")); + break; + case PROP_CHOICE_LABEL: + g_value_set_string (value, prompt_get_string_property (self, "choice-label", TRUE)); + break; + case PROP_CHOICE_CHOSEN: + g_value_set_boolean (value, prompt_get_boolean_property (self, "choice-chosen")); + break; + case PROP_CALLER_WINDOW: + g_value_set_string (value, prompt_get_string_property (self, "caller-window", TRUE)); + break; + case PROP_CONTINUE_LABEL: + g_value_set_string (value, prompt_get_string_property (self, "continue-label", TRUE)); + break; + case PROP_CANCEL_LABEL: + g_value_set_string (value, prompt_get_string_property (self, "cancel-label", TRUE)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_system_prompt_constructed (GObject *obj) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (obj); + gint seed; + + G_OBJECT_CLASS (gcr_system_prompt_parent_class)->constructed (obj); + + seed = g_atomic_int_add (&unique_prompt_id, 1); + + self->pv->prompt_path = g_strdup_printf ("%s/p%d", GCR_DBUS_PROMPT_OBJECT_PREFIX, seed); + + if (self->pv->prompter_bus_name == NULL) + self->pv->prompter_bus_name = g_strdup (GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME); +} + +static void +on_prompter_stop_prompting (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *async = NULL; + GError *error = NULL; + GVariant *retval; + + retval = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error); + if (error != NULL) { + g_debug ("failed to stop prompting: %s", egg_error_message (error)); + g_clear_error (&error); + } + + if (retval) + g_variant_unref (retval); + + if (user_data) { + async = G_SIMPLE_ASYNC_RESULT (user_data); + g_simple_async_result_complete (async); + g_object_unref (async); + } +} + +static void +perform_close (GcrSystemPrompt *self, + GSimpleAsyncResult *async, + GCancellable *cancellable) +{ + GSimpleAsyncResult *res; + CallClosure *closure; + gboolean called = FALSE; + gboolean closed; + + closed = self->pv->closed; + self->pv->closed = TRUE; + + if (!closed) + g_debug ("closing prompt"); + + if (self->pv->pending) { + res = g_object_ref (self->pv->pending); + g_clear_object (&self->pv->pending); + closure = g_simple_async_result_get_op_res_gpointer (res); + g_cancellable_cancel (closure->cancellable); + g_simple_async_result_complete_in_idle (res); + g_object_unref (res); + } + + if (self->pv->prompt_registered) { + g_dbus_connection_unregister_object (self->pv->connection, + self->pv->prompt_registered); + self->pv->prompt_registered = 0; + } + + if (self->pv->begun_prompting) { + if (self->pv->connection && self->pv->prompt_path && self->pv->prompt_owner) { + g_debug ("Calling the prompter %s method", GCR_DBUS_PROMPTER_METHOD_STOP); + g_dbus_connection_call (self->pv->connection, + self->pv->prompter_bus_name, + GCR_DBUS_PROMPTER_OBJECT_PATH, + GCR_DBUS_PROMPTER_INTERFACE, + GCR_DBUS_PROMPTER_METHOD_STOP, + g_variant_new ("(o)", self->pv->prompt_path), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, cancellable, + on_prompter_stop_prompting, + async ? g_object_ref (async) : NULL); + called = TRUE; + } + self->pv->begun_prompting = FALSE; + } + + g_free (self->pv->prompt_path); + self->pv->prompt_path = NULL; + + g_clear_object (&self->pv->connection); + + if (!called && async) + g_simple_async_result_complete_in_idle (async); + + /* Emit the signal if necessary, after closed */ + if (!closed) + gcr_prompt_close (GCR_PROMPT (self)); +} + +static void +gcr_system_prompt_dispose (GObject *obj) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (obj); + + g_clear_object (&self->pv->exchange); + perform_close (self, NULL, NULL); + + g_hash_table_remove_all (self->pv->properties); + g_hash_table_remove_all (self->pv->dirty_properties); + + G_OBJECT_CLASS (gcr_system_prompt_parent_class)->dispose (obj); +} + +static void +gcr_system_prompt_finalize (GObject *obj) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (obj); + + g_free (self->pv->prompter_bus_name); + g_free (self->pv->prompt_owner); + g_free (self->pv->last_response); + g_hash_table_destroy (self->pv->properties); + g_hash_table_destroy (self->pv->dirty_properties); + + G_OBJECT_CLASS (gcr_system_prompt_parent_class)->finalize (obj); +} + +static void +gcr_system_prompt_class_init (GcrSystemPromptClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructed = gcr_system_prompt_constructed; + gobject_class->get_property = gcr_system_prompt_get_property; + gobject_class->set_property = gcr_system_prompt_set_property; + gobject_class->dispose = gcr_system_prompt_dispose; + gobject_class->finalize = gcr_system_prompt_finalize; + + g_type_class_add_private (gobject_class, sizeof (GcrSystemPromptPrivate)); + + /** + * GcrSystemPrompt:bus-name: + * + * The DBus bus name of the prompter to use for prompting, or %NULL + * for the default prompter. + */ + g_object_class_install_property (gobject_class, PROP_BUS_NAME, + g_param_spec_string ("bus-name", "Bus name", "Prompter bus name", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GcrSystemPrompt:timeout-seconds: + * + * The timeout in seconds to wait when opening the prompt. + */ + g_object_class_install_property (gobject_class, PROP_TIMEOUT_SECONDS, + g_param_spec_int ("timeout-seconds", "Timeout seconds", "Timeout (in seconds) for opening prompt", + -1, G_MAXINT, -1, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GcrSystemPrompt:secret-exchange: + * + * The #GcrSecretExchange to use when transferring passwords. A default + * secret exchange will be used if this is not set. + */ + g_object_class_install_property (gobject_class, PROP_SECRET_EXCHANGE, + g_param_spec_object ("secret-exchange", "Secret exchange", "Secret exchange for passing passwords", + GCR_TYPE_SECRET_EXCHANGE, G_PARAM_READWRITE)); + + g_object_class_override_property (gobject_class, PROP_TITLE, "title"); + g_object_class_override_property (gobject_class, PROP_MESSAGE, "message"); + g_object_class_override_property (gobject_class, PROP_DESCRIPTION, "description"); + g_object_class_override_property (gobject_class, PROP_WARNING, "warning"); + g_object_class_override_property (gobject_class, PROP_PASSWORD_NEW, "password-new"); + g_object_class_override_property (gobject_class, PROP_PASSWORD_STRENGTH, "password-strength"); + g_object_class_override_property (gobject_class, PROP_CHOICE_LABEL, "choice-label"); + g_object_class_override_property (gobject_class, PROP_CHOICE_CHOSEN, "choice-chosen"); + g_object_class_override_property (gobject_class, PROP_CALLER_WINDOW, "caller-window"); + g_object_class_override_property (gobject_class, PROP_CONTINUE_LABEL, "continue-label"); + g_object_class_override_property (gobject_class, PROP_CANCEL_LABEL, "cancel-label"); +} + +/** + * gcr_system_prompt_get_secret_exchange: + * @self: a prompter + * + * Get the current #GcrSecretExchange used to transfer secrets in this prompt. + * + * Returns: (transfer none): the secret exchange + */ +GcrSecretExchange * +gcr_system_prompt_get_secret_exchange (GcrSystemPrompt *self) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPT (self), NULL); + + if (!self->pv->exchange) { + g_debug ("creating new secret exchange"); + self->pv->exchange = gcr_secret_exchange_new (NULL); + } + + return self->pv->exchange; +} + +static void +update_properties_from_iter (GcrSystemPrompt *self, + GVariantIter *iter) +{ + GObject *obj = G_OBJECT (self); + GVariant *variant; + GVariant *value; + GVariant *already; + gpointer key; + gchar *name; + + g_object_freeze_notify (obj); + while (g_variant_iter_loop (iter, "{sv}", &name, &variant)) { + key = (gpointer)g_intern_string (name); + value = g_variant_get_variant (variant); + already = g_hash_table_lookup (self->pv->properties, key); + if (!already || !g_variant_equal (already, value)) { + g_hash_table_replace (self->pv->properties, key, g_variant_ref (value)); + g_object_notify (obj, name); + } + g_variant_unref (value); + } + g_object_thaw_notify (obj); +} + +static void +prompt_method_ready (GcrSystemPrompt *self, + GDBusMethodInvocation *invocation, + GVariant *parameters) +{ + GcrSecretExchange *exchange; + GSimpleAsyncResult *res; + GVariantIter *iter; + gchar *received; + + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (self->pv->pending)); + + g_free (self->pv->last_response); + g_variant_get (parameters, "(sa{sv}s)", + &self->pv->last_response, + &iter, &received); + + g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); + + update_properties_from_iter (self, iter); + g_variant_iter_free (iter); + + exchange = gcr_system_prompt_get_secret_exchange (self); + if (gcr_secret_exchange_receive (exchange, received)) + self->pv->received = TRUE; + else + g_warning ("received invalid secret exchange string"); + g_free (received); + + res = g_object_ref (self->pv->pending); + g_clear_object (&self->pv->pending); + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +prompt_method_done (GcrSystemPrompt *self, + GDBusMethodInvocation *invocation, + GVariant *parameters) +{ + g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); + + /* + * At this point we're done prompting, and calling StopPrompting + * on the prompter is no longer necessary. It may have already been + * called, or the prompter may have stopped on its own accord. + */ + self->pv->begun_prompting = FALSE; + perform_close (self, NULL, NULL); +} + +static void +prompt_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (user_data); + + g_return_if_fail (method_name != NULL); + + if (g_str_equal (method_name, GCR_DBUS_CALLBACK_METHOD_READY)) { + prompt_method_ready (self, invocation, parameters); + + } else if (g_str_equal (method_name, GCR_DBUS_CALLBACK_METHOD_DONE)) { + prompt_method_done (self, invocation, parameters); + + } else { + g_return_if_reached (); + } +} + +static GVariant * +prompt_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + g_return_val_if_reached (NULL); +} + +static gboolean +prompt_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + g_return_val_if_reached (FALSE); +} + + +static GDBusInterfaceVTable prompt_dbus_vtable = { + prompt_method_call, + prompt_get_property, + prompt_set_property, +}; + +static void +register_prompt_object (GcrSystemPrompt *self, + GError **error) +{ + GError *lerror = NULL; + guint id; + + /* + * The unregister/reregister allows us to register this under a whatever + * GMainContext has been pushed as the thread default context. + */ + + if (self->pv->prompt_registered) + g_dbus_connection_unregister_object (self->pv->connection, + self->pv->prompt_registered); + + id = g_dbus_connection_register_object (self->pv->connection, + self->pv->prompt_path, + _gcr_dbus_prompter_callback_interface_info (), + &prompt_dbus_vtable, + self, NULL, &lerror); + self->pv->prompt_registered = id; + + if (lerror != NULL) { + g_warning ("error registering prompter %s", egg_error_message (lerror)); + g_propagate_error (error, lerror); + } +} + +static void +on_prompter_present (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (g_async_result_get_source_object (user_data)); + + g_free (self->pv->prompt_owner); + self->pv->prompt_owner = g_strdup (name_owner); + + g_object_unref (self); +} + +static void +on_prompter_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (g_async_result_get_source_object (user_data)); + CallClosure *call = g_simple_async_result_get_op_res_gpointer (user_data); + + if (self->pv->prompt_owner) { + g_free (self->pv->prompt_owner); + self->pv->prompt_owner = NULL; + g_debug ("prompter name owner has vanished: %s", name); + g_cancellable_cancel (call->cancellable); + } + + g_object_unref (self); +} + +static void +on_bus_connected (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (g_async_result_get_source_object (user_data)); + CallClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GError *error = NULL; + + g_assert (self->pv->connection == NULL); + self->pv->connection = g_bus_get_finish (result, &error); + + if (error != NULL) { + g_debug ("failed to connect to bus: %s", egg_error_message (error)); + + } else { + g_return_if_fail (self->pv->connection != NULL); + g_debug ("connected to bus"); + + g_main_context_push_thread_default (closure->context); + + closure->watch_id = g_bus_watch_name_on_connection (self->pv->connection, + self->pv->prompter_bus_name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + on_prompter_present, + on_prompter_vanished, + res, NULL); + + register_prompt_object (self, &error); + + g_main_context_pop_thread_default (closure->context); + } + + if (error == NULL) { + perform_init_async (self, res); + } else { + g_simple_async_result_take_error (res, error); + g_simple_async_result_complete (res); + } + + g_object_unref (self); + g_object_unref (res); +} + +static void +on_prompter_begin_prompting (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (g_async_result_get_source_object (user_data)); + GError *error = NULL; + GVariant *ret; + + ret = g_dbus_connection_call_finish (self->pv->connection, result, &error); + + if (error == NULL) { + self->pv->begun_prompting = TRUE; + g_variant_unref (ret); + + g_debug ("registered prompt %s: %s", + self->pv->prompter_bus_name, self->pv->prompt_path); + + g_return_if_fail (self->pv->prompt_path != NULL); + perform_init_async (self, res); + + } else { + g_debug ("failed to register prompt %s: %s", + self->pv->prompter_bus_name, egg_error_message (error)); + + g_simple_async_result_take_error (res, error); + g_simple_async_result_complete (res); + } + + g_object_unref (self); + g_object_unref (res); +} + +static gboolean +on_call_timeout (gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + CallClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (g_async_result_get_source_object (user_data)); + + g_source_destroy (closure->timeout); + g_source_unref (closure->timeout); + closure->timeout = NULL; + + /* Tell the prompter we're no longer interested */ + gcr_system_prompt_close_async (self, NULL, NULL, NULL); + + g_simple_async_result_set_error (res, GCR_SYSTEM_PROMPT_ERROR, + GCR_SYSTEM_PROMPT_IN_PROGRESS, + _("Another prompt is already in progress")); + g_simple_async_result_complete (res); + + g_object_unref (self); + return FALSE; /* Don't call this function again */ +} + +static gboolean +on_call_cancelled (GCancellable *cancellable, + gpointer user_data) +{ + GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data); + CallClosure *call = g_simple_async_result_get_op_res_gpointer (async); + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (g_async_result_get_source_object (user_data)); + + g_source_destroy (call->waiting); + g_source_unref (call->waiting); + call->waiting = NULL; + + g_simple_async_result_set_error (async, G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("The operation was cancelled")); + + /* Tell the prompter we're no longer interested */ + gcr_system_prompt_close_async (self, NULL, NULL, NULL); + + g_object_unref (self); + return FALSE; /* Don't call this function again */ +} + +void +perform_init_async (GcrSystemPrompt *self, + GSimpleAsyncResult *res) +{ + CallClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + + g_main_context_push_thread_default (closure->context); + + /* 1. Connect to the session bus */ + if (!self->pv->connection) { + g_debug ("connecting to bus"); + g_bus_get (G_BUS_TYPE_SESSION, closure->cancellable, + on_bus_connected, g_object_ref (res)); + + /* 2. Export our object, BeginPrompting on prompter */ + } else if (!self->pv->begun_prompting) { + g_assert (self->pv->prompt_path != NULL); + + g_debug ("calling %s method on prompter", GCR_DBUS_PROMPTER_METHOD_BEGIN); + g_dbus_connection_call (self->pv->connection, + self->pv->prompter_bus_name, + GCR_DBUS_PROMPTER_OBJECT_PATH, + GCR_DBUS_PROMPTER_INTERFACE, + GCR_DBUS_PROMPTER_METHOD_BEGIN, + g_variant_new ("(o)", self->pv->prompt_path), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, closure->cancellable, + on_prompter_begin_prompting, + g_object_ref (res)); + + /* 3. Wait for iterate */ + } else if (!self->pv->pending) { + self->pv->pending = g_object_ref (res); + if (self->pv->timeout_seconds > 0) { + g_assert (closure->timeout == NULL); + closure->timeout = g_timeout_source_new_seconds (self->pv->timeout_seconds); + g_source_set_callback (closure->timeout, on_call_timeout, res, NULL); + g_source_attach (closure->timeout, closure->context); + } + + g_assert (closure->waiting == NULL); + closure->waiting = g_cancellable_source_new (closure->cancellable); + g_source_set_callback (closure->waiting, (GSourceFunc)on_call_cancelled, res, NULL); + g_source_attach (closure->waiting, closure->context); + + /* 4. All done */ + } else { + g_assert_not_reached (); + } + + g_main_context_pop_thread_default (closure->context); +} + +static void +gcr_system_prompt_real_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (initable); + GSimpleAsyncResult *res; + CallClosure *closure; + + res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, + gcr_system_prompt_real_init_async); + closure = call_closure_new (cancellable); + closure->context = g_main_context_get_thread_default (); + if (closure->context) + g_main_context_ref (closure->context); + g_simple_async_result_set_op_res_gpointer (res, closure, call_closure_free); + + perform_init_async (self, res); + + g_object_unref (res); + +} + +static gboolean +gcr_system_prompt_real_init_finish (GAsyncInitable *initable, + GAsyncResult *result, + GError **error) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (initable); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), + gcr_system_prompt_real_init_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +static void +gcr_system_prompt_async_initable_iface (GAsyncInitableIface *iface) +{ + iface->init_async = gcr_system_prompt_real_init_async; + iface->init_finish = gcr_system_prompt_real_init_finish; +} + +typedef struct { + GAsyncResult *result; + GMainContext *context; + GMainLoop *loop; +} SyncClosure; + +static SyncClosure * +sync_closure_new (void) +{ + SyncClosure *closure; + + closure = g_new0 (SyncClosure, 1); + + closure->context = g_main_context_new (); + closure->loop = g_main_loop_new (closure->context, FALSE); + + return closure; +} + +static void +sync_closure_free (gpointer data) +{ + SyncClosure *closure = data; + + g_clear_object (&closure->result); + g_main_loop_unref (closure->loop); + g_main_context_unref (closure->context); + g_free (closure); +} + +static void +on_sync_result (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + SyncClosure *closure = user_data; + closure->result = g_object_ref (result); + g_main_loop_quit (closure->loop); +} + +static gboolean +gcr_system_prompt_real_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + SyncClosure *closure; + gboolean result; + + closure = sync_closure_new (); + g_main_context_push_thread_default (closure->context); + + gcr_system_prompt_real_init_async (G_ASYNC_INITABLE (initable), + G_PRIORITY_DEFAULT, cancellable, + on_sync_result, closure); + + g_main_loop_run (closure->loop); + + result = gcr_system_prompt_real_init_finish (G_ASYNC_INITABLE (initable), + closure->result, error); + + g_main_context_pop_thread_default (closure->context); + sync_closure_free (closure); + + return result; +} + +static void +gcr_system_prompt_initable_iface (GInitableIface *iface) +{ + iface->init = gcr_system_prompt_real_init; +} + +static GVariantBuilder * +build_dirty_properties (GcrSystemPrompt *self) +{ + GVariantBuilder *builder; + GHashTableIter iter; + GVariant *variant; + gpointer key; + + builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); + + g_hash_table_iter_init (&iter, self->pv->dirty_properties); + while (g_hash_table_iter_next (&iter, &key, NULL)) { + variant = g_hash_table_lookup (self->pv->properties, key); + g_variant_builder_add (builder, "{sv}", (const gchar *)key, variant); + } + + g_hash_table_remove_all (self->pv->dirty_properties); + return builder; +} + +static void +on_perform_prompt_complete (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (g_async_result_get_source_object (user_data)); + CallClosure *call = g_simple_async_result_get_op_res_gpointer (res); + GError *error = NULL; + GVariant *retval; + + retval = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error); + if (error != NULL) { + self->pv->pending = NULL; + g_simple_async_result_take_error (res, error); + g_simple_async_result_complete (res); + } else { + g_assert (call->waiting == NULL); + call->waiting = g_cancellable_source_new (call->cancellable); + g_source_set_callback (call->waiting, (GSourceFunc)on_call_cancelled, res, NULL); + g_source_attach (call->waiting, call->context); + } + + if (retval) + g_variant_unref (retval); + + g_object_unref (self); + g_object_unref (res); +} + +static void +perform_prompt_async (GcrSystemPrompt *self, + const gchar *type, + gpointer source_tag, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + GcrSecretExchange *exchange; + GVariantBuilder *builder; + CallClosure *closure; + gchar *sent; + + g_return_if_fail (GCR_IS_SYSTEM_PROMPT (self)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + if (self->pv->pending != NULL) { + g_warning ("another operation is already pending on this prompt"); + return; + } + + res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, source_tag); + closure = call_closure_new (cancellable); + g_simple_async_result_set_op_res_gpointer (res, closure, call_closure_free); + + if (self->pv->closed) { + g_free (self->pv->last_response); + self->pv->last_response = g_strdup (GCR_DBUS_PROMPT_REPLY_NONE); + g_simple_async_result_complete_in_idle (res); + g_object_unref (res); + return; + } + + g_debug ("prompting for password"); + + exchange = gcr_system_prompt_get_secret_exchange (self); + if (self->pv->received) + sent = gcr_secret_exchange_send (exchange, NULL, 0); + else + sent = gcr_secret_exchange_begin (exchange); + + closure->watch_id = g_bus_watch_name_on_connection (self->pv->connection, + self->pv->prompter_bus_name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + on_prompter_present, + on_prompter_vanished, + res, NULL); + + builder = build_dirty_properties (self); + + /* Reregister the prompt object in the current GMainContext */ + register_prompt_object (self, NULL); + + g_dbus_connection_call (self->pv->connection, + self->pv->prompter_bus_name, + GCR_DBUS_PROMPTER_OBJECT_PATH, + GCR_DBUS_PROMPTER_INTERFACE, + GCR_DBUS_PROMPTER_METHOD_PERFORM, + g_variant_new ("(osa{sv}s)", self->pv->prompt_path, + type, builder, sent), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, cancellable, + on_perform_prompt_complete, + g_object_ref (res)); + g_variant_builder_unref(builder); + + self->pv->pending = res; + g_free (sent); +} + +static GcrPromptReply +handle_last_response (GcrSystemPrompt *self) +{ + GcrPromptReply response; + + g_return_val_if_fail (self->pv->last_response != NULL, + GCR_PROMPT_REPLY_CANCEL); + + if (g_str_equal (self->pv->last_response, GCR_DBUS_PROMPT_REPLY_YES)) { + response = GCR_PROMPT_REPLY_CONTINUE; + + } else if (g_str_equal (self->pv->last_response, GCR_DBUS_PROMPT_REPLY_NO) || + g_str_equal (self->pv->last_response, GCR_DBUS_PROMPT_REPLY_NONE)) { + response = GCR_PROMPT_REPLY_CANCEL; + + } else { + g_warning ("unknown response from prompter: %s", self->pv->last_response); + response = GCR_PROMPT_REPLY_CANCEL; + } + + return response; +} + +static void +gcr_system_prompt_password_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (prompt); + perform_prompt_async (self, GCR_DBUS_PROMPT_TYPE_PASSWORD, + gcr_system_prompt_password_async, + cancellable, callback, user_data); +} + +static const gchar * +gcr_system_prompt_password_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (prompt); + GSimpleAsyncResult *res; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), + gcr_system_prompt_password_async), FALSE); + + res = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (res, error)) + return FALSE; + + if (handle_last_response (self) == GCR_PROMPT_REPLY_CONTINUE) + return gcr_secret_exchange_get_secret (self->pv->exchange, NULL); + + return NULL; +} + +static void +gcr_system_prompt_confirm_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (prompt); + perform_prompt_async (self, GCR_DBUS_PROMPT_TYPE_CONFIRM, + gcr_system_prompt_confirm_async, + cancellable, callback, user_data); +} + +static GcrPromptReply +gcr_system_prompt_confirm_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (prompt); + GSimpleAsyncResult *res; + + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPT (self), FALSE); + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), + gcr_system_prompt_confirm_async), FALSE); + + res = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (res, error)) + return FALSE; + + return handle_last_response (self); +} + +static void +gcr_system_prompt_real_close (GcrPrompt *prompt) +{ + GcrSystemPrompt *self = GCR_SYSTEM_PROMPT (prompt); + + /* + * Setting this before calling close_async allows us to prevent firing + * this signal again in a loop. + */ + + if (!self->pv->closed) { + self->pv->closed = TRUE; + perform_close (self, NULL, NULL); + } +} + +static void +gcr_system_prompt_prompt_iface (GcrPromptIface *iface) +{ + iface->prompt_password_async = gcr_system_prompt_password_async; + iface->prompt_password_finish = gcr_system_prompt_password_finish; + iface->prompt_confirm_async = gcr_system_prompt_confirm_async; + iface->prompt_confirm_finish = gcr_system_prompt_confirm_finish; + iface->prompt_close = gcr_system_prompt_real_close; +} + +/** + * gcr_system_prompt_open_async: + * @timeout_seconds: the number of seconds to wait to access the prompt, or -1 + * @cancellable: optional cancellation object + * @callback: called when the operation completes + * @user_data: data to pass the callback + * + * Asynchronously open a system prompt with the default system prompter. + * + * Most system prompters only allow showing one prompt at a time, and if + * another prompt is shown then this method will block for up to + * @timeout_seconds seconds. If @timeout_seconds is equal to -1, then this + * will block indefinitely until the prompt can be opened. If @timeout_seconds + * expires, then this operation will fail with a %GCR_SYSTEM_PROMPT_IN_PROGRESS + * error. + */ +void +gcr_system_prompt_open_async (gint timeout_seconds, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (timeout_seconds >= -1); + g_return_if_fail (cancellable == NULL || G_CANCELLABLE (cancellable)); + + gcr_system_prompt_open_for_prompter_async (NULL, timeout_seconds, + cancellable, callback, + user_data); +} + +/** + * gcr_system_prompt_open_for_prompter_async: + * @prompter_name: (allow-none): the prompter dbus name + * @timeout_seconds: the number of seconds to wait to access the prompt, or -1 + * @cancellable: optional cancellation object + * @callback: called when the operation completes + * @user_data: data to pass the callback + * + * Opens a system prompt asynchronously. If prompter_name is %NULL, then the + * default system prompter is used. + * + * Most system prompters only allow showing one prompt at a time, and if + * another prompt is shown then this method will block for up to + * @timeout_seconds seconds. If @timeout_seconds is equal to -1, then this + * will block indefinitely until the prompt can be opened. If @timeout_seconds + * expires, then this operation will fail with a %GCR_SYSTEM_PROMPT_IN_PROGRESS + * error. + */ +void +gcr_system_prompt_open_for_prompter_async (const gchar *prompter_name, + gint timeout_seconds, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (timeout_seconds >= -1); + g_return_if_fail (cancellable == NULL || G_CANCELLABLE (cancellable)); + + if (prompter_name == NULL) + g_debug ("opening prompt"); + else + g_debug ("opening prompt for prompter: %s", prompter_name); + + g_async_initable_new_async (GCR_TYPE_SYSTEM_PROMPT, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data, + "timeout-seconds", timeout_seconds, + "bus-name", prompter_name, + NULL); +} + +/** + * gcr_system_prompt_open_finish: + * @result: the asynchronous result + * @error: location to place an error on failure + * + * Complete an operation to asynchronously open a system prompt. + * + * Returns: (transfer full) (type Gcr.SystemPrompt): the prompt, or %NULL if + * prompt could not be opened + */ +GcrPrompt * +gcr_system_prompt_open_finish (GAsyncResult *result, + GError **error) +{ + GObject *object; + GObject *source_object; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + source_object = g_async_result_get_source_object (result); + g_assert (source_object != NULL); + + object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), + result, error); + g_object_unref (source_object); + + if (object != NULL) + return GCR_PROMPT (object); + else + return NULL; +} + +/** + * gcr_system_prompt_open: + * @timeout_seconds: the number of seconds to wait to access the prompt, or -1 + * @cancellable: optional cancellation object + * @error: location to place error on failure + * + * Opens a system prompt with the default prompter. + * + * Most system prompters only allow showing one prompt at a time, and if + * another prompt is shown then this method will block for up to + * @timeout_seconds seconds. If @timeout_seconds is equal to -1, then this + * will block indefinitely until the prompt can be opened. If @timeout_seconds + * expires, then this function will fail with a %GCR_SYSTEM_PROMPT_IN_PROGRESS + * error. + * + * Returns: (transfer full) (type Gcr.SystemPrompt): the prompt, or %NULL if + * prompt could not be opened + */ +GcrPrompt * +gcr_system_prompt_open (gint timeout_seconds, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (timeout_seconds >= -1, NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + return gcr_system_prompt_open_for_prompter (NULL, timeout_seconds, + cancellable, error); +} + +/** + * gcr_system_prompt_open_for_prompter: + * @prompter_name: (allow-none): the prompter dbus name + * @timeout_seconds: the number of seconds to wait to access the prompt, or -1 + * @cancellable: optional cancellation object + * @error: location to place error on failure + * + * Opens a system prompt. If prompter_name is %NULL, then the default + * system prompter is used. + * + * Most system prompters only allow showing one prompt at a time, and if + * another prompt is shown then this method will block for up to + * @timeout_seconds seconds. If @timeout_seconds is equal to -1, then this + * will block indefinitely until the prompt can be opened. If @timeout_seconds + * expires, then this function will fail with a %GCR_SYSTEM_PROMPT_IN_PROGRESS + * error. + * + * Returns: (transfer full) (type Gcr.SystemPrompt): the prompt, or %NULL if + * prompt could not be opened + */ +GcrPrompt * +gcr_system_prompt_open_for_prompter (const gchar *prompter_name, + gint timeout_seconds, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (timeout_seconds >= -1, NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + if (prompter_name == NULL) + g_debug ("opening prompt"); + else + g_debug ("opening prompt for prompter: %s", prompter_name); + + return g_initable_new (GCR_TYPE_SYSTEM_PROMPT, cancellable, error, + "timeout-seconds", timeout_seconds, + "bus-name", prompter_name, + NULL); +} + +/** + * gcr_system_prompt_close: + * @self: the prompt + * @cancellable: an optional cancellation object + * @error: location to place an error on failure + * + * Close this prompt. After calling this function, no further prompts will + * succeed on this object. The prompt object is not unreferenced by this + * function, and you must unreference it once done. + * + * This call may block, use the gcr_system_prompt_close_async() to perform + * this action indefinitely. + * + * Whether or not this function returns %TRUE, the system prompt object is + * still closed and may not be further used. + * + * Returns: whether close was cleanly completed + */ +gboolean +gcr_system_prompt_close (GcrSystemPrompt *self, + GCancellable *cancellable, + GError **error) +{ + SyncClosure *closure; + gboolean result; + + closure = sync_closure_new (); + g_main_context_push_thread_default (closure->context); + + gcr_system_prompt_close_async (self, cancellable, + on_sync_result, closure); + + g_main_loop_run (closure->loop); + + result = gcr_system_prompt_close_finish (self, closure->result, error); + + g_main_context_pop_thread_default (closure->context); + sync_closure_free (closure); + + return result; +} + +/** + * gcr_system_prompt_close_async: + * @self: the prompt + * @cancellable: an optional cancellation object + * @callback: called when the operation completes + * @user_data: data to pass to the callback + * + * Close this prompt asynchronously. After calling this function, no further + * methods may be called on this object. The prompt object is not unreferenced + * by this function, and you must unreference it once done. + * + * This call returns immediately and completes asynchronously. + */ +void +gcr_system_prompt_close_async (GcrSystemPrompt *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + CallClosure *closure; + + g_return_if_fail (GCR_SYSTEM_PROMPT (self)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + res = g_simple_async_result_new (NULL, callback, user_data, + gcr_system_prompt_close_async); + closure = call_closure_new (cancellable); + closure->context = g_main_context_get_thread_default (); + if (closure->context != NULL) + g_main_context_ref (closure->context); + g_simple_async_result_set_op_res_gpointer (res, closure, call_closure_free); + + perform_close (self, res, closure->cancellable); + + g_object_unref (res); +} + +/** + * gcr_system_prompt_close_finish: + * @self: the prompt + * @result: asynchronous operation result + * @error: location to place an error on failure + * + * Complete operation to close this prompt. + * + * Whether or not this function returns %TRUE, the system prompt object is + * still closed and may not be further used. + * + * Returns: whether close was cleanly completed + */ +gboolean +gcr_system_prompt_close_finish (GcrSystemPrompt *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPT (self), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, + gcr_system_prompt_close_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +static const GDBusErrorEntry SYSTEM_PROMPT_ERRORS[] = { + { GCR_SYSTEM_PROMPT_IN_PROGRESS, GCR_DBUS_PROMPT_ERROR_IN_PROGRESS }, +}; + +GQuark +gcr_system_prompt_error_get_domain (void) +{ + static volatile gsize quark_volatile = 0; + g_dbus_error_register_error_domain ("gcr-system-prompt-error-domain", + &quark_volatile, + SYSTEM_PROMPT_ERRORS, + G_N_ELEMENTS (SYSTEM_PROMPT_ERRORS)); + G_STATIC_ASSERT (G_N_ELEMENTS (SYSTEM_PROMPT_ERRORS) == GCR_SYSTEM_PROMPT_IN_PROGRESS); + return (GQuark) quark_volatile; +} diff --git a/gcr/gcr-system-prompt.h b/gcr/gcr-system-prompt.h new file mode 100644 index 0000000..4a6f9ef --- /dev/null +++ b/gcr/gcr-system-prompt.h @@ -0,0 +1,109 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_SYSTEM_PROMPT_H__ +#define __GCR_SYSTEM_PROMPT_H__ + +#include "gcr-types.h" +#include "gcr-secret-exchange.h" + +#include + +G_BEGIN_DECLS + +typedef enum { + GCR_SYSTEM_PROMPT_IN_PROGRESS = 1, +} GcrSystemPromptError; + +#define GCR_SYSTEM_PROMPT_ERROR (gcr_system_prompt_error_get_domain ()) + +GQuark gcr_system_prompt_error_get_domain (void) G_GNUC_CONST; + +#define GCR_TYPE_SYSTEM_PROMPT (gcr_system_prompt_get_type ()) +#define GCR_SYSTEM_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_SYSTEM_PROMPT, GcrSystemPrompt)) +#define GCR_SYSTEM_PROMPT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_SYSTEM_PROMPT, GcrSystemPromptClass)) +#define GCR_IS_SYSTEM_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_SYSTEM_PROMPT)) +#define GCR_IS_SYSTEM_PROMPT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_SYSTEM_PROMPT)) +#define GCR_SYSTEM_PROMPT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_SYSTEM_PROMPT, GcrSystemPromptClass)) + +typedef struct _GcrSystemPrompt GcrSystemPrompt; +typedef struct _GcrSystemPromptClass GcrSystemPromptClass; +typedef struct _GcrSystemPromptPrivate GcrSystemPromptPrivate; + +struct _GcrSystemPrompt { + GObject parent; + + /*< private >*/ + GcrSystemPromptPrivate *pv; +}; + +struct _GcrSystemPromptClass { + GObjectClass parent_class; +}; + +GType gcr_system_prompt_get_type (void); + +GcrSecretExchange * gcr_system_prompt_get_secret_exchange (GcrSystemPrompt *self); + +void gcr_system_prompt_open_async (gint timeout_seconds, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +void gcr_system_prompt_open_for_prompter_async (const gchar *prompter_name, + gint timeout_seconds, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + +GcrPrompt * gcr_system_prompt_open_finish (GAsyncResult *result, + GError **error); + +GcrPrompt * gcr_system_prompt_open_for_prompter (const gchar *prompter_name, + gint timeout_seconds, + GCancellable *cancellable, + GError **error); + +GcrPrompt * gcr_system_prompt_open (gint timeout_seconds, + GCancellable *cancellable, + GError **error); + +gboolean gcr_system_prompt_close (GcrSystemPrompt *self, + GCancellable *cancellable, + GError **error); + +void gcr_system_prompt_close_async (GcrSystemPrompt *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_system_prompt_close_finish (GcrSystemPrompt *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __GCR_SYSTEM_PROMPT_H__ */ diff --git a/gcr/gcr-system-prompter.c b/gcr/gcr-system-prompter.c new file mode 100644 index 0000000..975abe4 --- /dev/null +++ b/gcr/gcr-system-prompter.c @@ -0,0 +1,1166 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-dbus-constants.h" +#include "gcr-internal.h" +#include "gcr-library.h" +#include "gcr-prompt.h" +#include "gcr-secret-exchange.h" +#include "gcr-system-prompter.h" +#include "gcr-system-prompt.h" + +#include "gcr/gcr-dbus-generated.h" +#include "gcr/gcr-enum-types-base.h" +#include "gcr/gcr-marshal.h" + +#include "egg/egg-error.h" + +#include + +/** + * SECTION:gcr-system-prompter + * @title: GcrSystemPrompter + * @short_description: a prompter which displays system prompts + * + * This is a DBus service which is rarely implemented. Use #GcrSystemPrompt + * to display system prompts. + * + * The GcrSystemPrompter service responds to dbus requests to create system + * prompts and creates #GcrPrompt type objects to display those prompts. + * + * Pass the GType of the implementation of #GcrPrompt to gcr_system_prompter_new(). + */ + +/** + * GcrSystemPrompter: + * + * A prompter used by implementations of system prompts. + */ + +/** + * GcrSystemPrompterClass: + * @parent_class: parent class + * @new_prompt: default handler for the #GcrSystemPrompter::new-prompt signal + * + * The class for #GcrSystemPrompter. + */ + +/** + * GcrSystemPrompterMode: + * @GCR_SYSTEM_PROMPTER_SINGLE: only one prompt shown at a time + * @GCR_SYSTEM_PROMPTER_MULTIPLE: more than one prompt shown at a time + * + * The mode for the system prompter. Most system prompters can only show + * one prompt at a time and would use the %GCR_SYSTEM_PROMPTER_SINGLE mode. + */ + +enum { + PROP_0, + PROP_MODE, + PROP_PROMPT_TYPE, + PROP_PROMPTING +}; + +enum { + NEW_PROMPT, + LAST_SIGNAL, +}; + +struct _GcrSystemPrompterPrivate { + GcrSystemPrompterMode mode; + GType prompt_type; + + guint prompter_registered; + GDBusConnection *connection; + + GHashTable *callbacks; /* Callback -> guint watch_id */ + GHashTable *active; /* Callback -> active (ActivePrompt) */ + GQueue waiting; +}; + +static guint signals[LAST_SIGNAL] = { 0, }; + +G_DEFINE_TYPE (GcrSystemPrompter, gcr_system_prompter, G_TYPE_OBJECT); + +typedef struct { + const gchar *path; + const gchar *name; +} Callback; + +typedef struct { + gint refs; + Callback *callback; + GcrSystemPrompter *prompter; + GCancellable *cancellable; + GcrPrompt *prompt; + gboolean ready; + guint notify_sig; + GHashTable *changed; + GcrSecretExchange *exchange; + gboolean received; + gboolean closed; + guint close_sig; +} ActivePrompt; + +static void prompt_send_ready (ActivePrompt *active, + const gchar *response, + const gchar *secret); + +static void prompt_next_ready (GcrSystemPrompter *self); + +static void prompt_stop_prompting (GcrSystemPrompter *self, + Callback *callback, + gboolean send_done_message, + gboolean wait_for_reply); + +static ActivePrompt * +active_prompt_ref (ActivePrompt *active) +{ + g_atomic_int_inc (&active->refs); + return active; +} + +static void +on_prompt_notify (GObject *object, + GParamSpec *param, + gpointer user_data) +{ + ActivePrompt *active = user_data; + gpointer key = (gpointer)g_intern_string (param->name); + g_hash_table_replace (active->changed, key, key); +} + +static void +on_prompt_close (GcrPrompt *prompt, + gpointer user_data) +{ + ActivePrompt *active = user_data; + prompt_stop_prompting (active->prompter, active->callback, TRUE, FALSE); +} + +static Callback * +callback_dup (Callback *original) +{ + Callback *callback = g_slice_new0 (Callback); + g_assert (original != NULL); + g_assert (original->path != NULL); + g_assert (original->name != NULL); + callback->path = g_strdup (original->path); + callback->name = g_strdup (original->name); + return callback; +} + +static void +callback_free (gpointer data) +{ + Callback *callback = data; + g_free ((gchar *)callback->path); + g_free ((gchar *)callback->name); + g_slice_free (Callback, callback); +} + +static guint +callback_hash (gconstpointer data) +{ + const Callback *callback = data; + return g_str_hash (callback->name) ^ g_str_hash (callback->path); +} + +static gboolean +callback_equal (gconstpointer one, + gconstpointer two) +{ + const Callback *cone = one; + const Callback *ctwo = two; + return g_str_equal (cone->name, ctwo->name) && + g_str_equal (cone->path, ctwo->path); +} + +static void +active_prompt_unref (gpointer data) +{ + ActivePrompt *active = data; + + if (g_atomic_int_dec_and_test (&active->refs)) { + callback_free (active->callback); + g_object_unref (active->prompter); + g_object_unref (active->cancellable); + if (g_signal_handler_is_connected (active->prompt, active->notify_sig)) + g_signal_handler_disconnect (active->prompt, active->notify_sig); + if (g_signal_handler_is_connected (active->prompt, active->close_sig)) + g_signal_handler_disconnect (active->prompt, active->close_sig); + g_object_unref (active->prompt); + g_hash_table_destroy (active->changed); + if (active->exchange) + g_object_unref (active->exchange); + g_slice_free (ActivePrompt, active); + } +} + +static GcrSecretExchange * +active_prompt_get_secret_exchange (ActivePrompt *active) +{ + if (active->exchange == NULL) + active->exchange = gcr_secret_exchange_new (NULL); + return active->exchange; +} + +static ActivePrompt * +active_prompt_create (GcrSystemPrompter *self, + Callback *lookup) +{ + ActivePrompt *active; + + active = g_slice_new0 (ActivePrompt); + active->refs = 1; + active->callback = callback_dup (lookup); + active->prompter = g_object_ref (self); + active->cancellable = g_cancellable_new (); + g_signal_emit (self, signals[NEW_PROMPT], 0, &active->prompt); + g_return_val_if_fail (active->prompt != NULL, NULL); + + active->notify_sig = g_signal_connect (active->prompt, "notify", G_CALLBACK (on_prompt_notify), active); + active->close_sig = g_signal_connect (active->prompt, "prompt-close", G_CALLBACK (on_prompt_close), active); + active->changed = g_hash_table_new (g_direct_hash, g_direct_equal); + + /* Insert us into the active hash table */ + g_hash_table_replace (self->pv->active, active->callback, active); + return active; +} + +static void +unwatch_name (gpointer data) +{ + g_bus_unwatch_name (GPOINTER_TO_UINT (data)); +} + +static void +gcr_system_prompter_init (GcrSystemPrompter *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_SYSTEM_PROMPTER, + GcrSystemPrompterPrivate); + self->pv->callbacks = g_hash_table_new_full (callback_hash, callback_equal, callback_free, unwatch_name); + self->pv->active = g_hash_table_new_full (callback_hash, callback_equal, NULL, active_prompt_unref); +} + +static void +gcr_system_prompter_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrSystemPrompter *self = GCR_SYSTEM_PROMPTER (obj); + + switch (prop_id) { + case PROP_MODE: + self->pv->mode = g_value_get_enum (value); + break; + case PROP_PROMPT_TYPE: + self->pv->prompt_type = g_value_get_gtype (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_system_prompter_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrSystemPrompter *self = GCR_SYSTEM_PROMPTER (obj); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, gcr_system_prompter_get_mode (self)); + break; + case PROP_PROMPT_TYPE: + g_value_set_gtype (value, gcr_system_prompter_get_prompt_type (self)); + break; + case PROP_PROMPTING: + g_value_set_boolean (value, gcr_system_prompter_get_prompting (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_system_prompter_dispose (GObject *obj) +{ + GcrSystemPrompter *self = GCR_SYSTEM_PROMPTER (obj); + + g_debug ("disposing prompter"); + + if (self->pv->prompter_registered) + gcr_system_prompter_unregister (self, FALSE); + + g_hash_table_remove_all (self->pv->callbacks); + g_hash_table_remove_all (self->pv->active); + g_object_notify (obj, "prompting"); + + G_OBJECT_CLASS (gcr_system_prompter_parent_class)->dispose (obj); +} + +static void +gcr_system_prompter_finalize (GObject *obj) +{ + GcrSystemPrompter *self = GCR_SYSTEM_PROMPTER (obj); + + g_debug ("finalizing prompter"); + + g_assert (self->pv->connection == NULL); + g_assert (self->pv->prompter_registered == 0); + + g_hash_table_destroy (self->pv->callbacks); + g_hash_table_destroy (self->pv->active); + + G_OBJECT_CLASS (gcr_system_prompter_parent_class)->finalize (obj); +} + +static GcrPrompt * +gcr_system_prompter_new_prompt (GcrSystemPrompter *self) +{ + g_return_val_if_fail (self->pv->prompt_type != 0, NULL); + + g_debug ("creating new %s prompt", g_type_name (self->pv->prompt_type)); + + return g_object_new (self->pv->prompt_type, NULL); +} + +static gboolean +gcr_system_prompter_new_prompt_acculmulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer user_data) +{ + if (g_value_get_object (handler_return) != NULL) { + g_value_copy (handler_return, return_accu); + return FALSE; + } + + return TRUE; +} + +static void +gcr_system_prompter_class_init (GcrSystemPrompterClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = gcr_system_prompter_get_property; + gobject_class->set_property = gcr_system_prompter_set_property; + gobject_class->dispose = gcr_system_prompter_dispose; + gobject_class->finalize = gcr_system_prompter_finalize; + + klass->new_prompt = gcr_system_prompter_new_prompt; + + g_type_class_add_private (gobject_class, sizeof (GcrSystemPrompterPrivate)); + + /** + * GcrSystemPrompter:mode: + * + * The mode for this prompter. + * + * Most system prompters only display one prompt at a time and therefore + * return %GCR_SYSTEM_PROMPTER_SINGLE. + */ + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", "Prompting mode", + GCR_TYPE_SYSTEM_PROMPTER_MODE, GCR_SYSTEM_PROMPTER_SINGLE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GcrSystemPrompter:prompt-type: + * + * The #GType for prompts created by this prompter. This must be a + * #GcrPrompt implementation. + */ + g_object_class_install_property (gobject_class, PROP_PROMPT_TYPE, + g_param_spec_gtype ("prompt-type", "Prompt GType", "GObject type of prompts", + GCR_TYPE_PROMPT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GcrSystemPrompter:prompting: + * + * Whether the prompter is prompting or not. + */ + g_object_class_install_property (gobject_class, PROP_PROMPTING, + g_param_spec_boolean ("prompting", "Prompting", "Whether prompting or not", + FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GcrSystemPrompter::new-prompt: + * + * Signal emitted to create a new prompt when needed. + * + * The default implementation of this signal creates a prompt of the type + * gcr_system_prompter_get_prompt_type(). + * + * Returns: (transfer full): the new prompt + */ + signals[NEW_PROMPT] = g_signal_new ("new-prompt", GCR_TYPE_SYSTEM_PROMPTER, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GcrSystemPrompterClass, new_prompt), + gcr_system_prompter_new_prompt_acculmulator, NULL, + _gcr_marshal_OBJECT__VOID, + GCR_TYPE_PROMPT, 0, G_TYPE_NONE); +} + +static GVariantBuilder * +prompt_build_properties (GcrPrompt *prompt, + GHashTable *changed) +{ + GObject *obj = G_OBJECT (prompt); + GVariantBuilder *builder; + const gchar *property_name; + GParamSpec *pspec; + GHashTableIter iter; + const GVariantType *type; + GVariant *variant; + GValue value; + + builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); + g_hash_table_iter_init (&iter, changed); + while (g_hash_table_iter_next (&iter, (gpointer *)&property_name, NULL)) { + + /* Make sure this property is on the prompt interface */ + pspec = g_object_interface_find_property (GCR_PROMPT_GET_INTERFACE (obj), + property_name); + if (pspec == NULL) + continue; + + memset (&value, 0, sizeof (GValue)); + g_value_init (&value, pspec->value_type); + g_object_get_property (obj, property_name, &value); + + switch (pspec->value_type) { + case G_TYPE_STRING: + type = G_VARIANT_TYPE ("s"); + break; + case G_TYPE_INT: + type = G_VARIANT_TYPE ("i"); + break; + case G_TYPE_BOOLEAN: + type = G_VARIANT_TYPE ("b"); + break; + default: + g_critical ("encountered unsupported property type on GcrPrompt: %s", + g_type_name (pspec->value_type)); + continue; + } + + variant = g_dbus_gvalue_to_gvariant (&value, type); + g_variant_builder_add (builder, "{sv}", property_name, + g_variant_new_variant (variant)); + g_value_unset (&value); + g_variant_unref (variant); + } + g_hash_table_remove_all (changed); + return builder; +} + +static void +prompt_stop_prompting (GcrSystemPrompter *self, + Callback *callback, + gboolean send_done_message, + gboolean wait_for_reply) +{ + ActivePrompt *active; + GVariant *retval; + gpointer watch; + + g_debug ("stopping prompting for operation %s@%s", + callback->path, callback->name); + + /* Get a pointer to our actual callback */ + if (!g_hash_table_lookup_extended (self->pv->callbacks, callback, + (gpointer *)&callback, &watch)) { + g_debug ("couldn't find the callback for prompting operation %s@%s", + callback->path, callback->name); + return; + } + + /* + * We remove these from the callbacks hash table so that we don't + * do this stuff more than once. However we still need the callback + * to be valid. + */ + if (!g_hash_table_steal (self->pv->callbacks, callback)) + g_assert_not_reached (); + + /* Removed from the waiting queue */ + g_queue_remove (&self->pv->waiting, callback); + + /* Close any active prompt */ + active = g_hash_table_lookup (self->pv->active, callback); + if (active != NULL) { + active_prompt_ref (active); + g_hash_table_remove (self->pv->active, callback); + + if (!active->ready) { + g_debug ("cancelling active prompting operation for %s@%s", + callback->path, callback->name); + g_cancellable_cancel (active->cancellable); + } + + g_debug ("closing the prompt"); + gcr_prompt_close (active->prompt); + g_object_run_dispose (G_OBJECT (active->prompt)); + active_prompt_unref (active); + } + + /* Notify the caller */ + if (send_done_message && wait_for_reply) { + g_debug ("calling the %s method on %s@%s, and waiting for reply", + GCR_DBUS_CALLBACK_METHOD_DONE, callback->path, callback->name); + + retval = g_dbus_connection_call_sync (self->pv->connection, + callback->name, + callback->path, + GCR_DBUS_CALLBACK_INTERFACE, + GCR_DBUS_CALLBACK_METHOD_DONE, + g_variant_new ("()"), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, NULL); + if (retval) + g_variant_unref (retval); + + g_debug ("returned from %s on %s@%s", + GCR_DBUS_CALLBACK_METHOD_DONE, callback->path, callback->name); + + } else if (send_done_message) { + g_debug ("calling the %s method on %s@%s, and ignoring reply", + GCR_DBUS_CALLBACK_METHOD_DONE, callback->path, callback->name); + + g_dbus_connection_call (self->pv->connection, + callback->name, + callback->path, + GCR_DBUS_CALLBACK_INTERFACE, + GCR_DBUS_CALLBACK_METHOD_DONE, + g_variant_new ("()"), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, NULL, NULL); + } + + /* + * And all traces gone, including watch. We stole these values from + * the callbacks hashtable above. Now free them + */ + + callback_free (callback); + unwatch_name (watch); + + g_object_notify (G_OBJECT (self), "prompting"); +} + +static void +on_prompt_ready_complete (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ActivePrompt *active = user_data; + GcrSystemPrompter *self = g_object_ref (active->prompter); + GError *error = NULL; + GVariant *retval; + + g_assert (active->ready == FALSE); + + g_debug ("returned from the %s method on %s@%s", + GCR_DBUS_CALLBACK_METHOD_READY, active->callback->path, active->callback->name); + + active->ready = TRUE; + retval = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error); + + /* Was cancelled, prompter probably unregistered */ + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + g_cancellable_is_cancelled (active->cancellable)) { + g_error_free (error); + + /* The ready call failed, */ + } else if (error != NULL) { + if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) + g_debug ("prompt %s@%s disappeared or does not exist", + active->callback->path, active->callback->name); + else + g_message ("received an error from the prompt callback: %s", error->message); + g_error_free (error); + + prompt_stop_prompting (self, active->callback, FALSE, FALSE); + + /* Another new prompt may be ready to go active? */ + prompt_next_ready (self); + } + + if (retval != NULL) + g_variant_unref (retval); + + active_prompt_unref (active); + g_object_unref (self); +} + +static void +prompt_send_ready (ActivePrompt *active, + const gchar *response, + const gchar *secret) +{ + GcrSystemPrompter *self; + GVariantBuilder *builder; + GcrSecretExchange *exchange; + gchar *sent; + + g_assert (active->ready == FALSE); + + exchange = active_prompt_get_secret_exchange (active); + if (!active->received) { + g_return_if_fail (secret == NULL); + sent = gcr_secret_exchange_begin (exchange); + } else { + sent = gcr_secret_exchange_send (exchange, secret, -1); + } + + self = active->prompter; + builder = prompt_build_properties (active->prompt, active->changed); + + g_debug ("calling the %s method on %s@%s", + GCR_DBUS_CALLBACK_METHOD_READY, active->callback->path, active->callback->name); + + g_dbus_connection_call (self->pv->connection, + active->callback->name, + active->callback->path, + GCR_DBUS_CALLBACK_INTERFACE, + GCR_DBUS_CALLBACK_METHOD_READY, + g_variant_new ("(sa{sv}s)", response, builder, sent), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, active->cancellable, + on_prompt_ready_complete, + active_prompt_ref (active)); + + g_variant_builder_unref (builder); + g_free (sent); +} + +static void +prompt_next_ready (GcrSystemPrompter *self) +{ + ActivePrompt *active; + Callback *callback; + + if (self->pv->mode == GCR_SYSTEM_PROMPTER_SINGLE && + g_hash_table_size (self->pv->active) > 0) + return; + + callback = g_queue_pop_head (&self->pv->waiting); + if (callback == NULL) + return; + + g_debug ("preparing a prompt for callback %s@%s", + callback->path, callback->name); + + active = g_hash_table_lookup (self->pv->active, callback); + g_assert (active == NULL); + + active = active_prompt_create (self, callback); + g_return_if_fail (active != NULL); + + prompt_send_ready (active, GCR_DBUS_PROMPT_REPLY_NONE, NULL); +} + +static void +prompt_update_properties (GcrPrompt *prompt, + GVariantIter *iter) +{ + GObject *obj = G_OBJECT (prompt); + gchar *property_name; + GVariant *variant; + GValue value; + + g_object_freeze_notify (obj); + while (g_variant_iter_loop (iter, "{&sv}", &property_name, &variant)) { + memset (&value, 0, sizeof (GValue)); + g_dbus_gvariant_to_gvalue (variant, &value); + g_object_set_property (obj, property_name, &value); + g_value_unset (&value); + } + g_object_thaw_notify (obj); +} + +static GVariant * +prompter_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + g_return_val_if_reached (NULL); +} + +static gboolean +prompter_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + g_return_val_if_reached (FALSE); +} + +static void +on_caller_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GcrSystemPrompter *self = GCR_SYSTEM_PROMPTER (user_data); + GQueue queue = G_QUEUE_INIT; + Callback *callback; + GHashTableIter iter; + + g_hash_table_iter_init (&iter, self->pv->callbacks); + while (g_hash_table_iter_next (&iter, (gpointer *)&callback, NULL)) { + if (g_strcmp0 (name, callback->name) == 0) + g_queue_push_tail (&queue, callback); + } + + while ((callback = g_queue_pop_head (&queue)) != NULL) { + g_debug ("caller vanished for callback %s@%s", + callback->path, callback->name); + prompt_stop_prompting (self, callback, FALSE, FALSE); + } +} + +static void +prompter_method_begin_prompting (GcrSystemPrompter *self, + GDBusMethodInvocation *invocation, + GVariant *parameters) +{ + Callback lookup; + Callback *callback; + const gchar *caller; + guint watch_id; + + lookup.name = caller = g_dbus_method_invocation_get_sender (invocation); + g_variant_get (parameters, "(&o)", &lookup.path); + + g_debug ("received %s call from callback %s@%s", + GCR_DBUS_PROMPTER_METHOD_BEGIN, + lookup.path, lookup.name); + + if (g_hash_table_lookup (self->pv->callbacks, &lookup)) { + g_debug ("already begun prompting for callback %s@%s", + lookup.path, lookup.name); + g_dbus_method_invocation_return_error_literal (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "Already begun prompting for this prompt callback"); + return; + } + + callback = callback_dup (&lookup); + watch_id = g_bus_watch_name_on_connection (self->pv->connection, caller, + G_BUS_NAME_WATCHER_FLAGS_NONE, + NULL, on_caller_vanished, + self, NULL); + g_hash_table_insert (self->pv->callbacks, callback, GUINT_TO_POINTER (watch_id)); + + g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); + + g_queue_push_tail (&self->pv->waiting, callback); + g_object_notify (G_OBJECT (self), "prompting"); + + prompt_next_ready (self); +} + +static void +on_prompt_password (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ActivePrompt *active = user_data; + const gchar *reply; + GError *error = NULL; + const gchar *response; + + g_assert (active->ready == FALSE); + g_assert (active->callback != NULL); + + g_debug ("completed password prompt for callback %s@%s", + active->callback->name, active->callback->path); + + reply = gcr_prompt_password_finish (GCR_PROMPT (source), result, &error); + if (error != NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("prompting failed: %s", error->message); + g_clear_error (&error); + } + + if (reply == NULL) + response = "no"; + else + response = "yes"; + + prompt_send_ready (active, response, reply); + active_prompt_unref (active); +} + +static void +on_prompt_confirm (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ActivePrompt *active = user_data; + GcrPromptReply reply; + GError *error = NULL; + const gchar *response; + + g_assert (active->ready == FALSE); + g_assert (active->callback != NULL); + + g_debug ("completed confirm prompt for callback %s@%s", + active->callback->name, active->callback->path); + + reply = gcr_prompt_confirm_finish (GCR_PROMPT (source), result, &error); + if (error != NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("prompting failed: %s", error->message); + g_clear_error (&error); + } + + switch (reply) { + case GCR_PROMPT_REPLY_CONTINUE: + response = GCR_DBUS_PROMPT_REPLY_YES; + break; + case GCR_PROMPT_REPLY_CANCEL: + response = GCR_DBUS_PROMPT_REPLY_NO; + break; + default: + response = GCR_DBUS_PROMPT_REPLY_NONE; + g_warn_if_reached (); + break; + } + + prompt_send_ready (active, response, NULL); + active_prompt_unref (active); +} + +static void +prompter_method_perform_prompt (GcrSystemPrompter *self, + GDBusMethodInvocation *invocation, + GVariant *parameters) +{ + GcrSecretExchange *exchange; + GError *error = NULL; + ActivePrompt *active; + Callback lookup; + const gchar *type; + GVariantIter *iter; + const gchar *received; + + lookup.name = g_dbus_method_invocation_get_sender (invocation); + g_variant_get (parameters, "(&o&sa{sv}&s)", + &lookup.path, &type, &iter, &received); + + g_debug ("received %s call from callback %s@%s", + GCR_DBUS_PROMPTER_METHOD_PERFORM, + lookup.path, lookup.name); + + active = g_hash_table_lookup (self->pv->active, &lookup); + if (active == NULL) { + g_debug ("not begun prompting for this callback %s@%s", + lookup.path, lookup.name); + error = g_error_new (G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "Not begun prompting for this prompt callback"); + + } else if (!active->ready) { + g_debug ("already performing prompt for this callback %s@%s", + lookup.path, lookup.name); + error = g_error_new (G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "Already performing a prompt for this prompt callback"); + } + + if (error != NULL) { + g_dbus_method_invocation_take_error (invocation, error); + g_variant_iter_free (iter); + return; + } + + g_assert (active != NULL); + prompt_update_properties (active->prompt, iter); + g_variant_iter_free (iter); + + exchange = active_prompt_get_secret_exchange (active); + if (!gcr_secret_exchange_receive (exchange, received)) { + g_debug ("received invalid secret exchange from callback %s@%s", + lookup.path, lookup.name); + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Invalid secret exchange received"); + return; + } + + active->received = TRUE; + + if (g_strcmp0 (type, GCR_DBUS_PROMPT_TYPE_CONFIRM) == 0) { + active->ready = FALSE; + g_debug ("starting confirm prompt for callback %s@%s", + lookup.path, lookup.name); + gcr_prompt_confirm_async (active->prompt, active->cancellable, + on_prompt_confirm, active_prompt_ref (active)); + + } else if (g_strcmp0 (type, GCR_DBUS_PROMPT_TYPE_PASSWORD) == 0) { + active->ready = FALSE; + g_debug ("starting password prompt for callback %s@%s", + lookup.path, lookup.name); + gcr_prompt_password_async (active->prompt, active->cancellable, + on_prompt_password, active_prompt_ref (active)); + + } else { + g_debug ("invalid type of prompt from callback %s@%s", + lookup.path, lookup.name); + g_dbus_method_invocation_return_error_literal (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Invalid type argument"); + return; + } + + g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); +} + +static void +prompter_method_stop_prompting (GcrSystemPrompter *self, + GDBusMethodInvocation *invocation, + GVariant *parameters) +{ + Callback lookup; + + lookup.name = g_dbus_method_invocation_get_sender (invocation); + g_variant_get (parameters, "(&o)", &lookup.path); + + g_debug ("received %s call from callback %s@%s", + GCR_DBUS_PROMPTER_METHOD_PERFORM, + lookup.path, lookup.name); + + prompt_stop_prompting (self, &lookup, TRUE, FALSE); + + g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); + prompt_next_ready (self); +} + +static void +prompter_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GcrSystemPrompter *self = GCR_SYSTEM_PROMPTER (user_data); + + g_return_if_fail (method_name != NULL); + + if (g_str_equal (method_name, GCR_DBUS_PROMPTER_METHOD_BEGIN)) { + prompter_method_begin_prompting (self, invocation, parameters); + + } else if (g_str_equal (method_name, GCR_DBUS_PROMPTER_METHOD_PERFORM)) { + prompter_method_perform_prompt (self, invocation, parameters); + + } else if (g_str_equal (method_name, GCR_DBUS_PROMPTER_METHOD_STOP)) { + prompter_method_stop_prompting (self, invocation, parameters); + + } else { + g_return_if_reached (); + } +} + +static GDBusInterfaceVTable prompter_dbus_vtable = { + prompter_method_call, + prompter_get_property, + prompter_set_property, +}; + +/** + * gcr_system_prompter_register: + * @self: the system prompter + * @connection: a DBus connection + * + * Register this system prompter on the DBus @connection. + * + * This makes the prompter available for clients to call. The prompter will + * remain registered until gcr_system_prompter_unregister() is called, or the + * prompter is unreferenced. + */ +void +gcr_system_prompter_register (GcrSystemPrompter *self, + GDBusConnection *connection) +{ + GError *error = NULL; + + g_return_if_fail (GCR_IS_SYSTEM_PROMPTER (self)); + g_return_if_fail (G_DBUS_CONNECTION (connection)); + g_return_if_fail (self->pv->prompter_registered == 0); + g_return_if_fail (self->pv->connection == NULL); + + g_debug ("registering prompter"); + + self->pv->connection = g_object_ref (connection); + + self->pv->prompter_registered = g_dbus_connection_register_object (connection, + GCR_DBUS_PROMPTER_OBJECT_PATH, + _gcr_dbus_prompter_interface_info (), + &prompter_dbus_vtable, + self, NULL, &error); + if (error != NULL) { + g_warning ("error registering prompter %s", egg_error_message (error)); + g_clear_error (&error); + } +} + +/** + * gcr_system_prompter_unregister: + * @self: the system prompter + * @wait: whether to wait for closing prompts + * + * Unregister this system prompter on the DBus @connection. + * + * The prompter must have previously been registered with gcr_system_prompter_register(). + * + * If @wait is set then this function will wait until all prompts have been closed + * or cancelled. This is usually only used by tests. + */ +void +gcr_system_prompter_unregister (GcrSystemPrompter *self, + gboolean wait) +{ + GList *callbacks; + GList *l; + + g_return_if_fail (GCR_IS_SYSTEM_PROMPTER (self)); + g_return_if_fail (self->pv->prompter_registered != 0); + + g_debug ("unregistering prompter"); + + callbacks = g_hash_table_get_keys (self->pv->callbacks); + for (l = callbacks; l != NULL; l = g_list_next (l)) + prompt_stop_prompting (self, l->data, TRUE, wait); + g_list_free (callbacks); + + g_assert (g_hash_table_size (self->pv->active) == 0); + g_assert (g_hash_table_size (self->pv->callbacks) == 0); + g_assert (g_queue_is_empty (&self->pv->waiting)); + + if (!g_dbus_connection_unregister_object (self->pv->connection, self->pv->prompter_registered)) + g_assert_not_reached (); + self->pv->prompter_registered = 0; + + g_clear_object (&self->pv->connection); +} + +/** + * gcr_system_prompter_new: + * @mode: the mode for the prompt + * @prompt_type: the gobject type for prompts created by this prompter + * + * Create a new system prompter service. This prompter won't do anything unless + * you connect to its signals and show appropriate prompts. + * + * If @prompt_type is zero, then the new-prompt signal must be handled and + * return a valid prompt object implementing the #GcrPrompt interface. + * + * If @prompt_type is non-zero then the #GType must implement the #GcrPrompt + * interface. + * + * Returns: (transfer full): a new prompter service + */ +GcrSystemPrompter * +gcr_system_prompter_new (GcrSystemPrompterMode mode, + GType prompt_type) +{ + if (prompt_type == 0) { + return g_object_new (GCR_TYPE_SYSTEM_PROMPTER, + "mode", mode, + NULL); + + } else { + return g_object_new (GCR_TYPE_SYSTEM_PROMPTER, + "mode", mode, + "prompt-type", prompt_type, + NULL); + } +} + +/** + * gcr_system_prompter_get_mode: + * @self: the prompter + * + * Get the mode for this prompter. + * + * Most system prompters only display one prompt at a time and therefore + * return %GCR_SYSTEM_PROMPTER_SINGLE. + * + * Returns: the prompter mode + */ +GcrSystemPrompterMode +gcr_system_prompter_get_mode (GcrSystemPrompter *self) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (self), GCR_SYSTEM_PROMPTER_SINGLE); + return self->pv->mode; +} + +/** + * gcr_system_prompter_get_prompt_type: + * @self: the prompter + * + * Get the #GType for prompts created by this prompter. + * + * The returned #GType will be a #GcrPrompt implementation. + * + * Returns: the prompt #GType + */ +GType +gcr_system_prompter_get_prompt_type (GcrSystemPrompter *self) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (self), 0); + return self->pv->prompt_type; +} + +/** + * gcr_system_prompter_get_prompting: + * @self: the prompter + * + * Get whether prompting or not. + * + * Returns: whether prompting or not + */ +gboolean +gcr_system_prompter_get_prompting (GcrSystemPrompter *self) +{ + g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (self), FALSE); + return g_hash_table_size (self->pv->callbacks); +} diff --git a/gcr/gcr-system-prompter.h b/gcr/gcr-system-prompter.h new file mode 100644 index 0000000..66fafd9 --- /dev/null +++ b/gcr/gcr-system-prompter.h @@ -0,0 +1,90 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_SYSTEM_PROMPTER_H__ +#define __GCR_SYSTEM_PROMPTER_H__ + +#include "gcr-prompt.h" +#include "gcr-secret-exchange.h" +#include "gcr-types.h" + +#include + +G_BEGIN_DECLS + +typedef enum { + GCR_SYSTEM_PROMPTER_SINGLE, + GCR_SYSTEM_PROMPTER_MULTIPLE +} GcrSystemPrompterMode; + +#define GCR_TYPE_SYSTEM_PROMPTER (gcr_system_prompter_get_type ()) +#define GCR_SYSTEM_PROMPTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_SYSTEM_PROMPTER, GcrSystemPrompter)) +#define GCR_SYSTEM_PROMPTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_SYSTEM_PROMPTER, GcrSystemPrompterClass)) +#define GCR_IS_SYSTEM_PROMPTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_SYSTEM_PROMPTER)) +#define GCR_IS_SYSTEM_PROMPTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_SYSTEM_PROMPTER)) +#define GCR_SYSTEM_PROMPTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_SYSTEM_PROMPTER, GcrSystemPrompterClass)) + +typedef struct _GcrSystemPrompter GcrSystemPrompter; +typedef struct _GcrSystemPrompterClass GcrSystemPrompterClass; +typedef struct _GcrSystemPrompterPrivate GcrSystemPrompterPrivate; + +struct _GcrSystemPrompter { + GObject parent; + + /*< private >*/ + GcrSystemPrompterPrivate *pv; +}; + +struct _GcrSystemPrompterClass { + GObjectClass parent_class; + + /* signals */ + + GcrPrompt * (* new_prompt) (GcrSystemPrompter *self); + + /*< private >*/ + gpointer padding[7]; +}; + +GType gcr_system_prompter_get_type (void) G_GNUC_CONST; + +GcrSystemPrompter * gcr_system_prompter_new (GcrSystemPrompterMode mode, + GType prompt_type); + +GcrSystemPrompterMode gcr_system_prompter_get_mode (GcrSystemPrompter *self); + +GType gcr_system_prompter_get_prompt_type (GcrSystemPrompter *self); + +gboolean gcr_system_prompter_get_prompting (GcrSystemPrompter *self); + +void gcr_system_prompter_register (GcrSystemPrompter *self, + GDBusConnection *connection); + +void gcr_system_prompter_unregister (GcrSystemPrompter *self, + gboolean wait); + +G_END_DECLS + +#endif /* __GCR_SYSTEM_PROMPTER_H__ */ diff --git a/gcr/gcr-trust.c b/gcr/gcr-trust.c new file mode 100644 index 0000000..4c20c7d --- /dev/null +++ b/gcr/gcr-trust.c @@ -0,0 +1,862 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-types.h" +#include "gcr-internal.h" +#include "gcr-library.h" +#include "gcr-trust.h" + +#include "gck/gck.h" +#include "gck/pkcs11n.h" +#include "gck/pkcs11i.h" +#include "gck/pkcs11x.h" + +#include + +/** + * SECTION:gcr-trust + * @title: Trust Storage and Lookups + * @short_description: Store and lookup bits of information used for + * verifying certificates. + * + * These functions provide access to stored information about which + * certificates the system and user trusts as certificate authority trust + * anchors, or overrides to the normal verification of certificates. + * + * Trust anchors are used to verify the certificate authority in a certificate + * chain. Trust anchors are always valid for a given purpose. The most common + * purpose is the #GCR_PURPOSE_SERVER_AUTH and is used for a client application + * to verify that the certificate at the server side of a TLS connection is + * authorized to act as such. To check if a certificate is a trust anchor use + * gcr_trust_is_certificate_anchored(). + * + * Pinned certificates are used when a user overrides the default trust + * decision for a given certificate. They're often used with self-signed + * certificates. Pinned certificates are always only valid for a single peer + * such as the remote host with which TLS is being performed. To lookup + * pinned certificates use gcr_trust_is_certificate_pinned(). + * + * After the user has requested to override the trust decision + * about a given certificate then a pinned certificates can be added by using + * the gcr_trust_add_pinned_certificate() function. + * + * These functions do not constitute a viable method for verifying certificates + * used in TLS or other locations. Instead they support such verification + * by providing some of the needed data for a trust decision. + * + * The storage is provided by pluggable PKCS\#11 modules. + */ + +/** + * GCR_PURPOSE_SERVER_AUTH: + * + * The purpose used to verify the server certificate in a TLS connection. This + * is the most common purpose in use. + */ + +/** + * GCR_PURPOSE_CLIENT_AUTH: + * + * The purpose used to verify the client certificate in a TLS connection. + */ + +/** + * GCR_PURPOSE_CODE_SIGNING: + * + * The purpose used to verify certificate used for the signature on signed code. + */ + +/** + * GCR_PURPOSE_EMAIL: + * + * The purpose used to verify certificates that are used in email communication + * such as S/MIME. + */ + +/* ---------------------------------------------------------------------------------- + * HELPERS + */ + +typedef struct { + GckAttributes *attrs; + gboolean found; +} trust_closure; + +static void +trust_closure_free (gpointer data) +{ + trust_closure *closure = data; + gck_attributes_unref (closure->attrs); + g_free (closure); +} + +static void +prepare_trust_attrs (GcrCertificate *certificate, + CK_X_ASSERTION_TYPE type, + GckBuilder *builder) +{ + gconstpointer data; + gsize n_data; + + gck_builder_add_ulong (builder, CKA_CLASS, CKO_X_TRUST_ASSERTION); + gck_builder_add_ulong (builder, CKA_X_ASSERTION_TYPE, type); + + data = gcr_certificate_get_der_data (certificate, &n_data); + g_return_if_fail (data); + gck_builder_add_data (builder, CKA_X_CERTIFICATE_VALUE, data, n_data); +} + +/* ---------------------------------------------------------------------------------- + * GET PINNED CERTIFICATE + */ + +static GckAttributes * +prepare_is_certificate_pinned (GcrCertificate *certificate, const gchar *purpose, const gchar *peer) +{ + GckBuilder builder = GCK_BUILDER_INIT; + + prepare_trust_attrs (certificate, CKT_X_PINNED_CERTIFICATE, &builder); + + gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); + gck_builder_add_string (&builder, CKA_X_PEER, peer); + + return gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static gboolean +perform_is_certificate_pinned (GckAttributes *search, + GCancellable *cancellable, + GError **error) +{ + GckEnumerator *en; + GList *slots; + GckObject *object; + + if (!gcr_pkcs11_initialize (cancellable, error)) + return FALSE; + + slots = gcr_pkcs11_get_trust_lookup_slots (); + g_debug ("searching for pinned certificate in %d slots", + g_list_length (slots)); + en = gck_slots_enumerate_objects (slots, search, 0); + gck_list_unref_free (slots); + + object = gck_enumerator_next (en, cancellable, error); + g_object_unref (en); + + if (object) + g_object_unref (object); + + g_debug ("%s certificate anchor", object ? "found" : "did not find"); + return (object != NULL); +} + +/** + * gcr_trust_is_certificate_pinned: + * @certificate: a #GcrCertificate to check + * @purpose: the purpose string + * @peer: the peer for this pinned + * @cancellable: a #GCancellable + * @error: a #GError, or NULL + * + * Check if @certificate is pinned for @purpose to communicate with @peer. + * A pinned certificate overrides all other certificate verification. + * + * This call may block, see gcr_trust_is_certificate_pinned_async() for the + * non-blocking version. + * + * In the case of an error, %FALSE is also returned. Check @error to detect + * if an error occurred. + * + * Returns: %TRUE if the certificate is pinned for the host and purpose + */ +gboolean +gcr_trust_is_certificate_pinned (GcrCertificate *certificate, const gchar *purpose, + const gchar *peer, GCancellable *cancellable, GError **error) +{ + GckAttributes *search; + gboolean ret; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (certificate), FALSE); + g_return_val_if_fail (purpose, FALSE); + g_return_val_if_fail (peer, FALSE); + + search = prepare_is_certificate_pinned (certificate, purpose, peer); + g_return_val_if_fail (search, FALSE); + + ret = perform_is_certificate_pinned (search, cancellable, error); + gck_attributes_unref (search); + + return ret; +} + +static void +thread_is_certificate_pinned (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +{ + GError *error = NULL; + trust_closure *closure; + + closure = g_simple_async_result_get_op_res_gpointer (result); + closure->found = perform_is_certificate_pinned (closure->attrs, cancel, &error); + + if (error != NULL) { + g_simple_async_result_set_from_error (result, error); + g_clear_error (&error); + } +} + +/** + * gcr_trust_is_certificate_pinned_async: + * @certificate: a #GcrCertificate to check + * @purpose: the purpose string + * @peer: the peer for this pinned + * @cancellable: a #GCancellable + * @callback: a #GAsyncReadyCallback to call when the operation completes + * @user_data: the data to pass to callback function + * + * Check if @certificate is pinned for @purpose to communicate with @peer. A + * pinned certificate overrides all other certificate verification. + * + * When the operation is finished, callback will be called. You can then call + * gcr_trust_is_certificate_pinned_finish() to get the result of the + * operation. + */ +void +gcr_trust_is_certificate_pinned_async (GcrCertificate *certificate, const gchar *purpose, + const gchar *peer, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GSimpleAsyncResult *async; + trust_closure *closure; + + g_return_if_fail (GCR_CERTIFICATE (certificate)); + g_return_if_fail (purpose); + g_return_if_fail (peer); + + async = g_simple_async_result_new (NULL, callback, user_data, + gcr_trust_is_certificate_pinned_async); + closure = g_new0 (trust_closure, 1); + closure->attrs = prepare_is_certificate_pinned (certificate, purpose, peer); + g_return_if_fail (closure->attrs); + g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + + g_simple_async_result_run_in_thread (async, thread_is_certificate_pinned, + G_PRIORITY_DEFAULT, cancellable); + + g_object_unref (async); +} + +/** + * gcr_trust_is_certificate_pinned_finish: + * @result: the #GAsyncResult passed to the callback + * @error: a #GError, or NULL + * + * Finishes an asynchronous operation started by + * gcr_trust_is_certificate_pinned_async(). + * + * In the case of an error, %FALSE is also returned. Check @error to detect + * if an error occurred. + * + * Returns: %TRUE if the certificate is pinned. + */ +gboolean +gcr_trust_is_certificate_pinned_finish (GAsyncResult *result, GError **error) +{ + trust_closure *closure; + + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, + gcr_trust_is_certificate_pinned_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); + return closure->found; +} + +/* ---------------------------------------------------------------------------------- + * ADD PINNED CERTIFICATE + */ + +static GckAttributes * +prepare_add_pinned_certificate (GcrCertificate *certificate, const gchar *purpose, const gchar *peer) +{ + GckBuilder builder = GCK_BUILDER_INIT; + + prepare_trust_attrs (certificate, CKT_X_PINNED_CERTIFICATE, &builder); + + gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); + gck_builder_add_string (&builder, CKA_X_PEER, peer); + gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE); + + return gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static gboolean +perform_add_pinned_certificate (GckAttributes *search, + GCancellable *cancellable, + GError **error) +{ + GckBuilder builder = GCK_BUILDER_INIT; + gboolean ret = FALSE; + GError *lerr = NULL; + GckObject *object; + GckSession *session; + GckSlot *slot; + GckEnumerator *en; + GList *slots; + + if (!gcr_pkcs11_initialize (cancellable, error)) + return FALSE; + + slots = gcr_pkcs11_get_trust_lookup_slots (); + en = gck_slots_enumerate_objects (slots, search, CKF_RW_SESSION); + gck_list_unref_free (slots); + + object = gck_enumerator_next (en, cancellable, &lerr); + g_object_unref (en); + + if (lerr != NULL) { + g_propagate_error (error, lerr); + return FALSE; + } + + /* It already exists */ + if (object) { + g_object_unref (object); + return TRUE; + } + + gck_builder_add_all (&builder, search); + + /* TODO: Add relevant label */ + + /* Find an appropriate token */ + slot = gcr_pkcs11_get_trust_store_slot (); + if (slot == NULL) { + g_set_error (&lerr, GCK_ERROR, CKR_FUNCTION_FAILED, + /* Translators: A pinned certificate is an exception which + trusts a given certificate explicitly for a purpose and + communication with a certain peer. */ + _("Couldn’t find a place to store the pinned certificate")); + ret = FALSE; + } else { + session = gck_slot_open_session (slot, CKF_RW_SESSION, NULL, &lerr); + if (session != NULL) { + object = gck_session_create_object (session, gck_builder_end (&builder), + cancellable, &lerr); + if (object != NULL) { + g_object_unref (object); + ret = TRUE; + } + + g_object_unref (session); + } + + g_object_unref (slot); + } + + gck_builder_clear (&builder); + + if (!ret) + g_propagate_error (error, lerr); + + return ret; +} + +/** + * gcr_trust_add_pinned_certificate: + * @certificate: a #GcrCertificate + * @purpose: the purpose string + * @peer: the peer for this pinned certificate + * @cancellable: a #GCancellable + * @error: a #GError, or NULL + * + * Add a pinned @certificate for connections to @peer for @purpose. A pinned + * certificate overrides all other certificate verification and should be + * used with care. + * + * If the same pinned certificate already exists, then this operation + * does not add another, and succeeds without error. + * + * This call may block, see gcr_trust_add_pinned_certificate_async() for the + * non-blocking version. + * + * Returns: %TRUE if the pinned certificate is recorded successfully + */ +gboolean +gcr_trust_add_pinned_certificate (GcrCertificate *certificate, const gchar *purpose, const gchar *peer, + GCancellable *cancellable, GError **error) +{ + GckAttributes *search; + gboolean ret; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (certificate), FALSE); + g_return_val_if_fail (purpose, FALSE); + g_return_val_if_fail (peer, FALSE); + + search = prepare_add_pinned_certificate (certificate, purpose, peer); + g_return_val_if_fail (search, FALSE); + + ret = perform_add_pinned_certificate (search, cancellable, error); + gck_attributes_unref (search); + + return ret; +} + +static void +thread_add_pinned_certificate (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +{ + GError *error = NULL; + trust_closure *closure; + + closure = g_simple_async_result_get_op_res_gpointer (result); + perform_add_pinned_certificate (closure->attrs, cancel, &error); + + if (error != NULL) { + g_simple_async_result_set_from_error (result, error); + g_clear_error (&error); + } +} + +/** + * gcr_trust_add_pinned_certificate_async: + * @certificate: a #GcrCertificate + * @purpose: the purpose string + * @peer: the peer for this pinned certificate + * @cancellable: a #GCancellable + * @callback: a #GAsyncReadyCallback to call when the operation completes + * @user_data: the data to pass to callback function + * + * Add a pinned certificate for communication with @peer for @purpose. A pinned + * certificate overrides all other certificate verification and should be used + * with care. + * + * If the same pinned certificate already exists, then this operation + * does not add another, and succeeds without error. + * + * When the operation is finished, callback will be called. You can then call + * gcr_trust_add_pinned_certificate_finish() to get the result of the + * operation. + */ +void +gcr_trust_add_pinned_certificate_async (GcrCertificate *certificate, const gchar *purpose, + const gchar *peer, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GSimpleAsyncResult *async; + trust_closure *closure; + + g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); + g_return_if_fail (purpose); + g_return_if_fail (peer); + + async = g_simple_async_result_new (NULL, callback, user_data, + gcr_trust_add_pinned_certificate_async); + closure = g_new0 (trust_closure, 1); + closure->attrs = prepare_add_pinned_certificate (certificate, purpose, peer); + g_return_if_fail (closure->attrs); + g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + + g_simple_async_result_run_in_thread (async, thread_add_pinned_certificate, + G_PRIORITY_DEFAULT, cancellable); + + g_object_unref (async); +} + +/** + * gcr_trust_add_pinned_certificate_finish: + * @result: the #GAsyncResult passed to the callback + * @error: a #GError, or NULL + * + * Finishes an asynchronous operation started by + * gcr_trust_add_pinned_certificate_async(). + * + * Returns: %TRUE if the pinned certificate is recorded successfully + */ +gboolean +gcr_trust_add_pinned_certificate_finish (GAsyncResult *result, GError **error) +{ + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, + gcr_trust_add_pinned_certificate_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +/* ----------------------------------------------------------------------- + * REMOVE PINNED CERTIFICATE + */ + +static GckAttributes * +prepare_remove_pinned_certificate (GcrCertificate *certificate, const gchar *purpose, + const gchar *peer) +{ + GckBuilder builder = GCK_BUILDER_INIT; + + prepare_trust_attrs (certificate, CKT_X_PINNED_CERTIFICATE, &builder); + gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); + gck_builder_add_string (&builder, CKA_X_PEER, peer); + + return gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static gboolean +perform_remove_pinned_certificate (GckAttributes *attrs, + GCancellable *cancellable, + GError **error) +{ + GList *objects, *l; + GError *lerr = NULL; + GckEnumerator *en; + GList *slots; + + if (!gcr_pkcs11_initialize (cancellable, error)) + return FALSE; + + slots = gcr_pkcs11_get_trust_lookup_slots (); + en = gck_slots_enumerate_objects (slots, attrs, CKF_RW_SESSION); + gck_list_unref_free (slots); + + /* We need an error below */ + if (error && !*error) + *error = lerr; + + objects = gck_enumerator_next_n (en, -1, cancellable, error); + g_object_unref (en); + + if (*error) + return FALSE; + + for (l = objects; l; l = g_list_next (l)) { + if (!gck_object_destroy (l->data, cancellable, error)) { + + /* In case there's a race condition */ + if (g_error_matches (*error, GCK_ERROR, CKR_OBJECT_HANDLE_INVALID)) { + g_clear_error (error); + continue; + } + + gck_list_unref_free (objects); + return FALSE; + } + } + + gck_list_unref_free (objects); + return TRUE; +} + +/** + * gcr_trust_remove_pinned_certificate: + * @certificate: a #GcrCertificate + * @purpose: the purpose string + * @peer: the peer for this pinned certificate + * @cancellable: a #GCancellable + * @error: a #GError, or NULL + * + * Remove a pinned certificate for communication with @peer for @purpose. + * + * If the same pinned certificate does not exist, or was already removed, + * then this operation succeeds without error. + * + * This call may block, see gcr_trust_remove_pinned_certificate_async() for the + * non-blocking version. + * + * Returns: %TRUE if the pinned certificate no longer exists + */ +gboolean +gcr_trust_remove_pinned_certificate (GcrCertificate *certificate, const gchar *purpose, const gchar *peer, + GCancellable *cancellable, GError **error) +{ + GckAttributes *search; + gboolean ret; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (certificate), FALSE); + g_return_val_if_fail (purpose, FALSE); + g_return_val_if_fail (peer, FALSE); + + search = prepare_remove_pinned_certificate (certificate, purpose, peer); + g_return_val_if_fail (search, FALSE); + + ret = perform_remove_pinned_certificate (search, cancellable, error); + gck_attributes_unref (search); + + return ret; +} + +static void +thread_remove_pinned_certificate (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +{ + GError *error = NULL; + trust_closure *closure; + + closure = g_simple_async_result_get_op_res_gpointer (result); + perform_remove_pinned_certificate (closure->attrs, cancel, &error); + + if (error != NULL) { + g_simple_async_result_set_from_error (result, error); + g_clear_error (&error); + } +} + +/** + * gcr_trust_remove_pinned_certificate_async: + * @certificate: a #GcrCertificate + * @purpose: the purpose string + * @peer: the peer for this pinned certificate + * @cancellable: a #GCancellable + * @callback: a #GAsyncReadyCallback to call when the operation completes + * @user_data: the data to pass to callback function + * + * Remove a pinned certificate for communication with @peer for @purpose. + * + * If the same pinned certificate does not exist, or was already removed, + * then this operation succeeds without error. + * + * When the operation is finished, callback will be called. You can then call + * gcr_trust_remove_pinned_certificate_finish() to get the result of the + * operation. + */ +void +gcr_trust_remove_pinned_certificate_async (GcrCertificate *certificate, const gchar *purpose, + const gchar *peer, GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) +{ + GSimpleAsyncResult *async; + trust_closure *closure; + + g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); + g_return_if_fail (purpose); + g_return_if_fail (peer); + + async = g_simple_async_result_new (NULL, callback, user_data, + gcr_trust_remove_pinned_certificate_async); + closure = g_new0 (trust_closure, 1); + closure->attrs = prepare_remove_pinned_certificate (certificate, purpose, peer); + g_return_if_fail (closure->attrs); + g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + + g_simple_async_result_run_in_thread (async, thread_remove_pinned_certificate, + G_PRIORITY_DEFAULT, cancellable); + + g_object_unref (async); +} + +/** + * gcr_trust_remove_pinned_certificate_finish: + * @result: the #GAsyncResult passed to the callback + * @error: a #GError, or NULL + * + * Finishes an asynchronous operation started by + * gcr_trust_remove_pinned_certificate_async(). + * + * Returns: %TRUE if the pinned certificate no longer exists + */ +gboolean +gcr_trust_remove_pinned_certificate_finish (GAsyncResult *result, GError **error) +{ + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, + gcr_trust_remove_pinned_certificate_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + return TRUE; +} + +/* ---------------------------------------------------------------------------------- + * CERTIFICATE ROOT + */ + +static GckAttributes * +prepare_is_certificate_anchored (GcrCertificate *certificate, const gchar *purpose) +{ + GckBuilder builder = GCK_BUILDER_INIT; + + prepare_trust_attrs (certificate, CKT_X_ANCHORED_CERTIFICATE, &builder); + gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); + + return gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static gboolean +perform_is_certificate_anchored (GckAttributes *attrs, + GCancellable *cancellable, + GError **error) +{ + GckEnumerator *en; + GList *slots; + GckObject *object; + + if (!gcr_pkcs11_initialize (cancellable, error)) + return FALSE; + + slots = gcr_pkcs11_get_trust_lookup_slots (); + g_debug ("searching for certificate anchor in %d slots", + g_list_length (slots)); + en = gck_slots_enumerate_objects (slots, attrs, 0); + gck_list_unref_free (slots); + + object = gck_enumerator_next (en, cancellable, error); + g_object_unref (en); + + if (object != NULL) + g_object_unref (object); + + g_debug ("%s certificate anchor", object ? "found" : "did not find"); + return (object != NULL); +} + +/** + * gcr_trust_is_certificate_anchored: + * @certificate: a #GcrCertificate to check + * @purpose: the purpose string + * @cancellable: a #GCancellable + * @error: a #GError, or NULL + * + * Check if the @certificate is a trust anchor for the given @purpose. A trust + * anchor is used to verify the signatures on other certificates when verifying + * a certificate chain. Also known as a trusted certificate authority. + * + * This call may block, see gcr_trust_is_certificate_anchored_async() for the + * non-blocking version. + * + * In the case of an error, %FALSE is also returned. Check @error to detect + * if an error occurred. + * + * Returns: %TRUE if the certificate is a trust anchor + */ +gboolean +gcr_trust_is_certificate_anchored (GcrCertificate *certificate, const gchar *purpose, + GCancellable *cancellable, GError **error) +{ + GckAttributes *search; + gboolean ret; + + g_return_val_if_fail (GCR_IS_CERTIFICATE (certificate), FALSE); + g_return_val_if_fail (purpose, FALSE); + + search = prepare_is_certificate_anchored (certificate, purpose); + g_return_val_if_fail (search, FALSE); + + ret = perform_is_certificate_anchored (search, cancellable, error); + gck_attributes_unref (search); + + return ret; +} + +static void +thread_is_certificate_anchored (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +{ + GError *error = NULL; + trust_closure *closure; + + closure = g_simple_async_result_get_op_res_gpointer (result); + closure->found = perform_is_certificate_anchored (closure->attrs, cancel, &error); + + if (error != NULL) { + g_simple_async_result_set_from_error (result, error); + g_clear_error (&error); + } +} + +/** + * gcr_trust_is_certificate_anchored_async: + * @certificate: a #GcrCertificate to check + * @purpose: the purpose string + * @cancellable: a #GCancellable + * @callback: a #GAsyncReadyCallback to call when the operation completes + * @user_data: the data to pass to callback function + * + * Check if the @certificate is a trust anchor for the given @purpose. A trust + * anchor is used to verify the signatures on other certificates when verifying + * a certificate chain. Also known as a trusted certificate authority. + * + * When the operation is finished, callback will be called. You can then call + * gcr_trust_is_certificate_anchored_finish() to get the result of the operation. + */ +void +gcr_trust_is_certificate_anchored_async (GcrCertificate *certificate, const gchar *purpose, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *async; + trust_closure *closure; + + g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); + g_return_if_fail (purpose); + + async = g_simple_async_result_new (NULL, callback, user_data, + gcr_trust_is_certificate_anchored_async); + closure = g_new0 (trust_closure, 1); + closure->attrs = prepare_is_certificate_anchored (certificate, purpose); + g_return_if_fail (closure->attrs); + g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + + g_simple_async_result_run_in_thread (async, thread_is_certificate_anchored, + G_PRIORITY_DEFAULT, cancellable); + + g_object_unref (async); +} + +/** + * gcr_trust_is_certificate_anchored_finish: + * @result: the #GAsyncResult passed to the callback + * @error: a #GError, or NULL + * + * Finishes an asynchronous operation started by + * gcr_trust_is_certificate_anchored_async(). + * + * In the case of an error, %FALSE is also returned. Check @error to detect + * if an error occurred. + * + * Returns: %TRUE if the certificate is a trust anchor + */ +gboolean +gcr_trust_is_certificate_anchored_finish (GAsyncResult *result, GError **error) +{ + trust_closure *closure; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, + gcr_trust_is_certificate_anchored_async), FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return FALSE; + + closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); + return closure->found; +} diff --git a/gcr/gcr-trust.h b/gcr/gcr-trust.h new file mode 100644 index 0000000..379f363 --- /dev/null +++ b/gcr/gcr-trust.h @@ -0,0 +1,101 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_TRUST_H__ +#define __GCR_TRUST_H__ + +#include "gcr-certificate.h" +#include "gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_PURPOSE_SERVER_AUTH "1.3.6.1.5.5.7.3.1" +#define GCR_PURPOSE_CLIENT_AUTH "1.3.6.1.5.5.7.3.2" +#define GCR_PURPOSE_CODE_SIGNING "1.3.6.1.5.5.7.3.3" +#define GCR_PURPOSE_EMAIL "1.3.6.1.5.5.7.3.4" + +gboolean gcr_trust_is_certificate_pinned (GcrCertificate *certificate, + const gchar *purpose, + const gchar *peer, + GCancellable *cancellable, + GError **error); + +void gcr_trust_is_certificate_pinned_async (GcrCertificate *certificate, + const gchar *purpose, + const gchar *peer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_trust_is_certificate_pinned_finish (GAsyncResult *result, + GError **error); + +gboolean gcr_trust_add_pinned_certificate (GcrCertificate *certificate, + const gchar *purpose, + const gchar *peer, + GCancellable *cancellable, + GError **error); + +void gcr_trust_add_pinned_certificate_async (GcrCertificate *certificate, + const gchar *purpose, + const gchar *peer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_trust_add_pinned_certificate_finish (GAsyncResult *result, + GError **error); + +gboolean gcr_trust_remove_pinned_certificate (GcrCertificate *certificate, + const gchar *purpose, + const gchar *peer, + GCancellable *cancellable, + GError **error); + +void gcr_trust_remove_pinned_certificate_async (GcrCertificate *certificate, + const gchar *purpose, + const gchar *peer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_trust_remove_pinned_certificate_finish (GAsyncResult *result, + GError **error); + +gboolean gcr_trust_is_certificate_anchored (GcrCertificate *certificate, + const gchar *purpose, + GCancellable *cancellable, + GError **error); + +void gcr_trust_is_certificate_anchored_async (GcrCertificate *certificate, + const gchar *purpose, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gcr_trust_is_certificate_anchored_finish (GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __GCR_TOKEN_MANAGER_H__ */ diff --git a/gcr/gcr-types.h b/gcr/gcr-types.h new file mode 100644 index 0000000..095615a --- /dev/null +++ b/gcr/gcr-types.h @@ -0,0 +1,123 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCRTYPES_H_ +#define GCRTYPES_H_ + +#include + +#ifndef GCK_API_SUBJECT_TO_CHANGE + +#ifndef __GI_SCANNER__ +#define GCK_API_SUBJECT_TO_CHANGE 1 +#define __GCR_DEFINED_GCK_SUBJECT_TO_CHANGE__ 1 +#endif + +#endif + +#include + +#ifdef __GCR_DEFINED_GCK_SUBJECT_TO_CHANGE__ +#undef GCK_API_SUBJECT_TO_CHANGE +#endif + +G_BEGIN_DECLS + +#define GCR_DATA_ERROR (gcr_data_error_get_domain ()) + +GQuark gcr_data_error_get_domain (void) G_GNUC_CONST; + +typedef enum { + GCR_ERROR_FAILURE = -1, + GCR_ERROR_UNRECOGNIZED = 1, + GCR_ERROR_CANCELLED = 2, + GCR_ERROR_LOCKED = 3 +} GcrDataError; + +typedef enum { + GCR_FORMAT_ALL = -1, + GCR_FORMAT_INVALID = 0, + + GCR_FORMAT_DER_PRIVATE_KEY = 100, + GCR_FORMAT_DER_PRIVATE_KEY_RSA, + GCR_FORMAT_DER_PRIVATE_KEY_DSA, + GCR_FORMAT_DER_PRIVATE_KEY_EC, + + GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY = 150, + + GCR_FORMAT_DER_CERTIFICATE_X509 = 200, + + GCR_FORMAT_DER_PKCS7 = 300, + + GCR_FORMAT_DER_PKCS8 = 400, + GCR_FORMAT_DER_PKCS8_PLAIN, + GCR_FORMAT_DER_PKCS8_ENCRYPTED, + + GCR_FORMAT_DER_PKCS10 = 450, + GCR_FORMAT_DER_SPKAC = 455, + GCR_FORMAT_BASE64_SPKAC, + + GCR_FORMAT_DER_PKCS12 = 500, + + GCR_FORMAT_OPENSSH_PUBLIC = 600, + + GCR_FORMAT_OPENPGP_PACKET = 700, + GCR_FORMAT_OPENPGP_ARMOR, + + GCR_FORMAT_PEM = 1000, + GCR_FORMAT_PEM_PRIVATE_KEY_RSA, + GCR_FORMAT_PEM_PRIVATE_KEY_DSA, + GCR_FORMAT_PEM_CERTIFICATE_X509, + GCR_FORMAT_PEM_PKCS7, + GCR_FORMAT_PEM_PKCS8_PLAIN, + GCR_FORMAT_PEM_PKCS8_ENCRYPTED, + GCR_FORMAT_PEM_PKCS12, + GCR_FORMAT_PEM_PRIVATE_KEY, + GCR_FORMAT_PEM_PKCS10, + GCR_FORMAT_PEM_PRIVATE_KEY_EC, + GCR_FORMAT_PEM_PUBLIC_KEY, +} GcrDataFormat; + +/* + * Special PKCS#11 style attributes that we use internally in GCR. + * These are used by GcrParser the most + */ + +enum { + /* An object class representing GcrRecord/gnupg-colons style data */ + CKO_GCR_GNUPG_RECORDS = (CKO_VENDOR_DEFINED | 0x47435200UL /* GCR0 */), + + CKO_GCR_CERTIFICATE_REQUEST, + CKA_GCR_CERTIFICATE_REQUEST_TYPE, +}; + +enum { + CKQ_GCR_PKCS10 = 1, + CKQ_GCR_SPKAC +}; + +G_END_DECLS + +#endif /* GCRTYPES_H_ */ diff --git a/gcr/gcr-union-collection.c b/gcr/gcr-union-collection.c new file mode 100644 index 0000000..13a416c --- /dev/null +++ b/gcr/gcr-union-collection.c @@ -0,0 +1,354 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-collection.h" +#include "gcr-internal.h" +#include "gcr-union-collection.h" + +#include + +/** + * SECTION:gcr-union-collection + * @title: GcrUnionCollection + * @short_description: A GcrCollection which combines other collections + * + * An implementation of #GcrCollection, which combines the objects in + * other #GcrCollections. Use gcr_union_collection_add() to add and + * gcr_union_collection_remove() to remove them. + */ + +/** + * GcrUnionCollection: + * + * A union implementation of #GcrCollection. + */ + +/** + * GcrUnionCollectionClass: + * @parent_class: The parent class + * + * The class for #GcrUnionCollection. + */ + +struct _GcrUnionCollectionPrivate { + GHashTable *items; + GHashTable *collections; +}; + +static void gcr_collection_iface (GcrCollectionIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrUnionCollection, gcr_union_collection, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_collection_iface)); + +static void +on_collection_added (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + GcrUnionCollection *self = GCR_UNION_COLLECTION (user_data); + gint *count; + + g_object_ref (object); + + count = g_hash_table_lookup (self->pv->items, object); + if (count == NULL) { + count = g_new0 (gint, 1); + *count = 1; + g_hash_table_insert (self->pv->items, object, count); + gcr_collection_emit_added (GCR_COLLECTION (self), object); + } else { + g_assert (*count > 0); + (*count)++; + } + + g_object_unref (object); +} + +static void +on_collection_removed (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + GcrUnionCollection *self = GCR_UNION_COLLECTION (user_data); + gint *count; + + g_object_ref (object); + + count = g_hash_table_lookup (self->pv->items, object); + if (count != NULL) { + g_assert (*count > 0); + (*count)--; + + if (*count == 0) { + g_hash_table_remove (self->pv->items, object); + gcr_collection_emit_removed (GCR_COLLECTION (self), object); + } + } else { + g_warning ("Object of type %s that exists in an underlying " + "collection of a GcrUnionCollection appeared without " + "emitting 'added' signal.", G_OBJECT_TYPE_NAME (object)); + } + + g_object_unref (object); + +} + +static void +connect_to_collection (GcrUnionCollection *self, + GcrCollection *collection) +{ + g_signal_connect (collection, "added", G_CALLBACK (on_collection_added), self); + g_signal_connect (collection, "removed", G_CALLBACK (on_collection_removed), self); +} + +static void +disconnect_from_collection (GcrUnionCollection *self, + GcrCollection *collection) +{ + g_signal_handlers_disconnect_by_func (collection, on_collection_added, self); + g_signal_handlers_disconnect_by_func (collection, on_collection_removed, self); +} + +static void +gcr_union_collection_init (GcrUnionCollection *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_UNION_COLLECTION, GcrUnionCollectionPrivate); + self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, g_free); + self->pv->collections = g_hash_table_new_full (g_direct_hash, g_direct_equal, + g_object_unref, NULL); +} + +static void +gcr_union_collection_dispose (GObject *obj) +{ + GcrUnionCollection *self = GCR_UNION_COLLECTION (obj); + GHashTableIter iter; + GcrCollection *collection; + + g_hash_table_iter_init (&iter, self->pv->collections); + while (g_hash_table_iter_next (&iter, (gpointer *)&collection, NULL)) + disconnect_from_collection (self, collection); + g_hash_table_remove_all (self->pv->collections); + g_hash_table_remove_all (self->pv->items); + + G_OBJECT_CLASS (gcr_union_collection_parent_class)->dispose (obj); +} + +static void +gcr_union_collection_finalize (GObject *obj) +{ + GcrUnionCollection *self = GCR_UNION_COLLECTION (obj); + + g_assert (g_hash_table_size (self->pv->items) == 0); + g_hash_table_destroy (self->pv->items); + + g_assert (g_hash_table_size (self->pv->collections) == 0); + g_hash_table_destroy (self->pv->collections); + + G_OBJECT_CLASS (gcr_union_collection_parent_class)->finalize (obj); +} + +static void +gcr_union_collection_class_init (GcrUnionCollectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = gcr_union_collection_dispose; + gobject_class->finalize = gcr_union_collection_finalize; + g_type_class_add_private (gobject_class, sizeof (GcrUnionCollectionPrivate)); +} + +static guint +gcr_union_collection_real_get_length (GcrCollection *coll) +{ + GcrUnionCollection *self = GCR_UNION_COLLECTION (coll); + return g_hash_table_size (self->pv->items); +} + +static GList* +gcr_union_collection_real_get_objects (GcrCollection *coll) +{ + GcrUnionCollection *self = GCR_UNION_COLLECTION (coll); + return g_hash_table_get_keys (self->pv->items); +} + +static gboolean +gcr_union_collection_real_contains (GcrCollection *collection, + GObject *object) +{ + GcrUnionCollection *self = GCR_UNION_COLLECTION (collection); + return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE; +} + +static void +gcr_collection_iface (GcrCollectionIface *iface) +{ + iface->get_length = gcr_union_collection_real_get_length; + iface->get_objects = gcr_union_collection_real_get_objects; + iface->contains = gcr_union_collection_real_contains; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_union_collection_new: + * + * Create a new #GcrUnionCollection. + * + * Returns: (transfer full) (type Gcr.UnionCollection): a newly allocated + * collection, which should be freed with g_object_unref() + */ +GcrCollection * +gcr_union_collection_new (void) +{ + return g_object_new (GCR_TYPE_UNION_COLLECTION, NULL); +} + +/** + * gcr_union_collection_add: + * @self: The union collection + * @collection: The collection whose objects to add + * + * Add objects from this collection to the union + */ +void +gcr_union_collection_add (GcrUnionCollection *self, + GcrCollection *collection) +{ + g_return_if_fail (GCR_IS_UNION_COLLECTION (self)); + g_return_if_fail (GCR_IS_COLLECTION (collection)); + gcr_union_collection_take (self, g_object_ref (collection)); +} + +/** + * gcr_union_collection_take: + * @self: The union collection + * @collection: The collection whose objects to add + * + * Add objects from this collection to the union. Do not add an additional + * reference to the collection. + */ +void +gcr_union_collection_take (GcrUnionCollection *self, + GcrCollection *collection) +{ + GList *objects, *l; + + g_return_if_fail (GCR_IS_UNION_COLLECTION (self)); + g_return_if_fail (GCR_IS_COLLECTION (collection)); + g_return_if_fail (!g_hash_table_lookup (self->pv->collections, collection)); + + g_object_ref (collection); + + g_hash_table_insert (self->pv->collections, collection, collection); + connect_to_collection (self, collection); + + objects = gcr_collection_get_objects (collection); + for (l = objects; l != NULL; l = g_list_next (l)) + on_collection_added (collection, l->data, self); + g_list_free (objects); + + g_object_unref (collection); +} + +/** + * gcr_union_collection_remove: + * @self: The collection + * @collection: The collection whose objects to remove + * + * Remove an object from the collection. + */ +void +gcr_union_collection_remove (GcrUnionCollection *self, + GcrCollection *collection) +{ + GList *objects, *l; + + g_return_if_fail (GCR_IS_UNION_COLLECTION (self)); + g_return_if_fail (GCR_IS_COLLECTION (collection)); + g_return_if_fail (g_hash_table_lookup (self->pv->collections, collection)); + + g_object_ref (collection); + + g_hash_table_remove (self->pv->collections, collection); + disconnect_from_collection (self, collection); + + objects = gcr_collection_get_objects (collection); + for (l = objects; l != NULL; l = g_list_next (l)) + on_collection_removed (collection, l->data, self); + g_list_free (objects); + + g_object_unref (collection); +} + +/** + * gcr_union_collection_have: + * @self: the union collection + * @collection: the collection to check + * + * Check whether the collection is present in the union. + * + * Returns: whether present or not + */ +gboolean +gcr_union_collection_have (GcrUnionCollection *self, + GcrCollection *collection) +{ + g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), FALSE); + g_return_val_if_fail (GCR_IS_COLLECTION (collection), FALSE); + return g_hash_table_lookup (self->pv->collections, collection) != NULL; +} + +/** + * gcr_union_collection_size: + * @self: the union collection + * + * Return the number of collections in this union. This does not reflect + * the number of objects in the combined collection. + * + * Returns: number of collections inlcuded + */ +guint +gcr_union_collection_size (GcrUnionCollection *self) +{ + g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), FALSE); + return g_hash_table_size (self->pv->collections); +} + +/** + * gcr_union_collection_elements: + * @self: the union collection + * + * Get the collections that have been added to this union. + * + * Returns: (element-type Gcr.Collection) (transfer container): collections + * added to the union + */ +GList * +gcr_union_collection_elements (GcrUnionCollection *self) +{ + g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), NULL); + return g_hash_table_get_values (self->pv->collections); +} diff --git a/gcr/gcr-union-collection.h b/gcr/gcr-union-collection.h new file mode 100644 index 0000000..bae1a58 --- /dev/null +++ b/gcr/gcr-union-collection.h @@ -0,0 +1,75 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_UNION_COLLECTION_H__ +#define __GCR_UNION_COLLECTION_H__ + +#include "gcr-collection.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_UNION_COLLECTION (gcr_union_collection_get_type ()) +#define GCR_UNION_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrUnionCollection)) +#define GCR_UNION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION, GcrUnionCollectionClass)) +#define GCR_IS_UNION_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION)) +#define GCR_IS_UNION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION)) +#define GCR_UNION_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION, GcrUnionCollectionClass)) + +typedef struct _GcrUnionCollection GcrUnionCollection; +typedef struct _GcrUnionCollectionClass GcrUnionCollectionClass; +typedef struct _GcrUnionCollectionPrivate GcrUnionCollectionPrivate; + +struct _GcrUnionCollection { + GObject parent; + + /*< private >*/ + GcrUnionCollectionPrivate *pv; +}; + +struct _GcrUnionCollectionClass { + GObjectClass parent_class; +}; + +GType gcr_union_collection_get_type (void); + +GcrCollection* gcr_union_collection_new (void); + +void gcr_union_collection_add (GcrUnionCollection *self, + GcrCollection *collection); + +void gcr_union_collection_take (GcrUnionCollection *self, + GcrCollection *collection); + +void gcr_union_collection_remove (GcrUnionCollection *self, + GcrCollection *collection); + +gboolean gcr_union_collection_have (GcrUnionCollection *self, + GcrCollection *collection); + +guint gcr_union_collection_size (GcrUnionCollection *self); + +GList * gcr_union_collection_elements (GcrUnionCollection *self); + +G_END_DECLS + +#endif /* __GCR_UNION_COLLECTION_H__ */ diff --git a/gcr/gcr-unlock-options.h b/gcr/gcr-unlock-options.h new file mode 100644 index 0000000..f7b4adf --- /dev/null +++ b/gcr/gcr-unlock-options.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_UNLOCK_OPTIONS_H__ +#define __GCR_UNLOCK_OPTIONS_H__ + +G_BEGIN_DECLS + +#define GCR_UNLOCK_OPTION_ALWAYS "always" +#define GCR_UNLOCK_OPTION_SESSION "session" +#define GCR_UNLOCK_OPTION_TIMEOUT "timeout" +#define GCR_UNLOCK_OPTION_IDLE "idle" + +G_END_DECLS + +#endif /* __GCR_UNLOCK_OPTIONS_H__ */ diff --git a/gcr/gcr-util.c b/gcr/gcr-util.c new file mode 100644 index 0000000..7497ca2 --- /dev/null +++ b/gcr/gcr-util.c @@ -0,0 +1,66 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-util.h" + +#include + +/** + * _gcr_util_parse_lines: + * @string: The string to parse lines from, will be modified + * @last_line: Whether or not we should run for last line or not + * @callback: Call for each line + * @user_data: Data for callback + * + * Calls callback for each line. If last_line, also sends the remainder + * data that comes after the last line break. \n and \r\n are line separators. + * Neither are included in data passed to callback. + */ +void +_gcr_util_parse_lines (GString *string, gboolean last_line, + GcrLineCallback callback, gpointer user_data) +{ + gchar *ptr; + gchar *prev; + + g_return_if_fail (string); + g_return_if_fail (callback); + + /* Print all stderr lines as messages */ + while ((ptr = strchr (string->str, '\n')) != NULL) { + *ptr = '\0'; + if (ptr != string->str) { + prev = ptr - 1; + if (*prev == '\r') + *prev = '\0'; + } + + (callback) (string->str, user_data); + g_string_erase (string, 0, ptr - string->str + 1); + } + + if (last_line && string->len) { + (callback) (string->str, user_data); + g_string_erase (string, 0, string->len); + } +} diff --git a/gcr/gcr-util.h b/gcr/gcr-util.h new file mode 100644 index 0000000..a5358fc --- /dev/null +++ b/gcr/gcr-util.h @@ -0,0 +1,39 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_UTIL_H +#define GCR_UTIL_H + +#include + +G_BEGIN_DECLS + +typedef void (*GcrLineCallback) (const gchar *line, + gpointer user_data); + +void _gcr_util_parse_lines (GString *string, + gboolean last_line, + GcrLineCallback callback, + gpointer user_data); + +G_END_DECLS + +#endif /* __GCR_TOKEN_MANAGER_H__ */ diff --git a/gcr/gcr-version.h b/gcr/gcr-version.h new file mode 100644 index 0000000..18afadb --- /dev/null +++ b/gcr/gcr-version.h @@ -0,0 +1,44 @@ +/* + * gnome-keyring + * + * Copyright (C) 2013 Stef Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_VERSION_H__ +#define __GCR_VERSION_H__ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +/* compile time version + */ +#define GCR_MAJOR_VERSION (3) +#define GCR_MINOR_VERSION (28) +#define GCR_MICRO_VERSION (0) + +/* check whether a Gcr version equal to or greater than + * major.minor.micro. + */ +#define GCR_CHECK_VERSION(major,minor,micro) \ + (GCR_MAJOR_VERSION > (major) || \ + (GCR_MAJOR_VERSION == (major) && GCR_MINOR_VERSION > (minor)) || \ + (GCR_MAJOR_VERSION == (major) && GCR_MINOR_VERSION == (minor) && \ + GCR_MICRO_VERSION >= (micro))) + +#endif /* __GCR_VERSION_H__ */ diff --git a/gcr/gcr-version.h.in b/gcr/gcr-version.h.in new file mode 100644 index 0000000..81a5b4a --- /dev/null +++ b/gcr/gcr-version.h.in @@ -0,0 +1,44 @@ +/* + * gnome-keyring + * + * Copyright (C) 2013 Stef Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_VERSION_H__ +#define __GCR_VERSION_H__ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +/* compile time version + */ +#define GCR_MAJOR_VERSION (@GCR_MAJOR@) +#define GCR_MINOR_VERSION (@GCR_MINOR@) +#define GCR_MICRO_VERSION (@GCR_MICRO@) + +/* check whether a Gcr version equal to or greater than + * major.minor.micro. + */ +#define GCR_CHECK_VERSION(major,minor,micro) \ + (GCR_MAJOR_VERSION > (major) || \ + (GCR_MAJOR_VERSION == (major) && GCR_MINOR_VERSION > (minor)) || \ + (GCR_MAJOR_VERSION == (major) && GCR_MINOR_VERSION == (minor) && \ + GCR_MICRO_VERSION >= (micro))) + +#endif /* __GCR_VERSION_H__ */ diff --git a/gcr/gcr.h b/gcr/gcr.h new file mode 100644 index 0000000..966163a --- /dev/null +++ b/gcr/gcr.h @@ -0,0 +1,36 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_API_SUBJECT_TO_CHANGE +#error "This API has not yet reached stability." +#endif + +#ifndef __GCR_H__ +#define __GCR_H__ + +#include + +#include "gcr/gcr-base.h" +#include "ui/gcr-ui.h" + +#undef __GCR_INSIDE_HEADER__ + +#endif /* __GCR_H__ */ diff --git a/gcr/org.gnome.keyring.PrivatePrompter.service.in b/gcr/org.gnome.keyring.PrivatePrompter.service.in new file mode 100644 index 0000000..542a376 --- /dev/null +++ b/gcr/org.gnome.keyring.PrivatePrompter.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.gnome.keyring.PrivatePrompter +Exec=@libexecdir@/gcr-prompter diff --git a/gcr/org.gnome.keyring.Prompter.xml b/gcr/org.gnome.keyring.Prompter.xml new file mode 100644 index 0000000..5e68ed8 --- /dev/null +++ b/gcr/org.gnome.keyring.Prompter.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gcr/org.gnome.keyring.SystemPrompter.service.in b/gcr/org.gnome.keyring.SystemPrompter.service.in new file mode 100644 index 0000000..8d0063c --- /dev/null +++ b/gcr/org.gnome.keyring.SystemPrompter.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.gnome.keyring.SystemPrompter +Exec=@libexecdir@/gcr-prompter diff --git a/gcr/test-certificate-chain.c b/gcr/test-certificate-chain.c new file mode 100644 index 0000000..7a2f40b --- /dev/null +++ b/gcr/test-certificate-chain.c @@ -0,0 +1,714 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-internal.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-testing.h" + +#include "gck/gck-mock.h" +#include "gck/gck-test.h" +#include +#include "gck/pkcs11x.h" + +#include + +#include +#include + +/* --------------------------------------------------------------------------- + * A Mock certificate that checks that it's always called on the + * same thread. A GcrCertificate implemented on top of a non-thread-safe + * crypto library would require this behavior. + */ + +GType mock_certificate_get_type (void); + +#define MOCK_CERTIFICATE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), mock_certificate_get_type (), MockCertificate)) + +typedef struct _MockCertificate { + GObject parent; + GThread *created_on; + gpointer data; + gsize n_data; +} MockCertificate; + +typedef struct _MockCertificateClass { + GObjectClass parent_class; +} MockCertificateClass; + +static void mock_certificate_iface (GcrCertificateIface *iface); +G_DEFINE_TYPE_WITH_CODE (MockCertificate, mock_certificate, G_TYPE_OBJECT, + GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE (); + G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, mock_certificate_iface); +); + +static void +mock_certificate_init (MockCertificate *self) +{ + self->created_on = g_thread_self (); +} + +static void +mock_certificate_finalize (GObject *obj) +{ + MockCertificate *self = MOCK_CERTIFICATE (obj); + g_assert (self->created_on == g_thread_self ()); + g_free (self->data); + G_OBJECT_CLASS (mock_certificate_parent_class)->finalize (obj); +} + +static void +mock_certificate_class_init (MockCertificateClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = mock_certificate_finalize; + gobject_class->get_property = gcr_certificate_mixin_get_property; + gcr_certificate_mixin_class_init (gobject_class); +} + +static gconstpointer +mock_certificate_real_get_der_data (GcrCertificate *base, gsize *n_data) +{ + MockCertificate *self = MOCK_CERTIFICATE (base); + g_assert (self->created_on == g_thread_self ()); + *n_data = self->n_data; + return self->data; +} + +static void +mock_certificate_iface (GcrCertificateIface *iface) +{ + iface->get_der_data = (gpointer)mock_certificate_real_get_der_data; +} + +static GcrCertificate* +mock_certificate_new (gconstpointer data, gsize n_data) +{ + MockCertificate *self = g_object_new (mock_certificate_get_type (), NULL); + self->data = g_memdup (data, n_data); + self->n_data = n_data; + g_assert (self->created_on == g_thread_self ()); + return GCR_CERTIFICATE (self); +} + +/* ---------------------------------------------------------------------------- + * TESTS + */ + +typedef struct { + /* A self signed certificate */ + GcrCertificate *cert_self; + + /* Simple CA + issued */ + GcrCertificate *cert_ca; + GcrCertificate *cert_signed; + + /* Root + intermediate + issued */ + GcrCertificate *cert_root; + GcrCertificate *cert_inter; + GcrCertificate *cert_host; + + CK_FUNCTION_LIST funcs; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GList *modules = NULL; + CK_FUNCTION_LIST_PTR f; + gchar *contents; + gsize n_contents; + const gchar *uris[2]; + CK_RV rv; + GckModule *module; + + rv = gck_mock_C_GetFunctionList (&f); + gck_assert_cmprv (rv, ==, CKR_OK); + memcpy (&test->funcs, f, sizeof (test->funcs)); + + /* Open a session */ + rv = (test->funcs.C_Initialize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); + + g_assert (!modules); + module = gck_module_new (&test->funcs); + modules = g_list_prepend (modules, module); + gcr_pkcs11_set_modules (modules); + uris[0] = GCK_MOCK_SLOT_ONE_URI; + uris[1] = NULL; + gcr_pkcs11_set_trust_lookup_uris (uris); + gcr_pkcs11_set_trust_store_uri (GCK_MOCK_SLOT_ONE_URI); + gck_list_unref_free (modules); + + /* A self-signed certificate */ + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/der-certificate.crt", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->cert_self = gcr_simple_certificate_new ((const guchar *)contents, n_contents); + g_free (contents); + + /* A signed certificate */ + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/dhansak-collabora.cer", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->cert_signed = mock_certificate_new (contents, n_contents); + g_free (contents); + + /* The signer for the above certificate */ + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/collabora-ca.cer", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->cert_ca = mock_certificate_new (contents, n_contents); + g_free (contents); + + /* A root CA */ + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/startcom-ca.cer", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->cert_root = mock_certificate_new (contents, n_contents); + g_free (contents); + + /* An intermediate */ + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/startcom-intermediate.cer", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->cert_inter = mock_certificate_new (contents, n_contents); + g_free (contents); + + /* Signed by above intermediate */ + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/jabber-server.cer", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->cert_host = mock_certificate_new (contents, n_contents); + g_free (contents); +} + +static void +add_certificate_to_module (GcrCertificate *certificate) +{ + GckBuilder builder = GCK_BUILDER_INIT; + gconstpointer data; + gsize n_data, n_subject; + gpointer subject; + + data = gcr_certificate_get_der_data (certificate, &n_data); + g_assert (data); + + subject = gcr_certificate_get_subject_raw (certificate, &n_subject); + g_assert (subject); + + /* Add a certificate to the module */ + gck_builder_add_data (&builder, CKA_VALUE, data, n_data); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); + gck_builder_add_data (&builder, CKA_SUBJECT, subject, n_subject); + gck_mock_module_add_object (gck_builder_end (&builder)); + + g_free (subject); +} + +static void +add_anchor_to_module (GcrCertificate *certificate, const gchar *purpose) +{ + GckBuilder builder = GCK_BUILDER_INIT; + gconstpointer data; + gsize n_data; + + data = gcr_certificate_get_der_data (certificate, &n_data); + g_assert (data); + + /* And add a pinned certificate for the signed certificate */ + gck_builder_add_data (&builder, CKA_X_CERTIFICATE_VALUE, data, n_data); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_X_TRUST_ASSERTION); + gck_builder_add_ulong (&builder, CKA_X_ASSERTION_TYPE, CKT_X_ANCHORED_CERTIFICATE); + gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); + gck_mock_module_add_object (gck_builder_end (&builder)); +} + +static void +add_pinned_to_module (GcrCertificate *certificate, const gchar *purpose, const gchar *host) +{ + GckBuilder builder = GCK_BUILDER_INIT; + gconstpointer data; + gsize n_data; + + data = gcr_certificate_get_der_data (certificate, &n_data); + g_assert (data); + + /* And add a pinned certificate for the signed certificate */ + gck_builder_add_data (&builder, CKA_X_CERTIFICATE_VALUE, data, n_data); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_X_TRUST_ASSERTION); + gck_builder_add_ulong (&builder, CKA_X_ASSERTION_TYPE, CKT_X_PINNED_CERTIFICATE); + gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); + gck_builder_add_string (&builder, CKA_X_PEER, host); + gck_mock_module_add_object (gck_builder_end (&builder)); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + CK_RV rv; + + g_object_unref (test->cert_self); + g_object_unref (test->cert_signed); + g_object_unref (test->cert_ca); + g_object_unref (test->cert_host); + g_object_unref (test->cert_inter); + g_object_unref (test->cert_root); + + rv = (test->funcs.C_Finalize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); + + _gcr_uninitialize_library (); +} + +static void +test_new (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + + chain = gcr_certificate_chain_new (); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_UNKNOWN); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 0); + + g_assert (gcr_certificate_chain_get_endpoint (chain) == NULL); + + g_object_unref (chain); +} + +static void +test_new_with_cert (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GcrCertificate *check; + guint status, length; + + chain = gcr_certificate_chain_new (); + gcr_certificate_chain_add (chain, test->cert_signed); + gcr_certificate_chain_add (chain, test->cert_ca); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_UNKNOWN); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 2); + + status = G_MAXUINT; + length = 0; + g_object_get (chain, "status", &status, "length", &length, NULL); + g_assert_cmpuint (status, ==, GCR_CERTIFICATE_CHAIN_UNKNOWN); + g_assert_cmpuint (length, ==, 2); + + check = gcr_certificate_chain_get_certificate (chain, 1); + g_assert (check == test->cert_ca); + + /* Not yet completed */ + check = gcr_certificate_chain_get_anchor (chain); + g_assert (check == NULL); + + check = gcr_certificate_chain_get_endpoint (chain); + g_assert (check == test->cert_signed); + + g_object_unref (chain); +} + +static void +test_selfsigned (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* Add a self-signed certificate */ + gcr_certificate_chain_add (chain, test->cert_self); + + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_SELFSIGNED); + + g_object_unref (chain); +} + +static void +test_incomplete (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* Add a signed certificate */ + gcr_certificate_chain_add (chain, test->cert_signed); + + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_INCOMPLETE); + + g_object_unref (chain); +} + +static void +test_empty (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* Add no certificate */ + + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_UNKNOWN); + + g_object_unref (chain); +} + +static void +test_trim_extras (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* Add two unrelated certificates */ + gcr_certificate_chain_add (chain, test->cert_self); + gcr_certificate_chain_add (chain, test->cert_signed); + + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 2); + + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_SELFSIGNED); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 1); + + g_object_unref (chain); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_complete_async (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + GAsyncResult *result = NULL; + + chain = gcr_certificate_chain_new (); + + /* Add a whole bunch of certificates */ + gcr_certificate_chain_add (chain, test->cert_signed); + gcr_certificate_chain_add (chain, test->cert_ca); + gcr_certificate_chain_add (chain, test->cert_self); + + gcr_certificate_chain_build_async (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + if (!gcr_certificate_chain_build_finish (chain, result, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + g_object_unref (result); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_SELFSIGNED); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 2); + + g_object_unref (chain); +} + +static void +test_with_anchor (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* Two certificates in chain with ca trust anchor */ + gcr_certificate_chain_add (chain, test->cert_signed); + gcr_certificate_chain_add (chain, test->cert_ca); + add_anchor_to_module (test->cert_ca, GCR_PURPOSE_CLIENT_AUTH); + + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 2); + + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_ANCHORED); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 2); + g_assert (gcr_certificate_chain_get_anchor (chain) == test->cert_ca); + + g_object_unref (chain); +} + +static void +test_with_anchor_and_lookup_ca (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* One signed certificate, with CA in pkcs11, and trust anchor */ + gcr_certificate_chain_add (chain, test->cert_signed); + add_certificate_to_module (test->cert_ca); + add_anchor_to_module (test->cert_ca, GCR_PURPOSE_CLIENT_AUTH); + + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 1); + + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_ANCHORED); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 2); + g_assert (gcr_certificate_chain_get_anchor (chain) != NULL); + + g_object_unref (chain); +} + +static void +test_with_pinned (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* One certificate, and add CA to pkcs11 */ + gcr_certificate_chain_add (chain, test->cert_signed); + gcr_certificate_chain_add (chain, test->cert_ca); + add_pinned_to_module (test->cert_signed, GCR_PURPOSE_CLIENT_AUTH, "pinned.example.com"); + + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 2); + + /* But we don't allow the lookup to happen */ + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + "pinned.example.com", 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_PINNED); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 1); + g_assert (gcr_certificate_chain_get_anchor (chain) == NULL); + + g_object_unref (chain); +} + +static void +test_without_lookups (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* One certificate, and add CA to pkcs11 */ + gcr_certificate_chain_add (chain, test->cert_signed); + add_certificate_to_module (test->cert_ca); + + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 1); + + /* But we don't allow the lookup to happen */ + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, GCR_CERTIFICATE_CHAIN_NO_LOOKUPS, + NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_INCOMPLETE); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 1); + g_assert (gcr_certificate_chain_get_anchor (chain) == NULL); + + g_object_unref (chain); +} + +static void +test_with_lookup_error (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + /* Make the lookup fail */ + test->funcs.C_GetAttributeValue = gck_mock_fail_C_GetAttributeValue; + + chain = gcr_certificate_chain_new (); + + /* Two certificates in chain with ca trust anchor */ + gcr_certificate_chain_add (chain, test->cert_signed); + add_certificate_to_module (test->cert_ca); + + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 1); + + if (gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_error (error, GCK_ERROR, CKR_FUNCTION_FAILED); + g_clear_error (&error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_UNKNOWN); + + g_object_unref (chain); +} + +static void +test_wrong_order_anchor (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + chain = gcr_certificate_chain_new (); + + /* Two certificates in chain with ca trust anchor */ + gcr_certificate_chain_add (chain, test->cert_host); + gcr_certificate_chain_add (chain, test->cert_root); + gcr_certificate_chain_add (chain, test->cert_inter); + add_anchor_to_module (test->cert_root, GCR_PURPOSE_CLIENT_AUTH); + + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 3); + + if (!gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_ANCHORED); + g_assert_cmpuint (gcr_certificate_chain_get_length (chain), ==, 3); + g_assert (gcr_certificate_chain_get_anchor (chain) == test->cert_root); + + g_object_unref (chain); +} + +static void +test_with_anchor_error (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + + /* Make the lookup fail */ + test->funcs.C_GetAttributeValue = gck_mock_fail_C_GetAttributeValue; + + chain = gcr_certificate_chain_new (); + + /* Two certificates in chain with ca trust anchor */ + gcr_certificate_chain_add (chain, test->cert_signed); + add_certificate_to_module (test->cert_ca); + + if (gcr_certificate_chain_build (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, &error)) + g_assert_not_reached (); + g_assert_error (error, GCK_ERROR, CKR_FUNCTION_FAILED); + g_clear_error (&error); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_UNKNOWN); + + g_object_unref (chain); +} + +static void +test_with_anchor_error_async (Test *test, gconstpointer unused) +{ + GcrCertificateChain *chain; + GError *error = NULL; + GAsyncResult *result; + + /* Make the lookup fail */ + test->funcs.C_GetAttributeValue = gck_mock_fail_C_GetAttributeValue; + + chain = gcr_certificate_chain_new (); + + /* Two certificates in chain with ca trust anchor */ + gcr_certificate_chain_add (chain, test->cert_signed); + add_certificate_to_module (test->cert_ca); + + gcr_certificate_chain_build_async (chain, GCR_PURPOSE_CLIENT_AUTH, + NULL, 0, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + if (gcr_certificate_chain_build_finish (chain, result, &error)) + g_assert_not_reached (); + g_assert_error (error, GCK_ERROR, CKR_FUNCTION_FAILED); + g_clear_error (&error); + g_object_unref (result); + + g_assert_cmpuint (gcr_certificate_chain_get_status (chain), ==, + GCR_CERTIFICATE_CHAIN_UNKNOWN); + + g_object_unref (chain); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-certificate-chain"); + + g_test_add ("/gcr/certificate-chain/new", Test, NULL, setup, test_new, teardown); + g_test_add ("/gcr/certificate-chain/new_with_cert", Test, NULL, setup, test_new_with_cert, teardown); + g_test_add ("/gcr/certificate-chain/selfsigned", Test, NULL, setup, test_selfsigned, teardown); + g_test_add ("/gcr/certificate-chain/incomplete", Test, NULL, setup, test_incomplete, teardown); + g_test_add ("/gcr/certificate-chain/empty", Test, NULL, setup, test_empty, teardown); + g_test_add ("/gcr/certificate-chain/trim_extras", Test, NULL, setup, test_trim_extras, teardown); + g_test_add ("/gcr/certificate-chain/complete_async", Test, NULL, setup, test_complete_async, teardown); + g_test_add ("/gcr/certificate-chain/with_anchor", Test, NULL, setup, test_with_anchor, teardown); + g_test_add ("/gcr/certificate-chain/with_anchor_and_lookup_ca", Test, NULL, setup, test_with_anchor_and_lookup_ca, teardown); + g_test_add ("/gcr/certificate-chain/with_pinned", Test, NULL, setup, test_with_pinned, teardown); + g_test_add ("/gcr/certificate-chain/without_lookups", Test, NULL, setup, test_without_lookups, teardown); + g_test_add ("/gcr/certificate-chain/wrong_order_anchor", Test, NULL, setup, test_wrong_order_anchor, teardown); + g_test_add ("/gcr/certificate-chain/with_lookup_error", Test, NULL, setup, test_with_lookup_error, teardown); + g_test_add ("/gcr/certificate-chain/with_anchor_error", Test, NULL, setup, test_with_anchor_error, teardown); + g_test_add ("/gcr/certificate-chain/with_anchor_error_async", Test, NULL, setup, test_with_anchor_error_async, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-certificate.c b/gcr/test-certificate.c new file mode 100644 index 0000000..b593ea3 --- /dev/null +++ b/gcr/test-certificate.c @@ -0,0 +1,292 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-internal.h" + +#include "egg/egg-testing.h" + +#include + +#include +#include + +typedef struct { + GcrCertificate *certificate; + GcrCertificate *dsa_cert; + GcrCertificate *dhansak_cert; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + gchar *contents; + gsize n_contents; + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/der-certificate.crt", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->certificate = gcr_simple_certificate_new ((const guchar *)contents, n_contents); + g_assert (test->certificate); + g_free (contents); + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/der-certificate-dsa.cer", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->dsa_cert = gcr_simple_certificate_new ((const guchar *)contents, n_contents); + g_assert (test->dsa_cert); + g_free (contents); + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/dhansak-collabora.cer", &contents, &n_contents, NULL)) + g_assert_not_reached (); + test->dhansak_cert = gcr_simple_certificate_new ((const guchar *)contents, n_contents); + g_assert (test->certificate); + g_free (contents); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->certificate); + g_object_unref (test->dsa_cert); + g_object_unref (test->dhansak_cert); +} + +static void +test_issuer_cn (Test *test, gconstpointer unused) +{ + gchar *cn = gcr_certificate_get_issuer_cn (test->certificate); + g_assert (cn); + g_assert_cmpstr (cn, ==, "http://www.valicert.com/"); + g_free (cn); +} + +static void +test_issuer_dn (Test *test, gconstpointer unused) +{ + gchar *dn = gcr_certificate_get_issuer_dn (test->certificate); + g_assert (dn); + g_assert_cmpstr (dn, ==, "L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 3 Policy Validation Authority, CN=http://www.valicert.com/, EMAIL=info@valicert.com"); + g_free (dn); +} + +static void +test_issuer_part (Test *test, gconstpointer unused) +{ + gchar *part = gcr_certificate_get_issuer_part (test->certificate, "l"); + g_assert (part); + g_assert_cmpstr (part, ==, "ValiCert Validation Network"); + g_free (part); +} + +static void +test_issuer_raw (Test *test, gconstpointer unused) +{ + gpointer der; + gsize n_der; + + der = gcr_certificate_get_issuer_raw (test->certificate, &n_der); + g_assert (der); + egg_assert_cmpsize (n_der, ==, 190); + g_free (der); +} + +static void +test_subject_cn (Test *test, gconstpointer unused) +{ + gchar *cn = gcr_certificate_get_subject_cn (test->certificate); + g_assert (cn); + g_assert_cmpstr (cn, ==, "http://www.valicert.com/"); + g_free (cn); + + cn = gcr_certificate_get_subject_cn (test->dhansak_cert); + g_assert (cn); + g_assert_cmpstr (cn, ==, "dhansak.collabora.co.uk"); + g_free (cn); +} + +static void +test_subject_dn (Test *test, gconstpointer unused) +{ + gchar *dn = gcr_certificate_get_subject_dn (test->certificate); + g_assert (dn); + g_assert_cmpstr (dn, ==, "L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 3 Policy Validation Authority, CN=http://www.valicert.com/, EMAIL=info@valicert.com"); + g_free (dn); + + dn = gcr_certificate_get_subject_dn (test->dhansak_cert); + g_assert (dn); + g_assert_cmpstr (dn, ==, "CN=dhansak.collabora.co.uk, EMAIL=sysadmin@collabora.co.uk"); + g_free (dn); + +} + +static void +test_subject_part (Test *test, gconstpointer unused) +{ + gchar *part = gcr_certificate_get_subject_part (test->certificate, "OU"); + g_assert (part); + g_assert_cmpstr (part, ==, "ValiCert Class 3 Policy Validation Authority"); + g_free (part); + + part = gcr_certificate_get_subject_part (test->dhansak_cert, "EMAIL"); + g_assert (part); + g_assert_cmpstr (part, ==, "sysadmin@collabora.co.uk"); + g_free (part); + +} + +static void +test_subject_raw (Test *test, gconstpointer unused) +{ + gpointer der; + gsize n_der; + + der = gcr_certificate_get_subject_raw (test->certificate, &n_der); + g_assert (der); + egg_assert_cmpsize (n_der, ==, 190); + g_free (der); + + der = gcr_certificate_get_subject_raw (test->dhansak_cert, &n_der); + g_assert (der); + egg_assert_cmpsize (n_der, ==, 77); + g_free (der); +} + +static void +test_issued_date (Test *test, gconstpointer unused) +{ + GDate *date = gcr_certificate_get_issued_date (test->certificate); + g_assert (date); + g_assert_cmpuint (g_date_get_year (date), ==, 1999); + g_assert_cmpuint (g_date_get_month (date), ==, 6); + g_assert_cmpuint (g_date_get_day (date), ==, 26); + g_date_free (date); +} + +static void +test_expiry_date (Test *test, gconstpointer unused) +{ + GDate *date = gcr_certificate_get_expiry_date (test->certificate); + g_assert (date); + g_assert_cmpuint (g_date_get_year (date), ==, 2019); + g_assert_cmpuint (g_date_get_month (date), ==, 6); + g_assert_cmpuint (g_date_get_day (date), ==, 26); + g_date_free (date); +} + +static void +test_serial_number (Test *test, gconstpointer unused) +{ + gsize n_serial; + guchar *serial; + gchar *hex; + + serial = gcr_certificate_get_serial_number (test->certificate, &n_serial); + g_assert (serial); + g_assert_cmpuint (n_serial, ==, 1); + g_assert (memcmp (serial, "\1", n_serial) == 0); + g_free (serial); + + hex = gcr_certificate_get_serial_number_hex (test->certificate); + g_assert (hex); + g_assert_cmpstr (hex, ==, "01"); + g_free (hex); +} + +static void +test_fingerprint (Test *test, gconstpointer unused) +{ + gsize n_print; + guchar *print = gcr_certificate_get_fingerprint (test->certificate, G_CHECKSUM_MD5, &n_print); + g_assert (print); + g_assert_cmpuint (n_print, ==, g_checksum_type_get_length (G_CHECKSUM_MD5)); + g_assert (memcmp (print, "\xa2\x6f\x53\xb7\xee\x40\xdb\x4a\x68\xe7\xfa\x18\xd9\x10\x4b\x72", n_print) == 0); + g_free (print); +} + +static void +test_fingerprint_hex (Test *test, gconstpointer unused) +{ + gchar *print = gcr_certificate_get_fingerprint_hex (test->certificate, G_CHECKSUM_MD5); + g_assert (print); + g_assert_cmpstr (print, ==, "A2 6F 53 B7 EE 40 DB 4A 68 E7 FA 18 D9 10 4B 72"); + g_free (print); +} + +static void +test_certificate_key_size (Test *test, gconstpointer unused) +{ + guint key_size = gcr_certificate_get_key_size (test->certificate); + g_assert_cmpuint (key_size, ==, 1024); + + key_size = gcr_certificate_get_key_size (test->dsa_cert); + g_assert_cmpuint (key_size, ==, 1024); +} + +static void +test_certificate_is_issuer (Test *test, gconstpointer unused) +{ + gboolean ret = gcr_certificate_is_issuer (test->certificate, test->certificate); + g_assert (ret == TRUE); + + ret = gcr_certificate_is_issuer (test->certificate, test->dsa_cert); + g_assert (ret == FALSE); +} + +static void +test_basic_constraints (Test *test, + gconstpointer unused) +{ + gboolean is_ca = TRUE; + gint path_len = 0; + + if (!gcr_certificate_get_basic_constraints (test->dsa_cert, &is_ca, &path_len)) + g_assert_not_reached (); + + g_assert (is_ca == FALSE); + g_assert (path_len == -1); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-certificate"); + + g_test_add ("/gcr/certificate/issuer_cn", Test, NULL, setup, test_issuer_cn, teardown); + g_test_add ("/gcr/certificate/issuer_dn", Test, NULL, setup, test_issuer_dn, teardown); + g_test_add ("/gcr/certificate/issuer_part", Test, NULL, setup, test_issuer_part, teardown); + g_test_add ("/gcr/certificate/issuer_raw", Test, NULL, setup, test_issuer_raw, teardown); + g_test_add ("/gcr/certificate/subject_cn", Test, NULL, setup, test_subject_cn, teardown); + g_test_add ("/gcr/certificate/subject_dn", Test, NULL, setup, test_subject_dn, teardown); + g_test_add ("/gcr/certificate/subject_part", Test, NULL, setup, test_subject_part, teardown); + g_test_add ("/gcr/certificate/subject_raw", Test, NULL, setup, test_subject_raw, teardown); + g_test_add ("/gcr/certificate/issued_date", Test, NULL, setup, test_issued_date, teardown); + g_test_add ("/gcr/certificate/expiry_date", Test, NULL, setup, test_expiry_date, teardown); + g_test_add ("/gcr/certificate/serial_number", Test, NULL, setup, test_serial_number, teardown); + g_test_add ("/gcr/certificate/fingerprint", Test, NULL, setup, test_fingerprint, teardown); + g_test_add ("/gcr/certificate/fingerprint_hex", Test, NULL, setup, test_fingerprint_hex, teardown); + g_test_add ("/gcr/certificate/key_size", Test, NULL, setup, test_certificate_key_size, teardown); + g_test_add ("/gcr/certificate/is_issuer", Test, NULL, setup, test_certificate_is_issuer, teardown); + g_test_add ("/gcr/certificate/basic_constraints", Test, NULL, setup, test_basic_constraints, teardown); + + return g_test_run (); +} diff --git a/gcr/test-filter-collection.c b/gcr/test-filter-collection.c new file mode 100644 index 0000000..952dbd3 --- /dev/null +++ b/gcr/test-filter-collection.c @@ -0,0 +1,272 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-simple-collection.h" +#include "gcr/gcr-filter-collection.h" + +#include "egg/egg-testing.h" + +#include + +#define NUM_OBJECTS 10 + +typedef struct { + GcrCollection *underlying; + GObject *objects[NUM_OBJECTS]; +} Test; + +static guint +mock_object_value (GObject *object) +{ + return GPOINTER_TO_UINT (g_object_get_data (object, "value")); +} + +static void +setup (Test *test, + gconstpointer unused) +{ + GcrSimpleCollection *collection; + guint i; + + test->underlying = gcr_simple_collection_new (); + collection = GCR_SIMPLE_COLLECTION (test->underlying); + + for (i = 0; i < NUM_OBJECTS; i++) { + test->objects[i] = g_object_new (G_TYPE_OBJECT, NULL); + g_object_set_data (test->objects[i], "value", GUINT_TO_POINTER (i)); + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), test->objects[i]); + } +} + +static void +teardown (Test *test, + gconstpointer unused) +{ + guint i; + + for (i = 0; i < NUM_OBJECTS; i++) + g_object_unref (test->objects[i]); + + g_object_unref (test->underlying); +} + +static void +test_create (Test *test, + gconstpointer unused) +{ + GcrFilterCollection *filter; + GcrCollection *collection; + GcrCollection *underlying; + GList *objects; + guint i; + + collection = gcr_filter_collection_new_with_callback (test->underlying, + NULL, NULL, NULL); + filter = GCR_FILTER_COLLECTION (collection); + + g_assert (test->underlying == gcr_filter_collection_get_underlying (filter)); + g_object_get (collection, "underlying", &underlying, NULL); + g_assert (test->underlying == underlying); + g_object_unref (underlying); + + g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS); + for (i = 0; i < NUM_OBJECTS; i++) + gcr_collection_contains (collection, test->objects[i]); + objects = gcr_collection_get_objects (collection); + g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS); + for (i = 0; i < NUM_OBJECTS; i++) + g_assert (g_list_find (objects, test->objects[i]) != NULL); + g_list_free (objects); + + g_object_unref (collection); +} + +static gboolean +on_filter_increment_value (GObject *object, + gpointer user_data) +{ + guint *value = user_data; + + g_assert_cmpuint (*value, >=, 0); + g_assert_cmpuint (*value, <=, 20); + (*value)++; + + return TRUE; +} + +static void +destroy_change_value (gpointer data) +{ + guint *value = data; + g_assert (value != NULL); + *value = 0; +} + +static void +test_callbacks (Test *test, + gconstpointer unused) +{ + GcrCollection *collection; + GcrFilterCollection *filter; + guint value = 4; + + collection = gcr_filter_collection_new_with_callback (test->underlying, + on_filter_increment_value, + &value, destroy_change_value); + g_assert_cmpuint (value, ==, 4 + NUM_OBJECTS); + + filter = GCR_FILTER_COLLECTION (collection); + + /* This should call destroy (value -> 0), and then refilter all values (value -> 10) */ + gcr_filter_collection_set_callback (filter, on_filter_increment_value, + &value, destroy_change_value); + g_assert_cmpuint (value, ==, NUM_OBJECTS); + + g_object_unref (collection); + g_assert_cmpuint (value, ==, 0); +} + +static gboolean +on_filter_modulo (GObject *object, + gpointer user_data) +{ + guint value = mock_object_value (object); + guint *modulo = user_data; + + g_assert (modulo != NULL); + g_assert_cmpuint (value, >=, 0); + g_assert_cmpuint (value, <, NUM_OBJECTS); + + return (value % *modulo) == 0; +} + +static void +test_filtering (Test *test, + gconstpointer unused) +{ + GcrFilterCollection *filter; + GcrCollection *collection; + GList *objects; + guint modulo; + guint i; + + modulo = 2; + collection = gcr_filter_collection_new_with_callback (test->underlying, + on_filter_modulo, &modulo, NULL); + filter = GCR_FILTER_COLLECTION (collection); + + g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); + for (i = 0; i < NUM_OBJECTS; i += modulo) + gcr_collection_contains (collection, test->objects[i]); + objects = gcr_collection_get_objects (collection); + g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS / modulo); + for (i = 0; i < NUM_OBJECTS; i += modulo) + g_assert (g_list_find (objects, test->objects[i]) != NULL); + g_list_free (objects); + + modulo = 5; + gcr_filter_collection_refilter (filter); + + g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); + for (i = 0; i < NUM_OBJECTS; i += modulo) + gcr_collection_contains (collection, test->objects[i]); + objects = gcr_collection_get_objects (collection); + g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS / modulo); + for (i = 0; i < NUM_OBJECTS; i += modulo) + g_assert (g_list_find (objects, test->objects[i]) != NULL); + g_list_free (objects); + + g_object_unref (collection); +} + +static void +on_filter_added (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + guint *added = user_data; + g_assert (added != NULL); + (*added)++; +} + +static void +on_filter_removed (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + guint *removed = user_data; + g_assert (removed != NULL); + (*removed)++; +} + +static void +test_add_remove (Test *test, + gconstpointer unused) +{ + GcrCollection *collection; + guint modulo; + guint added = 0; + guint removed = 0; + guint i; + + modulo = 2; + collection = gcr_filter_collection_new_with_callback (test->underlying, + on_filter_modulo, &modulo, NULL); + + g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); + + g_signal_connect (collection, "added", G_CALLBACK (on_filter_added), &added); + g_signal_connect (collection, "removed", G_CALLBACK (on_filter_removed), &removed); + + for (i = 0; i < NUM_OBJECTS; i++) + gcr_simple_collection_remove (GCR_SIMPLE_COLLECTION (test->underlying), + test->objects[i]); + + g_assert_cmpuint (gcr_collection_get_length (collection), ==, 0); + g_assert_cmpuint (added, ==, 0); + g_assert_cmpuint (removed, ==, NUM_OBJECTS / modulo); + + for (i = 0; i < NUM_OBJECTS; i++) + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (test->underlying), + test->objects[i]); + + g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); + g_assert_cmpuint (added, ==, NUM_OBJECTS / modulo); + g_assert_cmpuint (removed, ==, NUM_OBJECTS / modulo); + + g_object_unref (collection); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-filter-collection"); + + g_test_add ("/gcr/filter-collection/create", Test, NULL, setup, test_create, teardown); + g_test_add ("/gcr/filter-collection/callbacks", Test, NULL, setup, test_callbacks, teardown); + g_test_add ("/gcr/filter-collection/filtering", Test, NULL, setup, test_filtering, teardown); + g_test_add ("/gcr/filter-collection/add-remove", Test, NULL, setup, test_add_remove, teardown); + + return g_test_run (); +} diff --git a/gcr/test-fingerprint.c b/gcr/test-fingerprint.c new file mode 100644 index 0000000..417d338 --- /dev/null +++ b/gcr/test-fingerprint.c @@ -0,0 +1,206 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" +#define GCR_COMPILATION 1 + +#include "gcr/gcr-base.h" +#include "gcr/gcr-internal.h" +#include "gcr/gcr-fingerprint.h" + +#include "gck/gck-test.h" +#include "gck/pkcs11n.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-testing.h" + +#include + +#include + +typedef struct { + GBytes *cert_rsa; + GBytes *key_rsa; + GBytes *cert_dsa; + GBytes *key_dsa; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gchar *contents; + gsize length; + + g_file_get_contents (SRCDIR "/gcr/fixtures/client.crt", &contents, &length, &error); + g_assert_no_error (error); + test->cert_rsa = g_bytes_new_take (contents, length); + + g_file_get_contents (SRCDIR "/gcr/fixtures/client.key", &contents, &length, &error); + g_assert_no_error (error); + test->key_rsa = g_bytes_new_take (contents, length); + + g_file_get_contents (SRCDIR "/gcr/fixtures/generic-dsa.crt", &contents, &length, &error); + g_assert_no_error (error); + test->cert_dsa = g_bytes_new_take (contents, length); + + g_file_get_contents (SRCDIR "/gcr/fixtures/generic-dsa.key", &contents, &length, &error); + g_assert_no_error (error); + test->key_dsa = g_bytes_new_take (contents, length); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_bytes_unref (test->cert_rsa); + g_bytes_unref (test->key_rsa); + g_bytes_unref (test->cert_dsa); + g_bytes_unref (test->key_dsa); +} + +static void +on_parser_parsed (GcrParser *parser, + gpointer user_data) +{ + GckAttributes **attrs = user_data; + g_assert (!*attrs); + *attrs = gcr_parser_get_parsed_attributes (parser); + g_assert (*attrs); + gck_attributes_ref (*attrs); +} + +static GckAttributes* +parse_attributes_for_key (GBytes *data) +{ + GcrParser *parser; + GckAttributes *attrs = NULL; + GError *error = NULL; + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &attrs); + gcr_parser_parse_bytes (parser, data, &error); + g_assert_no_error (error); + g_object_unref (parser); + + g_assert (attrs); + return attrs; +} + +static GckAttributes * +build_attributes_for_cert (GBytes *data) +{ + GckBuilder builder = GCK_BUILDER_INIT; + + gck_builder_add_data (&builder, CKA_VALUE, g_bytes_get_data (data, NULL), + g_bytes_get_size (data)); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); + + return gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static GBytes * +parse_subject_public_key_info_for_cert (GBytes *data) +{ + GBytes *info; + GNode *asn; + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", data); + g_assert (asn != NULL); + + info = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "tbsCertificate", "subjectPublicKeyInfo", NULL)); + g_assert (info != NULL); + + egg_asn1x_destroy (asn); + return info; +} + +static void +test_rsa (Test *test, gconstpointer unused) +{ + GckAttributes *key, *cert; + GBytes *info; + guchar *fingerprint1, *fingerprint2, *fingerprint3; + gsize n_fingerprint1, n_fingerprint2, n_fingerprint3; + + key = parse_attributes_for_key (test->key_rsa); + info = parse_subject_public_key_info_for_cert (test->cert_rsa); + cert = build_attributes_for_cert (test->cert_rsa); + + fingerprint1 = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (info, NULL), + g_bytes_get_size (info), + G_CHECKSUM_SHA1, &n_fingerprint1); + fingerprint2 = gcr_fingerprint_from_attributes (key, G_CHECKSUM_SHA1, &n_fingerprint2); + fingerprint3 = gcr_fingerprint_from_attributes (cert, G_CHECKSUM_SHA1, &n_fingerprint3); + + egg_assert_cmpmem (fingerprint1, n_fingerprint1, ==, fingerprint2, n_fingerprint2); + egg_assert_cmpmem (fingerprint1, n_fingerprint1, ==, fingerprint3, n_fingerprint3); + + g_free (fingerprint1); + g_free (fingerprint2); + g_free (fingerprint3); + + g_bytes_unref (info); + gck_attributes_unref (key); + gck_attributes_unref (cert); +} + +static void +test_dsa (Test *test, gconstpointer unused) +{ + GckAttributes *key, *cert; + GBytes *info; + guchar *fingerprint1, *fingerprint2, *fingerprint3; + gsize n_fingerprint1, n_fingerprint2, n_fingerprint3; + + key = parse_attributes_for_key (test->key_dsa); + info = parse_subject_public_key_info_for_cert (test->cert_dsa); + cert = build_attributes_for_cert (test->cert_dsa); + + fingerprint1 = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (info, NULL), + g_bytes_get_size (info), + G_CHECKSUM_SHA1, &n_fingerprint1); + fingerprint2 = gcr_fingerprint_from_attributes (key, G_CHECKSUM_SHA1, &n_fingerprint2); + fingerprint3 = gcr_fingerprint_from_attributes (cert, G_CHECKSUM_SHA1, &n_fingerprint3); + + egg_assert_cmpmem (fingerprint1, n_fingerprint1, ==, fingerprint2, n_fingerprint2); + egg_assert_cmpmem (fingerprint1, n_fingerprint1, ==, fingerprint3, n_fingerprint3); + + g_free (fingerprint1); + g_free (fingerprint2); + g_free (fingerprint3); + + g_bytes_unref (info); + gck_attributes_unref (key); + gck_attributes_unref (cert); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gcr/fingerprint/rsa", Test, NULL, setup, test_rsa, teardown); + g_test_add ("/gcr/fingerprint/dsa", Test, NULL, setup, test_dsa, teardown); + + return g_test_run (); +} diff --git a/gcr/test-gnupg-collection.c b/gcr/test-gnupg-collection.c new file mode 100644 index 0000000..e8b9cba --- /dev/null +++ b/gcr/test-gnupg-collection.c @@ -0,0 +1,249 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-gnupg-collection.h" +#include "gcr/gcr-gnupg-key.h" +#include "gcr/gcr-record.h" + +#include "egg/egg-testing.h" + +#include +#include + +#include +#include +#include + +typedef struct { + GcrGnupgCollection *collection; + gchar *directory; + GHashTable *keys; + GAsyncResult *result; +} Test; + +static void +on_collection_added (GcrCollection *collection, GObject *object, gpointer user_data) +{ + Test *test = user_data; + GcrGnupgKey *key; + const gchar *keyid; + + g_assert (GCR_COLLECTION (test->collection) == collection); + + g_assert (GCR_IS_GNUPG_KEY (object)); + key = GCR_GNUPG_KEY (object); + + keyid = _gcr_gnupg_key_get_keyid (key); + g_assert (keyid); + g_assert (!g_hash_table_lookup (test->keys, keyid)); + + g_hash_table_insert (test->keys, g_strdup (keyid), key); +} + +static void +on_collection_removed (GcrCollection *collection, GObject *object, gpointer user_data) +{ + Test *test = user_data; + GcrGnupgKey *key; + const gchar *keyid; + + g_assert (GCR_COLLECTION (test->collection) == collection); + g_assert (GCR_IS_GNUPG_KEY (object)); + + keyid = _gcr_gnupg_key_get_keyid (GCR_GNUPG_KEY (object)); + key = g_hash_table_lookup (test->keys, keyid); + g_assert (key == GCR_GNUPG_KEY (object)); + + if (!g_hash_table_remove (test->keys, keyid)) + g_assert_not_reached (); +} + +static void +setup (Test *test, gconstpointer unused) +{ + GcrCollection *collection; + GError *error = NULL; + gchar *cmd; + + test->directory = g_build_filename ("/tmp/gcr-tests.XXXXXX", NULL); + g_assert (g_mkdtemp_full (test->directory, 0700) != NULL); + + cmd = g_strdup_printf ("cp -p " SRCDIR "/gcr/fixtures/gnupg-homedir/* %s", test->directory); + g_spawn_check_exit_status (system (cmd), &error); + g_assert_no_error (error); + g_free (cmd); + + collection = _gcr_gnupg_collection_new (test->directory); + test->collection = GCR_GNUPG_COLLECTION (collection); + + test->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + g_signal_connect (collection, "added", G_CALLBACK (on_collection_added), test); + g_signal_connect (collection, "removed", G_CALLBACK (on_collection_removed), test); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gchar *cmd; + + g_hash_table_destroy (test->keys); + + if (test->result) + g_object_unref (test->result); + + g_object_unref (test->collection); + + /* remove potential gpg 2.1 extras, ignore any errors. */ + cmd = g_strdup_printf ("rm -rf %s/*.d", test->directory); + system (cmd); + g_free (cmd); + cmd = g_strdup_printf ("rm -f %s/.gpg-v21-migrated", test->directory); + system (cmd); + g_free (cmd); + + cmd = g_strdup_printf ("rm -f %s/*", test->directory); + g_spawn_check_exit_status (system (cmd), &error); + g_assert_no_error (error); + g_free (cmd); + + if (g_rmdir (test->directory) < 0) + g_critical ("couldn't remove %s: %s", test->directory, g_strerror (errno)); + g_free (test->directory); +} + +static void +on_async_ready (GObject *source, GAsyncResult *res, gpointer user_data) +{ + Test *test = user_data; + g_assert (G_OBJECT (test->collection) == source); + g_assert (test->result == NULL); + test->result = g_object_ref (res); + egg_test_wait_stop (); +} + +static void +test_properties (Test *test, gconstpointer unused) +{ + gchar *directory; + g_object_get (test->collection, "directory", &directory, NULL); + g_assert_cmpstr (directory, ==, test->directory); + g_free (directory); +} + +static void +test_load (Test *test, gconstpointer unused) +{ + GError *error = NULL; + GcrGnupgKey *key; + GList *l, *objects; + GcrRecord *record; + GHashTable *check; + + _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); + egg_test_wait_until (500000); + + g_assert (test->result); + _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); + g_assert_no_error (error); + + /* Werner Koch (a public key) */ + key = g_hash_table_lookup (test->keys, "5DE249965B0358A2"); + g_assert (GCR_IS_GNUPG_KEY (key)); + g_assert (_gcr_gnupg_key_get_secret_records (key) == NULL); + + /* Test Number 2 (a secret key)*/ + key = g_hash_table_lookup (test->keys, "268FEE686262C395"); + g_assert (GCR_IS_GNUPG_KEY (key)); + g_assert (_gcr_gnupg_key_get_secret_records (key)); + + /* The length of collection should be correct */ + g_assert_cmpuint (g_hash_table_size (test->keys), ==, + gcr_collection_get_length (GCR_COLLECTION (test->collection))); + + /* The list of objects should be correct */ + objects = gcr_collection_get_objects (GCR_COLLECTION (test->collection)); + g_assert_cmpuint (g_hash_table_size (test->keys), ==, g_list_length (objects)); + check = g_hash_table_new (g_str_hash, g_str_equal); + for (l = objects; l != NULL; l = g_list_next (l)) { + g_assert (GCR_IS_GNUPG_KEY (l->data)); + key = g_hash_table_lookup (test->keys, _gcr_gnupg_key_get_keyid (l->data)); + g_assert (key == l->data); + g_hash_table_replace (check, (gchar*)_gcr_gnupg_key_get_keyid (l->data), ""); + } + g_assert_cmpuint (g_hash_table_size (check), ==, g_hash_table_size (test->keys)); + g_hash_table_destroy (check); + g_list_free (objects); + + /* Phillip R. Zimmerman's key should have a photo */ + key = g_hash_table_lookup (test->keys, "C7463639B2D7795E"); + g_assert (GCR_IS_GNUPG_KEY (key)); + record = _gcr_records_find (_gcr_gnupg_key_get_public_records (key), GCR_RECORD_SCHEMA_XA1); + g_assert (record); +} + +static void +test_reload (Test *test, gconstpointer unused) +{ + GError *error = NULL; + GcrGnupgKey *key; + + _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); + egg_test_wait_until (2500); + g_assert (test->result); + _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); + g_assert_no_error (error); + + g_object_unref (test->result); + test->result = NULL; + + _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); + egg_test_wait_until (500000); + g_assert (test->result); + _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); + g_assert_no_error (error); + + /* Werner Koch (a public key) */ + key = g_hash_table_lookup (test->keys, "5DE249965B0358A2"); + g_assert (GCR_IS_GNUPG_KEY (key)); + g_assert (_gcr_gnupg_key_get_secret_records (key) == NULL); + + /* Test Number 2 (a secret key)*/ + key = g_hash_table_lookup (test->keys, "268FEE686262C395"); + g_assert (GCR_IS_GNUPG_KEY (key)); + g_assert (_gcr_gnupg_key_get_secret_records (key)); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-gnupg-collection"); + + g_test_add ("/gcr/gnupg-collection/properties", Test, NULL, setup, test_properties, teardown); + g_test_add ("/gcr/gnupg-collection/load", Test, NULL, setup, test_load, teardown); + g_test_add ("/gcr/gnupg-collection/reload", Test, NULL, setup, test_reload, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-gnupg-key.c b/gcr/test-gnupg-key.c new file mode 100644 index 0000000..4590311 --- /dev/null +++ b/gcr/test-gnupg-key.c @@ -0,0 +1,234 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-record.h" +#include "gcr/gcr-gnupg-key.h" +#include "gcr/gcr-gnupg-records.h" + +#include "egg/egg-testing.h" + +#include + +#include +#include +#include + +typedef struct { + GPtrArray *records; + GPtrArray *pubset; + GPtrArray *secset; + GcrGnupgKey *key; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GPtrArray *records; + + records = g_ptr_array_new_with_free_func (_gcr_record_free); + g_ptr_array_add (records, _gcr_record_parse_colons ("pub:f:1024:17:6C7EE1B8621CC013:899817715:1055898235::m:::scESC:", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("fpr:::::::::ECAF7590EB3443B5C7CF3ACB6C7EE1B8621CC013:", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("uid:f::::::::Werner Koch :\n", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("uid:f::::::::Werner Koch :\n", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("sub:f:1536:16:06AD222CADF6A6E1:919537416:1036177416:::::e:\n", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("fpr:::::::::CF8BCC4B18DE08FCD8A1615906AD222CADF6A6E1:\n", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("sub:r:1536:20:5CE086B5B5A18FF4:899817788:1025961788:::::esc:\n", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("fpr:::::::::AB059359A3B81F410FCFF97F5CE086B5B5A18FF4:", -1)); + test->records = records; + + test->key = _gcr_gnupg_key_new (records, NULL); + g_object_add_weak_pointer (G_OBJECT (test->key), (gpointer *)&test->key); + + records = g_ptr_array_new_with_free_func (_gcr_record_free); + g_ptr_array_add (records, _gcr_record_parse_colons ("pub:u:2048:1:4842D952AFC000FD:1305189489:::u:::scESC:", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("uid:u::::1305189849::D0A8FA7B15DC4BE3F8F03A49C372F2718C78AFC0::Dr. Strangelove :", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("uid:u::::1305189489::D449F1605254754B0BBFA424FC34E50609103BBB::Test Number 1 (unlimited) :", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("sub:u:2048:1:4852132BBED15014:1305189489::::::e:", -1)); + test->pubset = records; + + records = g_ptr_array_new_with_free_func (_gcr_record_free); + g_ptr_array_add (records, _gcr_record_parse_colons ("sec::2048:1:4842D952AFC000FD:1305189489::::::::::", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("uid:::::::D449F1605254754B0BBFA424FC34E50609103BBB::Test Number 1 (unlimited) :", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("uid:::::::D0A8FA7B15DC4BE3F8F03A49C372F2718C78AFC0::Dr. Strangelove :", -1)); + g_ptr_array_add (records, _gcr_record_parse_colons ("ssb::2048:1:4852132BBED15014:1305189489::::::::::", -1)); + test->secset = records; +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->key); + g_assert (test->key == NULL); + + g_ptr_array_unref (test->records); + g_ptr_array_unref (test->pubset); + g_ptr_array_unref (test->secset); +} + +static void +test_label (Test *test, gconstpointer unused) +{ + gchar *label; + + g_object_get (test->key, "label", &label, NULL); + g_assert_cmpstr (label, ==, "Werner Koch "); + + g_free (label); +} + +static void +test_markup (Test *test, gconstpointer unused) +{ + gchar *markup; + + g_object_get (test->key, "markup", &markup, NULL); + g_assert_cmpstr (markup, ==, "Werner Koch\nwk@g10code.com"); + + g_free (markup); +} + +static void +test_description (Test *test, gconstpointer unused) +{ + gchar *description; + + g_object_get (test->key, "description", &description, NULL); + g_assert_cmpstr (description, ==, "PGP Key"); + + g_free (description); +} + +static void +test_records (Test *test, gconstpointer unused) +{ + GPtrArray *records; + + g_object_get (test->key, "public-records", &records, NULL); + g_assert (records == test->records); + + _gcr_gnupg_key_set_public_records (test->key, records); + g_assert (records == _gcr_gnupg_key_get_public_records (test->key)); + + g_ptr_array_unref (records); +} + +static void +test_keyid (Test *test, gconstpointer unused) +{ + gchar *keyid; + + g_object_get (test->key, "keyid", &keyid, NULL); + g_assert_cmpstr (keyid, ==, "6C7EE1B8621CC013"); + + g_free (keyid); + + g_assert_cmpstr (_gcr_gnupg_key_get_keyid (test->key), ==, "6C7EE1B8621CC013"); +} + +static void +test_short_keyid (Test *test, gconstpointer unused) +{ + gchar *keyid; + + g_object_get (test->key, "short-keyid", &keyid, NULL); + g_assert_cmpstr (keyid, ==, "621CC013"); + + g_free (keyid); +} + +static void +test_keyid_for_records (Test *test, gconstpointer unused) +{ + const gchar *keyid; + + keyid = _gcr_gnupg_records_get_keyid (test->records); + g_assert_cmpstr (keyid, ==, "6C7EE1B8621CC013"); +} + +static void +test_with_secret (Test *test, gconstpointer unused) +{ + GcrGnupgKey *key; + GPtrArray *secset; + + key = _gcr_gnupg_key_new (test->pubset, test->secset); + g_assert (GCR_IS_GNUPG_KEY (key)); + + g_object_get (key, "secret-records", &secset, NULL); + g_assert (secset == _gcr_gnupg_key_get_secret_records (key)); + g_object_set (key, "secret-records", secset, NULL); + g_ptr_array_unref (secset); + + g_object_unref (key); +} + +static void +test_no_change_keyid (Test *test, gconstpointer unused) +{ + if (g_test_subprocess ()) { + /* Changing the keyid. This should fail with a warning */ + _gcr_gnupg_key_set_public_records (test->key, test->pubset); + return; + } + + g_test_trap_subprocess ("/gcr/gnupg-key/no_change_keyid", 0, G_TEST_SUBPROCESS_INHERIT_STDOUT); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*fingerprint is no longer the same:*"); +} + +static void +test_secret_mismatched_keyid (Test *test, gconstpointer unused) +{ + if (g_test_subprocess ()) { + /* Different keyid for secret part. This should fail with a warning */ + _gcr_gnupg_key_set_secret_records (test->key, test->secset); + return; + } + + g_test_trap_subprocess ("/gcr/gnupg-key/secret_mismatched_keyid", 0, G_TEST_SUBPROCESS_INHERIT_STDOUT); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*pub and sec parts are not the same:*"); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gcr/gnupg-key/label", Test, NULL, setup, test_label, teardown); + g_test_add ("/gcr/gnupg-key/description", Test, NULL, setup, test_description, teardown); + g_test_add ("/gcr/gnupg-key/markup", Test, NULL, setup, test_markup, teardown); + g_test_add ("/gcr/gnupg-key/records", Test, NULL, setup, test_records, teardown); + g_test_add ("/gcr/gnupg-key/keyid", Test, NULL, setup, test_keyid, teardown); + g_test_add ("/gcr/gnupg-key/short_keyid", Test, NULL, setup, test_short_keyid, teardown); + g_test_add ("/gcr/gnupg-key/keyid_for_records", Test, NULL, setup, test_keyid_for_records, teardown); + g_test_add ("/gcr/gnupg-key/with_secret", Test, NULL, setup, test_with_secret, teardown); + + /* Valgrind seems to have problems with g_test_trap_fork() */ + if (!egg_testing_on_valgrind ()) { + g_test_add ("/gcr/gnupg-key/no_change_keyid", Test, NULL, setup, test_no_change_keyid, teardown); + g_test_add ("/gcr/gnupg-key/secret_mismatched_keyid", Test, NULL, setup, test_secret_mismatched_keyid, teardown); + } + + return g_test_run (); +} diff --git a/gcr/test-gnupg-process.c b/gcr/test-gnupg-process.c new file mode 100644 index 0000000..d6cedd0 --- /dev/null +++ b/gcr/test-gnupg-process.c @@ -0,0 +1,593 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-callback-output-stream.h" +#include "gcr/gcr-gnupg-process.h" + +#include "egg/egg-testing.h" + +#include + +#include +#include + +#define WAIT 50000 + +typedef struct { + GcrGnupgProcess *process; + GAsyncResult *result; + GString *output_buf; + GString *error_buf; + GString *attribute_buf; + GcrRecord *record; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + test->output_buf = g_string_new (""); + test->error_buf = g_string_new (""); + test->attribute_buf = g_string_new (""); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + if (test->result) + g_object_unref (test->result); + if (test->process) + g_object_unref (test->process); + + while (g_main_context_iteration (NULL, FALSE)); + + if (test->result) + g_assert (test->result == NULL); + if (test->process) + g_assert (test->process == NULL); + + if (test->output_buf) + g_string_free (test->output_buf, TRUE); + if (test->error_buf) + g_string_free (test->error_buf, TRUE); + if (test->attribute_buf) + g_string_free (test->attribute_buf, TRUE); + _gcr_record_free (test->record); +} + +static void +test_create (Test *test, gconstpointer unused) +{ + gchar *value; + + test->process = _gcr_gnupg_process_new ("/the/directory", "/path/to/executable"); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + + g_object_get (test->process, "directory", &value, NULL); + g_assert_cmpstr (value, ==, "/the/directory"); + g_free (value); + + g_object_get (test->process, "executable", &value, NULL); + g_assert_cmpstr (value, ==, "/path/to/executable"); + g_free (value); +} + +static void +on_async_ready (GObject *source, GAsyncResult *result, gpointer user_data) +{ + Test *test = user_data; + GObject *result_source; + + g_assert (G_OBJECT (test->process) == source); + g_assert (test->result == NULL); + + result_source = g_async_result_get_source_object (result); + g_assert (result_source == source); + g_object_unref (result_source); + + test->result = g_object_ref (result); + g_object_add_weak_pointer (G_OBJECT (test->result), (gpointer *)&test->result); + egg_test_wait_stop (); +} + +static gchar* +build_script_path (const gchar *name) +{ + gchar *path; + + path = g_build_filename (SRCDIR, "gcr", "fixtures", "gnupg-mock", name, NULL); + + return path; +} + +static gssize +on_process_output_data (gconstpointer buffer, + gsize count, + GCancellable *cancellable, + gpointer user_data, + GError **error) +{ + Test *test = user_data; + g_string_append_len (test->output_buf, buffer, count); + return count; +} + +static gssize +on_process_attribute_data (gconstpointer buffer, + gsize count, + GCancellable *cancellable, + gpointer user_data, + GError **error) +{ + Test *test = user_data; + g_string_append_len (test->attribute_buf, buffer, count); + return count; +} + +static void +on_process_error_line (GcrGnupgProcess *process, const gchar *line, gpointer user_data) +{ + Test *test = user_data; + + g_assert (process == test->process); + g_assert (line); + g_assert (!strchr (line, '\n')); + + g_string_append_printf (test->error_buf, "%s\n", line); +} + +static void +on_process_status_record (GcrGnupgProcess *process, GcrRecord *record, gpointer user_data) +{ + Test *test = user_data; + + g_assert (process == test->process); + g_assert (record); + + g_assert (!test->record); + test->record = _gcr_record_copy (record); +} + +static void +test_run_simple_output (Test *test, gconstpointer unused) +{ + const gchar *argv[] = { NULL }; + GOutputStream *output; + GError *error = NULL; + gboolean ret; + gchar *script; + + script = build_script_path ("mock-simple-output"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL); + _gcr_gnupg_process_set_output_stream (test->process, output); + g_object_unref (output); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + g_assert_cmpstr ("simple-output\n", ==, test->output_buf->str); +} + +static void +test_run_simple_error (Test *test, gconstpointer unused) +{ + const gchar *argv[] = { NULL }; + GError *error = NULL; + gchar *script; + gboolean ret; + + script = build_script_path ("mock-simple-error"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + g_signal_connect (test->process, "error-line", G_CALLBACK (on_process_error_line), test); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + g_assert_cmpstr ("line 1: more line 1\nline 2\nline 3\n", ==, test->error_buf->str); +} + +static void +test_run_status_and_output (Test *test, gconstpointer unused) +{ + const gchar *argv[] = { NULL }; + GOutputStream *output; + GError *error = NULL; + gchar *script; + gboolean ret; + + script = build_script_path ("mock-status-and-output"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL); + _gcr_gnupg_process_set_output_stream (test->process, output); + g_object_unref (output); + + g_signal_connect (test->process, "status-record", G_CALLBACK (on_process_status_record), test); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, GCR_GNUPG_PROCESS_WITH_STATUS, + NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + g_assert (test->record); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 0), ==, "SCHEMA"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 1), ==, "one"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 2), ==, "two"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 3), ==, "three"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 4), ==, "four"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 5), ==, NULL); + g_assert_cmpstr ("Here's some output\nMore output\n", ==, test->output_buf->str); +} + +static void +test_run_status_and_attribute (Test *test, gconstpointer unused) +{ + const gchar *argv[] = { NULL }; + GOutputStream *output; + GError *error = NULL; + gchar *script; + gboolean ret; + + script = build_script_path ("mock-status-and-attribute"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + output = _gcr_callback_output_stream_new (on_process_attribute_data, test, NULL); + _gcr_gnupg_process_set_attribute_stream (test->process, output); + g_object_unref (output); + + g_signal_connect (test->process, "status-record", G_CALLBACK (on_process_status_record), test); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, + GCR_GNUPG_PROCESS_WITH_STATUS | GCR_GNUPG_PROCESS_WITH_ATTRIBUTES, + NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + g_assert (test->record); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 0), ==, "SCHEMA"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 1), ==, "one"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 2), ==, "two"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 3), ==, "three"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 4), ==, "four"); + g_assert_cmpstr (_gcr_record_get_raw (test->record, 5), ==, NULL); + g_assert_cmpstr ("1lc923g4laoeurc23rc241lcg2r23c4gr3", ==, test->attribute_buf->str); +} + + +static void +test_run_arguments_and_environment (Test *test, gconstpointer unused) +{ + GError *error = NULL; + GOutputStream *output; + gchar *script; + gboolean ret; + + const gchar *argv[] = { + "-1", "value1", + "-2", "value2", + NULL + }; + + const gchar *envp[] = { + "ENVIRON1=VALUE1", + "ENVIRON2=VALUE2", + NULL + }; + + script = build_script_path ("mock-arguments-environ"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL); + _gcr_gnupg_process_set_output_stream (test->process, output); + g_object_unref (output); + + g_signal_connect (test->process, "error-line", G_CALLBACK (on_process_error_line), test); + + _gcr_gnupg_process_run_async (test->process, argv, envp, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + if (error) { + g_printerr ("%s\n", test->error_buf->str); + g_assert_no_error (error); + } + g_assert (ret == TRUE); + + g_assert_cmpstr ("value1\nvalue2\n", ==, test->output_buf->str); + g_assert_cmpstr ("VALUE1VALUE2\n", ==, test->error_buf->str); +} + +static void +test_run_with_homedir (Test *test, gconstpointer unused) +{ + const gchar *argv[] = { NULL }; + GOutputStream *output; + GError *error = NULL; + gchar *script; + gchar *check; + gboolean ret; + + script = build_script_path ("mock-with-homedir"); + test->process = _gcr_gnupg_process_new (SRCDIR, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL); + _gcr_gnupg_process_set_output_stream (test->process, output); + g_object_unref (output); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + check = g_strdup_printf ("DIR: %s\n", SRCDIR); + g_assert_cmpstr (check, ==, test->output_buf->str); + g_free (check); +} + +static void +test_run_with_input_and_output (Test *test, + gconstpointer unused) +{ + const gchar *argv[] = { NULL }; + const gchar *data = "one\ntwenty two\nthree\nfourty four\n"; + GInputStream *input; + GOutputStream *output; + GError *error = NULL; + GString *string; + gchar *script; + gboolean ret; + + script = build_script_path ("mock-echo"); + test->process = _gcr_gnupg_process_new (SRCDIR, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + input = g_memory_input_stream_new_from_data ((gpointer)data, -1, NULL); + output = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + + _gcr_gnupg_process_set_input_stream (test->process, input); + _gcr_gnupg_process_set_output_stream (test->process, output); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + string = g_string_new_len (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (output)), + g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (output))); + g_assert_cmpstr (data, ==, string->str); + g_string_free (string, TRUE); + + g_clear_object (&input); + g_clear_object (&output); +} + +static void +test_run_bad_executable (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gchar *script; + const gchar *argv[] = { NULL }; + gboolean ret; + + script = build_script_path ("mock-invalid"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT); + g_clear_error (&error); + g_assert (ret == FALSE); +} + +static void +test_run_fail_exit (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gchar *script; + const gchar *argv[] = { "55", NULL }; + gboolean ret; + + script = build_script_path ("mock-fail-exit"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED); + g_assert_cmpstr (error->message, ==, "Gnupg process exited with code: 55"); + g_clear_error (&error); + g_assert (ret == FALSE); +} + +static void +test_run_fail_signal (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gchar *script; + const gchar *argv[] = { "15", NULL }; + gboolean ret; + + script = build_script_path ("mock-fail-signal"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED); + g_assert_cmpstr (error->message, ==, "Gnupg process was terminated with signal: 15"); + g_clear_error (&error); + g_assert (ret == FALSE); +} + +static void +test_run_and_cancel (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gchar *script; + const gchar *argv[] = { "15", NULL }; + GCancellable *cancellable; + gboolean ret; + + cancellable = g_cancellable_new (); + + script = build_script_path ("mock-simple-output"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + g_free (script); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, cancellable, on_async_ready, test); + g_cancellable_cancel (cancellable); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert (ret == FALSE); + + g_object_unref (cancellable); +} + +static gssize +on_process_output_cancel (gconstpointer buffer, + gsize count, + GCancellable *cancellable, + gpointer user_data, + GError **error) +{ + g_cancellable_cancel (cancellable); + g_cancellable_set_error_if_cancelled (cancellable, error); + return -1; +} + +static void +test_run_and_cancel_later (Test *test, gconstpointer unused) +{ + GError *error = NULL; + GOutputStream *output; + gchar *script; + const gchar *argv[] = { "15", NULL }; + GCancellable *cancellable; + gboolean ret; + + cancellable = g_cancellable_new (); + + script = build_script_path ("mock-simple-output"); + test->process = _gcr_gnupg_process_new (NULL, script); + g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process); + output = _gcr_callback_output_stream_new (on_process_output_cancel, NULL, NULL); + _gcr_gnupg_process_set_output_stream (test->process, output); + g_object_unref (output); + g_free (script); + + _gcr_gnupg_process_run_async (test->process, argv, NULL, 0, cancellable, on_async_ready, test); + egg_test_wait_until (WAIT); + + g_assert (test->result); + ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert (ret == FALSE); + + g_object_unref (cancellable); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-gnupg-process"); + + g_test_add ("/gcr/gnupg-process/create", Test, NULL, setup, test_create, teardown); + g_test_add ("/gcr/gnupg-process/run_simple_output", Test, NULL, setup, test_run_simple_output, teardown); + g_test_add ("/gcr/gnupg-process/run_simple_error", Test, NULL, setup, test_run_simple_error, teardown); + g_test_add ("/gcr/gnupg-process/run_status_and_output", Test, NULL, setup, test_run_status_and_output, teardown); + g_test_add ("/gcr/gnupg-process/run_status_and_attribute", Test, NULL, setup, test_run_status_and_attribute, teardown); + g_test_add ("/gcr/gnupg-process/run_arguments_and_environment", Test, NULL, setup, test_run_arguments_and_environment, teardown); + g_test_add ("/gcr/gnupg-process/run_with_homedir", Test, NULL, setup, test_run_with_homedir, teardown); + g_test_add ("/gcr/gnupg-process/run_with_input_and_output", Test, NULL, setup, test_run_with_input_and_output, teardown); + g_test_add ("/gcr/gnupg-process/run_fail_exit", Test, NULL, setup, test_run_fail_exit, teardown); + g_test_add ("/gcr/gnupg-process/run_fail_signal", Test, NULL, setup, test_run_fail_signal, teardown); + g_test_add ("/gcr/gnupg-process/run_and_cancel", Test, NULL, setup, test_run_and_cancel, teardown); + g_test_add ("/gcr/gnupg-process/run_and_cancel_later", Test, NULL, setup, test_run_and_cancel_later, teardown); + + /* Valgrind seems to have problems with g_spawn_async_xxx() failing */ + if (!egg_testing_on_valgrind ()) + g_test_add ("/gcr/gnupg-process/run_bad_executable", Test, NULL, setup, test_run_bad_executable, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-memory-icon.c b/gcr/test-memory-icon.c new file mode 100644 index 0000000..283dcd9 --- /dev/null +++ b/gcr/test-memory-icon.c @@ -0,0 +1,218 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-memory-icon.h" + +#include "egg/egg-testing.h" + +#include + +#include +#include +#include + +typedef struct { + GIcon *icon; + GAsyncResult *result; +} Test; + +static const guint8 test_data[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static void +setup (Test *test, gconstpointer unused) +{ + test->icon = _gcr_memory_icon_new ("application/octet-stream", + test_data, sizeof (test_data)); + g_object_add_weak_pointer (G_OBJECT (test->icon), (gpointer *)&test->icon); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->icon); + + if (test->result) { + g_object_unref (test->result); + g_assert (test->result == NULL); + } + + g_assert (test->icon == NULL); +} + + +static void +test_equal_same (Test *test, gconstpointer unused) +{ + g_assert (g_icon_equal (test->icon, test->icon) == TRUE); +} + +static void +test_equal_not (Test *test, gconstpointer unused) +{ + GIcon *icon; + + icon = g_themed_icon_new ("folder"); + g_assert (g_icon_equal (test->icon, icon) == FALSE); + g_object_unref (icon); +} + +static void +test_equal_data (Test *test, gconstpointer unused) +{ + GIcon *icon; + + icon = _gcr_memory_icon_new ("application/octet-stream", + test_data, sizeof (test_data)); + g_assert (g_icon_equal (test->icon, icon) == TRUE); + g_assert_cmpuint (g_icon_hash (test->icon), ==, g_icon_hash (icon)); + g_object_unref (icon); +} + +static void +test_different_type (Test *test, gconstpointer unused) +{ + GIcon *icon; + + icon = _gcr_memory_icon_new ("application/x-other", + test_data, sizeof (test_data)); + g_assert (g_icon_equal (test->icon, icon) == FALSE); + g_assert_cmpuint (g_icon_hash (test->icon), !=, g_icon_hash (icon)); + g_object_unref (icon); +} + +static void +test_different_offset (Test *test, gconstpointer unused) +{ + GIcon *icon; + + icon = _gcr_memory_icon_new_full ("application/octet-stream", (gpointer)test_data, + sizeof (test_data) - 16, 16, NULL); + g_assert (g_icon_equal (test->icon, icon) == FALSE); + g_assert_cmpuint (g_icon_hash (test->icon), !=, g_icon_hash (icon)); + g_object_unref (icon); +} + +static void +test_load_sync (Test *test, gconstpointer unused) +{ + GError *error = NULL; + GInputStream *is; + gchar buf[1024]; + gsize length; + gchar *type; + + is = g_loadable_icon_load (G_LOADABLE_ICON (test->icon), 0, &type, NULL, &error); + g_assert (is != NULL); + g_assert_no_error (error); + g_assert_cmpstr (type, ==, "application/octet-stream"); + + if (!g_input_stream_read_all (is, buf, sizeof (buf), &length, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + egg_assert_cmpsize (length, ==, sizeof (test_data)); + egg_assert_cmpmem (buf, length, ==, test_data, sizeof (test_data)); + + g_free (type); + g_object_unref (is); +} + +static void +on_async_ready (GObject *source, GAsyncResult *result, gpointer user_data) +{ + Test *test = user_data; + GObject *result_source; + + g_assert (G_OBJECT (test->icon) == source); + g_assert (test->result == NULL); + + result_source = g_async_result_get_source_object (result); + g_assert (result_source == source); + g_object_unref (result_source); + + test->result = g_object_ref (result); + g_object_add_weak_pointer (G_OBJECT (test->result), (gpointer *)&test->result); + egg_test_wait_stop (); +} + +static void +test_load_async (Test *test, gconstpointer unused) +{ + GError *error = NULL; + GInputStream *is; + gchar buf[1024]; + gsize length; + gchar *type; + + g_loadable_icon_load_async (G_LOADABLE_ICON (test->icon), 0, NULL, on_async_ready, test); + egg_test_wait_until (500); + + g_assert (test->result); + is = g_loadable_icon_load_finish (G_LOADABLE_ICON (test->icon), test->result, &type, &error); + g_assert (is != NULL); + g_assert_no_error (error); + g_assert_cmpstr (type, ==, "application/octet-stream"); + g_object_add_weak_pointer (G_OBJECT (is), (gpointer *)&is); + + if (!g_input_stream_read_all (is, buf, sizeof (buf), &length, NULL, &error)) + g_assert_not_reached (); + g_assert_no_error (error); + egg_assert_cmpsize (length, ==, sizeof (test_data)); + egg_assert_cmpmem (buf, length, ==, test_data, sizeof (test_data)); + + g_free (type); + g_object_unref (is); + g_assert (is == NULL); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gcr/memory-icon/equal_same", Test, NULL, setup, test_equal_same, teardown); + g_test_add ("/gcr/memory-icon/equal_not", Test, NULL, setup, test_equal_not, teardown); + g_test_add ("/gcr/memory-icon/equal_data", Test, NULL, setup, test_equal_data, teardown); + g_test_add ("/gcr/memory-icon/different_type", Test, NULL, setup, test_different_type, teardown); + g_test_add ("/gcr/memory-icon/different_offset", Test, NULL, setup, test_different_offset, teardown); + g_test_add ("/gcr/memory-icon/load_sync", Test, NULL, setup, test_load_sync, teardown); + g_test_add ("/gcr/memory-icon/load_async", Test, NULL, setup, test_load_async, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-openpgp.c b/gcr/test-openpgp.c new file mode 100644 index 0000000..afba139 --- /dev/null +++ b/gcr/test-openpgp.c @@ -0,0 +1,352 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-openpgp.h" +#include "gcr/gcr-record.h" + +#include "egg/egg-armor.h" +#include "egg/egg-testing.h" + +#include +#include +#include + +typedef struct { + const gchar *name; + const gchar **records; + const gchar *filename; + const gchar *version; + GcrOpenpgpParseFlags flags; +} Fixture; + +static const gchar *werner_koch_records[] = { + "pub:e:1024:17:68B7AB8957548DCD:899816990:1136043547::o:::sca:\n" + "fpr:::::::::6BD9050FD8FC941B43412DCC68B7AB8957548DCD:\n" + "uid:e::::1102866526::B712A25DC2ABEF1579696C2925859931078C2C3E::Werner Koch (gnupg sig) :\n", + + "pub:e:1024:17:5DE249965B0358A2:921520361:1247335656::o:::sc:\n" + "fpr:::::::::A4D94E92B0986AB5EE9DCD755DE249965B0358A2:\n" + "uid:e::::1113145458::F5B5738FAFB7543A01BAB31A6D767FBC789FF8A8::Werner Koch :\n" + "uid:e::::1113145466::60095F7DAD08129CCE39E15BEB6BBE21937E3AA6::Werner Koch :\n" + "uid:e::::921520362::392B892CF897AD0F03EB26343C4C20A48B36513E::Werner Koch:\n" + "uid:e::::1113145466::3E000C0F7D13A3C57C633C16ABDC97F12EAF16C1::Werner Koch :\n" + "sub:e:1024:17:60784E94010A57ED:1079892559:1199124559:::::s:\n" + "sub:e:2048:1:7299C628B604F148:1079892777:1136052777:::::e:\n" + "sub:e:2048:1:35E52D69C3680A6E:1136137762:1199123362:::::e:\n", + + "pub:e:1024:1:53B620D01CE0C630:1136130759:1230738759::o:::sc:\n" + "fpr:::::::::7B96D396E6471601754BE4DB53B620D01CE0C630:\n" + "uid:e::::1136130760::142B958D9816ECF810DBB83BD257E5C7DB36C99A::Werner Koch (dist sig) :\n", + + NULL +}; + +static const gchar *werner_sig_records[] = { + "pub:e:1024:17:68B7AB8957548DCD:899816990:1136043547::o:::sca:\n" + "fpr:::::::::6BD9050FD8FC941B43412DCC68B7AB8957548DCD:\n" + "uid:e::::1102866526::B712A25DC2ABEF1579696C2925859931078C2C3E::Werner Koch (gnupg sig) :\n" + "sig:::17:68B7AB8957548DCD:1102866526:::::13x:\n", + + "pub:e:1024:17:5DE249965B0358A2:921520361:1247335656::o:::sc:\n" + "fpr:::::::::A4D94E92B0986AB5EE9DCD755DE249965B0358A2:\n" + "uid:e::::1113145458::F5B5738FAFB7543A01BAB31A6D767FBC789FF8A8::Werner Koch :\n" + "sig:::17:5DE249965B0358A2:1113145458:::::13x:\n" + "uid:e::::1113145466::60095F7DAD08129CCE39E15BEB6BBE21937E3AA6::Werner Koch :\n" + "sig:::17:5DE249965B0358A2:1113145466:::::13x:\n" + "uid:e::::921520362::392B892CF897AD0F03EB26343C4C20A48B36513E::Werner Koch:\n" + "sig:::17:5DE249965B0358A2:921520362:::::13x:\n" + "uid:e::::1113145466::3E000C0F7D13A3C57C633C16ABDC97F12EAF16C1::Werner Koch :\n" + "sig:::17:5DE249965B0358A2:1113145466:::::13x:\n" + "sub:e:1024:17:60784E94010A57ED:1079892559:1199124559:::::s:\n" + "sig:::17:5DE249965B0358A2:1148562461:::::18x:\n" + "sub:e:2048:1:7299C628B604F148:1079892777:1136052777:::::e:\n" + "sig:::17:5DE249965B0358A2:1079892777:::::18x:\n" + "sub:e:2048:1:35E52D69C3680A6E:1136137762:1199123362:::::e:\n" + "sig:::17:5DE249965B0358A2:1136137762:::::18x:\n", + + "pub:e:1024:1:53B620D01CE0C630:1136130759:1230738759::o:::sc:\n" + "fpr:::::::::7B96D396E6471601754BE4DB53B620D01CE0C630:\n" + "uid:e::::1136130760::142B958D9816ECF810DBB83BD257E5C7DB36C99A::Werner Koch (dist sig) :\n" + "sig:::1:53B620D01CE0C630:1136130760:::::13x:\n", + + NULL +}; + +static const gchar *pubring_records[] = { + "pub:o:2048:1:4842D952AFC000FD:1305189489:::o:::scSCE:\n" + "fpr:::::::::61A6EA3E0115080227A32EC94842D952AFC000FD:\n" + "uid:o::::1305189489::D449F1605254754B0BBFA424FC34E50609103BBB::Test Number 1 (unlimited) :\n" + "uid:o::::1305189849::D0A8FA7B15DC4BE3F8F03A49C372F2718C78AFC0::Dr. Strangelove :\n" + "sub:o:2048:1:4852132BBED15014:1305189489::::::e:\n", + + "pub:e:1024:1:268FEE686262C395:1305189628:1305276028::o:::sc:\n" + "fpr:::::::::A4853C22EA82C8ADC6692751268FEE686262C395:\n" + "uid:e::::1305189628::2E9D48BD771DA765D2B48A0233D0E8F393F6E839::Test Number 2 (all gone) :\n" + "sub:e:1024:1:C5877FABF4772E4F:1305189628:1305276028:::::e:\n", + + "pub:e:1024:17:68B7AB8957548DCD:899816990:1136043547::o:::sca:\n" + "fpr:::::::::6BD9050FD8FC941B43412DCC68B7AB8957548DCD:\n" + "uid:e::::1102866526::B712A25DC2ABEF1579696C2925859931078C2C3E::Werner Koch (gnupg sig) :\n", + + "pub:e:1024:17:5DE249965B0358A2:921520361:1247335656::o:::sc:\n" + "fpr:::::::::A4D94E92B0986AB5EE9DCD755DE249965B0358A2:\n" + "uid:e::::1113145458::F5B5738FAFB7543A01BAB31A6D767FBC789FF8A8::Werner Koch :\n" + "uid:e::::1113145466::60095F7DAD08129CCE39E15BEB6BBE21937E3AA6::Werner Koch :\n" + "uid:e::::921520362::392B892CF897AD0F03EB26343C4C20A48B36513E::Werner Koch:\n" + "uid:e::::1113145466::3E000C0F7D13A3C57C633C16ABDC97F12EAF16C1::Werner Koch :\n" + "sub:e:1024:17:60784E94010A57ED:1079892559:1199124559:::::s:\n" + "sub:e:2048:1:7299C628B604F148:1079892777:1136052777:::::e:\n" + "sub:e:2048:1:35E52D69C3680A6E:1136137762:1199123362:::::e:\n", + + "pub:o:1024:17:C7463639B2D7795E:978642983:::o:::scSCE:\n" + "fpr:::::::::055FC78F112193492C4F37AFC7463639B2D7795E:\n" + "rvk:o::17::::::3FC732041D23E9EA66DDB5009C9DBC21DF74DC61:80:\n" + "uid:o::::978642983::44C6F00AAE524A8955CAB76F2BB16126530BB203::Philip R. Zimmermann :\n" + "uid:o::::978643127::BD93DF0D0D564E85F73ECBECFFB1B5BA5FF2838D::Philip R. Zimmermann :\n" + "uat:o::::978751266::E0F87F37495D4ED247BB66A08D7360D8D81F9976::1 3391:\n" + "uat:o::::1013326898::10A2C49F62C540090ECD679C518AACAA8E960BA5::1 3479:\n" + "uid:o::::1052692250::09D1F68A1C44AC42E7FCC5615EEDBB0FD581DCDE::Philip R. Zimmermann :\n" + "sub:o:3072:16:C4EB1C56A8E92834:978642983::::::e:\n", + + "pub:o:4096:1:DB698D7199242560:1012189561:::o:::scSCEA:\n" + "fpr:::::::::7D92FD313AB6F3734CC59CA1DB698D7199242560:\n" + "uid:o::::1012189561::0E5FC22DD5518890217F20F1FF832597932B46C1::David M. Shaw :\n" + "sub:o:2048:16:AE2827D11643B926:1012189956:1327549956:::::e:\n" + "sub:o:1024:17:E2665C8749E1CBC9:1012190171:1327550171:::::sca:\n", + + "pub:o:2048:1:9710B89BCA57AD7C:1102303986:::o:::scSC:\n" + "fpr:::::::::50BB6FFC9719DFD2BEBB04C69710B89BCA57AD7C:\n" + "uid:o::::1112650864::A96F758EFD5D67EA9450860C7D15A96DAA1B40E2::PGP Global Directory Verification Key:\n" + "uat:o::::1112650864::83B0B68B95892BBCE32F04BA0FBAC6CEAD4EDE49::1 3422:\n", + + "pub:e:1024:1:53B620D01CE0C630:1136130759:1230738759::o:::sc:\n" + "fpr:::::::::7B96D396E6471601754BE4DB53B620D01CE0C630:\n" + "uid:e::::1136130760::142B958D9816ECF810DBB83BD257E5C7DB36C99A::Werner Koch (dist sig) :\n", + + NULL +}; + +static const gchar *secring_records[] = { + "sec::2048:1:4842D952AFC000FD:1305189489::::::::::\n" + "fpr:::::::::61A6EA3E0115080227A32EC94842D952AFC000FD:\n" + "uid:::::::D449F1605254754B0BBFA424FC34E50609103BBB::Test Number 1 (unlimited) :\n" + "uid:::::::D0A8FA7B15DC4BE3F8F03A49C372F2718C78AFC0::Dr. Strangelove :\n" + "ssb::2048:1:4852132BBED15014:1305189489::::::::::\n", + + "sec::1024:1:268FEE686262C395:1305189628:1305276028:::::::::\n" + "fpr:::::::::A4853C22EA82C8ADC6692751268FEE686262C395:\n" + "uid:::::::2E9D48BD771DA765D2B48A0233D0E8F393F6E839::Test Number 2 (all gone) :\n" + "ssb::1024:1:C5877FABF4772E4F:1305189628::::::::::\n", + + NULL +}; + +static Fixture fixtures[] = { + { + "werner_koch", + werner_koch_records, + SRCDIR "/gcr/fixtures/werner-koch.asc", + "GnuPG v1.4.11 (GNU/Linux)", + GCR_OPENPGP_PARSE_KEYS + }, + { + "werner_koch_with_sigs", + werner_sig_records, + SRCDIR "/gcr/fixtures/werner-koch.asc", + "GnuPG v1.4.11 (GNU/Linux)", + GCR_OPENPGP_PARSE_KEYS | GCR_OPENPGP_PARSE_SIGNATURES + }, + { + "pubring", + pubring_records, + SRCDIR "/gcr/fixtures/pubring.gpg", + NULL, + GCR_OPENPGP_PARSE_KEYS + }, + { + "secring", + secring_records, + SRCDIR "/gcr/fixtures/secring.gpg", + NULL, + GCR_OPENPGP_PARSE_KEYS + } +}; + +typedef struct { + const gchar **at; + const Fixture *fixture; +} Test; + +static void +setup (Test *test, + gconstpointer data) +{ + const Fixture *fixture = data; + test->fixture = fixture; + test->at = fixture->records; +} + +static void +teardown (Test *test, + gconstpointer data) +{ + +} + +static void +compare_fixture_with_records (const gchar *fixture, + GPtrArray *records) +{ + gchar *record; + gchar **lines; + guint i; + + lines = g_strsplit (fixture, "\n", -1); + for (i = 0; i < records->len; i++) { + record = _gcr_record_format (records->pdata[i]); + g_assert_cmpstr (record, ==, lines[i]); + g_free (record); + } + + if (lines[i] == NULL) { + g_test_message ("more openpgp records parsed than in fixture"); + g_assert_not_reached (); + } + + g_strfreev (lines); +} + +static void +on_openpgp_packet (GPtrArray *records, + GBytes *outer, + gpointer user_data) +{ + Test *test = user_data; + guint seen; + + /* Should be parseable again */ + seen = _gcr_openpgp_parse (outer, test->fixture->flags | + GCR_OPENPGP_PARSE_NO_RECORDS, NULL, NULL); + g_assert_cmpuint (seen, ==, 1); + + if (*(test->at) == NULL) { + g_test_message ("more openpgp packets parsed than in fixture"); + g_assert_not_reached (); + } + + compare_fixture_with_records (*(test->at), records); + test->at++; +} + +static void +on_armor_parsed (GQuark type, + GBytes *data, + GBytes *outer, + GHashTable *headers, + gpointer user_data) +{ + Test *test = user_data; + const gchar *value; + guint seen; + + if (test->fixture->version) { + value = g_hash_table_lookup (headers, "Version"); + g_assert_cmpstr (value, ==, test->fixture->version); + } + + seen = _gcr_openpgp_parse (data, test->fixture->flags, + on_openpgp_packet, test); + g_assert_cmpuint (seen, >, 0); + + if (*(test->at) != NULL) { + g_test_message ("less openpgp packets parsed than in fixture"); + g_assert_not_reached (); + } +} + +static void +test_openpgp_armor (Test *test, + gconstpointer data) +{ + GError *error = NULL; + GBytes *bytes; + gchar *armor; + gsize length; + guint parts; + + g_file_get_contents (test->fixture->filename, &armor, &length, &error); + g_assert_no_error (error); + + bytes = g_bytes_new_take (armor, length); + parts = egg_armor_parse (bytes, on_armor_parsed, test); + g_assert_cmpuint (parts, ==, 1); + + g_bytes_unref (bytes); +} + +static void +test_openpgp_binary (Test *test, + gconstpointer data) +{ + GError *error = NULL; + GBytes *bytes; + gchar *binary; + gsize length; + guint seen; + + g_file_get_contents (test->fixture->filename, &binary, &length, &error); + g_assert_no_error (error); + + bytes = g_bytes_new_take (binary, length); + seen = _gcr_openpgp_parse (bytes, test->fixture->flags, on_openpgp_packet, test); + g_assert_cmpuint (seen, >, 0); + + if (*(test->at) != NULL) { + g_test_message ("less openpgp packets parsed than in fixture"); + g_assert_not_reached (); + } + + g_bytes_unref (bytes); +} + +int +main (int argc, char **argv) +{ + guint i; + gchar *test_path; + + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-openpgp"); + + for (i = 0; i < G_N_ELEMENTS (fixtures); i++) { + test_path = g_strdup_printf ("/gcr/openpgp/%s", fixtures[i].name); + if (g_str_has_suffix (fixtures[i].filename, ".asc")) + g_test_add (test_path, Test, fixtures + i, setup, test_openpgp_armor, teardown); + else + g_test_add (test_path, Test, fixtures + i, setup, test_openpgp_binary, teardown); + g_free (test_path); + } + + return g_test_run (); +} diff --git a/gcr/test-openssh.c b/gcr/test-openssh.c new file mode 100644 index 0000000..3161736 --- /dev/null +++ b/gcr/test-openssh.c @@ -0,0 +1,230 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-openssh.h" + +#include "egg/egg-testing.h" + +#include +#include +#include + +typedef struct { + const gchar *expected_label; + const gchar *expected_options; +} Test; + +#define OPENSSH_PUBLIC_RSA1 \ + "2048 65537 19574029774826276058535216798260123376543523095248321838931" \ + "8476099051534660565418100376122247153936738716140984293302866595208305" \ + "7124376564328644357957081508003798389808113087527047927841196160520784" \ + "3971799891833860159372766201922902824211581515042106928142039998651198" \ + "7806024885997262427984841536983221992403267030558391252672804492615887" \ + "9294713324466630490990131504557923061505441555447586185019409756877006" \ + "5871190731807718592844942425524851665039303855329966512492845780563670" \ + "0617451083369174928502647995734856960603065454655489558179113130210712" \ + "74638931037011169213563881172297734240201883475566393175838117784693 r" \ + "sa-key@example.com\n" + +#define OPENSSH_PUBLIC_RSA2 \ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCs8z2y0cCPYRAPkq8tAt6FC/kdfnR/p" \ + "8B2ZoY0oiLNt7kQEwJfexgwLqTxWYd2fSDUSSDPrsqAxZAwLLS/eF04kXiJO2VfqAWFpTL" \ + "NToERHpFF1yZQe26ELTlNNfna7LqfCRvpNDwu6AqndsT3eFt7DWvBDXbbEiTLW21Z2OFAA" \ + "H/J2iCFn4c0a8Myf7IaMYcy5GG3mpk39kEO4aNV/67U7kfooek24ObwD0vlXzlsi5VZIUF" \ + "OIUi0UdkNEMCtUWpfkZ1STUlmwp9HVM7xb7/9PESQKDnZdxpB09S9cIjdpDecpDlMDDEbE" \ + "UECM1PIas3ndhB7gAN1i2JsPHTcXZ1 rsa-key@example.com\r\n" \ + "# Comment\n" + +#define OPENSSH_PUBLIC_DSA2 \ + "ssh-dss AAAAB3NzaC1kc3MAAACBAL4z+ad0ZJYzMOQuGp00UJ+AijKhrPVUEYLcxBmFQo" \ + "nb/KIlLSWJua4Rl9DB4tDj30Y9c/oApqC4n+FIYlUZMSnxmpvcLF6aeXOiHHPvm0EDYjjy" \ + "VubyYQWI7CROrrzSc+x++ha3TuJEvF3PlKlZmTKKVYEkZNjwFqYysGyPxPalAAAAFQDtDS" \ + "EF9Gvnv5fQtSbbsp7j78uVBwAAAIAtNpAg/Mbd/E2241enedB9AxAbJWZ5QYnoPe6/zx5d" \ + "OmU7+qz8mG6tgvF8F7IgXPabuAKslzTDGS3zgaEhWicDS3CIYik2UR8hXdxfovIEqZKZe7" \ + "u02FCEoXYCEiFUAdzDGzjI7PswgtEJWWNqKeNis3HmDDha9lMkqz/3fLZGXwAAAIEAiaRP" \ + "YKZDMoJG+aVZ5A3R/m2gl+mYE2MsjPKXuBKcrZ6ItA9BMe4G/An0/+E3A+DuoGxdeNNMF8" \ + "U9Dy2N8Sch/Ngtg2E/FBo5geljWobJXd1jxmPtF2WAliYJXDdIt6RBVPGL9H/KSjDmBMsV" \ + "d42wxVJywawzypklVZjSUuWuBMI= dsa-key@example.com \n" + +#define OPENSSH_PUBLIC_ECDSA \ + "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAA" \ + "BBBMKWn4nDF3IVAB2XKK8MdlMV0r1PkwHWemNuNkKnDSLy1CA17IEBXzEFX0yDEaC/8cFG" \ + "Bc0VblrySYCYKvJc+is= ecdsa-key@example.com \n" + +#define EXTRA_LINES_WITHOUT_KEY \ + "\n# Comment\n\n" \ + "20aa3\n" \ + "not a key\n" + +static void +setup (Test *test, + gconstpointer unused) +{ + +} + +static void +teardown (Test *test, + gconstpointer unused) +{ + +} + +static void +on_openssh_pub_parse (GckAttributes *attrs, + const gchar *label, + const gchar *options, + GBytes *outer, + gpointer user_data) +{ + Test *test = user_data; + guint keys; + + if (test->expected_label) + g_assert_cmpstr (label, ==, test->expected_label); + if (test->expected_options) + g_assert_cmpstr (options, ==, test->expected_options); + + /* The block should parse properly */ + keys = _gcr_openssh_pub_parse (outer, NULL, NULL); + g_assert_cmpuint (keys, ==, 1); +} + +static void +test_parse_v1_rsa (Test *test, + gconstpointer unused) +{ + const gchar *data = OPENSSH_PUBLIC_RSA1 EXTRA_LINES_WITHOUT_KEY; + GBytes *bytes; + gint keys; + + test->expected_label = "rsa-key@example.com"; + + bytes = g_bytes_new_static (data, strlen (data)); + keys = _gcr_openssh_pub_parse (bytes, on_openssh_pub_parse, test); + g_assert_cmpint (keys, ==, 1); + + g_bytes_unref (bytes); +} + +static void +test_parse_v2_rsa (Test *test, + gconstpointer unused) +{ + const gchar *data = OPENSSH_PUBLIC_RSA2 EXTRA_LINES_WITHOUT_KEY; + GBytes *bytes; + gint keys; + + test->expected_label = "rsa-key@example.com"; + + bytes = g_bytes_new_static (data, strlen (data)); + keys = _gcr_openssh_pub_parse (bytes, on_openssh_pub_parse, test); + g_assert_cmpint (keys, ==, 1); + + g_bytes_unref (bytes); +} + +static void +test_parse_v2_dsa (Test *test, + gconstpointer unused) +{ + const gchar *data = OPENSSH_PUBLIC_DSA2 EXTRA_LINES_WITHOUT_KEY; + GBytes *bytes; + gint keys; + + test->expected_label = "dsa-key@example.com"; + + bytes = g_bytes_new_static (data, strlen (data)); + keys = _gcr_openssh_pub_parse (bytes, on_openssh_pub_parse, test); + g_assert_cmpint (keys, ==, 1); + + g_bytes_unref (bytes); +} + +static void +test_parse_v2_ecdsa (Test *test, + gconstpointer unused) +{ + const gchar *data = OPENSSH_PUBLIC_ECDSA EXTRA_LINES_WITHOUT_KEY; + GBytes *bytes; + gint keys; + + test->expected_label = "ecdsa-key@example.com"; + + bytes = g_bytes_new_static (data, strlen (data)); + keys = _gcr_openssh_pub_parse (bytes, on_openssh_pub_parse, test); + g_assert_cmpint (keys, ==, 1); + + g_bytes_unref (bytes); +} + +static void +test_parse_v1_options (Test *test, + gconstpointer unused) +{ + const gchar *data = "option1,option2=\"value 2\",option3 " OPENSSH_PUBLIC_RSA1; + GBytes *bytes; + gint keys; + + test->expected_options = "option1,option2=\"value 2\",option3"; + + bytes = g_bytes_new_static (data, strlen (data)); + keys = _gcr_openssh_pub_parse (bytes, on_openssh_pub_parse, test); + g_assert_cmpint (keys, ==, 1); + + g_bytes_unref (bytes); +} + +static void +test_parse_v2_options (Test *test, + gconstpointer unused) +{ + const gchar *data = "option1,option2=\"value 2\",option3 " OPENSSH_PUBLIC_RSA2; + GBytes *bytes; + gint keys; + + test->expected_options = "option1,option2=\"value 2\",option3"; + + bytes = g_bytes_new_static (data, strlen (data)); + keys = _gcr_openssh_pub_parse (bytes, on_openssh_pub_parse, test); + g_assert_cmpint (keys, ==, 1); + + g_bytes_unref (bytes); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-openssh"); + + g_test_add ("/gcr/openssh/parse_v1_rsa", Test, NULL, setup, test_parse_v1_rsa, teardown); + g_test_add ("/gcr/openssh/parse_v2_rsa", Test, NULL, setup, test_parse_v2_rsa, teardown); + g_test_add ("/gcr/openssh/parse_v2_dsa", Test, NULL, setup, test_parse_v2_dsa, teardown); + g_test_add ("/gcr/openssh/parse_v2_ecdsa", Test, NULL, setup, test_parse_v2_ecdsa, teardown); + g_test_add ("/gcr/openssh/parse_v1_options", Test, NULL, setup, test_parse_v1_options, teardown); + g_test_add ("/gcr/openssh/parse_v2_options", Test, NULL, setup, test_parse_v2_options, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-parser.c b/gcr/test-parser.c new file mode 100644 index 0000000..13cbc2b --- /dev/null +++ b/gcr/test-parser.c @@ -0,0 +1,381 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-pkix-parser.c: Test PKIX parser + + Copyright (C) 2007 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-error.h" +#include "egg/egg-secure-memory.h" +#include "egg/egg-testing.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-internal.h" + +#include "gck/gck.h" + +#include +#include + +#include +#include +#include +#include + +/* + * Each test looks like (on one line): + * void unit_test_xxxxx (CuTest* cu) + * + * Each setup looks like (on one line): + * void unit_setup_xxxxx (void); + * + * Each teardown looks like (on one line): + * void unit_teardown_xxxxx (void); + * + * Tests be run in the order specified here. + */ + +typedef struct { + GcrParser *parser; + const gchar* filedesc; +} Test; + +static void +ensure_block_can_be_parsed (GcrDataFormat format, + GBytes *block) +{ + GcrParser *parser; + gboolean result; + GError *error = NULL; + + g_assert (block != NULL); + + parser = gcr_parser_new (); + g_object_add_weak_pointer (G_OBJECT (parser), (gpointer *)&parser); + gcr_parser_format_disable (parser, -1); + gcr_parser_format_enable (parser, format); + result = gcr_parser_parse_bytes (parser, block, &error); + + if (!result) { + g_critical ("The data returned from gcr_parser_get_parsed_block() " + "cannot be parsed: %s", error->message); + g_assert_not_reached (); + } + + g_object_unref (parser); + g_assert (parser == NULL); +} + +static void +parsed_item (GcrParser *par, gpointer user_data) +{ + GckAttributes *attrs; + const gchar *description; + const gchar *label; + Test *test = user_data; + GBytes *block; + GcrDataFormat format; + + g_assert (GCR_IS_PARSER (par)); + g_assert (par == test->parser); + + attrs = gcr_parser_get_parsed_attributes (test->parser); + g_assert (attrs); + + description = gcr_parser_get_parsed_description (test->parser); + label = gcr_parser_get_parsed_label (test->parser); + block = gcr_parser_get_parsed_bytes (test->parser); + format = gcr_parser_get_parsed_format (test->parser); + ensure_block_can_be_parsed (format, block); + + if (g_test_verbose ()) + g_print ("%s: '%s'\n", description, label); +} + +static gboolean +authenticate (GcrParser *par, gint state, gpointer user_data) +{ + Test *test = user_data; + + g_assert (GCR_IS_PARSER (par)); + g_assert (par == test->parser); + + switch (state) { + case 0: + gcr_parser_add_password (test->parser, "booo"); + return TRUE; + case 1: + gcr_parser_add_password (test->parser, "usr0052"); + return TRUE; + default: + g_printerr ("decryption didn't work for: %s", test->filedesc); + g_assert_not_reached (); + return FALSE; + }; +} + +static void +setup (Test *test, gconstpointer unused) +{ + test->parser = gcr_parser_new (); + g_signal_connect (test->parser, "parsed", G_CALLBACK (parsed_item), test); + g_signal_connect (test->parser, "authenticate", G_CALLBACK (authenticate), test); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->parser); +} + +static void +test_parse_one (Test *test, + gconstpointer user_data) +{ + const gchar *path = user_data; + gchar *contents; + GError *error = NULL; + gboolean result; + GBytes *bytes; + gsize len; + + if (!g_file_get_contents (path, &contents, &len, NULL)) + g_assert_not_reached (); + + test->filedesc = path; + bytes = g_bytes_new_take (contents, len); + result = gcr_parser_parse_bytes (test->parser, bytes, &error); + g_assert_no_error (error); + g_assert (result); + + g_bytes_unref (bytes); +} + +static void +on_parsed_compare_bytes (GcrParser *parser, + gpointer user_data) +{ + GBytes *original = user_data; + GBytes *bytes; + gconstpointer data; + gsize n_data; + GcrParsed *parsed; + + bytes = gcr_parser_get_parsed_bytes (parser); + g_assert (bytes != NULL); + g_assert (g_bytes_equal (original, bytes)); + + data = gcr_parser_get_parsed_block (parser, &n_data); + g_assert (data != NULL); + g_assert_cmpint (n_data, ==, g_bytes_get_size (original)); + g_assert (memcmp (data, g_bytes_get_data (original, NULL), n_data) == 0); + + parsed = gcr_parser_get_parsed (parser); + g_assert (parsed != NULL); + bytes = gcr_parsed_get_bytes (parsed); + g_assert (bytes != NULL); + g_assert (g_bytes_equal (original, bytes)); + + data = gcr_parsed_get_data (parsed, &n_data); + g_assert (data != NULL); + g_assert_cmpint (n_data, ==, g_bytes_get_size (original)); + g_assert (memcmp (data, g_bytes_get_data (original, NULL), n_data) == 0); +} + +static void +test_parsed_bytes (void) +{ + GcrParser *parser = gcr_parser_new (); + gchar *contents; + GError *error = NULL; + gboolean result; + GBytes *bytes; + gsize len; + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/cacert.org.cer", &contents, &len, NULL)) + g_assert_not_reached (); + + bytes = g_bytes_new_take (contents, len); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parsed_compare_bytes), bytes); + result = gcr_parser_parse_bytes (parser, bytes, &error); + g_assert_no_error (error); + g_assert (result); + + g_bytes_unref (bytes); + g_object_unref (parser); +} + +static void +test_parse_null (void) +{ + GcrParser *parser = gcr_parser_new (); + GError *error = NULL; + gboolean result; + + result = gcr_parser_parse_data (parser, NULL, 0, &error); + g_assert_error (error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED); + g_assert (!result); + g_error_free (error); + + g_object_unref (parser); +} + +static void +test_parse_empty (void) +{ + GcrParser *parser = gcr_parser_new (); + GError *error = NULL; + gboolean result; + + result = gcr_parser_parse_data (parser, (const guchar *)"", 0, &error); + g_assert_error (error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED); + g_assert (!result); + g_error_free (error); + + g_object_unref (parser); +} + +static void +test_parse_stream (void) +{ + GcrParser *parser = gcr_parser_new (); + GError *error = NULL; + gboolean result; + GFile *file; + GFileInputStream *fis; + gchar *contents; + gsize len; + GBytes *bytes; + + file = g_file_new_for_path (SRCDIR "/gcr/fixtures/cacert.org.cer"); + fis = g_file_read (file, NULL, &error); + g_assert_no_error (error); + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/cacert.org.cer", &contents, &len, NULL)) + g_assert_not_reached (); + bytes = g_bytes_new_take (contents, len); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parsed_compare_bytes), bytes); + + result = gcr_parser_parse_stream (parser, G_INPUT_STREAM (fis), NULL, &error); + g_assert_no_error (error); + g_assert (result); + + g_bytes_unref (bytes); + g_object_unref (fis); + g_object_unref (file); + g_object_unref (parser); +} + +static void +on_parsed_ref (GcrParser *parser, + gpointer user_data) +{ + GcrParsed **parsed = user_data; + g_assert (parsed != NULL); + g_assert (*parsed == NULL); + *parsed = gcr_parsed_ref (gcr_parser_get_parsed (parser)); +} + +static void +test_parse_filename (void) +{ + GcrParser *parser = gcr_parser_new (); + GcrParsed *parsed = NULL; + GError *error = NULL; + gboolean result; + gchar *contents; + gsize len; + GBytes *bytes; + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/cacert.org.cer", &contents, &len, NULL)) + g_assert_not_reached (); + + bytes = g_bytes_new_take (contents, len); + gcr_parser_set_filename (parser, "cacert.org.cer"); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parsed_ref), &parsed); + + result = gcr_parser_parse_bytes (parser, bytes, &error); + g_assert_cmpstr (gcr_parser_get_filename (parser), ==, "cacert.org.cer"); + g_assert_no_error (error); + g_assert (result); + + g_bytes_unref (bytes); + g_object_unref (parser); + + g_assert (parsed != NULL); + g_assert_cmpstr (gcr_parsed_get_filename (parsed), ==, "cacert.org.cer"); + gcr_parsed_unref (parsed); +} + +int +main (int argc, char **argv) +{ + const gchar *filename; + GError *error = NULL; + GPtrArray *strings; + GDir *dir; + gchar *path; + gchar *lower; + gchar *test; + int ret; + + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-parser"); + + strings = g_ptr_array_new_with_free_func (g_free); + dir = g_dir_open (SRCDIR "/gcr/fixtures", 0, &error); + g_assert_no_error (error); + + for (;;) { + filename = g_dir_read_name (dir); + if (!filename) + break; + if (filename[0] == '.') + continue; + + path = g_build_filename (SRCDIR "/gcr/fixtures", filename, NULL); + + if (g_file_test (path, G_FILE_TEST_IS_DIR)) { + g_free (path); + continue; + } + + lower = g_ascii_strdown (filename, -1); + test = g_strdup_printf ("/gcr/parser/%s", + g_strcanon (lower, "abcdefghijklmnopqrstuvwxyz0123456789", '_')); + g_free (lower); + + g_test_add (test, Test, path, setup, test_parse_one, teardown); + g_ptr_array_add (strings, path); + g_ptr_array_add (strings, test); + } + + g_dir_close (dir); + + g_test_add_func ("/gcr/parser/parse_null", test_parse_null); + g_test_add_func ("/gcr/parser/parse_empty", test_parse_empty); + g_test_add_func ("/gcr/parser/parse_stream", test_parse_stream); + g_test_add_func ("/gcr/parser/parsed_bytes", test_parsed_bytes); + g_test_add_func ("/gcr/parser/filename", test_parse_filename); + + ret = g_test_run (); + g_ptr_array_free (strings, TRUE); + return ret; +} diff --git a/gcr/test-pkcs11-certificate.c b/gcr/test-pkcs11-certificate.c new file mode 100644 index 0000000..e1858ce --- /dev/null +++ b/gcr/test-pkcs11-certificate.c @@ -0,0 +1,281 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-internal.h" + +#include "egg/egg-testing.h" + +#include "gck/gck-mock.h" +#include "gck/gck-test.h" +#include "gck/pkcs11n.h" + +#include + +#include + +typedef struct { + gpointer cert_data; + gsize n_cert_data; + gpointer cert2_data; + gsize n_cert2_data; + CK_FUNCTION_LIST funcs; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GList *modules = NULL; + CK_FUNCTION_LIST_PTR f; + GckModule *module; + GBytes *subject; + GBytes *bytes; + GNode *asn, *node; + CK_RV rv; + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/der-certificate.crt", (gchar**)&test->cert_data, + &test->n_cert_data, NULL)) + g_assert_not_reached (); + g_assert (test->cert_data); + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/der-certificate-dsa.cer", (gchar**)&test->cert2_data, + &test->n_cert2_data, NULL)) + g_assert_not_reached (); + g_assert (test->cert2_data); + + rv = gck_mock_C_GetFunctionList (&f); + gck_assert_cmprv (rv, ==, CKR_OK); + memcpy (&test->funcs, f, sizeof (test->funcs)); + + /* Open a session */ + rv = (test->funcs.C_Initialize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); + + g_assert (!modules); + module = gck_module_new (&test->funcs); + modules = g_list_prepend (modules, module); + gcr_pkcs11_set_modules (modules); + gck_list_unref_free (modules); + + bytes = g_bytes_new_static (test->cert_data, test->n_cert_data); + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes); + g_assert (asn); + node = egg_asn1x_node (asn, "tbsCertificate", "subject", NULL); + subject = egg_asn1x_get_element_raw (node); + + /* Add a certificate to the module */ + gck_builder_add_data (&builder, CKA_VALUE, test->cert_data, test->n_cert_data); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); + gck_builder_add_data (&builder, CKA_SUBJECT, + g_bytes_get_data (subject, NULL), + g_bytes_get_size (subject)); + gck_mock_module_add_object (gck_builder_end (&builder)); + + g_bytes_unref (bytes); + g_bytes_unref (subject); + egg_asn1x_destroy (asn); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + CK_RV rv; + + g_free (test->cert_data); + g_free (test->cert2_data); + + rv = (test->funcs.C_Finalize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); + + _gcr_uninitialize_library (); +} + +static void +test_lookup_certificate_issuer (Test *test, gconstpointer unused) +{ + GcrCertificate *cert, *issuer; + GError *error = NULL; + GckAttributes *attrs; + const GckAttribute *attr; + gconstpointer der; + gsize n_der; + + cert = gcr_simple_certificate_new_static (test->cert_data, test->n_cert_data); + g_assert (cert); + + /* Should be self-signed, so should find itself (added in setup) */ + issuer = gcr_pkcs11_certificate_lookup_issuer (cert, NULL, &error); + g_assert (GCR_IS_PKCS11_CERTIFICATE (issuer)); + g_assert (error == NULL); + + /* Should be the same certificate */ + der = gcr_certificate_get_der_data (issuer, &n_der); + egg_assert_cmpsize (n_der, ==, test->n_cert_data); + g_assert (memcmp (der, test->cert_data, test->n_cert_data) == 0); + + /* Should return the same certificate here too */ + attrs = gcr_pkcs11_certificate_get_attributes (GCR_PKCS11_CERTIFICATE (issuer)); + g_assert (attrs); + attr = gck_attributes_find (attrs, CKA_VALUE); + g_assert (attr); + egg_assert_cmpsize (attr->length, ==, test->n_cert_data); + g_assert (memcmp (attr->value, test->cert_data, test->n_cert_data) == 0); + + /* Should return the same certificate here too */ + attrs = NULL; + g_object_get (issuer, "attributes", &attrs, NULL); + g_assert (attrs); + attr = gck_attributes_find (attrs, CKA_VALUE); + g_assert (attr); + egg_assert_cmpsize (attr->length, ==, test->n_cert_data); + g_assert (memcmp (attr->value, test->cert_data, test->n_cert_data) == 0); + gck_attributes_unref (attrs); + + g_object_unref (cert); + g_object_unref (issuer); +} + +static void +test_lookup_certificate_issuer_not_found (Test *test, gconstpointer unused) +{ + GcrCertificate *cert, *issuer; + GError *error = NULL; + + cert = gcr_simple_certificate_new_static (test->cert2_data, test->n_cert2_data); + g_assert (cert); + + /* Issuer shouldn't be found */ + issuer = gcr_pkcs11_certificate_lookup_issuer (cert, NULL, &error); + g_assert (issuer == NULL); + g_assert (error == NULL); + + g_object_unref (cert); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_lookup_certificate_issuer_async (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GcrCertificate *cert, *issuer; + GError *error = NULL; + gconstpointer der; + gsize n_der; + + cert = gcr_simple_certificate_new_static (test->cert_data, test->n_cert_data); + g_assert (cert); + + /* Should be self-signed, so should find itself (added in setup) */ + gcr_pkcs11_certificate_lookup_issuer_async (cert, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + issuer = gcr_pkcs11_certificate_lookup_issuer_finish (result, &error); + g_assert (GCR_IS_PKCS11_CERTIFICATE (issuer)); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; + + /* Should be the same certificate */ + der = gcr_certificate_get_der_data (issuer, &n_der); + egg_assert_cmpsize (n_der, ==, test->n_cert_data); + g_assert (memcmp (der, test->cert_data, test->n_cert_data) == 0); + + g_object_unref (cert); + g_object_unref (issuer); +} + +static void +test_lookup_certificate_issuer_failure (Test *test, gconstpointer unused) +{ + GcrCertificate *cert, *issuer; + GError *error = NULL; + + cert = gcr_simple_certificate_new_static (test->cert_data, test->n_cert_data); + g_assert (cert); + + /* Make the lookup fail */ + test->funcs.C_GetAttributeValue = gck_mock_fail_C_GetAttributeValue; + + issuer = gcr_pkcs11_certificate_lookup_issuer (cert, NULL, &error); + g_assert (issuer == NULL); + g_assert_error (error, GCK_ERROR, CKR_FUNCTION_FAILED); + g_assert (error->message); + g_clear_error (&error); + + g_object_unref (cert); +} + +static void +test_lookup_certificate_issuer_fail_async (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GcrCertificate *cert, *issuer; + GError *error = NULL; + + cert = gcr_simple_certificate_new_static (test->cert_data, test->n_cert_data); + g_assert (cert); + + /* Make the lookup fail */ + test->funcs.C_GetAttributeValue = gck_mock_fail_C_GetAttributeValue; + + /* Should be self-signed, so should find itself (added in setup) */ + gcr_pkcs11_certificate_lookup_issuer_async (cert, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + issuer = gcr_pkcs11_certificate_lookup_issuer_finish (result, &error); + g_assert (issuer == NULL); + g_assert_error (error, GCK_ERROR, CKR_FUNCTION_FAILED); + g_assert (error->message); + g_clear_error (&error); + g_object_unref (result); + result = NULL; + + g_object_unref (cert); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-pkcs11-certificate"); + + g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer", Test, NULL, setup, test_lookup_certificate_issuer, teardown); + g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer_not_found", Test, NULL, setup, test_lookup_certificate_issuer_not_found, teardown); + g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer_async", Test, NULL, setup, test_lookup_certificate_issuer_async, teardown); + g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer_failure", Test, NULL, setup, test_lookup_certificate_issuer_failure, teardown); + g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer_fail_async", Test, NULL, setup, test_lookup_certificate_issuer_fail_async, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-record.c b/gcr/test-record.c new file mode 100644 index 0000000..521c254 --- /dev/null +++ b/gcr/test-record.c @@ -0,0 +1,292 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-record.h" + +#include "egg/egg-testing.h" + +#include + +typedef struct { + GcrRecord *record; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + test->record = _gcr_record_parse_colons ("one:tab\\there::YW9ldTM4Mzg=:f\xfc""nf:3533333:-88", -1); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + _gcr_record_free (test->record); +} + +static void +test_count (Test *test, gconstpointer unused) +{ + g_assert_cmpuint (_gcr_record_get_count (test->record), ==, 7); +} + +static void +test_parse_colons (void) +{ + GcrRecord *record; + + record = _gcr_record_parse_colons ("one:two::four::six", -1); + g_assert (record); + + g_assert_cmpstr (_gcr_record_get_raw (record, 0), ==, "one"); + g_assert_cmpstr (_gcr_record_get_raw (record, 1), ==, "two"); + g_assert_cmpstr (_gcr_record_get_raw (record, 2), ==, ""); + g_assert_cmpstr (_gcr_record_get_raw (record, 3), ==, "four"); + g_assert_cmpstr (_gcr_record_get_raw (record, 4), ==, ""); + g_assert_cmpstr (_gcr_record_get_raw (record, 5), ==, "six"); + g_assert (_gcr_record_get_raw (record, 6) == NULL); + + _gcr_record_free (record); +} + +static void +test_parse_spaces (void) +{ + GcrRecord *record; + + record = _gcr_record_parse_spaces (" one two four six ", -1); + g_assert (record); + + g_assert_cmpstr (_gcr_record_get_raw (record, 0), ==, "one"); + g_assert_cmpstr (_gcr_record_get_raw (record, 1), ==, "two"); + g_assert_cmpstr (_gcr_record_get_raw (record, 2), ==, "four"); + g_assert_cmpstr (_gcr_record_get_raw (record, 3), ==, "six"); + g_assert (_gcr_record_get_raw (record, 4) == NULL); + g_assert_cmpuint (_gcr_record_get_count (record), ==, 4); + + _gcr_record_free (record); +} + +static void +test_parse_part (void) +{ + GcrRecord *record; + + record = _gcr_record_parse_colons ("one:two::four::six", 8); + g_assert (record); + + g_assert_cmpstr (_gcr_record_get_raw (record, 0), ==, "one"); + g_assert_cmpstr (_gcr_record_get_raw (record, 1), ==, "two"); + g_assert_cmpstr (_gcr_record_get_raw (record, 2), ==, ""); + g_assert (_gcr_record_get_raw (record, 3) == NULL); + + _gcr_record_free (record); +} + +static void +test_parse_too_long (void) +{ + GcrRecord *record; + + /* Too many columns */ + record = _gcr_record_parse_colons (":::::::::::::::::::::::::::::::::::::::::::::::::::::", -1); + g_assert (record == NULL); +} + +static void +test_find (void) +{ + GcrRecord *uid, *pub, *one, *check; + GPtrArray *records; + + records = g_ptr_array_new_with_free_func (_gcr_record_free); + + one = _gcr_record_parse_colons ("one:two::four::six", -1); + g_ptr_array_add (records, one); + pub = _gcr_record_parse_colons ("pub:two", -1); + g_ptr_array_add (records, pub); + uid = _gcr_record_parse_colons ("uid:two", -1); + g_ptr_array_add (records, uid); + + check = _gcr_records_find (records, GCR_RECORD_SCHEMA_PUB); + g_assert (check == pub); + + check = _gcr_records_find (records, GCR_RECORD_SCHEMA_UID); + g_assert (check == uid); + + g_ptr_array_unref (records); +} + +static void +test_get_string (Test *test, gconstpointer unused) +{ + gchar *value = _gcr_record_get_string (test->record, 1); + g_assert (value); + + g_assert_cmpstr (value, ==, "tab\there"); + g_free (value); +} + +static void +test_get_string_null (Test *test, gconstpointer unused) +{ + gchar *value = _gcr_record_get_string (test->record, 35); + g_assert (value == NULL); +} + +static void +test_get_string_latin1 (Test *test, gconstpointer unused) +{ + gchar *value = _gcr_record_get_string (test->record, 4); + g_assert (value); + + g_assert_cmpstr (value, ==, "f\xc3\xbc""nf"); + g_assert (g_utf8_validate (value, -1, NULL)); + g_free (value); +} + +static void +test_get_uint (Test *test, gconstpointer unused) +{ + guint value = 0; + + if (!_gcr_record_get_uint (test->record, 5, &value)) + g_assert_not_reached (); + g_assert_cmpuint (value, ==, 3533333); +} + +static void +test_get_uint_range (Test *test, gconstpointer unused) +{ + guint value = 0; + + if (_gcr_record_get_uint (test->record, 6, &value)) + g_assert_not_reached (); +} + +static void +test_get_uint_invalid (Test *test, gconstpointer unused) +{ + guint value = 0; + + if (_gcr_record_get_uint (test->record, 0, &value)) + g_assert_not_reached (); +} + +static void +test_get_base64 (Test *test, gconstpointer unused) +{ + gchar *value; + gsize n_value; + + value = _gcr_record_get_base64 (test->record, 3, &n_value); + g_assert (value); + egg_assert_cmpsize (n_value, ==, 8); + g_assert (memcmp (value, "aoeu3838", n_value) == 0); + + g_free (value); +} + + +static void +test_free_null (void) +{ + _gcr_record_free (NULL); +} + +static void +test_get_schema (Test *test, gconstpointer unused) +{ + GQuark schema; + GQuark check; + + /* Initialize this quark */ + check = g_quark_from_static_string ("one"); + + schema = _gcr_record_get_schema (test->record); + g_assert (check == schema); + g_assert_cmpstr (g_quark_to_string (schema), ==, "one"); +} + +static void +test_copy (Test *test, gconstpointer unused) +{ + GcrRecord *copy; + guint count, i; + + copy = _gcr_record_copy (test->record); + + count = _gcr_record_get_count (test->record); + g_assert_cmpuint (_gcr_record_get_count (copy), ==, count); + for (i = 0; i < count; i++) { + g_assert_cmpstr (_gcr_record_get_raw (copy, i), ==, + _gcr_record_get_raw (test->record, i)); + } + + g_assert (_gcr_record_get_raw (copy, count) == NULL); + _gcr_record_free (copy); +} + +static void +test_boxed (Test *test, gconstpointer unused) +{ + GcrRecord *copy; + guint count, i; + + copy = g_boxed_copy (GCR_TYPE_RECORD, test->record); + + count = _gcr_record_get_count (test->record); + g_assert_cmpuint (_gcr_record_get_count (copy), ==, count); + for (i = 0; i < count; i++) { + g_assert_cmpstr (_gcr_record_get_raw (copy, i), ==, + _gcr_record_get_raw (test->record, i)); + } + + g_assert (_gcr_record_get_raw (copy, count) == NULL); + g_boxed_free (GCR_TYPE_RECORD, copy); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gcr/record/parse-colons", test_parse_colons); + g_test_add_func ("/gcr/record/parse-spaces", test_parse_spaces); + g_test_add_func ("/gcr/record/parse_part", test_parse_part); + g_test_add_func ("/gcr/record/parse_too_long", test_parse_too_long); + g_test_add_func ("/gcr/record/free_null", test_free_null); + g_test_add_func ("/gcr/record/find", test_find); + g_test_add ("/gcr/record/count", Test, NULL, setup, test_count, teardown); + g_test_add ("/gcr/record/copy", Test, NULL, setup, test_copy, teardown); + g_test_add ("/gcr/record/boxed", Test, NULL, setup, test_boxed, teardown); + g_test_add ("/gcr/record/get_string", Test, NULL, setup, test_get_string, teardown); + g_test_add ("/gcr/record/get_string_null", Test, NULL, setup, test_get_string_null, teardown); + g_test_add ("/gcr/record/get_string_latin1", Test, NULL, setup, test_get_string_latin1, teardown); + g_test_add ("/gcr/record/get_uint", Test, NULL, setup, test_get_uint, teardown); + g_test_add ("/gcr/record/get_uint_invalid", Test, NULL, setup, test_get_uint_invalid, teardown); + g_test_add ("/gcr/record/get_uint_range", Test, NULL, setup, test_get_uint_range, teardown); + g_test_add ("/gcr/record/get_base64", Test, NULL, setup, test_get_base64, teardown); + g_test_add ("/gcr/record/get_schema", Test, NULL, setup, test_get_schema, teardown); + + return g_test_run (); +} diff --git a/gcr/test-secret-exchange.c b/gcr/test-secret-exchange.c new file mode 100644 index 0000000..27d7775 --- /dev/null +++ b/gcr/test-secret-exchange.c @@ -0,0 +1,166 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" + +#include "egg/egg-testing.h" + +#include + +#include + +typedef struct { + GcrSecretExchange *caller; + GcrSecretExchange *callee; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + test->caller = gcr_secret_exchange_new (NULL); + g_assert (GCR_IS_SECRET_EXCHANGE (test->caller)); + g_object_add_weak_pointer (G_OBJECT (test->caller), (gpointer *)&test->caller); + + test->callee = gcr_secret_exchange_new (NULL); + g_assert (GCR_IS_SECRET_EXCHANGE (test->callee)); + g_object_add_weak_pointer (G_OBJECT (test->callee), (gpointer *)&test->callee); +} + +static void +teardown (Test *test, + gconstpointer unused) +{ + g_object_unref (test->caller); + g_assert (test->caller == NULL); + + g_object_unref (test->callee); + g_assert (test->callee == NULL); +} + +static void +test_perform_exchange (Test *test, + gconstpointer unused) +{ + gchar *exchange; + + exchange = gcr_secret_exchange_begin (test->caller); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->callee, exchange)) + g_assert_not_reached (); + + g_free (exchange); + + exchange = gcr_secret_exchange_send (test->callee, "the secret", -1); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->caller, exchange)) + g_assert_not_reached (); + + g_assert_cmpstr (gcr_secret_exchange_get_secret (test->caller, NULL), ==, "the secret"); + + g_free (exchange); +} + +static void +test_perform_reverse (Test *test, + gconstpointer unused) +{ + gchar *exchange; + + exchange = gcr_secret_exchange_begin (test->caller); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->callee, exchange)) + g_assert_not_reached (); + + g_free (exchange); + + exchange = gcr_secret_exchange_send (test->callee, NULL, -1); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->caller, exchange)) + g_assert_not_reached (); + + g_free (exchange); + + g_assert (gcr_secret_exchange_get_secret (test->caller, NULL) == NULL); + + exchange = gcr_secret_exchange_send (test->caller, "reverse secret", -1); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->callee, exchange)) + g_assert_not_reached (); + + g_free (exchange); + + g_assert_cmpstr (gcr_secret_exchange_get_secret (test->callee, NULL), ==, "reverse secret"); +} + +static void +test_perform_multiple (Test *test, + gconstpointer unused) +{ + gchar *exchange; + + exchange = gcr_secret_exchange_begin (test->caller); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->callee, exchange)) + g_assert_not_reached (); + + g_free (exchange); + + exchange = gcr_secret_exchange_send (test->callee, "first secret", -1); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->caller, exchange)) + g_assert_not_reached (); + + g_free (exchange); + + g_assert_cmpstr (gcr_secret_exchange_get_secret (test->caller, NULL), ==, "first secret"); + + exchange = gcr_secret_exchange_send (test->callee, "second secret", -1); + g_assert (exchange); + + if (!gcr_secret_exchange_receive (test->caller, exchange)) + g_assert_not_reached (); + + g_free (exchange); + + g_assert_cmpstr (gcr_secret_exchange_get_secret (test->caller, NULL), ==, "second secret"); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-secret-exchange"); + + g_test_add ("/gcr/secret-exchange/perform-exchange", Test, NULL, setup, test_perform_exchange, teardown); + g_test_add ("/gcr/secret-exchange/perform-reverse", Test, NULL, setup, test_perform_reverse, teardown); + g_test_add ("/gcr/secret-exchange/perform-multiple", Test, NULL, setup, test_perform_multiple, teardown); + + return g_test_run (); +} diff --git a/gcr/test-secure-memory.c b/gcr/test-secure-memory.c new file mode 100644 index 0000000..7ef5b2f --- /dev/null +++ b/gcr/test-secure-memory.c @@ -0,0 +1,225 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* unit-test-memory.c: Test memory allocation functionality + + Copyright (C) 2007 Stefan Walter + Copyright (C) 2012 Red Hat Inc. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-secure-memory.h" + +#include + +#include +#include +#include +#include +#include + +#define IS_ZERO -1 + +static int +find_non_zero (gpointer mem, gsize len) +{ + guchar *b, *e; + gsize sz = 0; + for (b = (guchar*)mem, e = ((guchar*)mem) + len; b != e; ++b, ++sz) { + if (*b != 0x00) + return (int)sz; + } + + return -1; +} + +extern int egg_secure_warnings; + +static gsize +get_rlimit_memlock (void) +{ + struct rlimit memlock; + + if (getrlimit (RLIMIT_MEMLOCK, &memlock) != 0) + g_error ("getrlimit() failed: %s", strerror (errno)); + + /* Check that the limit is finite, and that if the caller increases its + * size by one (to get the first invalid allocation size), things won’t + * explode. */ + if (memlock.rlim_cur == RLIM_INFINITY || + memlock.rlim_cur >= G_MAXSIZE - 1) { + /* Try reducing the limit to 64KiB. */ + memlock.rlim_cur = MIN (64 * 1024, memlock.rlim_max); + if (setrlimit (RLIMIT_MEMLOCK, &memlock) != 0) { + g_test_skip ("setrlimit() failed"); + return 0; + } + } + + return memlock.rlim_cur; +} + +static void +test_alloc_free (void) +{ + gpointer p; + gboolean ret; + + p = gcr_secure_memory_alloc (512); + g_assert (p != NULL); + g_assert_cmpint (IS_ZERO, ==, find_non_zero (p, 512)); + + memset (p, 0x67, 512); + + ret = gcr_secure_memory_is_secure (p); + g_assert (ret == TRUE); + + gcr_secure_memory_free (p); +} + +static void +test_alloc_two (void) +{ + gpointer p, p2; + gboolean ret; + + p2 = gcr_secure_memory_alloc (4); + g_assert(p2 != NULL); + g_assert_cmpint (IS_ZERO, ==, find_non_zero (p2, 4)); + + memset (p2, 0x67, 4); + + p = gcr_secure_memory_alloc (16200); + g_assert (p != NULL); + g_assert_cmpint (IS_ZERO, ==, find_non_zero (p, 16200)); + + memset (p, 0x67, 16200); + + ret = gcr_secure_memory_is_secure (p); + g_assert (ret == TRUE); + + gcr_secure_memory_free (p2); + gcr_secure_memory_free (p); +} + +/* Test alloc() with an allocation larger than RLIMIT_MEMLOCK, which should + * fail. */ +static void +test_alloc_oversized (void) +{ + gsize limit; + gpointer mem; + + limit = get_rlimit_memlock (); + if (limit == 0) + return; + + /* Try the allocation. */ + egg_secure_warnings = 0; + + mem = gcr_secure_memory_try_alloc (limit + 1); + g_assert_null (mem); + + egg_secure_warnings = 1; +} + +static void +test_realloc (void) +{ + const gchar *str = "a test string to see if realloc works properly"; + gpointer p, p2; + gsize len; + + len = strlen (str) + 1; + + p = gcr_secure_memory_realloc (NULL, len); + g_assert (p != NULL); + g_assert_cmpint (IS_ZERO, ==, find_non_zero (p, len)); + + strcpy ((gchar*)p, str); + + p2 = gcr_secure_memory_realloc (p, 512); + g_assert (p2 != NULL); + + /* "strings not equal after realloc" */ + g_assert_cmpstr (p2, ==, str); + + p = gcr_secure_memory_realloc (p2, 0); + /* "should have freed memory" */ + g_assert (p == NULL); +} + +static void +test_realloc_across (void) +{ + gpointer p, p2; + + /* Tiny allocation */ + p = gcr_secure_memory_realloc (NULL, 1088); + g_assert (p != NULL); + g_assert_cmpint (IS_ZERO, ==, find_non_zero (p, 1088)); + + /* Reallocate to a large one, will have to have changed blocks */ + p2 = gcr_secure_memory_realloc (p, 16200); + g_assert (p2 != NULL); + g_assert_cmpint (IS_ZERO, ==, find_non_zero (p2, 16200)); + + gcr_secure_memory_free (p2); +} + +/* Test realloc() with an allocation larger than RLIMIT_MEMLOCK, which should + * fail. */ +static void +test_realloc_oversized (void) +{ + gsize limit; + gpointer mem, new_mem; + + limit = get_rlimit_memlock (); + if (limit == 0) + return; + + /* Try the allocation. */ + mem = gcr_secure_memory_alloc (64); + g_assert_nonnull (mem); + + egg_secure_warnings = 0; + + new_mem = gcr_secure_memory_try_realloc (mem, limit + 1); + g_assert_null (new_mem); + + egg_secure_warnings = 1; + + gcr_secure_memory_free (mem); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-memory"); + + g_test_add_func ("/memory/alloc-free", test_alloc_free); + g_test_add_func ("/memory/alloc-two", test_alloc_two); + g_test_add_func ("/memory/alloc-oversized", test_alloc_oversized); + g_test_add_func ("/memory/realloc", test_realloc); + g_test_add_func ("/memory/realloc-across", test_realloc_across); + g_test_add_func ("/memory/realloc-oversized", test_realloc_oversized); + + return g_test_run (); +} diff --git a/gcr/test-simple-certificate.c b/gcr/test-simple-certificate.c new file mode 100644 index 0000000..9353c5e --- /dev/null +++ b/gcr/test-simple-certificate.c @@ -0,0 +1,100 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-internal.h" + +#include "gck/gck-test.h" + +#include "egg/egg-testing.h" + +#include + +#include + +typedef struct { + gpointer cert_data; + gsize n_cert_data; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/der-certificate.crt", (gchar**)&test->cert_data, + &test->n_cert_data, NULL)) + g_assert_not_reached (); + g_assert (test->cert_data); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_free (test->cert_data); +} + +static void +test_new (Test *test, gconstpointer unused) +{ + GcrCertificate *cert; + gconstpointer der; + gsize n_der; + + cert = gcr_simple_certificate_new (test->cert_data, test->n_cert_data); + g_assert (GCR_IS_SIMPLE_CERTIFICATE (cert)); + + der = gcr_certificate_get_der_data (cert, &n_der); + g_assert (der); + egg_assert_cmpmem (der, n_der, ==, test->cert_data, test->n_cert_data); + + g_object_unref (cert); +} + +static void +test_new_static (Test *test, gconstpointer unused) +{ + GcrCertificate *cert; + gconstpointer der; + gsize n_der; + + cert = gcr_simple_certificate_new_static (test->cert_data, test->n_cert_data); + g_assert (GCR_IS_SIMPLE_CERTIFICATE (cert)); + + der = gcr_certificate_get_der_data (cert, &n_der); + g_assert (der); + egg_assert_cmpsize (n_der, ==, test->n_cert_data); + g_assert (der == test->cert_data); /* Must be same pointer */ + + g_object_unref (cert); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-simple-certificate"); + + g_test_add ("/gcr/simple-certificate/new", Test, NULL, setup, test_new, teardown); + g_test_add ("/gcr/simple-certificate/new_static", Test, NULL, setup, test_new_static, teardown); + + return g_test_run (); +} diff --git a/gcr/test-ssh-askpass.c b/gcr/test-ssh-askpass.c new file mode 100644 index 0000000..a6a4965 --- /dev/null +++ b/gcr/test-ssh-askpass.c @@ -0,0 +1,173 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2014 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" + +#include "egg/egg-testing.h" +#include "egg/mock-interaction.h" + +#include + +extern const char *gcr_ssh_askpass_executable; + +typedef struct { + GTlsInteraction *interaction; + GcrSshAskpass *askpass; +} Test; + +static void +setup (Test *test, + gconstpointer password) +{ + test->interaction = mock_interaction_new (password); + test->askpass = gcr_ssh_askpass_new (test->interaction); +} + +static void +teardown (Test *test, + gconstpointer unused) +{ + g_object_unref (test->interaction); + + g_object_add_weak_pointer (G_OBJECT (test->askpass), (gpointer *)&test->askpass); + g_object_unref (test->askpass); + g_assert (test->askpass == NULL); +} + +static void +on_ssh_child (GPid pid, + gint status, + gpointer user_data) +{ + gint *out = user_data; + *out = status; +} + +static void +test_ssh_keygen (Test *test, + gconstpointer password) +{ + + GError *error = NULL; + gint status; + GPid pid; + + gchar *filename = g_build_filename (SRCDIR, "gcr", "fixtures", "pem-rsa-enc.key", NULL); + gchar *argv[] = { "ssh-keygen", "-y", "-f", filename, NULL }; + + g_assert_cmpstr (password, ==, "booo"); + + if (g_chmod (filename, 0600) < 0) + g_assert_not_reached (); + + g_spawn_async (SRCDIR "/gcr/fixtures", argv, NULL, + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, + gcr_ssh_askpass_child_setup, test->askpass, &pid, &error); + + g_free (filename); + + if (g_error_matches (error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT)) { + g_test_skip ("ssh-keygen not found"); + return; + } + + g_assert_no_error (error); + + status = -1; + g_child_watch_add (pid, on_ssh_child, &status); + + while (status == -1) + g_main_context_iteration (NULL, TRUE); + + g_spawn_check_exit_status (status, &error); + g_assert_cmpint (status, ==, 0); + g_assert_no_error (error); +} + +static void +test_cancelled (Test *test, + gconstpointer password) +{ + + GError *error = NULL; + gint status; + GPid pid; + + gchar *filename = g_build_filename (SRCDIR, "gcr", "fixtures", "pem-rsa-enc.key", NULL); + gchar *argv[] = { "ssh-keygen", "-y", "-f", filename, NULL }; + + g_assert_cmpstr (password, ==, NULL); + + if (g_chmod (filename, 0600) < 0) + g_assert_not_reached (); + + g_spawn_async (SRCDIR "/gcr/fixtures", argv, NULL, + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, + gcr_ssh_askpass_child_setup, test->askpass, &pid, &error); + + g_free (filename); + + if (g_error_matches (error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT)) { + g_test_skip ("ssh-keygen not found"); + return; + } + + g_assert_no_error (error); + + status = -1; + g_child_watch_add (pid, on_ssh_child, &status); + + while (status == -1) + g_main_context_iteration (NULL, TRUE); + + g_assert_cmpint (status, !=, 0); + g_assert_no_error (error); +} + +static void +test_properties (Test *test, + gconstpointer unused) +{ + GTlsInteraction *interaction; + + g_object_get (test->askpass, "interaction", &interaction, NULL); + g_assert (interaction == test->interaction); + g_object_unref (interaction); + + g_assert (gcr_ssh_askpass_get_interaction (test->askpass) == test->interaction); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-ssh-askpass"); + + gcr_ssh_askpass_executable = BUILDDIR "/gcr-ssh-askpass"; + + g_test_add ("/gcr/ssh-askpass/ssh-keygen", Test, "booo", setup, test_ssh_keygen, teardown); + g_test_add ("/gcr/ssh-askpass/cancelled", Test, NULL, setup, test_cancelled, teardown); + g_test_add ("/gcr/ssh-askpass/properties", Test, NULL, setup, test_properties, teardown); + + return g_test_run (); +} diff --git a/gcr/test-subject-public-key.c b/gcr/test-subject-public-key.c new file mode 100644 index 0000000..f92995a --- /dev/null +++ b/gcr/test-subject-public-key.c @@ -0,0 +1,751 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-subject-public-key.h" + +#include "gck/gck-mock.h" +#include "gck/gck-test.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-testing.h" + +#include + +#include + +typedef struct { + const gchar *name; + const gchar *basename; + guint key_size; +} TestFixture; + +typedef struct { + GBytes *crt_data; + GckAttributes *crt_attrs; + GBytes *key_data; + GckAttributes *prv_attrs; + GBytes *spk_data; + GckAttributes *pub_attrs; +} TestAttributes; + +static void +on_parser_parsed (GcrParser *parser, + gpointer user_data) +{ + GckAttributes **attrs = user_data; + g_assert (*attrs == NULL); + *attrs = gcr_parser_get_parsed_attributes (parser); + g_assert (*attrs != NULL); + gck_attributes_ref (*attrs); +} + +static GckAttributes * +parse_attributes (GBytes *data, + GcrDataFormat format) +{ + GcrParser *parser; + GckAttributes *attrs = NULL; + GError *error = NULL; + + parser = gcr_parser_new (); + gcr_parser_format_disable (parser, GCR_FORMAT_ALL); + gcr_parser_format_enable (parser, format); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &attrs); + gcr_parser_parse_bytes (parser, data, &error); + g_assert_no_error (error); + g_object_unref (parser); + + g_assert (attrs); + return attrs; +} + +static void +setup_attributes (TestAttributes *test, + gconstpointer data) +{ + const TestFixture *fixture = data; + GError *error = NULL; + gchar *contents; + gchar *filename; + gsize length; + gulong klass; + + filename = g_strdup_printf (SRCDIR "/gcr/fixtures/%s.crt", fixture->basename); + g_file_get_contents (filename, &contents, &length, &error); + g_assert_no_error (error); + test->crt_data = g_bytes_new_take (contents, length); + test->crt_attrs = parse_attributes (test->crt_data, GCR_FORMAT_DER_CERTIFICATE_X509); + g_assert (gck_attributes_find_ulong (test->crt_attrs, CKA_CLASS, &klass)); + gck_assert_cmpulong (klass, ==, CKO_CERTIFICATE); + g_free (filename); + + filename = g_strdup_printf (SRCDIR "/gcr/fixtures/%s.key", fixture->basename); + g_file_get_contents (filename, &contents, &length, &error); + g_assert_no_error (error); + test->key_data = g_bytes_new_take (contents, length); + test->prv_attrs = parse_attributes (test->key_data, GCR_FORMAT_ALL); + g_assert (gck_attributes_find_ulong (test->prv_attrs, CKA_CLASS, &klass)); + gck_assert_cmpulong (klass, ==, CKO_PRIVATE_KEY); + g_free (filename); + + filename = g_strdup_printf (SRCDIR "/gcr/fixtures/%s.spk", fixture->basename); + g_file_get_contents (filename, &contents, &length, &error); + g_assert_no_error (error); + test->spk_data = g_bytes_new_take (contents, length); + test->pub_attrs = parse_attributes (test->spk_data, GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY); + g_assert (gck_attributes_find_ulong (test->pub_attrs, CKA_CLASS, &klass)); + gck_assert_cmpulong (klass, ==, CKO_PUBLIC_KEY); + g_free (filename); +} + +static void +teardown_attributes (TestAttributes *test, + gconstpointer unused) +{ + g_bytes_unref (test->crt_data); + g_bytes_unref (test->key_data); + g_bytes_unref (test->spk_data); + gck_attributes_unref (test->crt_attrs); + gck_attributes_unref (test->prv_attrs); + gck_attributes_unref (test->pub_attrs); +} + +static void +perform_for_attributes (TestAttributes *test, + GckAttributes *attrs) +{ + GNode *info; + GBytes *data; + + info = _gcr_subject_public_key_for_attributes (attrs); + g_assert (info != NULL); + + data = egg_asn1x_encode (info, NULL); + egg_assert_cmpbytes (data, ==, g_bytes_get_data (test->spk_data, NULL), + g_bytes_get_size (test->spk_data)); + + g_bytes_unref (data); + egg_asn1x_destroy (info); + +} + +static void +test_for_cert_attributes (TestAttributes *test, + gconstpointer unused) +{ + perform_for_attributes (test, test->crt_attrs); +} + +static void +test_for_private_key_attributes (TestAttributes *test, + gconstpointer unused) +{ + perform_for_attributes (test, test->prv_attrs); +} + +static void +test_for_public_key_attributes (TestAttributes *test, + gconstpointer unused) +{ + perform_for_attributes (test, test->pub_attrs); +} + +static void +perform_calculate_size (TestAttributes *test, + GckAttributes *attrs, + const TestFixture *fixture) +{ + GNode *info; + guint size; + + info = _gcr_subject_public_key_for_attributes (attrs); + g_assert (info != NULL); + + /* TODO: until encoding, we don't have readable attributes */ + g_bytes_unref (egg_asn1x_encode (info, NULL)); + + size = _gcr_subject_public_key_calculate_size (info); + g_assert_cmpuint (size, ==, fixture->key_size); + + egg_asn1x_destroy (info); + +} + +static void +test_certificate_calculate_size (TestAttributes *test, + gconstpointer fixture) +{ + perform_calculate_size (test, test->crt_attrs, fixture); +} + +static void +test_public_key_calculate_size (TestAttributes *test, + gconstpointer fixture) +{ + perform_calculate_size (test, test->pub_attrs, fixture); +} + +static void +test_private_key_calculate_size (TestAttributes *test, + gconstpointer fixture) +{ + perform_calculate_size (test, test->prv_attrs, fixture); +} + +typedef struct { + CK_FUNCTION_LIST funcs; + GckModule *module; + GckSession *session; +} TestModule; + +static void +setup_module (TestModule *test, + gconstpointer unused) +{ + CK_FUNCTION_LIST_PTR f; + GError *error = NULL; + GckSlot *slot; + CK_RV rv; + + rv = gck_mock_C_GetFunctionList (&f); + gck_assert_cmprv (rv, ==, CKR_OK); + memcpy (&test->funcs, f, sizeof (test->funcs)); + + /* Open a session */ + rv = (test->funcs.C_Initialize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); + + test->module = gck_module_new (&test->funcs); + g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); + + slot = gck_slot_from_handle (test->module, GCK_MOCK_SLOT_ONE_ID); + test->session = gck_session_open (slot, GCK_SESSION_READ_ONLY, NULL, NULL, &error); + g_assert_no_error (error); + g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session); + + g_object_unref (slot); +} + +static void +teardown_module (TestModule *test, + gconstpointer fixture) +{ + CK_RV rv; + + g_object_unref (test->session); + g_assert (test->session == NULL); + + g_object_unref (test->module); + g_assert (test->module == NULL); + + rv = (test->funcs.C_Finalize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); +} + +typedef struct { + TestAttributes at; + TestModule mo; + GckObject *crt_object; + GckObject *pub_object; + GckObject *prv_object; +} TestLoading; + +static void +setup_loading (TestLoading *test, + gconstpointer fixture) +{ + GckBuilder builder = GCK_BUILDER_INIT; + const gchar *id = "test-id"; + gulong handle; + + setup_attributes (&test->at, fixture); + setup_module (&test->mo, NULL); + + gck_builder_add_all (&builder, test->at.crt_attrs); + gck_builder_add_string (&builder, CKA_ID, id); + handle = gck_mock_module_add_object (gck_builder_end (&builder)); + test->crt_object = gck_object_from_handle (test->mo.session, handle); + g_object_add_weak_pointer (G_OBJECT (test->crt_object), (gpointer *)&test->crt_object); + + gck_builder_add_all (&builder, test->at.pub_attrs); + gck_builder_add_string (&builder, CKA_ID, id); + handle = gck_mock_module_add_object (gck_builder_end (&builder)); + test->pub_object = gck_object_from_handle (test->mo.session, handle); + g_object_add_weak_pointer (G_OBJECT (test->pub_object), (gpointer *)&test->pub_object); + + gck_builder_add_all (&builder, test->at.prv_attrs); + gck_builder_add_string (&builder, CKA_ID, id); + handle = gck_mock_module_add_object (gck_builder_end (&builder)); + test->prv_object = gck_object_from_handle (test->mo.session, handle); + g_object_add_weak_pointer (G_OBJECT (test->prv_object), (gpointer *)&test->prv_object); +} + +static void +teardown_loading (TestLoading *test, + gconstpointer fixture) +{ + g_object_unref (test->crt_object); + g_assert (test->crt_object == NULL); + + g_object_unref (test->prv_object); + g_assert (test->prv_object == NULL); + + g_object_unref (test->pub_object); + g_assert (test->pub_object == NULL); + + teardown_module (&test->mo, NULL); + teardown_attributes (&test->at, fixture); +} + +static void +perform_load (TestLoading *test, + GckObject *object) +{ + GError *error = NULL; + GBytes *data; + GNode *info; + + info = _gcr_subject_public_key_load (object, NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + + data = egg_asn1x_encode (info, NULL); + egg_assert_cmpbytes (data, ==, g_bytes_get_data (test->at.spk_data, NULL), + g_bytes_get_size (test->at.spk_data)); + + g_bytes_unref (data); + egg_asn1x_destroy (info); +} + +static void +test_certificate_load (TestLoading *test, + gconstpointer unused) +{ + perform_load (test, test->crt_object); +} + +static void +test_public_key_load (TestLoading *test, + gconstpointer unused) +{ + perform_load (test, test->pub_object); +} + +static void +test_private_key_load (TestLoading *test, + gconstpointer unused) +{ + perform_load (test, test->prv_object); +} + +static void +on_async_result (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **ret = user_data; + g_assert (ret != NULL); + g_assert (*ret == NULL); + g_assert (G_IS_ASYNC_RESULT (result)); + *ret = g_object_ref (result); + egg_test_wait_stop (); +} + +static void +perform_load_async (TestLoading *test, + GckObject *object) +{ + GAsyncResult *result = NULL; + GError *error = NULL; + GBytes *data; + GNode *info; + + _gcr_subject_public_key_load_async (object, NULL, on_async_result, &result); + g_assert (result == NULL); + egg_test_wait (); + + g_assert (result != NULL); + info = _gcr_subject_public_key_load_finish (result, &error); + g_assert_no_error (error); + g_assert (info != NULL); + g_object_unref (result); + + data = egg_asn1x_encode (info, NULL); + egg_assert_cmpbytes (data, ==, g_bytes_get_data (test->at.spk_data, NULL), + g_bytes_get_size (test->at.spk_data)); + + g_bytes_unref (data); + egg_asn1x_destroy (info); +} + +static void +test_certificate_load_async (TestLoading *test, + gconstpointer unused) +{ + perform_load_async (test, test->crt_object); +} + +static void +test_public_key_load_async (TestLoading *test, + gconstpointer unused) +{ + perform_load_async (test, test->pub_object); +} + +static void +test_private_key_load_async (TestLoading *test, + gconstpointer unused) +{ + perform_load_async (test, test->prv_object); +} + +enum { PROP_ATTRIBUTES = 1 }; +typedef struct { GckObject parent; GckAttributes *attrs; } MockObject; +typedef struct { GckObjectClass parent; } MockObjectClass; + +GType mock_object_get_type (void) G_GNUC_CONST; +static void mock_object_cache_init (GckObjectCacheIface *iface); +G_DEFINE_TYPE_WITH_CODE (MockObject, mock_object, GCK_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCK_TYPE_OBJECT_CACHE, mock_object_cache_init) +); + +static void +mock_object_init (MockObject *self) +{ + +} + +static void +mock_object_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + g_assert (prop_id == PROP_ATTRIBUTES); + g_value_set_boxed (value, ((MockObject *)obj)->attrs); +} + +static void +mock_object_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + g_assert (prop_id == PROP_ATTRIBUTES); + ((MockObject *)obj)->attrs = g_value_dup_boxed (value); +} + +static void +mock_object_finalize (GObject *obj) +{ + MockObject *self = (MockObject *)obj; + gck_attributes_unref (self->attrs); + G_OBJECT_CLASS (mock_object_parent_class)->finalize (obj); +} + +static void +mock_object_class_init (MockObjectClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = mock_object_get_property; + gobject_class->set_property = mock_object_set_property; + gobject_class->finalize = mock_object_finalize; + + g_object_class_override_property (gobject_class, PROP_ATTRIBUTES, "attributes"); +} + +static void +mock_object_fill (GckObjectCache *object, + GckAttributes *attrs) +{ + GckBuilder builder = GCK_BUILDER_INIT; + MockObject *self = (MockObject *)object; + + gck_builder_add_all (&builder, self->attrs); + gck_builder_set_all (&builder, attrs); + + gck_attributes_unref (self->attrs); + self->attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); +} + +static void +mock_object_cache_init (GckObjectCacheIface *iface) +{ + iface->default_types = NULL; + iface->n_default_types = 0; + iface->fill = mock_object_fill; +} + +static void +perform_load_already (TestLoading *test, + GckAttributes *attributes) +{ + const gulong INVALID = 0xFFF00FF; /* invalid handle, should not be used */ + GckObject *object; + GError *error = NULL; + GBytes *data; + GNode *info; + + object = g_object_new (mock_object_get_type (), + "module", test->mo.module, + "session", test->mo.session, + "handle", INVALID, + "attributes", attributes, + NULL); + + info = _gcr_subject_public_key_load (object, NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + + data = egg_asn1x_encode (info, NULL); + egg_assert_cmpbytes (data, ==, g_bytes_get_data (test->at.spk_data, NULL), + g_bytes_get_size (test->at.spk_data)); + + g_bytes_unref (data); + egg_asn1x_destroy (info); + g_object_unref (object); +} + +static void +test_certificate_load_already (TestLoading *test, + gconstpointer unused) +{ + perform_load_already (test, test->at.crt_attrs); +} + +static void +test_public_key_load_already (TestLoading *test, + gconstpointer unused) +{ + perform_load_already (test, test->at.pub_attrs); +} + +static void +test_private_key_load_already (TestLoading *test, + gconstpointer unused) +{ + perform_load_already (test, test->at.prv_attrs); +} + +static void +perform_load_partial (TestLoading *test, + GckObject *original, + GckAttributes *attributes) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *partial; + GckObject *object; + GError *error = NULL; + GBytes *data; + GNode *info; + guint i; + + for (i = 0; i < gck_attributes_count (attributes); i += 2) + gck_builder_add_attribute (&builder, gck_attributes_at (attributes, i)); + partial = gck_attributes_ref_sink (gck_builder_end (&builder)); + + object = g_object_new (mock_object_get_type (), + "module", test->mo.module, + "session", test->mo.session, + "handle", gck_object_get_handle (original), + "attributes", partial, + NULL); + gck_attributes_unref (partial); + + info = _gcr_subject_public_key_load (object, NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + + data = egg_asn1x_encode (info, NULL); + egg_assert_cmpbytes (data, ==, g_bytes_get_data (test->at.spk_data, NULL), + g_bytes_get_size (test->at.spk_data)); + + g_bytes_unref (data); + egg_asn1x_destroy (info); + g_object_unref (object); +} + +static void +test_certificate_load_partial (TestLoading *test, + gconstpointer unused) +{ + perform_load_partial (test, test->crt_object, test->at.crt_attrs); +} + +static void +test_public_key_load_partial (TestLoading *test, + gconstpointer unused) +{ + perform_load_partial (test, test->pub_object, test->at.pub_attrs); +} + +static void +test_private_key_load_partial (TestLoading *test, + gconstpointer unused) +{ + perform_load_partial (test, test->prv_object, test->at.prv_attrs); +} + +static void +test_load_failure_lookup (TestModule *test, + gconstpointer fixture) +{ + const gulong INVALID = 0xFFF00FF; /* invalid handle, should fail */ + GckObject *object; + GError *error = NULL; + GNode *info; + + object = g_object_new (mock_object_get_type (), + "module", test->module, + "session", test->session, + "handle", INVALID, + NULL); + + info = _gcr_subject_public_key_load (object, NULL, &error); + g_assert_error (error, GCK_ERROR, CKR_OBJECT_HANDLE_INVALID); + g_assert (info == NULL); + g_error_free (error); + + g_object_unref (object); +} + +static void +test_load_failure_build (TestModule *test, + gconstpointer fixture) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attributes; + const gulong INVALID = 0xFFF00FF; /* invalid handle, shouldn't be used */ + GckObject *object; + GError *error = NULL; + GNode *info; + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); + gck_builder_add_string (&builder, CKA_VALUE, "invalid value"); + attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + + object = g_object_new (mock_object_get_type (), + "module", test->module, + "session", test->session, + "handle", INVALID, + "attributes", attributes, + NULL); + + gck_attributes_unref (attributes); + + info = _gcr_subject_public_key_load (object, NULL, &error); + g_assert_error (error, GCK_ERROR, CKR_TEMPLATE_INCONSISTENT); + g_assert (info == NULL); + g_error_free (error); + + g_object_unref (object); +} + +static const TestFixture FIXTURES[] = { + { "rsa", "client", 2048 }, + { "dsa", "generic-dsa", 1024 }, + { "ec", "ecc-strong", 521 }, +}; + +static GPtrArray *test_names = NULL; + +static const gchar * +test_name (const gchar *format, + const gchar *basename) +{ + gchar *name = g_strdup_printf (format, basename); + g_ptr_array_add (test_names, name); + return name; +} + +int +main (int argc, char **argv) +{ + const TestFixture *fixture; + gint ret; + guint i; + + g_test_init (&argc, &argv, NULL); + + test_names = g_ptr_array_new_with_free_func (g_free); + + for (i = 0; i < G_N_ELEMENTS (FIXTURES); i++) { + fixture = &FIXTURES[i]; + + g_test_add (test_name ("/gcr/subject-public-key/%s/cert-attributes", fixture->name), TestAttributes, fixture, + setup_attributes, test_for_cert_attributes, teardown_attributes); + g_test_add (test_name ("/gcr/subject-public-key/%s/public-key-attributes", fixture->name), TestAttributes, fixture, + setup_attributes, test_for_public_key_attributes, teardown_attributes); + g_test_add (test_name ("/gcr/subject-public-key/%s/private-key-attributes", fixture->name), TestAttributes, fixture, + setup_attributes, test_for_private_key_attributes, teardown_attributes); + + g_test_add (test_name ("/gcr/subject-public-key/%s/certificate-size", fixture->name), TestAttributes, fixture, + setup_attributes, test_certificate_calculate_size, teardown_attributes); + g_test_add (test_name ("/gcr/subject-public-key/%s/public-key-size", fixture->name), TestAttributes, fixture, + setup_attributes, test_public_key_calculate_size, teardown_attributes); + g_test_add (test_name ("/gcr/subject-public-key/%s/private-key-size", fixture->name), TestAttributes, fixture, + setup_attributes, test_private_key_calculate_size, teardown_attributes); + + g_test_add (test_name ("/gcr/subject-public-key/%s/certificate-load", fixture->name), TestLoading, fixture, + setup_loading, test_certificate_load, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/public-key-load", fixture->name), TestLoading, fixture, + setup_loading, test_public_key_load, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/private-key-load", fixture->name), TestLoading, fixture, + setup_loading, test_private_key_load, teardown_loading); + + g_test_add (test_name ("/gcr/subject-public-key/%s/certificate-load-async", fixture->name), TestLoading, fixture, + setup_loading, test_certificate_load_async, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/public-key-load-async", fixture->name), TestLoading, fixture, + setup_loading, test_public_key_load_async, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/private-key-load-async", fixture->name), TestLoading, fixture, + setup_loading, test_private_key_load_async, teardown_loading); + + g_test_add (test_name ("/gcr/subject-public-key/%s/certificate-load-already", fixture->name), TestLoading, fixture, + setup_loading, test_certificate_load_already, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/public-key-load-already", fixture->name), TestLoading, fixture, + setup_loading, test_public_key_load_already, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/private-key-load-already", fixture->name), TestLoading, fixture, + setup_loading, test_private_key_load_already, teardown_loading); + + g_test_add (test_name ("/gcr/subject-public-key/%s/certificate-load-partial", fixture->name), TestLoading, fixture, + setup_loading, test_certificate_load_partial, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/public-key-load-partial", fixture->name), TestLoading, fixture, + setup_loading, test_public_key_load_partial, teardown_loading); + g_test_add (test_name ("/gcr/subject-public-key/%s/private-key-load-partial", fixture->name), TestLoading, fixture, + setup_loading, test_private_key_load_partial, teardown_loading); + } + + g_test_add ("/gcr/subject-public-key/load-failure-lookup", TestModule, NULL, + setup_module, test_load_failure_lookup, teardown_module); + g_test_add ("/gcr/subject-public-key/load-failure-build", TestModule, NULL, + setup_module, test_load_failure_build, teardown_module); + + ret = egg_tests_run_with_loop (); + + g_ptr_array_free (test_names, TRUE); + return ret; +} diff --git a/gcr/test-system-prompt.c b/gcr/test-system-prompt.c new file mode 100644 index 0000000..32ac493 --- /dev/null +++ b/gcr/test-system-prompt.c @@ -0,0 +1,771 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-mock-prompter.h" + +#include "egg/egg-testing.h" + +#include + +#define g_assert_cmpstr_free(a, op, b) G_STMT_START { \ + char *lhs_str = a; \ + char *rhs_str = b; \ + g_assert_cmpstr (lhs_str, op, rhs_str); \ + g_free (lhs_str); \ + g_free (rhs_str); \ +} G_STMT_END + +typedef struct { + const gchar *prompter_name; +} Test; + +static void +setup (Test *test, + gconstpointer unused) +{ + test->prompter_name = gcr_mock_prompter_start (); +} + +static void +teardown (Test *test, + gconstpointer unused) +{ + gcr_mock_prompter_stop (); +} + +static void +test_open_prompt (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + gboolean ret; + gchar *bus_name; + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + + g_object_get (prompt, "bus-name", &bus_name, NULL); + g_assert_cmpstr (bus_name, ==, test->prompter_name); + + ret = gcr_system_prompt_close (GCR_SYSTEM_PROMPT (prompt), NULL, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + g_free (bus_name); + g_object_unref (prompt); +} + +static void +test_open_failure (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GDBusConnection *connection; + GError *error = NULL; + + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + + /* Try to open a prompt where no prompter is running */ + + prompt = gcr_system_prompt_open_for_prompter (g_dbus_connection_get_unique_name (connection), + 0, NULL, &error); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD); + g_assert (prompt == NULL); + + g_error_free (error); + g_object_unref (connection); +} + +static void +test_prompt_password (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + const gchar *password; + + gcr_mock_prompter_expect_password_ok ("booo", NULL); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + password = gcr_prompt_password_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (password, ==, "booo"); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_password_in_exchange (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + GcrSecretExchange *exchange; + + gcr_mock_prompter_expect_password_ok ("booo", NULL); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + gcr_prompt_password_run (prompt, NULL, &error); + g_assert_no_error (error); + + g_object_get (prompt, "secret-exchange", &exchange, NULL); + g_assert (GCR_IS_SECRET_EXCHANGE (exchange)); + g_assert_cmpstr (gcr_secret_exchange_get_secret (exchange, NULL), ==, "booo"); + + g_object_unref (exchange); + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_password_custom_exchange (Test *test, + gconstpointer unused) +{ + GcrSystemPrompt *prompt; + GError *error = NULL; + GcrSecretExchange *exchange; + const gchar *password; + + exchange = gcr_secret_exchange_new (NULL); + gcr_mock_prompter_expect_password_ok ("booo", NULL); + + prompt = g_initable_new (GCR_TYPE_SYSTEM_PROMPT, NULL, &error, + "timeout-seconds", 0, + "bus-name", test->prompter_name, + "secret-exchange", exchange, + NULL); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + password = gcr_prompt_password_run (GCR_PROMPT (prompt), NULL, &error); + g_assert_cmpstr (password, ==, "booo"); + g_assert_no_error (error); + + password = gcr_secret_exchange_get_secret (exchange, NULL); + g_assert_cmpstr (password, ==, "booo"); + + g_object_unref (exchange); + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +on_async_result (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **ret = user_data; + *ret = g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_async_password (Test *test, + gconstpointer unused) +{ + GAsyncResult *result = NULL; + GcrPrompt *prompt; + GError *error = NULL; + const gchar *password; + + gcr_mock_prompter_expect_password_ok ("booo", NULL); + + gcr_system_prompt_open_for_prompter_async (test->prompter_name, 0, NULL, + on_async_result, &result); + g_assert (result == NULL); + egg_test_wait (); + + g_assert (result != NULL); + prompt = gcr_system_prompt_open_finish (result, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_clear_object (&result); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + gcr_prompt_password_async (prompt, NULL, + on_async_result, &result); + g_assert (result == NULL); + egg_test_wait (); + + password = gcr_prompt_password_finish (prompt, result, &error); + g_assert_no_error (error); + g_assert_cmpstr (password, ==, "booo"); + g_clear_object (&result); + + g_object_unref (prompt); +} + +static void +test_prompt_confirm (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + gboolean ret; + + gcr_mock_prompter_expect_confirm_ok (NULL); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_async_confirm (Test *test, + gconstpointer unused) +{ + GAsyncResult *result = NULL; + GcrPrompt *prompt; + GError *error = NULL; + gboolean confirm; + + gcr_mock_prompter_expect_confirm_ok (NULL); + + gcr_system_prompt_open_for_prompter_async (test->prompter_name, 0, NULL, + on_async_result, &result); + g_assert (result == NULL); + egg_test_wait (); + + g_assert (result != NULL); + prompt = gcr_system_prompt_open_finish (result, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_clear_object (&result); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + gcr_prompt_confirm_async (prompt, NULL, on_async_result, &result); + g_assert (result == NULL); + egg_test_wait (); + + confirm = gcr_prompt_confirm_finish (prompt, result, &error); + g_assert_no_error (error); + g_assert (confirm == TRUE); + g_clear_object (&result); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_cancel_password (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + const gchar *password; + + gcr_mock_prompter_expect_password_cancel (); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + password = gcr_prompt_password_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (password, ==, NULL); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_cancel_confirm (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + gboolean ret; + + gcr_mock_prompter_expect_confirm_cancel (); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == FALSE); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_prompt_properties (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + gboolean ret; + + gcr_mock_prompter_expect_confirm_ok ("title", "My Title", + "description", "My Description", + "warning", "My Warning", + "message", "My Message", + "caller-window", "01010", + "choice-label", "My Choice", + "choice-chosen", TRUE, + "password-new", TRUE, + "password-strength", 0, + "continue-label", "My Continue", + "cancel-label", "My Cancel", + NULL); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + g_object_set (prompt, + "title", "Other Title", + "choice-label", "Other Choice", + "description", "Other Description", + "message", "Other Message", + "caller-window", "01012", + "warning", "Other Warning", + "password-new", FALSE, + "choice-chosen", TRUE, + "continue-label", "Other Continue", + "cancel-label", "Other Cancel", + NULL); + + g_assert_cmpstr_free (gcr_prompt_get_title (prompt), ==, g_strdup ("Other Title")); + g_assert_cmpstr_free (gcr_prompt_get_choice_label (prompt), ==, g_strdup ("Other Choice")); + g_assert_cmpstr_free (gcr_prompt_get_description (prompt), ==, g_strdup ("Other Description")); + g_assert_cmpstr_free (gcr_prompt_get_message (prompt), ==, g_strdup ("Other Message")); + g_assert_cmpstr_free (gcr_prompt_get_caller_window (prompt), ==, g_strdup ("01012")); + g_assert_cmpstr_free (gcr_prompt_get_warning (prompt), ==, g_strdup ("Other Warning")); + g_assert_cmpstr_free (gcr_prompt_get_continue_label (prompt), ==, g_strdup ("Other Continue")); + g_assert_cmpstr_free (gcr_prompt_get_cancel_label (prompt), ==, g_strdup ("Other Cancel")); + g_assert (gcr_prompt_get_password_new (prompt) == FALSE); + g_assert (gcr_prompt_get_choice_chosen (prompt) == TRUE); + + gcr_prompt_set_title (prompt, "My Title"); + gcr_prompt_set_choice_label (prompt, "My Choice"); + gcr_prompt_set_description (prompt, "My Description"); + gcr_prompt_set_message (prompt, "My Message"); + gcr_prompt_set_caller_window (prompt, "01010"); + gcr_prompt_set_warning (prompt, "My Warning"); + gcr_prompt_set_continue_label (prompt, "My Continue"); + gcr_prompt_set_cancel_label (prompt, "My Cancel"); + gcr_prompt_set_password_new (prompt, TRUE); + gcr_prompt_set_choice_chosen (prompt, TRUE); + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + g_assert (gcr_prompt_get_choice_chosen (prompt) == TRUE); + g_assert_cmpint (gcr_prompt_get_password_strength (prompt), ==, 0); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_prompt_properties_unset (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + g_assert_cmpstr_free (gcr_prompt_get_title (prompt), ==, g_strdup ("")); + g_assert_cmpstr_free (gcr_prompt_get_choice_label (prompt), ==, NULL); + g_assert_cmpstr_free(gcr_prompt_get_description (prompt), ==, g_strdup ("")); + g_assert_cmpstr_free (gcr_prompt_get_message (prompt), ==, g_strdup ("")); + g_assert_cmpstr_free (gcr_prompt_get_caller_window (prompt), ==, NULL); + g_assert_cmpstr_free (gcr_prompt_get_warning (prompt), ==, NULL); + g_assert_cmpstr_free (gcr_prompt_get_continue_label (prompt), ==, g_strdup ("Continue")); + g_assert_cmpstr_free (gcr_prompt_get_cancel_label (prompt), ==, g_strdup ("Cancel")); + g_assert (gcr_prompt_get_password_new (prompt) == FALSE); + g_assert (gcr_prompt_get_choice_chosen (prompt) == FALSE); + g_assert_cmpint (gcr_prompt_get_password_strength (prompt), ==, 0); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + + +static void +test_prompt_properties_reset (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + g_object_set (prompt, + "title", "Other Title", + "choice-label", "Other Choice", + "description", "Other Description", + "message", "Other Message", + "caller-window", "01012", + "warning", "Other Warning", + "password-new", FALSE, + "choice-chosen", TRUE, + "continue-label", "Other Continue", + "cancel-label", "Other Cancel", + NULL); + + g_assert_cmpstr_free (gcr_prompt_get_title (prompt), ==, g_strdup ("Other Title")); + g_assert_cmpstr_free (gcr_prompt_get_choice_label (prompt), ==, g_strdup ("Other Choice")); + g_assert_cmpstr_free (gcr_prompt_get_description (prompt), ==, g_strdup ("Other Description")); + g_assert_cmpstr_free (gcr_prompt_get_message (prompt), ==, g_strdup ("Other Message")); + g_assert_cmpstr_free (gcr_prompt_get_caller_window (prompt), ==, g_strdup ("01012")); + g_assert_cmpstr_free (gcr_prompt_get_warning (prompt), ==, g_strdup ("Other Warning")); + g_assert_cmpstr_free (gcr_prompt_get_continue_label (prompt), ==, g_strdup ("Other Continue")); + g_assert_cmpstr_free (gcr_prompt_get_cancel_label (prompt), ==, g_strdup ("Other Cancel")); + g_assert (gcr_prompt_get_password_new (prompt) == FALSE); + g_assert (gcr_prompt_get_choice_chosen (prompt) == TRUE); + + gcr_prompt_reset (prompt); + + g_assert_cmpstr_free (gcr_prompt_get_title (prompt), ==, strdup ("")); + g_assert_cmpstr_free (gcr_prompt_get_choice_label (prompt), ==, NULL); + g_assert_cmpstr_free (gcr_prompt_get_description (prompt), ==, strdup ("")); + g_assert_cmpstr_free (gcr_prompt_get_message (prompt), ==, strdup ("")); + g_assert_cmpstr_free (gcr_prompt_get_caller_window (prompt), ==, NULL); + g_assert_cmpstr_free (gcr_prompt_get_warning (prompt), ==, NULL); + g_assert_cmpstr_free (gcr_prompt_get_continue_label (prompt), ==, strdup ("Continue")); + g_assert_cmpstr_free (gcr_prompt_get_cancel_label (prompt), ==, strdup ("Cancel")); + g_assert (gcr_prompt_get_password_new (prompt) == FALSE); + g_assert (gcr_prompt_get_choice_chosen (prompt) == FALSE); + g_assert_cmpint (gcr_prompt_get_password_strength (prompt), ==, 0); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_prompt_close (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GcrPrompt *prompt2; + GError *error = NULL; + gboolean ret; + + gcr_mock_prompter_expect_confirm_ok (NULL); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 1, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + prompt2 = gcr_system_prompt_open_for_prompter (test->prompter_name, 1, NULL, &error); + g_assert_error (error, GCR_SYSTEM_PROMPT_ERROR, GCR_SYSTEM_PROMPT_IN_PROGRESS); + g_clear_error (&error); + g_assert (prompt2 == NULL); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == TRUE); + + prompt2 = gcr_system_prompt_open_for_prompter (test->prompter_name, 1, NULL, &error); + g_assert_error (error, GCR_SYSTEM_PROMPT_ERROR, GCR_SYSTEM_PROMPT_IN_PROGRESS); + g_clear_error (&error); + g_assert (prompt2 == NULL); + + gcr_system_prompt_close (GCR_SYSTEM_PROMPT (prompt), NULL, &error); + g_assert_no_error (error); + + prompt2 = gcr_system_prompt_open_for_prompter (test->prompter_name, 1, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt2)); + + g_object_unref (prompt); + + g_object_unref (prompt2); + g_assert (prompt == NULL); +} + +static void +on_prompt_close (GcrPrompt *prompt, + gpointer user_data) +{ + gboolean *prompt_closed = (gboolean *)user_data; + g_assert (*prompt_closed == FALSE); + *prompt_closed = TRUE; +} + +static void +test_close_cancels (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + const gchar *password = NULL; + GAsyncResult *result = NULL; + gboolean prompt_closed; + + gcr_mock_prompter_set_delay_msec (3000); + gcr_mock_prompter_expect_password_ok ("booo", NULL); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + prompt_closed = FALSE; + g_signal_connect_after (prompt, "prompt-close", G_CALLBACK (on_prompt_close), &prompt_closed); + + gcr_prompt_password_async (prompt, NULL, on_async_result, &result); + + gcr_system_prompt_close (GCR_SYSTEM_PROMPT (prompt), NULL, &error); + g_assert_no_error (error); + + g_assert (prompt_closed == TRUE); + egg_test_wait (); + + password = gcr_prompt_password_finish (prompt, result, &error); + g_assert_no_error (error); + g_assert (password == NULL); + g_clear_object (&result); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_close_from_prompter (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + gboolean ret; + const gchar *password; + gboolean prompt_closed; + + gcr_mock_prompter_expect_close (); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 1, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + prompt_closed = FALSE; + g_signal_connect_after (prompt, "prompt-close", G_CALLBACK (on_prompt_close), &prompt_closed); + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == GCR_PROMPT_REPLY_CANCEL); + + /* The prompt should be closed now, these shouldn't reach the mock prompter */ + + while (!prompt_closed) + g_main_context_iteration (NULL, TRUE); + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == GCR_PROMPT_REPLY_CANCEL); + + password = gcr_prompt_password_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (password == NULL); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static void +test_after_close_dismisses (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GError *error = NULL; + gboolean ret; + const gchar *password; + gboolean prompt_closed; + + gcr_mock_prompter_expect_confirm_ok (NULL); + + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 1, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + prompt_closed = FALSE; + g_signal_connect_after (prompt, "prompt-close", G_CALLBACK (on_prompt_close), &prompt_closed); + + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == GCR_PROMPT_REPLY_CONTINUE); + + gcr_prompt_close (prompt); + g_assert (prompt_closed); + + /* These should never even reach the mock prompter */ + + ret = gcr_prompt_confirm_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (ret == GCR_PROMPT_REPLY_CANCEL); + + password = gcr_prompt_password_run (prompt, NULL, &error); + g_assert_no_error (error); + g_assert (password == NULL); + + while (g_main_context_iteration (NULL, FALSE)); + + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +typedef struct { + GAsyncResult *result1; + GAsyncResult *result2; +} ResultPair; + +static void +on_result_pair_one (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ResultPair *pair = user_data; + g_assert (pair->result1 == NULL); + pair->result1 = g_object_ref (result); + if (pair->result1 && pair->result2) + egg_test_wait_stop (); +} + +static void +on_result_pair_two (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ResultPair *pair = user_data; + g_assert (pair->result2 == NULL); + pair->result2 = g_object_ref (result); + if (pair->result1 && pair->result2) + egg_test_wait_stop (); +} + +static void +test_watch_cancels (Test *test, + gconstpointer unused) +{ + GcrPrompt *prompt; + GcrPrompt *prompt2; + GError *error = NULL; + const gchar *password; + ResultPair pair = { NULL, NULL }; + + gcr_mock_prompter_set_delay_msec (3000); + gcr_mock_prompter_expect_password_ok ("booo", NULL); + + /* This should happen immediately */ + prompt = gcr_system_prompt_open_for_prompter (test->prompter_name, 0, NULL, &error); + g_assert_no_error (error); + g_assert (GCR_IS_SYSTEM_PROMPT (prompt)); + + /* Show a password prompt */ + gcr_prompt_password_async (prompt, NULL, on_result_pair_one, &pair); + + /* This prompt should wait, block */ + gcr_system_prompt_open_for_prompter_async (test->prompter_name, 0, NULL, + on_result_pair_two, &pair); + + /* Wait a bit before stopping, so outgoing request is done */ + egg_test_wait_until (1000); + + /* Kill the mock prompter */ + gcr_mock_prompter_disconnect (); + + /* Both the above operations should cancel */ + egg_test_wait (); + + prompt2 = gcr_system_prompt_open_finish (pair.result2, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert (prompt2 == NULL); + + password = gcr_prompt_password_finish (prompt, pair.result1, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert (password == NULL); + + g_object_unref (prompt); + g_object_unref (pair.result1); + g_object_unref (pair.result2); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-system-prompt"); + + g_test_add ("/gcr/system-prompt/open", Test, NULL, setup, test_open_prompt, teardown); + g_test_add ("/gcr/system-prompt/open-failure", Test, NULL, setup, test_open_failure, teardown); + g_test_add ("/gcr/system-prompt/password", Test, NULL, setup, test_prompt_password, teardown); + g_test_add ("/gcr/system-prompt/password-async", Test, NULL, setup, test_async_password, teardown); + g_test_add ("/gcr/system-prompt/password-cancel", Test, NULL, setup, test_cancel_password, teardown); + g_test_add ("/gcr/system-prompt/password-in-exchange", Test, NULL, setup, test_password_in_exchange, teardown); + g_test_add ("/gcr/system-prompt/password-custom-exchange", Test, NULL, setup, test_password_custom_exchange, teardown); + g_test_add ("/gcr/system-prompt/confirm", Test, NULL, setup, test_prompt_confirm, teardown); + g_test_add ("/gcr/system-prompt/confirm-async", Test, NULL, setup, test_async_confirm, teardown); + g_test_add ("/gcr/system-prompt/confirm-cancel", Test, NULL, setup, test_cancel_confirm, teardown); + g_test_add ("/gcr/system-prompt/properties", Test, NULL, setup, test_prompt_properties, teardown); + g_test_add ("/gcr/system-prompt/properties-unset", Test, NULL, setup, test_prompt_properties_unset, teardown); + g_test_add ("/gcr/system-prompt/properties-reset", Test, NULL, setup, test_prompt_properties_reset, teardown); + g_test_add ("/gcr/system-prompt/close", Test, NULL, setup, test_prompt_close, teardown); + g_test_add ("/gcr/system-prompt/close-cancels", Test, NULL, setup, test_close_cancels, teardown); + g_test_add ("/gcr/system-prompt/after-close-dismisses", Test, NULL, setup, test_after_close_dismisses, teardown); + g_test_add ("/gcr/system-prompt/close-from-prompter", Test, NULL, setup, test_close_from_prompter, teardown); + g_test_add ("/gcr/system-prompt/watch-cancels", Test, NULL, setup, test_watch_cancels, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-trust.c b/gcr/test-trust.c new file mode 100644 index 0000000..fb3dca9 --- /dev/null +++ b/gcr/test-trust.c @@ -0,0 +1,325 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2010 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-internal.h" + +#include "gck/gck-mock.h" +#include "gck/gck-test.h" +#include +#include "gck/pkcs11n.h" +#include "gck/pkcs11x.h" + +#include "egg/egg-testing.h" + +#include + +#include + +typedef struct { + CK_FUNCTION_LIST funcs; + GcrCertificate *certificate; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + GList *modules = NULL; + CK_FUNCTION_LIST_PTR f; + GckModule *module; + gchar *contents; + const gchar *uris[2]; + gsize len; + CK_RV rv; + + if (!g_file_get_contents (SRCDIR "/gcr/fixtures/der-certificate.crt", &contents, &len, NULL)) + g_assert_not_reached (); + g_assert (contents); + + test->certificate = gcr_simple_certificate_new ((const guchar *)contents, len); + g_free (contents); + + rv = gck_mock_C_GetFunctionList (&f); + gck_assert_cmprv (rv, ==, CKR_OK); + memcpy (&test->funcs, f, sizeof (test->funcs)); + + /* Open a session */ + rv = (test->funcs.C_Initialize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); + + g_assert (!modules); + module = gck_module_new (&test->funcs); + modules = g_list_prepend (modules, module); + gcr_pkcs11_set_modules (modules); + gck_list_unref_free (modules); + + uris[0] = GCK_MOCK_SLOT_ONE_URI; + uris[1] = NULL; + + gcr_pkcs11_set_trust_store_uri (GCK_MOCK_SLOT_ONE_URI); + gcr_pkcs11_set_trust_lookup_uris (uris); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + CK_RV rv; + + g_object_unref (test->certificate); + + rv = (test->funcs.C_Finalize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); + + _gcr_uninitialize_library (); +} + +static void +test_is_pinned_none (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gboolean trust; + + trust = gcr_trust_is_certificate_pinned (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert_cmpint (trust, ==, FALSE); + g_assert (error == NULL); +} + +static void +test_add_and_is_pinned (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gboolean trust; + gboolean ret; + + trust = gcr_trust_is_certificate_pinned (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert_cmpint (trust, ==, FALSE); + g_assert (error == NULL); + + ret = gcr_trust_add_pinned_certificate (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert (ret == TRUE); + g_assert (error == NULL); + + trust = gcr_trust_is_certificate_pinned (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert_cmpint (trust, ==, TRUE); + g_assert (error == NULL); +} + +static void +test_add_certificate_pinned_fail (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gboolean ret; + + /* Make this function fail */ + test->funcs.C_CreateObject = gck_mock_fail_C_CreateObject; + + ret = gcr_trust_add_pinned_certificate (test->certificate, GCR_PURPOSE_CLIENT_AUTH, "peer", NULL, &error); + g_assert (ret == FALSE); + g_assert_error (error, GCK_ERROR, CKR_FUNCTION_FAILED); + g_clear_error (&error); +} + +static void +test_add_and_remov_pinned (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gboolean trust; + gboolean ret; + + ret = gcr_trust_add_pinned_certificate (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert (ret == TRUE); + g_assert (error == NULL); + + trust = gcr_trust_is_certificate_pinned (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert_cmpint (trust, ==, TRUE); + g_assert (error == NULL); + + ret = gcr_trust_remove_pinned_certificate (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert (ret == TRUE); + g_assert (error == NULL); + + trust = gcr_trust_is_certificate_pinned (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, &error); + g_assert_cmpint (trust, ==, FALSE); + g_assert (error == NULL); +} + +static void +fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data) +{ + *((GAsyncResult**)user_data) = result; + g_object_ref (result); + egg_test_wait_stop (); +} + +static void +test_add_and_is_pinned_async (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GError *error = NULL; + gboolean trust; + gboolean ret; + + gcr_trust_is_certificate_pinned_async (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + trust = gcr_trust_is_certificate_pinned_finish (result, &error); + g_assert (trust == FALSE); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; + + gcr_trust_add_pinned_certificate_async (test->certificate, GCR_PURPOSE_EMAIL, "host", + NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + ret = gcr_trust_add_pinned_certificate_finish (result, &error); + g_assert (ret == TRUE); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; + + gcr_trust_is_certificate_pinned_async (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + trust = gcr_trust_is_certificate_pinned_finish (result, &error); + g_assert (trust == TRUE); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; +} + +static void +test_add_and_remov_pinned_async (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GError *error = NULL; + gboolean trust; + gboolean ret; + + gcr_trust_add_pinned_certificate_async (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + ret = gcr_trust_add_pinned_certificate_finish (result, &error); + g_assert (ret == TRUE); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; + + gcr_trust_is_certificate_pinned_async (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + trust = gcr_trust_is_certificate_pinned_finish (result, &error); + g_assert (trust == TRUE); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; + + gcr_trust_remove_pinned_certificate_async (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + ret = gcr_trust_remove_pinned_certificate_finish (result, &error); + g_assert (ret == TRUE); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; + + gcr_trust_is_certificate_pinned_async (test->certificate, GCR_PURPOSE_EMAIL, "host", NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + trust = gcr_trust_is_certificate_pinned_finish (result, &error); + g_assert (trust == FALSE); + g_assert (error == NULL); + g_object_unref (result); + result = NULL; +} + +static void +test_is_certificate_anchored_not (Test *test, gconstpointer unused) +{ + GError *error = NULL; + gboolean ret; + + ret = gcr_trust_is_certificate_anchored (test->certificate, GCR_PURPOSE_CLIENT_AUTH, NULL, &error); + g_assert (ret == FALSE); + g_assert (error == NULL); +} + +static void +test_is_certificate_anchored_yes (Test *test, gconstpointer unused) +{ + GckBuilder builder = GCK_BUILDER_INIT; + GError *error = NULL; + gconstpointer der; + gsize n_der; + gboolean ret; + + /* Create a certificate root trust */ + der = gcr_certificate_get_der_data (test->certificate, &n_der); + gck_builder_add_data (&builder, CKA_X_CERTIFICATE_VALUE, der, n_der); + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_X_TRUST_ASSERTION); + gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE); + gck_builder_add_string (&builder, CKA_X_PURPOSE, GCR_PURPOSE_CLIENT_AUTH); + gck_builder_add_ulong (&builder, CKA_X_ASSERTION_TYPE, CKT_X_ANCHORED_CERTIFICATE); + gck_mock_module_add_object (gck_builder_end (&builder)); + + ret = gcr_trust_is_certificate_anchored (test->certificate, GCR_PURPOSE_CLIENT_AUTH, NULL, &error); + g_assert (ret == TRUE); + g_assert (error == NULL); +} + +static void +test_is_certificate_anchored_async (Test *test, gconstpointer unused) +{ + GAsyncResult *result = NULL; + GError *error = NULL; + gboolean ret; + + gcr_trust_is_certificate_anchored_async (test->certificate, GCR_PURPOSE_CLIENT_AUTH, NULL, fetch_async_result, &result); + egg_test_wait_until (500); + g_assert (result); + + ret = gcr_trust_is_certificate_anchored_finish (result, &error); + g_assert (ret == FALSE); + g_assert (error == NULL); + + g_object_unref (result); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_set_prgname ("test-trust"); + + g_test_add ("/gcr/trust/is_pinned_none", Test, NULL, setup, test_is_pinned_none, teardown); + g_test_add ("/gcr/trust/add_and_is_pinned", Test, NULL, setup, test_add_and_is_pinned, teardown); + g_test_add ("/gcr/trust/add_certificate_pinned_fail", Test, NULL, setup, test_add_certificate_pinned_fail, teardown); + g_test_add ("/gcr/trust/add_and_remov_pinned", Test, NULL, setup, test_add_and_remov_pinned, teardown); + g_test_add ("/gcr/trust/add_and_is_pinned_async", Test, NULL, setup, test_add_and_is_pinned_async, teardown); + g_test_add ("/gcr/trust/add_and_remov_pinned_async", Test, NULL, setup, test_add_and_remov_pinned_async, teardown); + g_test_add ("/gcr/trust/is_certificate_anchored_not", Test, NULL, setup, test_is_certificate_anchored_not, teardown); + g_test_add ("/gcr/trust/is_certificate_anchored_yes", Test, NULL, setup, test_is_certificate_anchored_yes, teardown); + g_test_add ("/gcr/trust/is_certificate_anchored_async", Test, NULL, setup, test_is_certificate_anchored_async, teardown); + + return egg_tests_run_with_loop (); +} diff --git a/gcr/test-util.c b/gcr/test-util.c new file mode 100644 index 0000000..6e7610f --- /dev/null +++ b/gcr/test-util.c @@ -0,0 +1,110 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-base.h" +#include "gcr/gcr-util.h" + +#include + +static void +on_line_parsed_match_template (const gchar *line, gpointer user_data) +{ + const gchar ***matching = user_data; + + g_assert (matching); + g_assert (*matching); + + /* Must be another line to match */ + g_assert ((*matching)[0]); + + /* Match this line against expected, and increment to next */ + g_assert_cmpstr ((*matching)[0], ==, line); + (*matching)++; +} + +static void +test_parse_lines (void) +{ + GString *string = g_string_new ("first line\nsecond line\n\nlast line"); + const gchar *matches[] = { "first line", "second line", "", NULL }; + const gchar **matching = matches; + + _gcr_util_parse_lines (string, FALSE, on_line_parsed_match_template, &matching); + + /* All lines should have matched */ + g_assert (*matching == NULL); + + /* The last line should still be here */ + g_assert_cmpstr (string->str, ==, "last line"); + g_string_free (string, TRUE); +} + +static void +test_parse_lines_and_last (void) +{ + GString *string = g_string_new ("first line\nsecond line\n\nlast line"); + const gchar *matches[] = { "first line", "second line", "", "last line", NULL }; + const gchar **matching = matches; + + _gcr_util_parse_lines (string, FALSE, on_line_parsed_match_template, &matching); + _gcr_util_parse_lines (string, TRUE, on_line_parsed_match_template, &matching); + + /* All lines should have matched */ + g_assert (*matching == NULL); + + /* No more data */ + g_assert_cmpstr (string->str, ==, ""); + g_assert_cmpuint (string->len, ==, 0); + g_string_free (string, TRUE); +} + +static void +test_parse_lines_dos (void) +{ + GString *string = g_string_new ("first line\r\nsecond line\r\n\r\nlast line"); + const gchar *matches[] = { "first line", "second line", "", "last line", NULL }; + const gchar **matching = matches; + + _gcr_util_parse_lines (string, FALSE, on_line_parsed_match_template, &matching); + _gcr_util_parse_lines (string, TRUE, on_line_parsed_match_template, &matching); + + /* All lines should have matched */ + g_assert (*matching == NULL); + + /* No more data */ + g_assert_cmpstr (string->str, ==, ""); + g_assert_cmpuint (string->len, ==, 0); + g_string_free (string, TRUE); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gcr/util/test_parse_lines", test_parse_lines); + g_test_add_func ("/gcr/util/test_parse_lines_and_last", test_parse_lines_and_last); + g_test_add_func ("/gcr/util/test_parse_lines_dos", test_parse_lines_dos); + + return g_test_run (); +} diff --git a/gtk-doc.make b/gtk-doc.make new file mode 100644 index 0000000..f87eaab --- /dev/null +++ b/gtk-doc.make @@ -0,0 +1,320 @@ +# -*- mode: makefile -*- +# +# gtk-doc.make - make rules for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2004-2007 Damon Chaplin +# 2007-2017 Stefan Sauer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = $(LIBTOOL) --mode=execute +else +GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = +endif + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) + +SETUP_FILES = \ + $(content_files) \ + $(expand_content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +EXTRA_DIST = \ + $(HTML_IMAGES) \ + $(SETUP_FILES) + +DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +gtkdoc-check.test: Makefile + $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ + echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ + chmod +x $@ + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test + +if GTK_DOC_BUILD_HTML +HTML_BUILD_STAMP=html-build.stamp +else +HTML_BUILD_STAMP= +endif +if GTK_DOC_BUILD_PDF +PDF_BUILD_STAMP=pdf-build.stamp +else +PDF_BUILD_STAMP= +endif + +all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +.PHONY: all-gtk-doc + +if ENABLE_GTK_DOC +all-local: all-gtk-doc +endif + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_@AM_V@) +GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_@AM_DEFAULT_V@) +GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + destdir=`dirname $(abs_builddir)/$$file`; \ + test -d "$$destdir" || mkdir -p "$$destdir"; \ + test -f $(abs_srcdir)/$$file && \ + cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + fi + $(AM_V_at)touch setup-build.stamp + +#### scan #### + +GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_@AM_V@) +GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_@AM_DEFAULT_V@) +GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; + +GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_@AM_V@) +GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_@AM_DEFAULT_V@) +GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; + +scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### xml #### + +GTK_DOC_V_XML=$(GTK_DOC_V_XML_@AM_V@) +GTK_DOC_V_XML_=$(GTK_DOC_V_XML_@AM_DEFAULT_V@) +GTK_DOC_V_XML_0=@echo " DOC Building XML"; + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent + $(GTK_DOC_V_XML)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +$(DOC_MAIN_SGML_FILE): sgml-build.stamp + @true + +xml/gtkdocentities.ent: Makefile + $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + ) > $@ + +#### html #### + +GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_@AM_V@) +GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_@AM_DEFAULT_V@) +GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; + +GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_@AM_V@) +GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_@AM_DEFAULT_V@) +GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ + mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$$?" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + test -f $(abs_srcdir)/$$file && cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + test -f $(abs_builddir)/$$file && cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + done; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +#### pdf #### + +GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_@AM_V@) +GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_@AM_DEFAULT_V@) +GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ + mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ + rm -f $(DOC_MODULE).types; \ + fi + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ + rm -f $(DOC_MODULE)-sections.txt; \ + fi + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ + fi + +maintainer-clean-local: + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +if HAVE_GTK_DOC +dist-check-gtkdoc: docs +else +dist-check-gtkdoc: + @echo "*** gtk-doc is needed to run 'make dist'. ***" + @echo "*** gtk-doc was not found when 'configure' ran. ***" + @echo "*** please install gtk-doc and rerun 'configure'. ***" + @false +endif + +dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local + @mkdir $(distdir)/html + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs diff --git a/intltool-extract.in b/intltool-extract.in new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/intltool-extract.in diff --git a/intltool-merge.in b/intltool-merge.in new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/intltool-merge.in diff --git a/intltool-update.in b/intltool-update.in new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/intltool-update.in diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..7fa849a --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,88 @@ +# please keep this list sorted alphabetically +# +af +ar +as +ast +az +be +be@latin +bg +bn +bn_IN +bs +ca +ca@valencia +cs +cy +da +de +dz +el +en_CA +en_GB +en@shaw +eo +es +et +eu +fa +fi +fr +fur +ga +gl +gu +he +hi +hr +hu +id +it +is +ja +ka +kk +kn +ko +lt +lv +mai +mg +mk +ml +mn +mr +ms +nb +ne +nl +nn +oc +or +pa +pl +pt +pt_BR +ro +ru +rw +si +sk +sl +sq +sr +sr@latin +sv +ta +te +tg +th +tr +ug +uk +vi +xh +zh_CN +zh_HK +zh_TW diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..fcd2c3b --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,221 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper +# Copyright (C) 2004-2008 Rodney Dawes +# +# This file may be copied and used freely without restrictions. It may +# be used in projects which are not available under a GNU Public License, +# but which still want to provide support for the GNU gettext functionality. +# +# - Modified by Owen Taylor to use GETTEXT_PACKAGE +# instead of PACKAGE and to look for po2tbl in ./ not in intl/ +# +# - Modified by jacob berkman to install +# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize +# +# - Modified by Rodney Dawes for use with intltool +# +# We have the following line for use by intltoolize: +# INTLTOOL_MAKEFILE + +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = @top_builddir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +datarootdir = @datarootdir@ +libdir = @libdir@ +localedir = @localedir@ +subdir = po +install_sh = @install_sh@ +# Automake >= 1.8 provides @mkdir_p@. +# Until it can be supposed, use the safe fallback: +mkdir_p = $(install_sh) -d + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist +GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot + +ALL_LINGUAS = @ALL_LINGUAS@ + +PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) + +USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) + +USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) + +POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) + +DISTFILES = Makefile.in.in POTFILES.in $(POFILES) +EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS + +POTFILES = \ +# This comment gets stripped out + +CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) + +.SUFFIXES: +.SUFFIXES: .po .pox .gmo .mo .msg .cat + +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) +INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) +INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; + +.po.pox: + $(MAKE) $(GETTEXT_PACKAGE).pot + $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox + +.po.mo: + $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< + +.po.gmo: + $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && gencat $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +$(GETTEXT_PACKAGE).pot: $(POTFILES) + $(GENPOT) + +install: install-data +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $$dir; \ + if test -r $$lang.gmo; then \ + $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ + echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ + echo "installing $(srcdir)/$$lang.gmo as" \ + "$$dir/$(GETTEXT_PACKAGE).mo"; \ + fi; \ + if test -r $$lang.gmo.m; then \ + $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ + echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ + else \ + if test -r $(srcdir)/$$lang.gmo.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ + $$dir/$(GETTEXT_PACKAGE).mo.m; \ + echo "installing $(srcdir)/$$lang.gmo.m as" \ + "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ + else \ + true; \ + fi; \ + fi; \ + done + +# Empty stubs to satisfy archaic automake needs +dvi info ctags tags CTAGS TAGS ID: + +# Define this as empty until I found a useful application. +install-exec installcheck: + +uninstall: + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ + done + +check: all $(GETTEXT_PACKAGE).pot + rm -f missing notexist + srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m + if [ -r missing -o -r notexist ]; then \ + exit 1; \ + fi + +mostlyclean: + rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp + rm -f .intltool-merge-cache + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES stamp-it + rm -f *.mo *.msg *.cat *.cat.m *.gmo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f Makefile.in.in + +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: $(DISTFILES) + dists="$(DISTFILES)"; \ + extra_dists="$(EXTRA_DISTFILES)"; \ + for file in $$extra_dists; do \ + test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ + done; \ + for file in $$dists; do \ + test -f $$file || file="$(srcdir)/$$file"; \ + ln $$file $(distdir) 2> /dev/null \ + || cp -p $$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(GETTEXT_PACKAGE).pot + tmpdir=`pwd`; \ + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + echo "$$lang:"; \ + result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ + if $$result; then \ + if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.gmo failed!"; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi; \ + done + +Makefile POTFILES: stamp-it + @if test ! -f $@; then \ + rm -f stamp-it; \ + $(MAKE) stamp-it; \ + fi + +stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..fad541b --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,41 @@ +# List of source files containing translatable strings. +# Please keep this file sorted alphabetically. +egg/egg-oid.c +gck/gck-misc.c +gck/gck-module.c +gck/gck-modules.c +gck/gck-uri.c +gcr/gcr-callback-output-stream.c +gcr/gcr-certificate.c +gcr/gcr-certificate-extensions.c +gcr/gcr-certificate-request.c +gcr/gcr-gnupg-importer.c +gcr/gcr-gnupg-key.c +gcr/gcr-gnupg-process.c +gcr/gcr-importer.c +gcr/gcr-library.c +gcr/gcr-parser.c +gcr/gcr-prompt.c +gcr/gcr-ssh-askpass.c +gcr/gcr-subject-public-key.c +gcr/gcr-system-prompt.c +gcr/gcr-trust.c +ui/gcr-certificate-renderer.c +ui/gcr-certificate-request-renderer.c +ui/gcr-certificate-widget.c +ui/gcr-display-view.c +ui/gcr-failure-renderer.c +ui/gcr-gnupg-renderer.c +ui/gcr-import-button.c +ui/gcr-key-renderer.c +ui/gcr-pkcs11-import-dialog.c +[type: gettext/glade]ui/gcr-pkcs11-import-dialog.ui +ui/gcr-pkcs11-import-interaction.c +ui/gcr-prompt-dialog.c +ui/gcr-prompter.desktop.in.in +ui/gcr-certificate-exporter.c +[type: gettext/glade]ui/gcr-unlock-options-widget.ui +ui/gcr-unlock-renderer.c +ui/gcr-viewer-tool.c +ui/gcr-viewer-widget.c +ui/gcr-viewer-window.c diff --git a/po/POTFILES.skip b/po/POTFILES.skip new file mode 100644 index 0000000..24c3197 --- /dev/null +++ b/po/POTFILES.skip @@ -0,0 +1 @@ +gcr/gcr-prompter.desktop.in diff --git a/po/af.po b/po/af.po new file mode 100644 index 0000000..5bab3ae --- /dev/null +++ b/po/af.po @@ -0,0 +1,1054 @@ +# Afrikaans translation for gcr. +# Copyright (C) 2011 +# This file is distributed under the same license as the gcr package. +# Hermien , 2011. +# F Wolff , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gcr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2011-03-19 00:11+0200\n" +"Last-Translator: F Wolff \n" +"Language-Team: translate-discuss-af@lists.sourceforge.net\n" +"Language: af\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.0-beta4\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Domeinkomponent" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "Gebruiker-ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "E-posadres" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Geboortedatum" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Geboorteplek" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Geslag" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Land van burgerskap" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Land van verblyf" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Noemnaam" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Van" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "Reeksnommer" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Land" + +#: ../egg/egg-oid.c:73 +#, fuzzy +msgid "Locality" +msgstr "Lokaliteit" + +#: ../egg/egg-oid.c:75 +#, fuzzy +msgid "State" +msgstr "Provinsie" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Straat" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Organisasie" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Organisasie-eenheid" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Titel" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Telefoonnommer" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Doopnaam" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Voorletters" + +#: ../egg/egg-oid.c:91 +#, fuzzy +msgid "Generation Qualifier" +msgstr "Generasiekwalifiseerder" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Skuilnaam" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 met RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 met RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 met RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 met DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Die sessie is gesluit" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "_Naam:" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Uitreiker naam" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "Verval" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Die bewerking is gekanselleer" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Ontsluit sertifikaat" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "Uitreiker naam" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +#, fuzzy +msgid "X400 Address" +msgstr "E-posadres" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "Onderwerpnaam" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +#, fuzzy +msgid "IP Address" +msgstr "E-posadres" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "Ja" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "Nee" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Identifiseerder" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "Identifiseerder" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "Handtekening" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "Sleutelparameters" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "Onderwerpnaam" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "Uitbreiding" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "Identifiseerder" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "Waarde" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "Krities" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Voer wagwoord in om die sertifikaat te ontsluit" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "Identiteit" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "Geverifieer deur" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "Verval" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "Onderwerpnaam" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +#, fuzzy +msgid "Issuer Name" +msgstr "Uitreiker naam" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "Uitgereikte sertifikaat" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "Weergawe" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "Nie geldig voor" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "Nie geldig ná" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Vingerafdrukke" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "Handtekening" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "Handtekeningalgoritme" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "Handtekeningparameters" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "Inligting oor publieke sleutel" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "Sleutelalgoritme" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "Sleutelparameters" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "Sleutelgrootte" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "Vingerafdruk" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Publieke sleutel" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "_Besonderhede:" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Ontsluit sleutelring" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "PGP-sleutel: %s" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +#, fuzzy +msgid "PGP Key" +msgstr "PGP-sleutel: %s" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Die bewerking is gekanselleer" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "Handtekening" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Sertifikaat" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Sertifikaat" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "Onbekend" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "Verval" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Die inligting is sensitief en kan nie onthul word nie" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Die sessie is ongeldig" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "Die module is nog nie begin nie" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Die sleutel kan nie toegedraai word nie" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Die wagwoord of PIN het verval" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Die sleutel is die verkeerde tipe" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "Algoritme" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "Verval" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "_Naam:" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "Grootte" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "Handtekeningparameters" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "Handtekening" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Ontsluit sertifikaat" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "Handtekeningparameters" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "Lokaliteit" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "Vingerafdruk" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Publieke sleutel" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "Voorletters" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "Voer in na:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Voer in na:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Kan nie invoer nie, aangesien die sleutel die verkeerde tipe is" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "Geen ligging beskikbaar om na toe in te voer nie" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "Sleutel" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "Privaat RSA-sleutel" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "Privaat DSA-sleutel" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Privaatsleutel" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "Publieke DSA-sleutel" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d bis" +msgstr[1] "%d bisse" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "Sterkte" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "Vingerafdrukke" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "Nieherkende of nieondersteunde data." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "Kon nie ongeldige of korrupte data ontleed nie." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "Die data is gesluit" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Ontsluit" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "Om '%s' in te voer, moet dit ontsluit word" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "Wagwoord:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Ontsluit hierdie sleutelring outomaties wanneer ek aangemeld is" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "Sluit hierdie sleutelring ná" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "Sluit hierdie sleutelring wanneer ledig vir" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "Sluit hierdie sleutelring wanneer en afmeld" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minute" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Ontsluit" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Ontsluit" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "Wagwoord:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "Sertifikaat- en sleutelberging" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "Sertifikaat- en sleutelberging" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Sertifikaat" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Die ontsluitwagwoord was verkeerd" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Voer in na:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Die bewerking het misluk" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "Voer in na:" + +#: ../gck/gck-uri.c:223 +#, fuzzy, c-format +msgid "The URI has invalid encoding." +msgstr "" +"Die URI het ongeldige sintaks. Die '%s'-veld se enkodering is ongeldig." + +#: ../gck/gck-uri.c:227 +#, fuzzy +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "Die URI het nie die 'pkcs11'-skema nie." + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 0000000..4433716 --- /dev/null +++ b/po/ar.po @@ -0,0 +1,1049 @@ +# translation of gnome-keyring.HEAD.ar.po to Arabic +# Arabic translation of gnome-keyring. +# Copyright (C) 2004 THE gnome-keyring'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-keyring package. +# Arafat Medini , 2004. +# Djihed Afifi , 2006. +# Khaled Hosny , 2006, 2009, 2010, 2011. +# Anas Husseini , 2007. +# Anas Afif Emad , 2008. +# Anass Ahmed , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD.ar\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2011-09-05 13:10+0200\n" +"Last-Translator: Anass Ahmed \n" +"Language-Team: Arabeyes\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Virtaal 0.7.0\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "مكوّن النطاق" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "معرف المستخدم" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "عنوان البريد الإلكتروني" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "تاريخ الميلاد" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "مكان الميلاد" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "الجنس" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "بلد الجنسية" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "بلد الإقامة" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "الاسم الشائع" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "الكُنية" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "الرقم التسلسلي" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "البلد" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "المحلّة" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "الولاية" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "الشارع" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "المنظمة" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "الوحدة التنظيمية" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "اللّقب" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "رقم الهاتف" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "الاسم المعط" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "الألقاب" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "مُؤهِّل التوليد" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "مُؤهِّل الاسم المميِّز" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "الاسم المستعار" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "‏RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "‏MD2 مع RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "‏MD5 مع RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "‏SHA1 مع RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "‏SHA1 مع DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "استيثاق الخادم" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "تصديق العميل" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "توقيع الكود" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "حماية البريد الإليكتروني" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "الختم الزمني" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "تعذر تحميل وحدة PKCS#11: %s" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "وحدة PKCS#11 غير صالحة: %s" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "تعذّر تثبيت وحدة PKCS#11: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "تعذّر تهيئة وحدة PKCS#11: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "تعذّر تهيئة وحدات PKCS#11 المسجلة: %s" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "الجلسة مغلقة" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "الاسم" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "مُصْدَرة مِن" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "تاريخ انتهاء الصلاحية" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "الشهادة" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" +"يوجد بالفعل ملف بهذا الاسم.\n" +"\n" +"أترغب في استبداله بملف جديد؟" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "ا_ستبدل" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "أُلغيت العملية" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "استورد الشهادة" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "ملفات الشهادة" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "ملفات PEM" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "الاسم الآخر" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "عنوان XMPP" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "البريد" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:182 +#, fuzzy +msgid "X400 Address" +msgstr "عنوان X400" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "اسم المجلد" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "اسم طرف EDI" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "العنوان" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "عنوان IP" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "المعرف المسجل" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "القيود الأساسية" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "سلطة الشهادة" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "نعم" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "لا" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "أقصى طول للمسار" + +#: ../gcr/gcr-certificate-renderer.c:123 +#, fuzzy +msgid "Unlimited" +msgstr "غير محدود" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "الاستخدام الموسع للمفتاح" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "الأغراض المسموح بها" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "معرف مفتاح الموضوع" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "معرف المفتاح" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "التوقيع الرقمي" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "تشفير المفتاح" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "تشفير البيانات" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "اتفاقية المفتاح" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "توقيع الشهادة" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "توقيع قائمة الإلغاء" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "استخدام المفتاح" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "الاستعمالات" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "الأسماء البديلة الموضوع" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "الامتداد" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "المعرف" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "القيمة" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "حرج" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "تعذّر تصدير الشهادة." + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "المعرّف" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "تحقق منها" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "تاريخ انتهاء الصلاحية" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "اسم المُصدَر إليه" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "اسم المُصدِر" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "الشهادة المُصدرة" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "الإصدارة" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "ليست صالحة قبل" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "ليست صالحة بعد" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "بصمات الشهادة" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "التوقيع" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "خوارزمية التوقيع" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "معاملات التوقيع" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "معلومات المفتاح العلني" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "خوارزمية المفتاح" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "معاملات المفتاح" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "حجم المفتاح" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "بصمة مفتاح SHA1" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "المفتاح العلني" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "الت_فاصيل" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "تعذّر عرض '%s'" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "تعذّر عرض الملف" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "السبب" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "تعذّر عرض ملف من هذا النوع." + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "فك قفل حلقة المفاتيح" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "مفتاح PGP:‏ %s" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "مفتاح PGP" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "معرّف المفتاح" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "إنتهت عملية Gnupg بكود: %d" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "أُنهِيت عملية Gnupg بالإشارة: %d" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "تم إلغاء العملية" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "التوقيع" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "الشهادة" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "استيثاق الخادم" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "غير معروف" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "تاريخ انتهاء الصلاحية" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "المعلومات حسّاسة ولا يمكن كشفها" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "الجلسة غير صالحة" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "لم يتم ابتداء الوحدة" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "حلقة المفاتيح مفتوحة مسبقًا." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "انتهت مدة كلمة السر أو رمز التعريف الشخصي PIN" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "المفتاح من النوع الخاطئ" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +#, fuzzy +msgid "Key ID" +msgstr "معرّف المفتاح" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "الخوارزمية" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "_أنشئ" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "تاريخ انتهاء الصلاحية" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "الاسم" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "الحجم" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "معاملات التوقيع" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "التوقيع الرقمي" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "فكّ قفل الشهادة" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "معاملات التوقيع" + +#: ../gcr/gcr-gnupg-renderer.c:529 +#, fuzzy +msgid "Key revocation signature" +msgstr "توقيع قائمة الإلغاء" + +#: ../gcr/gcr-gnupg-renderer.c:531 +#, fuzzy +msgid "Subkey revocation signature" +msgstr "توقيع قائمة الإلغاء" + +#: ../gcr/gcr-gnupg-renderer.c:533 +#, fuzzy +msgid "Certification revocation signature" +msgstr "توقيع الشهادة" + +#: ../gcr/gcr-gnupg-renderer.c:535 +#, fuzzy +msgid "Timestamp signature" +msgstr "التوقيع الرقمي" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "المحلّة" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +#, fuzzy +msgid "Revocation Key" +msgstr "توقيع قائمة الإلغاء" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "البصمة" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "المفتاح العلني" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "الألقاب" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "استورد إلى:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "استورد إلى:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "تعذّر الاستيراد لأن نوع المفتاح خاطئ" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "لا مكان متاح للاستيراد منه" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "مفتاح" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "مفتاح RSA سري" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "مفتاح DSA سري" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "المفتاح السري" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "مفتاح DSA علني" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d بتة" +msgstr[1] "%d بتة" +msgstr[2] "%d بتة" +msgstr[3] "%d بتات" +msgstr[4] "%d بتة" +msgstr[5] "%d بتة" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "القوّة" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "البصمات" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "SHA1" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "SHA256" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "بيانات غير مدعومة أو غير معروفة." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "تعذّر قراءة بيانات معطوبة أو غير سليمة." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "البيانات موصدة" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "افتح هذه تلقائيًا عندما ألِج." + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "فك القفل" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "يجب فتح قفل '%s' قبل استيراده" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "كلمة السّر:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "تعذّر العثور على مكان لحفظ الشهادة" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "افتح تلقائيًا حلقة المفاتيح هذه عندما ألِج" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "أقفل حلقة المفاتيح هذه بعد" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "أقفل حلقة المفاتيح إذا خملت لمدة" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "أقفل حلقة المفاتيح هذه عندما أخرج" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "دقائق" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "فك قفل: %s" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "فك القفل" + +#: ../gcr/gcr-unlock-renderer.c:126 +msgid "Password" +msgstr "كلمة السّر" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, fuzzy, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "محتويات '%s' مقفلة. لكي تعرضها أدخل كلمة السّر الصحيحة." + +#: ../gcr/gcr-unlock-renderer.c:282 +#, fuzzy +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "المحتويات مقفلة. لتعرضها أدخل كلمة السّر الصحيحة." + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "عارض مفاتيح وشهادات GCR" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "اعرض إصدار التطبيق" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[ملف...]" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "- اعرض ملفات الشهادة والمفاتيح" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "عارض الشهادات" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "كلمة السر غير صحيحة" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "استورد إلى:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "فشلت العملية" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "استورد إلى:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "ترميز المسار URI غير صالح." + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "مسار URI لا يملك مخطط 'pkcs11'." + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "صيغة المسار URI سيئة." + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "مسار URI يملك رقم إصدار سيء." diff --git a/po/as.po b/po/as.po new file mode 100644 index 0000000..ba7fda7 --- /dev/null +++ b/po/as.po @@ -0,0 +1,1164 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Amitakhya Phukan , 2009. +# Nilamdyuti Goswami , 2011, 2014. +msgid "" +msgstr "" +"Project-Id-Version: as\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2014-04-19 20:37+0000\n" +"PO-Revision-Date: 2014-08-21 17:57+0530\n" +"Last-Translator: Nilamdyuti Goswami \n" +"Language-Team: Assamese \n" +"Language: as\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.5\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "ডমেইনৰ উপাদান" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ব্যবহাৰকাৰীৰ ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "ই-মেইল ঠিকনা" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "জন্মৰ তাৰিখ" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "জন্মস্থান" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "লিংগ" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "নাগৰিকত্ব" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "বসবাসৰ দেশ" + +# +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "সাধাৰণ নাম" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "পদবি" + +# +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "ক্ৰমিক নম্বৰ" + +# +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "দেশ" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "অঞ্চল" + +# +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "অৱস্থা" + +# +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "ৰাস্তা" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "সংস্থা" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "সংস্থাৰ বিভাগ" + +# +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "শীৰ্ষক" + +# +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "টেলিফোন নম্বৰ" + +# +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "প্ৰদত্ত নাম" + +# +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "আদ্যাক্ষৰ" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "প্ৰজন্ম পৰিপুষ্টক" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN পৰিপুষ্টক" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "ছদ্ধনাম" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "RSA সহ MD2" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "RSA সহ MD5" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "RSA সহ SHA1" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "DSA সহ SHA1" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "উপবৃত্তীয় বক্ৰ" + +#: ../egg/egg-oid.c:106 +#| msgid "SHA1 with DSA" +msgid "SHA1 with ECDSA" +msgstr "ECDSA ৰ সৈতে SHA1" + +#: ../egg/egg-oid.c:107 +#| msgid "SHA1 with DSA" +msgid "SHA224 with ECDSA" +msgstr "ECDSA ৰ সৈতে SHA224" + +#: ../egg/egg-oid.c:108 +#| msgid "SHA1 with DSA" +msgid "SHA256 with ECDSA" +msgstr "ECDSA ৰ সৈতে SHA256" + +#: ../egg/egg-oid.c:109 +#| msgid "SHA1 with DSA" +msgid "SHA384 with ECDSA" +msgstr "ECDSA ৰ সৈতে SHA384" + +#: ../egg/egg-oid.c:110 +#| msgid "SHA1 with DSA" +msgid "SHA512 with ECDSA" +msgstr "ECDSA ৰ সৈতে SHA512" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "চাৰ্ভাৰ প্ৰমাণীকৰণ" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "ক্লাএন্ট প্ৰমাণীকৰণ" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "কোড স্বাক্ষৰণ" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "ই-মেইল সুৰক্ষা" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "সময় মোহৰকৰণ" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 মডিউল ল'ড কৰোতে ত্ৰুটি: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "PKCS#11 মডিউল আৰম্ভ কৰিব নোৱাৰি: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "ৰেজিস্টাৰ কৰা PKCS#11 মডিউল আৰম্ভ কৰিব নোৱাৰি: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI টোৰ অবৈধ এনকোডিং আছে।" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI -ৰ 'pkcs11' আচনি নাই।" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI -ৰ বেয়া বাক্যবিন্যাস আছে।" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URl -ৰ এটা বেয়া সংস্কৰণ আছে।" + +#: ../gcr/gcr-callback-output-stream.c:62 +#: ../gcr/gcr-callback-output-stream.c:79 +#, c-format +msgid "The stream was closed" +msgstr "স্ট্ৰিম বন্ধ কৰা হৈছিল" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "নাম" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "প্ৰেৰণ কৰা হৈছে" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "অৱসান ঘটিব" + +# +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "প্ৰমাণপত্ৰ" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "অন্য নাম" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "ই-মেইল" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 ঠিকনা" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "ডাইৰেকটৰি নাম" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI দল নাম" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP ঠিকনা" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ৰেজিস্টাৰ্ড ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "প্ৰমাণপত্ৰ অনুৰোধৰ বাবে অসমৰ্থিত কি ধৰণ" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "কিক অনুৰোধ ছাইন কৰিবলে ব্যৱহাৰ কৰিব নোৱাৰি" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG কিৰিং" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG কিৰিং: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP কি" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "কি ID" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg প্ৰক্ৰিয়া কোড: %d -ৰ সৈতে প্ৰস্থান কৰিছে" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg প্ৰক্ৰিয়া সংকেত: %d দ্বাৰা অন্ত পেলোৱা হৈছে" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2551 +#: ../gcr/gcr-parser.c:3157 ../gcr/gcr-system-prompt.c:924 +msgid "The operation was cancelled" +msgstr "কৰ্ম বাতিল কৰা হৈছে" + +# +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "ব্যক্তিগত কি" + +# +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "ৰাজহুৱা কি" + +#: ../gcr/gcr-parser.c:334 +#| msgid "Certificate files" +msgid "Certificate Request" +msgstr "প্ৰমাণপত্ৰ অনুৰোধ" + +#: ../gcr/gcr-parser.c:2554 +msgid "Unrecognized or unsupported data." +msgstr "অপৰিচিত অথবা অসমৰ্থিত তথ্য।" + +#: ../gcr/gcr-parser.c:2557 +msgid "Could not parse invalid or corrupted data." +msgstr "অবৈধ অথবা ক্ষতিগ্ৰস্ত তথ্য বিশ্লেষণ কৰিব ব্যৰ্থ।" + +#: ../gcr/gcr-parser.c:2560 +msgid "The data is locked" +msgstr "তথ্য লক কৰা আছে" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "অব্যাহত ৰাখক" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "বাতিল কৰক" + +#: ../gcr/gcr-subject-public-key.c:407 +msgid "Unrecognized or unavailable attributes for key" +msgstr "কিৰ বাবে অপৰিচিত অথবা আনউপলব্ধ বৈশিষ্ট্যসমূহ" + +#: ../gcr/gcr-subject-public-key.c:493 ../gcr/gcr-subject-public-key.c:579 +msgid "Couldn't build public key" +msgstr "ৰাজহুৱা কি নিৰ্মাণ কৰিব নোৱাৰি" + +#: ../gcr/gcr-system-prompt.c:905 +msgid "Another prompt is already in progress" +msgstr "অন্য প্ৰমপ্ট ইতিমধ্যে প্ৰগতিশীল" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:366 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "পিন্নড প্ৰমাণপত্ৰ সংৰক্ষণ কৰিবলে এটা স্থান পোৱা নগল" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "সাধাৰণ বাধাসমূহ" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "প্ৰমাণপত্ৰ কতৃপক্ষ" + +# +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "হয়" + +# +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "নহয়" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "সৰ্বাধিক পথ দৈৰ্ঘ" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "অসীমিত" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "প্ৰসাৰিত কি ব্যৱহাৰ" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "অনুমোদিত কাৰণসমূহ" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "বিষয় কি পৰিচয়ক" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "কি পৰিচয়ক" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "অঙ্কীয় স্বাক্ষৰ" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "কি ইনচিফাৰমেন্ট" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "তথ্য ইনচিফাৰমেন্ট" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "কি চুক্তি" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "প্ৰমাণপত্ৰ স্বাক্ষৰ" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "প্ৰত্যাৱৰ্তন তালিকা স্বাক্ষৰ" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "কি ব্যৱহাৰ" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "ব্যৱহাৰসমূহ" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "বিষয় অতিৰিক্ত নামসমূহ" + +# +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "প্ৰসাৰণ" + +# +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "পৰিচয়ক" + +# +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "মান" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "প্ৰমাণপত্ৰ এক্সপৰ্ট কৰিব নোৱাৰি।" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "পৰিচয়" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "দ্বাৰা সতাসত্য নিৰূপিত" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "অৱসান ঘটিব" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "বিষয়ৰ নাম" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "প্ৰেৰণকাৰীৰ নাম" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "প্ৰেৰণ কৰা প্ৰমাণপত্ৰ" + +# +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "সংস্কৰণ" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "চিহ্নিত সময়ৰ পূৰ্বে বৈধ নয়" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "চিহ্নিত সময়ৰ পিছত বৈধ নয়" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰিন্টসমূহ" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "ৰাজহুৱা কি তথ্য" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "স্বাক্ষৰ" + +#: ../ui/gcr-certificate-renderer.c:616 +#| msgid "Export certificate" +msgid "Export Certificate…" +msgstr "প্ৰমাণপত্ৰ এক্সপৰ্ট কৰক" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "কিৰ এলগৰিথম" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "কিৰ প্ৰাচলসমূহ" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "কিৰ আকাৰ" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Key SHA1 ফিংগাৰপ্ৰিন্ট" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "স্বাক্ষৰৰ এলগৰিথম" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "স্বাক্ষৰৰ প্ৰাচলসমূহ" + +# +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "গুৰুতৰ" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +#| msgid "Certificate files" +msgid "Certificate request" +msgstr "প্ৰমাণপত্ৰ অনুৰোধ" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "বৈশিষ্ট্য" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "ধৰণ" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "প্ৰত্যাহ্বান" + +#: ../ui/gcr-display-view.c:317 +msgid "_Details" +msgstr "বিৱৰণসমূহ (_D)" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "'%s' প্ৰদৰ্শন কৰিব নোৱাৰি" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "ফাইল প্ৰদৰ্শন কৰিব পৰা নগল" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "কাৰণ" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "এই ধৰণৰ নথিপত্ৰ প্ৰদৰ্শন কৰিব নোৱাৰি।" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "ইনক্ৰিপ্ট কৰক" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "প্ৰমাণীত কৰক" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "প্ৰমাণীত কৰক" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "অসামৰ্থবান" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "অজ্ঞাত" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "অবৈধ" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "অসামৰ্থবান" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "প্ৰত্যাবৰ্তিত" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "অৱসিত" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "অবিৱৰিত ভৰষা" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "ভৰষাহীন" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "আংশিকভাৱে ভৰষাবান" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "সম্পূৰ্ণভাৱো ভৰষাবান" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "উত্তমভাৱে ভৰষাবান" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "এই কিৰ তথ্যক এতিয়াও সত্যাপন কৰা হোৱা নাই" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "এই কি অবৈধ" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "এই কিক অসামৰ্থবান কৰা হৈছে" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "এই কিক প্ৰত্যাহাৰ কৰা হৈছে" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "এই কি'ৰ অৱসান হৈছে" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "এই কি ভৰষাহীন" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "এই কি আংশিকভাৱে ভৰষাবান" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "এই কি সম্পূৰ্ণভাৱে ভৰষাবান" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "এই কি সম্পূৰ্ণভাৱে ভৰষাবান" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "কি ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "এলগৰিথম" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "সৃষ্টি কৰাৰ তাৰিখ" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "অৱসান ঘটিব" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "ক্ষমতাসমূহ" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "গৰাকীৰ ভৰষা" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "নাম" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "মন্তব্য" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "ব্যৱহাৰকাৰীৰ বৈশিষ্ট্য" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "আকাৰ" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "এটা বাইনাৰি দস্তাবেজৰ স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "এটা বিধিত লিখনি দস্তাবেজৰ স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "স্টেণ্ডএলৌন স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "কিৰ বৰ্গীয় প্ৰমাণীকৰণ" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "কিৰ পাৰচনা প্ৰমাণীকৰণ" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "কিৰ সাধাৰণ প্ৰমাণীকৰণ" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "কিৰ ধনাত্মক প্ৰমাণীকৰণ" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "চাবকি বাইন্ডিং স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "প্ৰাথমিক কি বাইণ্ডিং স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "কিত প্ৰত্যক্ষভাৱে স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "কি প্ৰত্যাবৰ্তন স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "চাবকি প্ৰত্যাবৰ্তন স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "প্ৰমাণপত্ৰ প্ৰত্যাবৰ্তন স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "টাইমস্টাম্প স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "তৃতীয়-দল নিশ্চিতকৰণ স্বাক্ষৰ" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "ক্লাচ" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "কেৱল স্থানীয়" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "এক্সপৰ্ট কৰিব পৰা" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "প্ৰত্যাবৰ্তন কি" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "ফিংগাৰপ্ৰিন্ট" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "ৰাজহুৱা চাবকি" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "গোপন কি" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "গোপন চাবকি" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "আৰম্ভ কৰা হৈছে…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "ইমপৰ্ট প্ৰগতিশীল…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "চিহ্নিত স্থানত ইমপৰ্ট কৰা হৈছে: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "চিহ্নিত স্থানত ইমপৰ্ট কৰক: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "কোনো সংগত ইমপৰ্টাৰ নথকা বাবে ইমপৰ্ট কৰিব নোৱাৰি" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "ইমপৰ্ট কৰিবলে কোনো তথ্য নাই" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "কি" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "ব্যক্তিগত RSA কি" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "ব্যক্তিগত DSA কি" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "ব্যক্তিগত উপবৃত্তীয় বক্ৰ কি" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "ৰাজহুৱা DSA কি" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "ৰাজহুৱা উপবৃত্তীয় বক্ৰ কি" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +#| msgid "%d bit" +#| msgid_plural "%d bits" +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u বিট" +msgstr[1] "%u বিট" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "শক্তি" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "ফিংগাৰপ্ৰিন্টসমূহ" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:502 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "বাতিল কৰক (_C)" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:505 +msgid "_OK" +msgstr "ঠিক আছে (_O)" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "স্বচালিতভাৱে নিৰ্বাচিত" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "ব্যৱহাৰকাৰীয়ে কাৰ্য্য বাতিল কৰিছে" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "ইমপৰ্ট কৰিবলে, অনুগ্ৰহ কৰি পাছৱৰ্ড সুমুৱাওক।" + +# +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:563 +msgid "Password:" +msgstr "পাছৱৰ্ড:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "টকেন:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "আনলক কৰক" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "লেবেল:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "ইমপৰ্ট সংহতিসমূহ" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:580 +msgid "Confirm:" +msgstr "নিশ্চিত কৰক:" + +#: ../ui/gcr-prompt-dialog.c:648 +msgid "Passwords do not match." +msgstr "পাছৱৰ্ডসমূহ মিল নাখায়।" + +#: ../ui/gcr-prompt-dialog.c:655 +msgid "Password cannot be blank" +msgstr "পাছৱৰ্ড ৰিক্ত হব নোৱাৰিব" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "অভিগম প্ৰমপ্ট" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "পাছৱৰ্ডসমূহ আৰু অন্য গোপন তথ্যসমূহলে অভিগম আনলক কৰক" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "এই নামৰ এটা ফাইল ইতিমধ্যে অস্তিত্ববান।" + +#: ../ui/gcr-certificate-exporter.c:226 +#| msgid "" +#| "A file already exists with this name.\n" +#| "\n" +#| "Do you want to replace it with a new file?" +msgid "Do you want to replace it with a new file?" +msgstr "আপুনি ইয়াক এটা নতুন ফাইলৰ সৈতে সলনি কৰিব বিচাৰে নে?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "প্ৰতিস্থাপন কৰক (_R)" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "কাৰ্য্য বাতিল কৰা হৈছিল।" + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "প্ৰমাণপত্ৰ এক্সপৰ্ট কৰক" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "সংৰক্ষণ কৰক (_S)" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "নথিপত্ৰসমূহ এক্সপৰ্ট কৰক" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM নথিপত্ৰসমূহ" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "যেতিয়ায় মই লগিন কৰো স্বচালিতভাৱে এই keyring আনলক কৰিব" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "মই লগ আউট কৰিলে এই keyring লক কৰিব" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "এই keyring লক কৰিব " + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "এই keyring লক কৰিব যদি অলস" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "মিনিটসমূহ" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "আনলক কৰক: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "পাছৱৰ্ড" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"'%s' -ৰ সমলসমূহ লক কৰা আছে। সমলসমূহ দৰ্শন কৰিবলে, সঠিক পাছৱৰ্ড সুমুৱাওক।" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "সমলসমূহ লক কৰা আছে। সমলসমূহ দৰ্শন কৰিবলে, সঠিক পাছৱৰ্ড সুমুৱাওক।" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR প্ৰমাণপত্ৰ আৰু কি দৰ্শক" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "এপ্লিকেচনৰ সংস্কৰণ দেখুৱাওক" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[file...]" + +#: ../ui/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "-প্ৰমাণপত্ৰ আৰু কি নথিপত্ৰসমূহ দৰ্শন কৰক" + +#: ../ui/gcr-viewer-tool.c:118 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "প্ৰমাণপত্ৰ দৰ্শক" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "পাছৱৰ্ড সঠিক নাছিল" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "ইমপৰ্ট কৰা হৈছে" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "ইমপৰ্ট ব্যৰ্থ হল" + +#: ../ui/gcr-viewer-window.c:107 +msgid "Import" +msgstr "ইমপৰ্ট কৰক" + +#: ../ui/gcr-viewer-window.c:116 +msgid "_Close" +msgstr "বন্ধ কৰক (_C)" + +#, fuzzy +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "চিহ্নিত নথিপত্ৰ আঁতৰুৱা নাযায়: %s" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "আনলক কৰক" diff --git a/po/ast.po b/po/ast.po new file mode 100644 index 0000000..f5ab802 --- /dev/null +++ b/po/ast.po @@ -0,0 +1,1063 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Asturian translation for gnome-keyring +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the gnome-keyring package. +# FIRST AUTHOR , 2008. +# Xandru Armesto , 2010. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2010-03-21 12:14+0200\n" +"Last-Translator: Xandru Armesto \n" +"Language-Team: Asturian Team alministradores@softastur.org\n" +"Language: ast\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Virtaal 0.5.2\n" +"X-Launchpad-Export-Date: 2009-02-09 14:52+0000\n" +"X-Poedit-Language: asturian\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Componente de dominiu" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ID del usuariu" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Data de nacencia" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Llugar de nacencia" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Xéneru" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "País de nacionalidá" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "País de residencia" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Nome común" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Apellíu" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "Númberu de serie" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Llocalidá" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Estáu" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Cai" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Organización" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Unidá d'organización" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Títulu" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Númberu de teléfonu" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Nome de pila" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Iniciales" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Calificador de Xeneración" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "Calificador del nome de dominiu" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Nomatu" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 con RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 con RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 con RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 con DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "Certificáu de sirvidor SSL" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "Certificáu de veceru SSL" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "La sesión ta zarrada" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "N_ome:" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Emitíu el" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "Caduca el" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Certificáu" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "La operación encaboxose" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Desbloquiar el certificáu" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Certificáu" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "Nome del emisor" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "Corréu electrónicu" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "Nome del asuntu" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Certificáu" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "Sí" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "Non" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Identificador" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "Identificador" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "Robla" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "Parámetros de la clave" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Certificáu" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "Nome del asuntu" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "Estensión" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "Identificador" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "Valor" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "Críticu" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Introduza la contraseña pa desbloquiar el certificáu" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "Identificador" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "Caduca el" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "Nome del asuntu" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "Nome del emisor" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "Certificáu emitíu" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "Versión" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "Nun ye válidu enantes de" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "Nun ye válidu dempués de" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Buelgues" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "Robla" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "Algoritmu de robla" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "Parámetros de la robla" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "Información de la clave pública" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "Algoritmu de la clave" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "Parámetros de la clave" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "Tamañu de la clave" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "Buelga SHA1" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Clave pública" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "_Detalles:" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Abrir l'aniellu de claves" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "La operación encaboxose" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "Robla" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Certificáu" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Certificáu" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "Fallu desconocíu" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "Caduca el" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Esa ye información sensible y nun puede revelase" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "La sesión ye inválida" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "El módulu nun s'anició" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "El depósity de claves yá se desbloquió." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "La contraseña o PIN caducó" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "La clave ye de tipu equivocáu" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "Algoritmu de la clave" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "Caduca el" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "N_ome:" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "Tamañu de la clave" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "Parámetros de la robla" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "Robla" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Desbloquiar el certificáu" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "Parámetros de la robla" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "Llocalidá" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "Buelgues" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Clave pública" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "Iniciales" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "Importar en:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Importar en:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Nun puede importase porque la clave ye de tipu equivocáu" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "Dengún allugamientu disponible nel que importar" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "Clave privada" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "Clave privada" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Clave privada" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "Clave pública" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "Cai" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "Buelgues" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "Datos non reconocíos o non sofitaos." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "Nun pudieron analizase datos inválidos o toyíos." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "Los datos tan bloquiaos" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "Desbloquiar esto automáticamente al aniciar sesión" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Desbloquiar" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "Pa poder importar «%s», hai de desbloquialu" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "Contraseña:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Escueyi un llugar p'atroxar los certificaos/claves importaos." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Desbloquiar esti depósitu de claves siempres qu'anicie sesión" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "Bloquiar dempués esti depósitu" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "Bloquiar esti depósitu si ta inactivu durante" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "Bloquiar esti depósitu al zarrar la sesión" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutos" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Desbloquiar" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Desbloquiar" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "Contraseña:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "Certificaos y almacenamientu de claves" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "¿Permitir a l'aplicación acceder a l'aniellu claves?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "Certificaos y almacenamientu de claves" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Certificáu" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "La contraseña de desbloquéu yera incorreuta" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Importar en:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Falló la operación" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "Importar en:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/az.po b/po/az.po new file mode 100644 index 0000000..dcae6a5 --- /dev/null +++ b/po/az.po @@ -0,0 +1,995 @@ +# translation of gnome-keyring.HEAD.az.po to Azerbaijani Turkish +# This file is distributed under the same license as the gnome-keyring package. +# Copyright (C) 2004 Mətin Əmirov. +# Mətin Əmirov , 2003, 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD.az\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2004-02-13 13:19+0200\n" +"Last-Translator: Mətin Əmirov \n" +"Language-Team: Azerbaijani Turkish \n" +"Language: az\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Şifrə Kisəsinin Qıfılını Aç" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "Şifrə Kisəsinin Qıfılını Aç" + +#: ../gcr/gcr-unlock-renderer.c:126 +msgid "Password" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Proqrama şifrə kisəsinə yetişmə səlahiyyəti verilsin?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/be.po b/po/be.po new file mode 100644 index 0000000..924c90d --- /dev/null +++ b/po/be.po @@ -0,0 +1,1126 @@ +# +# Ihar Hrachyshka , 2007, 2013. +# Yuri Matsuk , 2011. +# Yuras Shumovich , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-04-15 18:27+0000\n" +"PO-Revision-Date: 2017-09-01 18:52+0300\n" +"Last-Translator: Yuras Shumovich \n" +"Language-Team: Belarusian \n" +"Language: be\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.8.11\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Даменны складнік" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Ідэнтыфікатар карыстальніка" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Адрас электроннай пошты" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Дата нараджэння" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Месца нараджэння" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Пол" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Грамадзянства" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Краіна пражывання" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Агульнае імя" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Прозвішча" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Серыйны нумар" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Краіна" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Мясцовасць" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Штат" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Вуліца" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Установа" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Аддзел установы" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Званне" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Тэлефонны нумар" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Імя" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Ініцыялы" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Пазнака пакалення" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Пазнака DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Псеўданім" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 з RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 з RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 з RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 з DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Эліптычная крывая" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 з ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 з ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 з ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 з ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 з ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Серверная ідэнтыфікацыя" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Кліенцкая ідэнтыфікацыя" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Падпісванне коду" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Абарона для электроннай пошты" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Часавыя меткі" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Памылка загрузкі модуля PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Не ўдалося ініцыяваць модуль PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Не ўдалося ініцыяваць зарэгістраваны модуль PKCS#11: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI-адрас мае хібнае кадаванне." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI-адрас не мае схемы \"pkcs11\"." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI-адрас мае хібны сінтаксіс." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI-адрас мае хібны нумар версіі." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Струмень быў закрыты" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Назва" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Выдавец" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Тэрмін прыдатнасці" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Сертыфікат" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Іншая назва" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP-адрас" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Электронная пошта" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-адрас" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Назва каталога" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Імя EDI-удзельніка" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI-адрас" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-адрас" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Зарэгістраваны ідэнтыфікатар" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Невядомы тып ключа ў запыце сертыфіката" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Гэты ключ непрыдатны для падпісання гэтага запыту" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Вязка ключоў GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Вязка ключоў GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-ключ" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Ідэнтыфікатар ключа" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Працэс Gnupg скончыў працу, вярнуўшы код: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Працэс Gnupg быў знішчаны сігналам: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Аперацыя была скасавана" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Закрыты ключ" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Адкрыты ключ" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Запыт сертыфіката" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Даныя не апазнаныя ці не падтрымліваюцца." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Не ўдалося разабраць хібныя ці пашкоджаныя даныя." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Даныя заблакіраваныя" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Працягнуць" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Скасаваць" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Невядомыя ці недаступныя атрыбуты ключа" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Не ўдалося стварыць адкрыты ключ" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Ужо адкрыта іншая копія запыту доступу" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Не ўдалося знайсці месца для захавання прышпіленага сертыфіката" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Асноўныя абмежаванні" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Цэнтр сертыфікацыі" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Так" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Не" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Максімальная даўжыня маршруту" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Неабмежавана" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Пашыранае выкарыстанне ключа" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Дазволеныя мэты" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Ідэнтыфікатар ключа суб'екта" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Ідэнтыфікатар ключа" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Лічбавы подпіс" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Шыфраванне ключа" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Шыфраванне даных" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Ключавое пагадненне" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Подпіс сертыфіката" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Подпіс спіса адклікання" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Выкарыстанне ключа" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Спосабы выкарыстання" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Альтэрнатыўныя назвы суб'екта" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Пашырэнне" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Ідэнтыфікатар" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Значэнне" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Не ўдалося экспартаваць сертыфікат." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Ідэнтычнасць" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Выканаўца праверкі" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Тэрмін прыдатнасці" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Назва суб'екта" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Назва выдаўца" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Выдадзены сертыфікат" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Версія" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Не дзейны да" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Не дзейны пасля" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Адбіткі сертыфікатаў" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Звесткі аб адкрытым ключы" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Подпіс" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Экспартаваць сертыфікат..." + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Алгарытм ключа" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Параметры ключа" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Памер ключа" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1-адбітак ключа" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Алгарытм подпісу" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Параметры подпісу" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Крытычна" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Запыт сертыфіката" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Атрыбут" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Тып" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Выпрабаванне" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Падрабязнасці" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Не ўдалося паказаць \"%s\"" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Не ўдалося паказаць файл" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Прычына" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Не ўдалося паказаць файл такога тыпу." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Зашыфраваць" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Падпісаць" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Сертыфікаваць" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Ідэнтыфікаваць" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Выключана" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Невядома" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Хібны" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Выключаны" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Адкліканы" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Састарэлы" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Нявызначаны аб'ект даверу" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Не варты даверу" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Нязначна давераны" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Поўнасцю давераны" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Канчаткова давераны" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Інфармацыя ў гэтым ключы яшчэ не была праверана" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Гэта хібны ключ" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Гэты ключ быў выключаны" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Гэты ключ быў адкліканы" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Гэты ключ састарэў" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Гэты ключы не варты даверу" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Гэты ключ нязначна давераны" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Гэты ключ поўнасцю давераны" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Гэты ключ канчаткова давераны" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Ідэнтыфікатар ключа" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Алгарытм" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Дата стварэння" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Тэрмін прыдатнасці" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Здольнасці" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Давер да ўласніка" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Імя" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Каментарый" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Атрыбут карыстальніка" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Памер" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Подпіс двайковага дакумента" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Подпіс кананічнага тэкставага дакумента" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Асобны подпіс" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Звычайная сертыфікацыя ключа" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Персанальная сертыфікацыя ключа" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Неафіцыйная сертыфікацыя ключа" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Пазітыўная сертыфікацыя ключа" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Подпіс сувязі дадатковага ключа" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Подпіс сувязі галоўнага ключа" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Подпіс проста на ключы" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Подпіс для адклікання ключа" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Подпіс для адклікання дадатковага ключа" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Подпіс для адклікання сертыфіката" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Подпіс для часавага адбітка" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Подпіс для пацвярджэння іншай асобы" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Клас" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Толькі мясцовыя ключы" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "З магчымасцю экспартавання" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Ключ адклікання" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Адбітак" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Адкрыты дадатковы ключ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Закрыты ключ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Закрыты дадатковы ключ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Ініцыяцыя..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Выконваецца імпартаванне..." + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Імпартавана ў: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Імпартаваць у: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Не ўдалося імпартаваць, бо няма адпаведных імпартавальнікаў" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Няма даных для імпартавання" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Ключ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Закрыты RSA-ключ" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Закрыты DSA-ключ" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Закрыты ключ эліптычнай крывой" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Адкрыты DSA-ключ" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Адкрыты ключ эліптычнай крывой" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u біт" +msgstr[1] "%u біты" +msgstr[2] "%u бітаў" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Трываласць" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Адбіткі" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Скасаваць" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Добра" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Аўтаматычна абраны" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Карыстальнік скасаваў гэтую аперацыю" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Увядзіце пароль для імпартавання." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Пароль:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Токен:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Разблакіраваць" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Цэтлік:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Настройкі імпартавання" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Пацвярджэнне:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Паролі адрозніваюцца." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Пароль не можа быць пустым" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Запыт доступу" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Разблакіраванне доступу да пароляў і іншых сакрэтаў" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Файл з такой назвай ужо існуе." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Замяніць яго новым файлам?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Замяніць" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Аперацыя была скасавана." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Экспартаванне сертыфіката" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Захаваць" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Файлы сертыфікатаў" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-файлы" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Аўтаматычна разблакіраваць гэту вязку ключоў пры ўваходзе ў сістэму" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Блакіраваць гэту вязку ключоў пры выхадзе з сеанса" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Блакіраваць гэту вязку ключоў праз" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Блакіраваць гэту вязку ключоў пры бяздзейнасці цягам" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "хв." + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Разблакіраваць: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Пароль" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Змесціва \"%s\" заблакіравана. Каб разблакіраваць гэты аб'ект, трэба ўвесці " +"правільны пароль." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Змесціва заблакіравана. Каб паглядзець яго, трэба ўвесці правільны пароль." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Праглядальнік сертыфікатаў і ключоў GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Паказаць нумар версіі праграмы" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[файл...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Прагляд файлаў сертыфікатаў і ключоў" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Праглядальнік сертыфікатаў" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Хібны пароль" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Імпартавана" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Няўдалае імпартаванне" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Імпартаваць" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Закрыць" diff --git a/po/be@latin.po b/po/be@latin.po new file mode 100644 index 0000000..ee4b970 --- /dev/null +++ b/po/be@latin.po @@ -0,0 +1,1056 @@ +# Biełaruski pierakład gnome-keyring +# Copyright (C) 2007 FSF +# This file is distributed under the same license as the gnome-keyring package. +# Ihar Hrachyshka , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2009-02-27 12:12+0200\n" +"Last-Translator: Ihar Hrachyshka \n" +"Language-Team: Belarusian Latin \n" +"Language: be@latin\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Kampanent damenu" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ID karystalnika" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Dzień narodzinaŭ" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Miesca narodzinaŭ" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Poł" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Hramadzianstva" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Kraina žycharstva" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Ahulnaja nazva" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Proźvišča" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "Seryjny numar" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Kraina" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Rehijon" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Štat" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Vulica" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Arhanizacyja" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Departament" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Pasada" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Telefonny numar" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Imia" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Inicyjały" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Kvalifikatar hieneracyi" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "Kvalifikatar DN" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseŭdanim" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 z RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 z RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 z RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 z DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "Sertyfikat servera SSL" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "Sertyfikat klijenta SSL" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, fuzzy, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "Niemahčyma vydalić fajł: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Sesija skončanaja" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Padpisany" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "Dziejny da" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Sertyfikat" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Aperacyja anulavanaja" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Adblakuj sertyfikat" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Sertyfikat" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "Padpiščyk" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "Email" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "Nazva temy" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Sertyfikat" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "Tak" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "Nie" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Identyfikatar" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "Identyfikatar" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "Podpis" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "Parametry kluča" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Sertyfikat" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "Nazva temy" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "Pašyreńnie" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "Identyfikatar" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "Vartaść" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "Krytyčny" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Uviadzi parol, kab adblakavać sertyfikat" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "Identyfikatar" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "Dziejny da" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "Nazva temy" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "Padpiščyk" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "Padpisany sertyfikat" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "Versija" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "Nia dziejničaje pierad" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "Nia dziejničaje paśla" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Adbitki palcaŭ" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "Podpis" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "Alharytm padpisańnia" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "Parametry podpisu" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "Źviestki pra publičny kluč" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "Alharytm kluča" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "Parametry kluča" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "Pamier kluča" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "Adbitak SHA1" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Publičny kluč" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +#, fuzzy +msgid "Could not display file" +msgstr "Niemahčyma vydalić fajł: %s" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Razblakuj klučnika" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Aperacyja anulavanaja" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "Podpis" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Sertyfikat" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Sertyfikat" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "Nieviadomaja pamyłka" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "Dziejny da" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Infarmacyja vielmi važnaja, i jaje nielha raskryvać" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Sesija niapravilnaja" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "Modul nie zinicyjalizavany" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Klučnik užo razblakavany." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Parol ci PIN sastareli" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Kluč niapravilnaha typu" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "Alharytm kluča" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "_Stvary" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "Dziejny da" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "Pamier kluča" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "Parametry podpisu" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "Podpis" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Adblakuj sertyfikat" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "Parametry podpisu" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "Rehijon" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "Adbitki palcaŭ" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Publičny kluč" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "Inicyjały" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "Zimpartuj u:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Zimpartuj u:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Niemahčyma zimpartavać kluč, bo toj niapravilnaha typu" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "Niama miesca impartavańnia" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "Pryvatny kluč" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "Pryvatny kluč" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Pryvatny kluč" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "Publičny kluč" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "Vulica" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "Adbitki palcaŭ" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "Nieviadomyja albo nieabsłuhoŭvanyja źviestki." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "Nie ŭdałosia razabrać nieviadomyja albo paškodžanyja źviestki." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "Źviestki zablakavanyja" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "Aŭtamatyčna adblakuj heta pry ŭvachodzie." + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Razblakuj" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "Kab zimpartavać abjekt \"%s\", spačatku treba jaho adblakavać" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "Parol:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" +"Vybiery miesca, dzie treba zachavać zimpartavanyja sertyfikaty j klučy." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Aŭtamatyčna razblakuj hetaha klučnika pry ŭvachodzie." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "Aŭtamatyčna razblakuj hetaha klučnika pry ŭvachodzie." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Razblakuj" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Razblakuj" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "Parol:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Dazvolić dostup aplikacyi da klučnika?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Sertyfikat" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Parol ci PIN niapravilnyja" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Zimpartuj u:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Nie ŭdałosia vykanać aperacyju" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "Zimpartuj u:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..e3e8dfc --- /dev/null +++ b/po/bg.po @@ -0,0 +1,1077 @@ +# Bulgarian translation of gcr po-file. +# Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the gcr package. +# Rostislav "zbrox" Raykov , 2004, 2005, 2006. +# Alexander Shopov , 2007, 2008, 2009, 2011, 2012. +# Yavor Doganov , 2008, 2009. +# Damyan Ivanov , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-01-15 08:50+0200\n" +"PO-Revision-Date: 2013-01-15 08:50+0200\n" +"Last-Translator: Alexander Shopov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Домейн" + +#: ../egg/egg-oid.c:43 ../ui/gcr-gnupg-renderer.c:410 +#: ../ui/gcr-gnupg-renderer.c:579 +msgid "User ID" +msgstr "Идентификатор на потребител" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "Адрес на е-поща" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Дата на раждане" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Месторождение" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Пол" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Гражданство" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Държава на пребиваване" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Лично име" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Фамилия" + +#: ../egg/egg-oid.c:69 ../ui/gcr-certificate-renderer.c:558 +msgid "Serial Number" +msgstr "Сериен номер" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Държава" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Област" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Щат" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Улица" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Организация" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Подразделение" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Титла" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Телефонен номер" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Лично име" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Инициали" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Титла за поколение" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "Титла за показваното име" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Псевдоним" + +#: ../egg/egg-oid.c:98 ../ui/gcr-gnupg-renderer.c:201 +#: ../ui/gcr-key-renderer.c:430 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 с RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 с RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 с RSA" + +#: ../egg/egg-oid.c:103 ../ui/gcr-gnupg-renderer.c:205 +#: ../ui/gcr-key-renderer.c:432 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 с DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "Идентификация на сървър" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "Идентификация на клиент" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "Подписване на код" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "Защита на е-поща" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "Удостоверяване на време" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Грешка при зареждане на модула за PKCS#11: %s" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "Неправилен модул за PKCS#11: %s" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "Модулът за PKCS#11 не може да се настрои: %s" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Модулът за PKCS#11 не може да се стартира: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Регистрираните модули за PKCS#11 не могат да се стартират: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Адресът е кодиран неправилно." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "В адреса липсва схемата „pkcs11“." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Неправилен синтаксис на адреса." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Неправилен номер на версия на адреса." + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "Потокът бе заключен" + +#. later +#. later +#: ../gcr/gcr-certificate.c:308 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "Име" + +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Issued By" +msgstr "Издател" + +#. later +#: ../gcr/gcr-certificate.c:312 +msgctxt "column" +msgid "Expires" +msgstr "Срок" + +#: ../gcr/gcr-certificate.c:1133 ../gcr/gcr-parser.c:322 +#: ../ui/gcr-certificate-renderer.c:103 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "Друго име" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "Адрес за XMPP" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "Запис за услуга (SRV) в DNS" + +#: ../gcr/gcr-certificate-extensions.c:204 ../ui/gcr-gnupg-renderer.c:423 +#: ../ui/gcr-gnupg-renderer.c:705 +msgid "Email" +msgstr "Е-поща" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "Адрес по X400" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "Име на директория" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "Име на страна по EDI" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "Адрес" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "IP адрес" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "Регистриран идентификатор" + +#: ../gcr/gcr-certificate-request.c:418 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Неподдържан вид ключ за заявката за сертификат" + +#: ../gcr/gcr-certificate-request.c:505 ../gcr/gcr-certificate-request.c:590 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Ключът не може да се използва за подписване на заявката" + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "Ключодържател на GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Ключодържател на GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-parser.c:328 +#: ../ui/gcr-gnupg-renderer.c:89 +msgid "PGP Key" +msgstr "Ключ за PGP" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "Идентификатор" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Процесът на GnuPG завърши работа с код: %d" + +#: ../gcr/gcr-gnupg-process.c:874 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Процесът на GnuPG бе спрян със сигнал: %d" + +#: ../gcr/gcr-gnupg-process.c:928 ../gcr/gcr-parser.c:2424 +#: ../gcr/gcr-parser.c:2917 ../gcr/gcr-system-prompt.c:902 +msgid "The operation was cancelled" +msgstr "Отменено действие" + +#: ../gcr/gcr-parser.c:319 ../ui/gcr-key-renderer.c:408 +msgid "Private Key" +msgstr "Частен ключ" + +#: ../gcr/gcr-parser.c:325 ../ui/gcr-certificate-renderer.c:891 +#: ../ui/gcr-gnupg-renderer.c:738 ../ui/gcr-key-renderer.c:415 +msgid "Public Key" +msgstr "Публичен ключ" + +#: ../gcr/gcr-parser.c:331 +msgid "Certificate Request" +msgstr "Заявка за сертификат" + +#: ../gcr/gcr-parser.c:2427 +msgid "Unrecognized or unsupported data." +msgstr "Непознати или неподдържани данни." + +#: ../gcr/gcr-parser.c:2430 +msgid "Could not parse invalid or corrupted data." +msgstr "Неправилни или повредени данни не могат да бъдат анализирани" + +#: ../gcr/gcr-parser.c:2433 +msgid "The data is locked" +msgstr "Данните са заключени" + +#: ../gcr/gcr-prompt.c:227 +msgid "Continue" +msgstr "Нататък" + +#: ../gcr/gcr-prompt.c:236 +msgid "Cancel" +msgstr "Отмяна" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Непознати или недостъпни атрибути на ключа" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "Публичният ключ не може да бъде генериран" + +#: ../gcr/gcr-system-prompt.c:883 +msgid "Another prompt is already in progress" +msgstr "Вече е изведено друго съобщение за достъпа до паролите" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Не може да бъде открито място за съхранението на избрания сертификат" + +#: ../ui/gcr-certificate-renderer.c:118 +msgid "Basic Constraints" +msgstr "Основни ограничения" + +#: ../ui/gcr-certificate-renderer.c:120 +msgid "Certificate Authority" +msgstr "Удостоверител" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:962 +msgid "Yes" +msgstr "Да" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:962 +msgid "No" +msgstr "Не" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Max Path Length" +msgstr "Максимална дължина на веригата" + +#: ../ui/gcr-certificate-renderer.c:125 +msgid "Unlimited" +msgstr "Без ограничение" + +#: ../ui/gcr-certificate-renderer.c:144 +msgid "Extended Key Usage" +msgstr "Разширена употреба на ключа" + +#: ../ui/gcr-certificate-renderer.c:155 +msgid "Allowed Purposes" +msgstr "Позволени употреби" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Subject Key Identifier" +msgstr "Идентификатор на собственика на ключа" + +#: ../ui/gcr-certificate-renderer.c:176 +msgid "Key Identifier" +msgstr "Идентификатор на ключа" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Digital signature" +msgstr "Цифров подпис" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Key encipherment" +msgstr "Шифър на ключа" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Data encipherment" +msgstr "Шифър на данните" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Key agreement" +msgstr "Условия на ключа" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Certificate signature" +msgstr "Подпис на сертификат" + +#: ../ui/gcr-certificate-renderer.c:192 +msgid "Revocation list signature" +msgstr "Подпис на списъка за отмяна" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Key Usage" +msgstr "Употреба на ключа" + +#: ../ui/gcr-certificate-renderer.c:218 +msgid "Usages" +msgstr "Употреби" + +#: ../ui/gcr-certificate-renderer.c:238 +msgid "Subject Alternative Names" +msgstr "Алтернативни имена на притежателя" + +#: ../ui/gcr-certificate-renderer.c:265 +msgid "Extension" +msgstr "Разширение" + +#: ../ui/gcr-certificate-renderer.c:269 +msgid "Identifier" +msgstr "Идентификатор" + +#: ../ui/gcr-certificate-renderer.c:270 +#: ../ui/gcr-certificate-request-renderer.c:273 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-gnupg-renderer.c:431 +msgid "Value" +msgstr "Стойност" + +#: ../ui/gcr-certificate-renderer.c:295 +msgid "Couldn't export the certificate." +msgstr "Сертификатът не може да бъде изнесен." + +#: ../ui/gcr-certificate-renderer.c:520 +#: ../ui/gcr-certificate-request-renderer.c:314 +msgid "Identity" +msgstr "Идентичност" + +#: ../ui/gcr-certificate-renderer.c:524 +msgid "Verified by" +msgstr "Проверен от" + +#: ../ui/gcr-certificate-renderer.c:531 ../ui/gcr-gnupg-renderer.c:719 +msgid "Expires" +msgstr "Изтича на" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:538 +#: ../ui/gcr-certificate-request-renderer.c:320 +msgid "Subject Name" +msgstr "Име на получателя" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:543 +msgid "Issuer Name" +msgstr "Име на издателя" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:548 +msgid "Issued Certificate" +msgstr "Издаден сертификат" + +#: ../ui/gcr-certificate-renderer.c:553 +#: ../ui/gcr-certificate-request-renderer.c:331 +msgid "Version" +msgstr "Версия" + +#: ../ui/gcr-certificate-renderer.c:567 +msgid "Not Valid Before" +msgstr "Не е валиден преди" + +#: ../ui/gcr-certificate-renderer.c:572 +msgid "Not Valid After" +msgstr "Не е валиден след" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:577 +msgid "Certificate Fingerprints" +msgstr "Отпечатъци на сертификата" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:583 +#: ../ui/gcr-certificate-request-renderer.c:334 +#: ../ui/gcr-certificate-request-renderer.c:380 +msgid "Public Key Info" +msgstr "Информация за публичен ключ" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:598 ../ui/gcr-certificate-renderer.c:919 +#: ../ui/gcr-certificate-request-renderer.c:350 +#: ../ui/gcr-certificate-request-renderer.c:387 ../ui/gcr-gnupg-renderer.c:560 +msgid "Signature" +msgstr "Подпис" + +#: ../ui/gcr-certificate-renderer.c:865 +msgid "Key Algorithm" +msgstr "Алгоритъм на ключа" + +#: ../ui/gcr-certificate-renderer.c:870 +msgid "Key Parameters" +msgstr "Параметри на ключа" + +#: ../ui/gcr-certificate-renderer.c:878 ../ui/gcr-gnupg-renderer.c:353 +msgid "Key Size" +msgstr "Размер на ключа" + +#: ../ui/gcr-certificate-renderer.c:886 +msgid "Key SHA1 Fingerprint" +msgstr "Отпечатък на сертификата по SHA1" + +#: ../ui/gcr-certificate-renderer.c:908 +msgid "Signature Algorithm" +msgstr "Алгоритъм на подписа" + +#: ../ui/gcr-certificate-renderer.c:912 +msgid "Signature Parameters" +msgstr "Параметри на подписа" + +#: ../ui/gcr-certificate-renderer.c:961 +msgid "Critical" +msgstr "Критичен" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:96 +#: ../ui/gcr-certificate-request-renderer.c:309 +#: ../ui/gcr-certificate-request-renderer.c:324 +#: ../ui/gcr-certificate-request-renderer.c:367 +#: ../ui/gcr-certificate-request-renderer.c:372 +msgid "Certificate request" +msgstr "Заявка за сертификат" + +#: ../ui/gcr-certificate-request-renderer.c:262 +msgid "Attribute" +msgstr "Атрибут" + +#: ../ui/gcr-certificate-request-renderer.c:266 +#: ../ui/gcr-certificate-request-renderer.c:325 +#: ../ui/gcr-certificate-request-renderer.c:373 ../ui/gcr-gnupg-renderer.c:591 +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Type" +msgstr "Вид" + +#: ../ui/gcr-certificate-request-renderer.c:377 +msgid "Challenge" +msgstr "Предизвикателство" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Подробности" + +#: ../ui/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "„%s“ не може да се покаже" + +#: ../ui/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "Файлът не може да се покаже" + +#: ../ui/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "Причина" + +#: ../ui/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Този вид файл не може да се покаже." + +#: ../ui/gcr-gnupg-renderer.c:203 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Encrypt" +msgstr "Шифриране" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Sign" +msgstr "Подписване" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Certify" +msgstr "Удостоверяване" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgid "Authenticate" +msgstr "Идентифициране" + +#: ../ui/gcr-gnupg-renderer.c:224 ../ui/gcr-gnupg-renderer.c:259 +msgid "Disabled" +msgstr "Неактивен" + +#: ../ui/gcr-gnupg-renderer.c:255 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-key-renderer.c:434 ../ui/gcr-key-renderer.c:439 +msgid "Unknown" +msgstr "Непознат" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgid "Invalid" +msgstr "Невалиден" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Revoked" +msgstr "Отхвърлен" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Expired" +msgstr "С изтекъл срок" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Undefined trust" +msgstr "Не е определено доверие" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Distrusted" +msgstr "Без никакво доверие" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Marginally trusted" +msgstr "С малко доверие" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Fully trusted" +msgstr "С пълно доверие" + +#: ../ui/gcr-gnupg-renderer.c:273 +msgid "Ultimately trusted" +msgstr "С максимално доверие" + +#: ../ui/gcr-gnupg-renderer.c:287 +msgid "The information in this key has not yet been verified" +msgstr "Информацията в този ключ не е потвърдена" + +#: ../ui/gcr-gnupg-renderer.c:290 +msgid "This key is invalid" +msgstr "Ключът е невалиден" + +#: ../ui/gcr-gnupg-renderer.c:293 +msgid "This key has been disabled" +msgstr "Ключът е неактивен" + +#: ../ui/gcr-gnupg-renderer.c:296 +msgid "This key has been revoked" +msgstr "Ключът е отменен" + +#: ../ui/gcr-gnupg-renderer.c:299 +msgid "This key has expired" +msgstr "Ключът е с изтекъл срок" + +#: ../ui/gcr-gnupg-renderer.c:304 +msgid "This key is distrusted" +msgstr "Ключът е без никакво доверие" + +#: ../ui/gcr-gnupg-renderer.c:307 +msgid "This key is marginally trusted" +msgstr "Ключът е с малко доверие" + +#: ../ui/gcr-gnupg-renderer.c:310 +msgid "This key is fully trusted" +msgstr "Ключът е с пълно доверие" + +#: ../ui/gcr-gnupg-renderer.c:313 +msgid "This key is ultimately trusted" +msgstr "Ключът е с максимално доверие" + +#: ../ui/gcr-gnupg-renderer.c:338 ../ui/gcr-gnupg-renderer.c:564 +msgid "Key ID" +msgstr "Идентификатор" + +#: ../ui/gcr-gnupg-renderer.c:346 ../ui/gcr-gnupg-renderer.c:572 +#: ../ui/gcr-gnupg-renderer.c:619 ../ui/gcr-key-renderer.c:435 +msgid "Algorithm" +msgstr "Алгоритъм" + +#: ../ui/gcr-gnupg-renderer.c:361 ../ui/gcr-gnupg-renderer.c:438 +#: ../ui/gcr-gnupg-renderer.c:481 +msgid "Created" +msgstr "Създаден" + +#: ../ui/gcr-gnupg-renderer.c:370 ../ui/gcr-gnupg-renderer.c:447 +#: ../ui/gcr-gnupg-renderer.c:490 +msgid "Expiry" +msgstr "Изтича на" + +#: ../ui/gcr-gnupg-renderer.c:379 +msgid "Capabilities" +msgstr "Възможности" + +#: ../ui/gcr-gnupg-renderer.c:392 +msgid "Owner trust" +msgstr "Доверие към притежателя" + +#: ../ui/gcr-gnupg-renderer.c:420 +msgid "Name" +msgstr "Име" + +#: ../ui/gcr-gnupg-renderer.c:426 ../ui/gcr-gnupg-renderer.c:708 +msgid "Comment" +msgstr "Коментар" + +#: ../ui/gcr-gnupg-renderer.c:466 +msgid "User Attribute" +msgstr "Атрибут на потребителя" + +#: ../ui/gcr-gnupg-renderer.c:473 ../ui/gcr-key-renderer.c:442 +msgid "Size" +msgstr "Размер" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a binary document" +msgstr "Подпис на двоичен документ" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Signature of a canonical text document" +msgstr "Подпис на каноничен текстов документ" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Standalone signature" +msgstr "Самостоятелен подпис" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Generic certification of key" +msgstr "Неуказващо сертифициране на ключ (generic)" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Persona certification of key" +msgstr "Самостоятелно сертифициране на ключ (persona)" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Casual certification of key" +msgstr "Небрежно сертифициране на ключ (casual)" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Positive certification of key" +msgstr "Надеждно сертифициране на ключ (positive)" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Subkey binding signature" +msgstr "Подпис потвърждаващ притежание на подключ" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Primary key binding signature" +msgstr "Подпис потвърждаващ притежание на основен ключ" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Signature directly on key" +msgstr "Подпис директно в ключа" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Key revocation signature" +msgstr "Подпис за отмяна на ключа" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Subkey revocation signature" +msgstr "Подпис за отмяна на подключа" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Certification revocation signature" +msgstr "Подпис за отмяна на сертификат" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Timestamp signature" +msgstr "Подпис за време" + +#: ../ui/gcr-gnupg-renderer.c:536 +msgid "Third-party confirmation signature" +msgstr "Подпис за потвърждаване на трети лица" + +#: ../ui/gcr-gnupg-renderer.c:589 ../ui/gcr-gnupg-renderer.c:597 +msgid "Class" +msgstr "Клас" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Local only" +msgstr "Само локално" + +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Exportable" +msgstr "Може да се изнесе" + +#: ../ui/gcr-gnupg-renderer.c:611 +msgid "Revocation Key" +msgstr "Ключ за отмяна" + +#: ../ui/gcr-gnupg-renderer.c:625 ../ui/gcr-gnupg-renderer.c:649 +#: ../ui/gcr-gnupg-renderer.c:651 +msgid "Fingerprint" +msgstr "Отпечатък" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Public Subkey" +msgstr "Публичен подключ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Key" +msgstr "Таен ключ" + +#: ../ui/gcr-gnupg-renderer.c:744 +msgid "Secret Subkey" +msgstr "Таен подключ" + +#: ../ui/gcr-import-button.c:112 +msgid "Initializing..." +msgstr "Инициализиране…" + +#: ../ui/gcr-import-button.c:120 +msgid "Import is in progress..." +msgstr "В момента тече внасяне…" + +#: ../ui/gcr-import-button.c:127 +#, c-format +msgid "Imported to: %s" +msgstr "Внесен в: %s" + +#: ../ui/gcr-import-button.c:147 +#, c-format +msgid "Import to: %s" +msgstr "Внасяне в: %s" + +#: ../ui/gcr-import-button.c:160 +msgid "Cannot import because there are no compatible importers" +msgstr "Не може да бъде внесен, защото няма съвместими модули" + +#: ../ui/gcr-import-button.c:169 +msgid "No data to import" +msgstr "Няма какво да се внася" + +#: ../ui/gcr-key-renderer.c:90 +msgid "Key" +msgstr "Ключ" + +#: ../ui/gcr-key-renderer.c:404 +msgid "Private RSA Key" +msgstr "Частен ключ за RSA" + +#: ../ui/gcr-key-renderer.c:406 +msgid "Private DSA Key" +msgstr "Частен ключ за DSA" + +#: ../ui/gcr-key-renderer.c:411 ../ui/gcr-key-renderer.c:413 +msgid "Public DSA Key" +msgstr "Публичен ключ за DSA" + +#: ../ui/gcr-key-renderer.c:422 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d бит" +msgstr[1] "%d бита" + +#: ../ui/gcr-key-renderer.c:423 +msgid "Strength" +msgstr "Надеждност" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:446 +msgid "Fingerprints" +msgstr "Отпечатъци" + +#: ../ui/gcr-key-renderer.c:450 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:455 +msgid "SHA256" +msgstr "SHA256" + +#: ../ui/gcr-pkcs11-import-dialog.c:188 +msgid "Automatically chosen" +msgstr "Автоматичен избор" + +#: ../ui/gcr-pkcs11-import-dialog.c:272 +#: ../ui/gcr-pkcs11-import-interaction.c:154 +#: ../ui/gcr-pkcs11-import-interaction.c:172 +#, c-format +msgid "The user cancelled the operation" +msgstr "Потребителят отмени действието" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "За внасяне въведете паролата." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:564 +msgid "Password:" +msgstr "Парола:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Жетон:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:72 +#: ../ui/gcr-unlock-renderer.c:127 +msgid "Unlock" +msgstr "Отключване" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Етикет:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Настройки на внасянето" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:581 +msgid "Confirm:" +msgstr "Потвърждаване:" + +#: ../ui/gcr-prompt-dialog.c:649 +msgid "Passwords do not match." +msgstr "Паролите не съвпадат." + +#: ../ui/gcr-prompt-dialog.c:656 +msgid "Password cannot be blank" +msgstr "Паролата не може да е празна" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Съобщение при достъп" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Отключване на достъпа до паролите и други тайни" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" +"Вече съществува файл с такова име.\n" +"\n" +"Искате ли да го замените с нов файл?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Замяна" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Отменено действие." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Изнасяне на сертификат" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Файлове на сертификата" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Файлове на PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Автоматично отключване на ключодържателя при влизане." + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Автоматично заключване на ключодържателя при излизане" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Заключване на ключодържателя след" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Заключване на ключодържателя при бездействане след" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "минути" + +#: ../ui/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "Отключване: %s" + +#: ../ui/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "Парола" + +#: ../ui/gcr-unlock-renderer.c:277 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Съдържанието на „%s“ е заключено. За да го видите, въведете правилната " +"парола." + +#: ../ui/gcr-unlock-renderer.c:280 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Съдържанието е заключено. За да го видите, въведете правилната парола." + +#: ../ui/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "Разглеждане на ключове и сертификати по GCR" + +#: ../ui/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "Извеждане на версията на програмата" + +#: ../ui/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[файл…]" + +#: ../ui/gcr-viewer-tool.c:105 +msgid "- View certificate and key files" +msgstr "– разглеждане на ключове и сертификати" + +#: ../ui/gcr-viewer-tool.c:119 ../ui/gcr-viewer-widget.c:638 +msgid "Certificate Viewer" +msgstr "Разглеждане на сертификати" + +#: ../ui/gcr-viewer-widget.c:204 +msgid "The password was incorrect" +msgstr "Паролата е грешна" + +#: ../ui/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "Внесен" + +#: ../ui/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "Неуспешно внасяне" + +#: ../ui/gcr-viewer-window.c:108 +msgid "Import" +msgstr "Внасяне" diff --git a/po/bn.po b/po/bn.po new file mode 100644 index 0000000..3d12b96 --- /dev/null +++ b/po/bn.po @@ -0,0 +1,1056 @@ +# Bengali translation for gnome-keyring +# This file is distributed under the same license as the gnome-keyring package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Runa Bhattacharjee , 2004. +# Runa Bhattacharjee , 2007. +# Runa Bhattacharjee , 2008, 2009. +# Maruf Ovee , 2009. +# Loba Yeasmeen , 2010. +# Israt Jahan , 2010. +# Zenat Rahnuma , 2011. +msgid "" +msgstr "" +"Project-Id-Version: bn\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2011-03-30 14:35+0600\n" +"Last-Translator: Zenat Rahnuma \n" +"Language-Team: Bengali \n" +"Language: bn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.11.4\n" +"X-Language: bn_BD\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "ডোমেইনের অংশবিশেষ" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ব্যবহারকারীর ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "ইমেইল ঠিকানা" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "জন্মদিন" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "জন্মস্থান" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "লিঙ্গ" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "নাগরিকত্ব" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "বসবাসের দেশ" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "নাম" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "পদবি" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "ক্রমিক সংখ্যা" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "দেশ" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "অঞ্চল" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "প্রদেশ" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "রাস্তা" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "প্রতিষ্ঠান" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "প্রাতিষ্ঠানিক বিভাগ" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "পদ" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "টেলিফোন নম্বর" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "প্রদত্ত নাম" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "অদ্যাক্ষর" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "উৎপাদনের যোগ্যতা নির্বাচনকারী" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN যোগ্যতা নির্বাচনকারী" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "ছদ্মনাম" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA সহ MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA সহ MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA সহ SHA1" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA সহ SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "SSL সার্ভার সার্টিফিকেট" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "SSL ক্লায়েন্ট সার্টিফিকেট" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "সেশন বন্ধ হয়ে গিয়েছে" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "নাম: (_N)" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "প্রদানের তারিখ" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "মেয়াদউত্তীর্ণ" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "অপারেশন বাতিল করা হয়েছে" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "সার্টিফিকেট আনলক " + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "নির্মাণকারী নাম" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "ইমেইল" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +#, fuzzy +msgid "X400 Address" +msgstr "ইমেইল ঠিকানা" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "প্রসঙ্গের নাম" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +#, fuzzy +msgid "IP Address" +msgstr "ইমেইল ঠিকানা" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "হ্যাঁ" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "না" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "সনাক্তকারী" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "সনাক্তকারী" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "কী-এর প্যারামিটার" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "প্রসঙ্গের নাম" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "প্রসারণ" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "সনাক্তকারী" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "মান" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "গুরুতর" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "পিনযুক্ত সার্টিফিকেট সংরক্ষণের জন্য কোন স্থান পাওয়া যাচ্ছেনা" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "পরিচয়" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "এর দ্বারা যাচাইকৃত" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "মেয়াদউত্তীর্ণ" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "প্রসঙ্গের নাম" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "নির্মাণকারী নাম" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "প্রদান করা সার্টিফিকেট" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "সংস্করণ" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "চিহ্নিত সময়ের পূর্বে কার্যকর হবেনা" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "চিহ্নিত সময়ের পরে কার্যকর হবেনা" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "আঙ্গুলের ছাপ" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "স্বাক্ষরের অ্যালগরিদম" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "স্বাক্ষরের প্যারামিটার" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "পাবলিক কী সংক্রান্ত তথ্য" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "কী-এর অ্যালগরিদম" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "কী-এর প্যারামিটার" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "কী-এর আকার" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 ফিংগারপ্রিন্ট" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "পাবলিক কী" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "বিস্তারিত: (_D)" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "কী-রিং আনলক" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "PGP কী: %s" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +#, fuzzy +msgid "PGP Key" +msgstr "PGP কী: %s" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "অপারেশন বাতিল করা হয়েছে" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "অজানা" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "মেয়াদউত্তীর্ণ" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "তথ্যটি সংবেদনশীল ও প্রকাশ করা সম্ভব নয়" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "এই সেশনটি অকার্যকর" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "মডিউল আরম্ভ করা হয়নি" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "কী মোড়ানো সম্ভব নয়" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "পাসওয়ার্ড অথবা PIN-এর মেয়াদ উত্তীর্ণ" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "কী-এর ধরন ভুল" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "অ্যালগরিদম" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "মেয়াদউত্তীর্ণ" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "নাম: (_N)" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "আকার" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "স্বাক্ষরের প্যারামিটার" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "সার্টিফিকেট আনলক " + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "স্বাক্ষরের প্যারামিটার" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "অঞ্চল" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "আঙ্গুলের ছাপ" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "পাবলিক কী" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "অদ্যাক্ষর" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "কী ভুল ধরনের হওয়ায় ইম্পোর্ট করা যাবে না" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "ইম্পোর্ট করার উদ্দেশ্যে কোনো স্থান চিহ্নিত হয়নি" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "কী" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "একান্ত RSA কী" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "একান্ত DSA কী" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "একান্ত কী" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "পাবলিক DSA কী" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d বিট" +msgstr[1] "%d বিট" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "প্রতিরোধশক্তি" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "আঙ্গুলের ছাপ" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "অপরিচিত অথবা অসমর্থিত ডাটা।" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "অকার্যকর অথবা ক্ষতিগ্রস্ত ডাটা পার্স করতে ব্যর্থ।" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "ডাটা লক করা রয়েছে" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "আনলক" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s' ইম্পোর্ট করতে হলে তা আন-লক করা আবশ্যক" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "পাসওয়ার্ড:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "পিনযুক্ত সার্টিফিকেট সংরক্ষণের জন্য কোন স্থান পাওয়া যাচ্ছেনা" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "লগ-ইন করার সময় স্বয়ংক্রিয়ভাবে এই কী-রিং আন-লক করা হবে" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "পরবর্তীতে এই কীরিং লক করা হবে" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "নিষ্ক্রিয়তার জন্য এই কীরিংটি লক করা হবে" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "লগআউট করার সময় স্বয়ংক্রিয়ভাবে এই কী-রিং লক করা হবে" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "মিনিট" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "আনলক" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "আনলক" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "পাসওয়ার্ড:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "সার্টিফিকেট এবং কী স্টোরেজ" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "সার্টিফিকেট এবং কী স্টোরেজ" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "আনলক করার পাসওয়ার্ড সঠিক নয়" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "অপারেশন ব্যর্থ" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট:" + +#: ../gck/gck-uri.c:223 +#, fuzzy, c-format +msgid "The URI has invalid encoding." +msgstr "URI এর সিনট্যাক্স অকার্যকর। '%s' ক্ষেত্রের এনকোডিং অকার্যকর।" + +#: ../gck/gck-uri.c:227 +#, fuzzy +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI এর 'pkcs11' স্কীম নেই।" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/bn_IN.po b/po/bn_IN.po new file mode 100644 index 0000000..1a4027e --- /dev/null +++ b/po/bn_IN.po @@ -0,0 +1,1060 @@ +# translation of bn_IN.po to Bengali INDIA +# This file is distributed under the same license as the gnome-keyring package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# Runa Bhattacharjee , 2004. +# Runa Bhattacharjee , 2007. +# Runa Bhattacharjee , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: bn_IN\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2009-08-28 12:33+0530\n" +"Last-Translator: Runa Bhattacharjee \n" +"Language-Team: Bengali INDIA \n" +"Language: bn_IN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "ডোমেইনের অংশবিশেষ" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ব্যবহারকারীর ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "জন্মদিন" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "জন্মস্থান" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "স্ত্রী/পুরুষ" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "নাগরিকত্ব" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "বসবাসের দেশ" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "নাম" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "পদবি" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "ক্রমিক সংখ্যা" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "দেশ" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "অঞ্চল" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "প্রদেশ" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "রাস্তা" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "প্রতিষ্ঠান" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "প্রাতিষ্ঠানিক বিভাগ" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "পদ" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "দূরভাষ" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "প্রদত্ত নাম" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "অদ্যাক্ষর" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "জেনারেশন কোয়ালিফায়ার" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN কোয়ালিফায়ার" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "ছদ্মনাম" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA সহ MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA সহ MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA সহ SHA1" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA সহ SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "SSL সার্ভার সার্টিফিকেট" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "SSL ক্লায়েন্ট সার্টিফিকেট" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, fuzzy, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "চিহ্নিত ফাইল মুছে ফেলা যায়নি: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "সেশান বন্ধ হয়ে গেছে" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "জারির তারিখ" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "মেয়াদপূর্তী" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "কর্ম বাতিল করা হয়েছে" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "সার্টিফিকেট আন-লক করুন" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "নির্মাণকারী নাম" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "ই-মেইল" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "প্রসঙ্গের নাম" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "হ্যাঁ" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "না" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "সনাক্তকারী" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "সনাক্তকারী" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "কি-র পরামিতি" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "প্রসঙ্গের নাম" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "প্রসারণ" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "সনাক্তকারী" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "মান" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "গুরুতর" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "সার্টিফিকেট আন-লক করার জন্য পাসওয়ার্ড লিখুন" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "সনাক্তকারী" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "মেয়াদপূর্তী" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "প্রসঙ্গের নাম" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "নির্মাণকারী নাম" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "জারি করা সার্টিফিকেট" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "সংস্করণ" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "চিহ্নিত সময়ের পূর্বে বৈধ নয়" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "চিহ্নিত সময়ের পরে বৈধ নয়" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "ফিংগারপ্রিন্ট" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "স্বাক্ষরের অ্যালগোরিদম" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "স্বাক্ষরের পরামিতি" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "সার্বজনীন কি সংক্রান্ত তথ্য" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "কি-র অ্যালগোরিদম" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "কি-র পরামিতি" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "কি-র মাপ" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 ফিংগারপ্রিন্ট" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "সার্বজনীন কি" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +#, fuzzy +msgid "Could not display file" +msgstr "চিহ্নিত ফাইল মুছে ফেলা যায়নি: %s" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "কি-রিং আনলক করুন" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "কর্ম বাতিল করা হয়েছে" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "অজানা ত্রুটি" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "মেয়াদপূর্তী" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "তথ্যটি সংবেদনশীল ও প্রকাশ করা সম্ভব নয়" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "এই সেশানটি বৈধ নয়" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "মডিউল আরম্ভ করা হয়নি" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "কি-রিং পূর্বে আন-লক করা হয়েছে।" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "পাসওয়ার্ড অথবা PIN-র মেয়াদ পূর্ণ হয়েছে" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "কি-র ধরন সঠিক নয়" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "কি-র অ্যালগোরিদম" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "নির্মাণ করুন (_r)" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "মেয়াদপূর্তী" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "কি-র মাপ" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "স্বাক্ষরের পরামিতি" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "স্বাক্ষর" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "সার্টিফিকেট আন-লক করুন" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "স্বাক্ষরের পরামিতি" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "অঞ্চল" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "ফিংগারপ্রিন্ট" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "সার্বজনীন কি" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "অদ্যাক্ষর" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট করুন:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট করুন:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "ভুল ধরনের হওয়ার ফলে কি ইম্পোর্ট করা যাবে না" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "ইম্পোর্ট করার উদ্দেশ্যে কোনো স্থান চিহ্নিত হয়নি" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "গোপনীয় কি" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "গোপনীয় কি" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "গোপনীয় কি" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "সার্বজনীন কি" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "রাস্তা" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "ফিংগারপ্রিন্ট" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "অপরিচিত অথবা অসমর্থিত তথ্য।" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "অবৈধ অথবা ক্ষতিগ্রস্ত তথ্য পার্স করতে ব্যর্থ।" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "তথ্য লক করা রয়েছে" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "লগ-ইন করার সময় স্বয়ংক্রিয়রূপে এটি আন-লক করা হবে।" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "আন-লক করুন" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s' ইম্পোর্ট করতে হলে তা আন-লক করা আবশ্যক" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "পাসওয়ার্ড:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "ইম্পোর্ট করা সার্টিফিকেট/কি সংরক্ষণের জন্য একটি স্থান নির্বাচন করুন।" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "লগ-ইন করার সময় স্বয়ংক্রিয়রূপে এই কি-রিং আন-লক করা হবে।" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "লগ-ইন করার সময় স্বয়ংক্রিয়রূপে এই কি-রিং আন-লক করা হবে।" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "আন-লক করুন" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "আন-লক করুন" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "পাসওয়ার্ড:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "অ্যাপ্লিকেশনকে কি-রিং ব্যবহারের অনুমতি প্রদান করা হবে কি?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "সার্টিফিকেট" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "পাসওয়ার্ড অথবা PIN সঠিক নয়" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট করুন:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "কর্ম ব্যর্থ" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "চিহ্নিত স্থানে ইম্পোর্ট করুন:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/bs.po b/po/bs.po new file mode 100644 index 0000000..31b1b40 --- /dev/null +++ b/po/bs.po @@ -0,0 +1,1125 @@ +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD.bs\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2015-02-27 05:48+0000\n" +"PO-Revision-Date: 2015-02-04 16:10+0000\n" +"Last-Translator: Samir Ribić \n" +"Language-Team: Bosnian \n" +"Language: bs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Launchpad-Export-Date: 2015-02-05 07:02+0000\n" +"X-Generator: Launchpad (build 17331)\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Komponenta domena" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Korisnički id." + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-mail adresa" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Datum rođenja" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Mjesto rođenja" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Spol" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Državljanstvo" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Država prebivališta" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Uobičajeno ime" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Prezime" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serijski broj" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Država" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Lokalitet" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Država/Entitet" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Ulica" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizacija" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organizaciona jedinica" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Naslov" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Broj telefona" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Dato ime" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inicijali" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Oznaka generacije" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN oznaka" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 sa RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 sa RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 sa RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 sa DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elipticna kriva" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 sa ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 sa ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 sa ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 sa ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 saECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autentifikacija servera" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Provjera autentičnosti na klijentu" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Potpisivanje koda" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Zaštita e-pošte" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Označavanje vremena" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Greška učitavanja PKCS#11 modula: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Ne mogu inicijalizirati PKCS#11 modul: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Ne mogu inicijalizirati registrovane PKCS#11 module: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI ima pogrešno kodiranje." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI nema 'pkcs11' šemu." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI ima lošu sintaksu." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI ima loš broj verzije." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Tok je zatvoren" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Ime" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Izdato od" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Ističe" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certifikat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Drugo ime" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP adresa" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-pošta" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 Adresa" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Ime direktorija" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Ime EDI strane" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP Adresa" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrovani ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nepodržana vrsta ključa za zahtjev certifikata" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Ključ ne može biti iskorišten da potpiše zahtjev" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG privjesak" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG privjesak: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP ključ" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID ključa" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg proces izašao s kodom: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg proces je prekinut sa signalom: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Radnja je poništena" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privatni ključ" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Javni ključ" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Zahtjev za potvrdu" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Neprepoznati ili nepodržani podaci." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Ne mogu da obradim neispravne ili oštećene podatke." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Podaci su zaključani" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Nastavi" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Otkaži" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Nepoznati ili nedostupni atributi ključa" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "Nemoguće napraviti javni ključ" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Drugi prompt je već u tijeku ..." + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" +"Ne mogu da pronađem mjesto da uskladištim certifikat koji je izuzetak sa,mo " +"za komunikaciju s navedenim partnerom" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Osnovna ograničenja" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Certifikacijski autoritet" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Da" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ne" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maksimalna dužina staze" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Neograničeno" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Prošireno korišćenje ključa" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Dopuštene namjene" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identifikator ključa teme" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identifikator ključa" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitalni potpis" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Šifrovanje ključa" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Šifrovanje podataka" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Slaganje ključeva" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Certifikacijski potpis" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Potpis liste povlačenja" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Upotreba ključeva" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Upotrebe" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternativna imena teme" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Proširenje" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikator" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Vrijednost" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "Ne mogu izvesti certifikat." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitet" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Provjerio" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Ističe" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Ime predmeta" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Ime izdavaoca" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Izdati sertifikat" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Verzija" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Ne važi prije" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Ne važi poslije" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Otisci prsta certifikata" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Podaci o javnom ključu" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Potpis" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Izvezi certifikat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritam ključa" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametri ključa" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Veličina ključa" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Otisci prsta SHA1 ključa" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritam potpisa" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametri potpisa" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritična" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Zahtjev za certifikat" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tip" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Izazov" + +#: ../ui/gcr-display-view.c:316 +msgid "_Details" +msgstr "_Detalji" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "Ne mogu prikazati '%s'" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Ne mogu prikazati datoteku" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Razlog" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Ne mogu prikazati datoteku ovog tipa." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Šifruj" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Potpiši" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Provjeri" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autenticiraj" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Onemogućeno" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Nepoznato" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Neispravan" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Onemogućeno" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Opozvan" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Istekao" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Nedefinisano povjerenje" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nepovjerljiv" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Od slabog povjerenja" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Potpuno od povjerenja" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Bezuslovno od povjerenja" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informacija u ovom kluču još uvijek nije verificirana" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Ključ je neispravan." + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Ovaj ključ je onemogućen" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Ovaj ključ je ukinut" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Ovaj ključ je istekao" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Ovaj ključ je nepouzdan" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Ovaj ključ je slabo pouzdan" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Ovaj ključ je potpuno pouzdan" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Ovaj ključ je izuzetno pouzdan" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID ključa" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritam" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Kreirano" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Ističe" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Mogućnosti" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Povjerenje vlasnika" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Naziv" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Komentar" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Osobina korisnika" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Veličina" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Potpis binarnog dokumenta" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Potpis kanonskog teksutalnog dokumenta" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Samostalni potpis" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Generička potvrda ključa" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Lična potvrda ključa" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Neformalna potvrda ključa" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Pozitivna potvrda ključa" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Potključ vezuje potpis" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Glavni ključ vezuje potpis" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Potpis direktno na ključu" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Potpis opoziva ključa" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Potpis opoziva podključa" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Potvrda opoziva potpisa" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Timestamp potpis" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Potpis potvrde treće stranke" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasa" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Samo lokalni" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Izvozni" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Opozivajući ključ" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Otisak" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Javni potključ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Tajni ključ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Tajni podključ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicijalizira.." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Uvoz je u toku…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Uvezeno u : %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Uvezi u : %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Ne može uvoziti jer nema odgovarajuih uvoznika" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nema podataka za uvoz" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Ključ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privatni RSA ključ" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privatni DSA ključ" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Šifra za privatnu eliptičnu krivu" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Javni DSA ključ" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Javna šifra za eliptičnu krivu" + +# translations. +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bita" +msgstr[2] "%u bitova" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Snaga" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Otisci" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "Otkaži" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_U redu" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatski odabrano" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Korisnik je prekinuo operaciju" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Da biste uvezli, molim vas unesite šifru." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Lozinka:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Otključaj" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Oznaka:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Uvezi postavke" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Potvrdi:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Lozinke se ne podudaraju." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Lozinka ne može biti prazna" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Zatražiti pristup" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Otključaj pristup lozinkama i drugim tajnama" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Već postoji datoteka s ovim imenom." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Želite li je zamijeniti novim imenom datoteke?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Zamijeni" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operacija je otkazana." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Izvezi certifikat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Sačuvaj" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Certifikacijske datoteke" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM datoteke" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Sam otključaj ovaj privezak kada se prijavim." + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Zaključaj ovaj privezak kada se odjavim" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Nakon ovoga zaključaj trenutni privezak" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Zaključaj ovaj privezak ako je neaktivan" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minute" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Otključaj: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Lozinka" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Sadržaj od '%s' je zaključan. Da bi ste vidjeli sadržaj, ukucajte pravilnu " +"lozinku." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Sadržaji su zaključani. Da bi ste vidjeli sadržaj, ukucajte pravilnu lozinku." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR certifikat i preglednik ključeva" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Prikaži verziju programa" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[datoteka...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Vidi certifikate i datoteke ključeva" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Preglednik certifikata" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Lozinka nije ispravna" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Uvezeno" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Neuspješan uvoz" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Uvezi" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Zatvori" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..1f9b07c --- /dev/null +++ b/po/ca.po @@ -0,0 +1,1129 @@ +# Catalan translation of gnome-keyring. +# Copyright © 2004-2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Jordi Mallach , 2004, 2006. +# Joan Duran , 2008-2013. +# Gil Forcada , 2014. +# Jordi Serratosa , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-08-23 06:46+0000\n" +"PO-Revision-Date: 2017-08-22 14:56+0200\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 1.8.11\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Component del domini" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Identificador d'usuari" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Adreça electrònica" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data de naixement" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Lloc de naixement" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Gènere" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "País de ciutadania" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "País de residència" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nom comú" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Cognom" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Número de sèrie" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localitat" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Estat" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Carrer" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organització" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unitat organitzativa" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Títol" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Número de telèfon" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nom de pila" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inicials" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Qualificador de la generació" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Qualificador del nom de domini" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudònim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 amb RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 amb RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 amb RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 amb DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Corba el·líptica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 amb ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 amb ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 amb ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 amb ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 amb ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Servidor d'autenticació" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Client d'autenticació" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Firma del codi" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Protecció del correu electrònic" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Marcat horari" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "S'ha produït un error en carregar el mòdul PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "No s'ha pogut inicialitzar el mòdul PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "No s'han pogut inicialitzar els mòduls PKCS#11 registrats: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "La codificació de l'URI no és vàlida." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "L'URI no té l'esquema «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "La sintaxi de l'URI no és correcta." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "El número de versió de l'URI no és correcte." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "El flux està tancat" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nom" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emès per" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Venç" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Un altre nom" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Adreça XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "Servidor DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Correu electrònic" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Adreça X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nom del directori" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nom del grup EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Adreça IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Identificador registrat" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipus de clau no admès per la sol·licitud de certificat" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "No es pot utilitzar la clau per signar la sol·licitud" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Anell de claus GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Anell de claus GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Clau PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID de la clau" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "El procés GnuPG ha sortit amb el codi: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "S'ha finalitzat el procés GnuPG amb el senyal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "S'ha cancel·lat l'operació" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Clau privada" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Clau pública" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Sol·licitud de certificat" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Dades no reconegudes o no compatibles." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "No s'han pogut analitzar les dades. No són vàlides o estan malmeses." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Les dades estan blocades" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continua" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Cancel·la" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atributs de la clau no reconeguts o no disponibles" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "No s'ha pogut construir la clau pública" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Ja hi ha una altra petició en curs" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" +"No s'ha pogut trobar una ubicació on emmagatzemar el certificat importat" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Restriccions bàsiques" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoritat de certificació" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Sí" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "No" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Longitud màxima del camí" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Sense límit" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utilització ampliada de la clau" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Propòsits permesos" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificador de l'assumpte de la clau" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificador de la clau" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Signatura digital" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Xifrat de clau" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Xifrat de dades" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acord sobre la clau" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Signatura del certificat" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Firma de la llista de revocació" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Utilització de la clau" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Utilitzacions" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Noms alternatius de l'assumpte" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extensió" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificador" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valor" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "No s'ha pogut exportar el certificat." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitat" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificat per" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Venç" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nom de l'assumpte" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nom de l'emissor" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificat emès" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versió" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "No és vàlid abans de" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "No és vàlid després de" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Empremtes del certificat" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informació de la clau pública" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signatura" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exporta el certificat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Clau de l'algorisme" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Paràmetres de la clau" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Mida de la clau" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Empremta de la clau SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algorisme de la signatura" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Paràmetres de la signatura" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Crític" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Sol·licitud de certificat" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipus" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Desafiament" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detalls" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "No s'ha pogut mostrar «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "No s'ha pogut mostrar el fitxer" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Raó" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "No es pot mostrar un fitxer d'aquest tipus." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Encripta" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Signa" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certifica" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentica" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Inhabilitat" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Desconegut" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "No vàlid" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Inhabilitat" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "S'ha revocat" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Ha vençut" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Confiança no definida" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "No s'hi confia" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Confiança marginal" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Confiança total" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Confiança última" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Encara no s'ha verificat la informació d'aquesta clau" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Aquesta clau no és vàlida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "S'ha inhabilitat aquesta clau" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "S'ha revocat aquesta clau" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Aquesta clau ha vençut" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "No es confia en aquesta clau" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Aquesta clau és de confiança marginal" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Aquesta clau és de confiança total" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Aquesta clau és de confiança última" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID de la clau" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algorisme" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "S'ha creat" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Venç" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Capacitats" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Propietari de la confiança" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nom" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comentari" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atribut de l'usuari" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Mida" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signatura d'un document binari" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signatura d'un document de text canònic" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Signatura independent" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificació genèrica de la clau" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificació personal de la clau" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificació casual de la clau" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificació positiva de la clau" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Firma de vinculació de la subclau" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Firma de vinculació de la clau primària" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Firma directament a la clau" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Firma de la clau de revocació" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Firma de la subclau de revocació" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Signatura del certificat de revocació" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Marca horària de la signatura" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Firma de confirmació de tercers" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classe" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Només local" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportable" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Clau de revocació" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Empremta" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Subclau pública" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Clau secreta" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Subclau secreta" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "S'està iniciant…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importació en curs…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "S'ha importat a: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importa a: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "No es pot importar perquè no hi ha importadors compatibles" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "No hi ha dades a importar" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Clau" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Clau privada RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Clau privada DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Clau privada de corba el·líptica" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Clau pública DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Clau pública de corba el·líptica" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Força" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Empremtes" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Cancel·la" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "D'ac_ord" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "S'han triat automàticament" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "L'usuari ha cancel·lat l'operació" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Introduïu la contrasenya per poder importar." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Contrasenya:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Testimoni:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Desbloca" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiqueta:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Paràmetres d'importació" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirma:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Les contrasenyes no coincideixen." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "La contrasenya no pot estar en blanc" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Petició d'accés" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Desbloca l'accés a les contrasenyes i altres secrets" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Ja existeix un fitxer amb aquest nom." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Voleu reemplaçar-lo amb un fitxer nou?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Reemplaça" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "S'ha cancel·lat l'operació." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exporta el certificat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "De_sa" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Fitxers de certificat" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Fitxers PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Desbloca l'anell de claus automàticament quan estigui en la sessió" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloca aquest anell de claus quan surti" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloca aquest anell de claus després de" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloca aquest anell de claus si està inactiu durant" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minuts" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Desbloca: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Contrasenya" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"El contingut de «%s» està bloquejat. Per poder visualitzar el contingut, " +"introduïu la contrasenya correcta." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"El contingut està bloquejat. Per poder visualitzar el contingut, introduïu " +"la contrasenya correcta." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Visualitzador de certificats i claus GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostra la versió de l'aplicació" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fitxer...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Visualitza fitxers de certificats i de claus" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visualitzador de certificats" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "La contrasenya era incorrecta" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "S'ha importat" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Ha fallat la importació" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importa" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "Tan_ca" diff --git a/po/ca@valencia.po b/po/ca@valencia.po new file mode 100644 index 0000000..4d38155 --- /dev/null +++ b/po/ca@valencia.po @@ -0,0 +1,1127 @@ +# Catalan translation of gnome-keyring. +# Copyright © 2004-2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Jordi Mallach , 2004, 2006. +# Joan Duran , 2008-2013. +# Gil Forcada , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-09-24 09:13+0000\n" +"PO-Revision-Date: 2014-08-17 13:58+0200\n" +"Last-Translator: Xavi Ivars \n" +"Language-Team: Catalan \n" +"Language: ca-valencia\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bits\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Component del domini" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Identificador d'usuari" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Adreça de correu electrònic" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data de naixement" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Lloc de naixement" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Gènere" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "País de ciutadania" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "País de residència" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nom comú" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Cognom" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Número de sèrie" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localitat" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Estat" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Carrer" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organització" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unitat organitzativa" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Títol" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Número de telèfon" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nom de pila" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inicials" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Qualificador de la generació" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Qualificador del nom de domini" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudònim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 amb RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 amb RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 amb RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 amb DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Corba el·líptica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 amb ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 amb ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 amb ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 amb ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 amb ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Servidor d'autenticació" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Client d'autenticació" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Firma del codi" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Protecció del correu electrònic" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Marcat horari" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "S'ha produït un error en carregar el mòdul PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "No s'ha pogut inicialitzar el mòdul PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "No s'han pogut inicialitzar els mòduls PKCS#11 registrats: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "La codificació de l'URI no és vàlida." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "L'URI no té l'esquema «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "La sintaxi de l'URI no és correcta." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "El número de versió de l'URI no és correcte." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "El flux està tancat" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nom" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emés per" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Venç" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Un altre nom" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Adreça XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "Servidor DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Correu electrònic" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Adreça X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nom del directori" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nom del grup EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Adreça IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Identificador registrat" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipus de clau no admés per la sol·licitud de certificat" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "No es pot utilitzar la clau per signar la sol·licitud" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Anell de claus GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Anell de claus GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Clau PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID de la clau" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "El procés GnuPG ha eixit amb el codi: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "S'ha finalitzat el procés GnuPG amb el senyal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "S'ha cancel·lat l'operació" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Clau privada" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Clau pública" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Sol·licitud de certificat" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Dades no reconegudes o no compatibles." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "No s'han pogut analitzar les dades. No són vàlides o estan malmeses." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Les dades estan blocades" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continua" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Cancel·la" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atributs de la clau no reconeguts o no disponibles" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "No s'ha pogut construir la clau pública" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Ja hi ha una altra petició en progrés" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" +"No s'ha pogut trobar una ubicació on emmagatzemar el certificat importat" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Restriccions bàsiques" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoritat de certificació" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Sí" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "No" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Longitud màxima del camí" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Sense límit" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utilització ampliada de la clau" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Propòsits permesos" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificador de l'assumpte de la clau" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificador de la clau" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Signatura digital" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Xifrat de clau" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Xifrat de dades" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acord sobre la clau" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Signatura del certificat" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Firma de la llista de revocació" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Utilització de la clau" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Utilitzacions" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Noms alternatius de l'assumpte" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extensió" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificador" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valor" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "No s'ha pogut exportar el certificat." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitat" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificat per" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Venç" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nom de l'assumpte" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nom de l'emissor" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificat emés" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versió" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "No és vàlid abans de" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "No és vàlid després de" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Empremtes del certificat" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informació de la clau pública" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signatura" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exporta el certificat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Clau de l'algorisme" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Paràmetres de la clau" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Mida de la clau" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Empremta de la clau SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algorisme de la signatura" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Paràmetres de la signatura" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Crític" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Sol·licitud de certificat" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipus" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Desafiament" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detalls" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "No s'ha pogut mostrar «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "No s'ha pogut mostrar el fitxer" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Raó" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "No es pot mostrar un fitxer d'este tipus." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Encripta" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Signa" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certifica" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentica" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Inhabilitat" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Desconegut" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "No vàlid" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Inhabilitat" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "S'ha revocat" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Ha vençut" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Confiança no definida" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "No s'hi confia" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Confiança marginal" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Confiança total" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Confiança última" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Encara no s'ha verificat la informació d'esta clau" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Esta clau no és vàlida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "S'ha inhabilitat esta clau" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "S'ha revocat esta clau" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Esta clau ha vençut" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "No es confia en esta clau" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Esta clau és de confiança marginal" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Esta clau és de confiança total" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Esta clau és de confiança última" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID de la clau" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algorisme" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "S'ha creat" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Venç" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Capacitats" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Propietari de la confiança" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nom" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comentari" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atribut de l'usuari" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Mida" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signatura d'un document binari" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signatura d'un document de text canònic" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Signatura independent" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificació genèrica de la clau" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificació personal de la clau" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificació casual de la clau" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificació positiva de la clau" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Firma de vinculació de la subclau" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Firma de vinculació de la clau primària" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Firma directament a la clau" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Firma de la clau de revocació" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Firma de la subclau de revocació" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Signatura del certificat de revocació" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Marca horària de la signatura" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Firma de confirmació de tercers" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classe" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Només local" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportable" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Clau de revocació" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Empremta" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Subclau pública" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Clau secreta" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Subclau secreta" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "S'està iniciant…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importació en progrés…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "S'ha importat a: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importa a: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "No es pot importar perquè no hi ha importadors compatibles" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "No hi ha dades a importar" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Clau" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Clau privada RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Clau privada DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Clau privada de corba el·líptica" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Clau pública DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Clau pública de corba el·líptica" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Força" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Empremtes" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Cancel·la" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "D'ac_ord" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "S'han triat automàticament" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "L'usuari ha cancel·lat l'operació" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Introduïu la contrasenya per poder importar." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Contrasenya:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Testimoni:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Desbloca" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiqueta:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Paràmetres d'importació" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirma:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Les contrasenyes no coincideixen." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "La contrasenya no pot estar en blanc" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Petició d'accés" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Desbloca l'accés a les contrasenyes i altres secrets" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Ja existeix un fitxer amb este nom." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Voleu reemplaçar-lo amb un fitxer nou?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Reemplaça" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "S'ha cancel·lat l'operació." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exporta el certificat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "Al_ça" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Fitxers de certificat" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Fitxers PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Desbloca l'anell de claus automàticament quan estiga en la sessió" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloca este anell de claus quan isca" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloca este anell de claus després de" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloca este anell de claus si està inactiu durant" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minuts" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Desbloca: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Contrasenya" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"El contingut de «%s» està bloquejat. Per poder visualitzar el contingut, " +"introduïu la contrasenya correcta." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"El contingut està bloquejat. Per poder visualitzar el contingut, introduïu " +"la contrasenya correcta." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Visualitzador de certificats i claus GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostra la versió de l'aplicació" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fitxer...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Visualitza fitxers de certificats i de claus" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visualitzador de certificats" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "La contrasenya era incorrecta" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "S'ha importat" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Ha fallat la importació" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importa" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "Tan_ca" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..63ef010 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,1135 @@ +# Czech translation of gnome-keyring. +# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 the author(s) of gnome-keyring. +# Copyright (C) 2004, 2005, 2006 Miloslav Trmac . +# This file is distributed under the same license as the gnome-keyring package. +# +# Miloslav Trmac , 2003, 2004, 2005, 2006. +# Jakub Friedl , 2007. +# Kamil Páral , 2008. +# Petr Kovar , 2008, 2009. +# Lucas Lommer , 2008, 2009, 2010. +# Marek Černocký , 2010, 2011, 2012, 2014, 2016, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-02 18:05+0100\n" +"Last-Translator: Marek Černocký \n" +"Language-Team: čeština \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Součást domény" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID uživatele" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-mailová adresa" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Datum narození" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Místo narození" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Pohlaví" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Státní příslušnost" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Místo pobytu" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Běžný název" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Příjmení" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Sériové číslo" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Země" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Lokalita" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Stát" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Ulice" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizace" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organizační jednotka" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titul" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonní číslo" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Křestní jméno" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniciály" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Kvalifikátor generování" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Kvalifikátor DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 s RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 s RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 s RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 s DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Eliptické křivky" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 s ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 s ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 s ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 s ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 s ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autentizace serveru" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autentizace klienta" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Podepisování kódu" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Ochrana e-mailu" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Časové razítko" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Chyba při načítání modulu PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Nezdařilo se inicializovat modul PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Nezdařilo se inicializovat registrovaný modul PKCS#11: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Adresa URI má neplatné kódování." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Adresa URI nemá schéma „pkcs11“." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Adresa URI má chybnou syntaxi." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Adresa URI má špatné číslo verze." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Proud byl uzavřen" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Název" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Vydal" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Vyprší" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certifikát" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Jiný název" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Adresa XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "Záznam DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Adresa X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Adresářový název" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Název EDI skupiny" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "Adresa URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Adresa IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrované ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nepodporovaný typ klíče pro požadavek o certifikát" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Klíč nemůže být použit k podepsání požadavku" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Klíčenka GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Klíčenka GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Klíč PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID klíče" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Proces gnupg skončil kódem: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Proces gnupg byl ukončen signálem: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Operace byla zrušena" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Soukromý klíč" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Veřejný klíč" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Požadavek o certifikát" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Nerozpoznaná nebo nepodporovaná data." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Nelze analyzovat neplatná nebo poškozená data." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Data jsou uzamčena" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Pokračovat" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Zrušit" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Zadejte svoje heslo pro OpenSSH" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Nerozpoznaný nebo nedostupný atribut pro klíč" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Nezdařilo se sestavit veřejný klíč" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Jiný dotaz již probíhá" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Nezdařilo se najít místo, kde se mají uchovávat vyznačené certifikáty" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Základní omezení" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Certifikační autorita" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ano" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ne" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maximální délka cesty" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Bez omezení" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Použití rozšířeného klíče" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Povolené účely" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identifikátor klíče subjektu" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identifikátor klíče" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitální podpis" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Šifrování klíče" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Šifrování dat" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Dohoda na klíči" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Podpis certifikátu" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Podpis seznamu odvolaných" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Použití klíče" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Použití" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternativní názvy subjektu" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Rozšíření" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikátor" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Hodnota" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Nezdařilo se exportovat certifikát." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identita" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Ověřil" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Vyprší" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Název subjektu" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Název vydavatele" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Vydaný certifikát" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Verze" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Není platný před" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Není platný po" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Otisky certifikátů" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informace o veřejném klíči" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Podpis" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportovat certifikát…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritmus klíče" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametry klíče" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Velikost klíče" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Otisk SHA1 klíče" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritmus podpisu" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametry podpisu" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritické" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Požadavek o certifikát" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Typ" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Zpochybnění" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "Po_drobnosti" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Nezdařilo se zobrazit „%s“" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Nelze zobrazit soubor" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Důvod" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Nelze zobrazit soubor tohoto typu." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "šifrování" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "podepisování" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "certifikování" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "autentizace" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "zakázaný" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "neznámý" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "neplatný" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "zakázaný" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "odvolaný" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "vypršel" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "nedefinovaná důvěra" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "nedůvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "trochu důvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "plně důvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "bezmezně důvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informace v tomto klíči ještě nebyly ověřeny" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Tento klíč je neplatný" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Tento klíč byl zakázán" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Tento klíč byl odvolán" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Tomuto klíči skončila platnost" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Tento klíč je nedůvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Tento klíč je trochu důvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Tento klíč je plně důvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Tento klíč je bezmezně důvěryhodný" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID klíče" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmus" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Vytvořen" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Vyprší" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Použitelnost" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Důvěra ve vlastníka" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Jméno" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Poznámka" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Uživatelský atribut" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Velikost" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Podpis binárního dokumentu" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Podpis uznávaného textového dokumentu" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Samostatný podpis" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Obecný certifikát klíče" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Osobní certifikát klíče" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Příčinný certifikát klíče" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Souhlasný certifikát klíče" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Podpis vazby podřízeného klíče" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Podpis vazby hlavního klíče" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Podpis přímo na klíči" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Podpis odvolání klíče" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Podpis odvolání podřízeného klíče" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Podpis odvolání certifikátu" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Časové razítko" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Podpis potvrzení třetí strany" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Třída" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Pouze lokální" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportovatelný" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Odvolací klíč" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Otisk" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Veřejný podřízený klíč" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Tajný klíč" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Tajný podřízený klíč" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicializuje se…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Probíhá import…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Naimportováno do: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Import do: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" +"Nelze importovat, protože nejsou k dispozici kompatibilní importní funkce" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nejsou žádná data, která by šlo importovat" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Klíč" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Soukromý klíč (RSA)" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Soukromý klíč (DSA)" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Soukromý klíč (eliptické křivky)" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Veřejný klíč (DSA)" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Veřejný klíč (eliptické křivky)" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bity" +msgstr[2] "%u bitů" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Síla" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Otisky" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Zrušit" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Budiž" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automaticky zvolený" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Uživatel operaci zrušil" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Pokud chcete importovat, zadejte prosím heslo." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Heslo:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Kupon:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Odemknout" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Popisek:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Nastavení importu" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Ověření:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Hesla si neodpovídají." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Heslo nemůže být prázdné" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Dotaz na přístup" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Odemknout přístup k heslům a dalším utajovaným informacím" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Soubor s tímto názvem již existuje." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Chcete jej nahradit novým souborem?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Nahradit" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operace byla zrušena." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Export certifikátu" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Uložit" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Soubory s certifikáty" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Soubory PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Automaticky odemknout klíčenku, kdykoliv se přihlásím" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Uzamknout klíčenku, pokud se odhlásím" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Uzamknout tuto klíčenku za" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Uzamknout tuto klíčenku při nečinnosti delší než" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minut" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Odemknutí: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Heslo" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Obsah „%s“ je zamknutý. Pro zobrazení obsahu musíte zadat správné heslo." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Obsah je zamknutý. Pro zobrazení obsahu musíte zadat správné heslo." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Prohlížeč certifikátů a klíčů GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Zobrazit verzi aplikace" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[soubor…]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "– Zobrazit certifikáty a soubory s klíči" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Prohlížeč certifikátů" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Heslo nebylo správné" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Naimportováno" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Import selhal" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importovat" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Zavřít" diff --git a/po/cy.po b/po/cy.po new file mode 100644 index 0000000..aa59e66 --- /dev/null +++ b/po/cy.po @@ -0,0 +1,998 @@ +# gnome-keyring yn Gymraeg. +# Mae'r ffeil hon dan yr un drwydded a phecyn gnome-keyring. +# Bryn Salisbury , 2004. +# Chris M. Jackson , 2004. +# Rhys Jones , 2004-2006. +# Dafydd Tomos , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2006-04-06 21:03+0100\n" +"Last-Translator: Rhys Jones \n" +"Language-Team: Welsh \n" +"Language: cy\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Datgloi Cylch Allweddi" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Cyfrinair:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "Datgloi Cylch Allweddi" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Cyfrinair:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Caniatáu i raglenni gyrchu'r cylch allweddi?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..daa84d9 --- /dev/null +++ b/po/da.po @@ -0,0 +1,1146 @@ +# Danish translation of gnome-keyring. +# Copyright (C) 2004-14, 2018 Free Software Foundation, Inc. +# Ole Laursen , 2004. +# Peter Bach , 2007. +# Kenneth Nielsen , 2008, 2012. +# Per Kongstad , 2009. +# Kris Thomsen , 2011. +# Joe Hansen , 2011. +# Ask Hjorth Larsen , 2007, 2008, 10, 13, 14, 2018. +# +# signatur -> underskrift +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-02 18:34+0100\n" +"Last-Translator: Ask Hjorth Larsen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Danish\n" +"X-Poedit-Country: DENMARK\n" +"X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domænekomponent" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Bruger-ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-mail-adresse" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Fødselsdato" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Fødselssted" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Køn" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Statsborgerskab" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Opholdsland" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Normalt navn" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Efternavn" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serienummer" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Land" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Egn" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Stat" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Gade" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisation" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organisationsenhed" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Position" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonnummer" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Givet navn" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Initialer" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Generatorkvalifikator" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN-kvalifikator" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 med RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 med RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 med RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 med DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptisk kurve" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 med ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 med ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 med ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 med ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 med ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Servergodkendelse" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Klient-godkendelse" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Kode-underskrivelse" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-mail-beskyttelse" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Tidsstempel" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Fejl ved indlæsning af PKCS#11-modul: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Kunne ikke initialisere PKCS#11-modul: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Kunne ikke initialisere registrerede PKCS#11-moduler: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI'en har en ugyldig kodning." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI'en har ikke skemaet “pkcs11”." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI'en har ugyldig syntaks." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI'en har et ugyldigt versionsnummer." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Strømmen blev lukket" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Navn" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Udstedt af" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Udløber" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certifikat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Andet navn" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail-adresse" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-adresse" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Mappenavn" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI Party-navn" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-adresse" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registreret ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Uunderstøttet nøgletype for certifikatforespørgsel" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Nøglen kan ikke bruges til at signere denne forespørgsel" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG-nøglering" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG-nøglering: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-nøgle" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Nøgle-ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg-proces afsluttedes med kode: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg-proces blev afsluttet med signal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Operationen blev annulleret" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privat nøgle" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Offentlig nøgle" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Certifikatforespørgsel" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Ukendt eller ikke understøttetede data." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Kunne ikke fortolke ugyldige eller ødelagte data." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Dataene er låst" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Fortsæt" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Annuller" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Indtast din adgangsfrase til OpenSSH" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Ukendt eller utilgængelig attribut for nøgle" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Kunne ikke bygge offentlig nøgle" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "En anden prompt er allerede i gang" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Kunne ikke finde et sted at gemme det fastsatte certifikat" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Basisbegrænsninger" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Certifikatautoritet" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ja" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nej" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maks stilængde" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Ubegrænset" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Udvidet nøglebrug" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Tilladte formål" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identifikator for emnenøgle" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Nøgleidentifikator" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digital underskrift" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Nøglekodning" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Datakodning" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Nøgleaftale" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Certifikatunderskrift" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Underskrift for tilbagekaldsliste" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Nøglebrug" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Brug" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternative navne for emne" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Udvidelse" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikator" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Værdi" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Kunne ikke eksportere certifikatet." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitet" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificeret af" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Udløber" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Subjekts navn" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Udsteders navn" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Udstedt certifikat" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Version" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Ikke gyldig før" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Ugyldig efter" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Certifikatfingeraftryk" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Offentlig nøgleinformation" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Underskrift" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Eksportér certifikat …" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritme til nøgle" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametre til nøgle" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Nøglestørrelse" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1-fingeraftryk for nøgle" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritme til underskrift" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametre til underskrift" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritisk" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Certifikatforespørgsel" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Type" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Udfordring" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detaljer" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Kunne ikke vise “%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Kunne ikke vise filen" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Årsag" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Kan ikke vise en fil af denne type." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Kryptér" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Underskriv" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certificer" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Godkend" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Deaktiveret" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Ukendt" + +# Antager at der tales om et certifikat, idet den næste streng er "revoked" +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Ugyldigt" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Deaktiveret" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Inddraget" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Udløbet" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Udefineret tillid" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Ikke betroet" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Marginalt betroet" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Fuldt ud betroet" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Ultimativt betroet" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informationen i denne nøgle er endnu ikke blevet bekræftet" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Denne nøgle er ugyldig" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Denne nøgle er blevet deaktiveret" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Denne nøgle er blevet inddraget" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Denne nøgle er udløbet" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Denne nøgle er ikke betroet" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Denne nøgle er marginalt betroet" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Denne nøgle er fuldt ud betroet" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Denne nøgle er ultimativt betroet" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Nøgle-ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritme" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Oprettet" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Udløb" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Egenskaber" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Ejertillid" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Navn" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Kommentar" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Brugerattribut" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Størrelse" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Underskrift for et binært dokument" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Underskrift af et kanonisk tekstdokument" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Enkeltstående underskrift" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Generisk certificering for nøgle" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Personacertificering for nøgle" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Afslappet certificering af nøgle" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Positiv certificering af nøgle" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Bindingsunderskrift for undernøgle" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Bindingsunderskrift for hovednøgle" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Underskrift direkte på nøgle" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Underskrift for nøgletilbagekaldelse" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Underskrift for undernøgletilbagekaldelse" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Underskrift for certifikattilbagekaldelse" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Underskrift for tidsstempel" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Tredjeparts-bekræftelsesunderskrift" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasse" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Kun lokal" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Eksporterbar" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Tilbagekaldelsesnøgle" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Fingeraftryk" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Offentlig undernøgle" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Hemmelig nøgle" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Hemmelig undernøgle" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Klargør …" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Import er i gang …" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importeret til: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importér til: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Kan ikke importere idet der ikke er nogen gyldige importere" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Ingen data at importere" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Nøgle" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privat RSA-nøgle" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privat DSA-nøgle" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Privat elliptisk kurvenøgle" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Offentlig DSA-nøgle" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Offentlig elliptisk kurvenøgle" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Styrke" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Fingeraftryk" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Annullér" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Valgt automatisk" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Brugeren annullerede denne operation" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Indtast venligst adgangskoden for at kunne importere." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Adgangskode:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Symbol (token):" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Lås op" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Mærkat:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importeringsindstillinger" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Bekræft:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Adgangskoderne passer ikke sammen." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Adgangskoden må ikke være blank" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Adgangsprompt" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Lås op for adgang til adgangkode og andre hemmeligheder" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Der findes allerede en fil med dette navn." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Ønsker du at erstatte den med en ny fil?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Erstat" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operationen blev annulleret." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Eksporter certifikat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Gem" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Certifikatfiler" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-filer" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Lås automatisk denne nøglering op når jeg logger ind" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Lås denne nøglering når jeg logger ud" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Lås denne nøglering efter" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Lås denne nøglering hvis inaktiv i" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutter" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Lås op: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Adgangskode" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Indholdet af “%s” er låst. For at se indholdet så indtast den korrekte " +"adgangskode." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Indholdet er låst. For at se indholdet så indtast den korrekte adgangskode." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR-certifikat og nøglefremviser" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Vis programmets version" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fil …]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Vis certifikat og nøglefiler" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Certifikatfremviser" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Adgangskoden var forkert" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importeret" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importering mislykkedes" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Import" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Luk" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Ugyldigt PKCS#11-modul: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Kunne ikke opsætte PKCS#11-modul: %s" + +#~ msgid "Label" +#~ msgstr "Mærkat" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..4a67fc2 --- /dev/null +++ b/po/de.po @@ -0,0 +1,1143 @@ +# German gcr translation. +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. +# This file is distributed under the same license as the gcr package. +# Christian Neumair , 2003, 2004. +# Hendrik Richter , 2006. +# Philipp Kerling , 2008. +# Stefan Horning , 2009. +# Mario Blättermann , 2009-2013, 2016, 2018. +# Nathan-J. Hirschauer , 2010. +# Wolfgang Stöggl , 2010, 2011, 2014. +# Christian Kirbach , 2008-2010, 2012. +# Tobias Endrigkeit , 2012. +# Benjamin Steinwender , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-03 10:15+0100\n" +"Last-Translator: Mario Blättermann \n" +"Language-Team: Deutsch \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domänenkomponente" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Benutzerkennung" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-Mail-Adresse" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Geburtsdatum" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Geburtsort" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Geschlecht" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Staatsangehörigkeit" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Aufenthaltsland" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Vorname" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Nachname" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Seriennummer" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Land" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Ort" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Staat" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Straße" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisation" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organisationseinheit" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titel" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonnummer" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Vorname" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Initialen" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Erstellungsvermerk" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN-Kennzeichnung" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 mit RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 mit RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 mit RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 mit DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptische Kurve" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 mit ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 mit ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 mit ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 mit ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 mit ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Server-Legitimierung" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Client-Legitimierung" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Code-Signatur" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-Mail-Schutz" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Zeitstempel" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Fehler beim Laden des PKCS#11-Moduls: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "PKCS#11-Modul konnte nicht initialisiert werden: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Registrierte PKCS#11-Module konnten nicht initialisiert werden: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Die Adresse hat eine ungültige Zeichenkodierung." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Die Adresse entspricht nicht dem Schema »PKCS11«." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Die Adresse hat eine ungültige Syntax." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Die Adresse hat eine falsche Versionsnummer." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Der Datenstrom wurde geschlossen" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Name" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Ausgestellt von" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Läuft ab" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Zertifikat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Sonstiger Name" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP-Adresse" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS-Server" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-Mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-Adresse" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Ordnername" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Name der EDI-Stelle" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "Adresse" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-Adresse" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrierte Kennung" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nicht unterstützter Schlüsseltyp für die Anfrage des Zertifikats" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "" +"Dieser Schlüssel kann nicht genutzt werden, um die Anfrage zu unterzeichnen." + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG-Schlüsselbund" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG-Schlüsselbund: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-Schlüssel" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Schlüsselkennung" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg-Prozess endete mit Fehlercode: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg-Prozess wurde mit Signal beendet: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Der Vorgang wurde abgebrochen" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privater Schlüssel" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Öffentlicher Schlüssel" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Zertifikatsanfrage" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Unbekannte oder nicht unterstützte Daten" + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Ungültige oder defekte Daten konnten nicht verarbeitet werden." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Die Daten sind gesperrt" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Fortsetzen" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Abbrechen" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Geben Sie Ihr OpenSSH-Kennwort ein" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Unerkanntes oder nicht verfügbares Attribut für den Schlüssel" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Öffentlicher Schlüssel konnte nicht erzeugt werden" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Eine andere Anzeige läuft bereits" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" +"Es konnte kein Ort für die Hinterlegung des beschränkt gültigen Zertifikats " +"gefunden werden" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Globale Einschränkungen" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Zertifizierungsstelle" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ja" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nein" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maximale Pfadlänge" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Unbegrenzt" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Erweiterte Schlüsselverwendung" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Zugelassene Zwecke" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Personen-Schlüsselidentifikator" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Schlüsselidentifikator" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitale Signatur" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Schlüsselverschlüsselung" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Datenverschlüsselung" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Schlüsselaustausch" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Zertifikatsignatur" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Signatur der Zertifikatrücknahmeliste" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Schlüsselverwendung" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Verwendungszwecke" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternative Personennamen" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Erweiterung" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Bezeichner" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Wert" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Zertifikat konnte nicht exportiert werden." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identität" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Überprüft durch" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Läuft ab" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Personenname" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Name des Herausgebers" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Zertifikat des Herausgebers" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Version" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Nicht gültig vor" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Nicht gültig nach" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Zertifikat-Fingerabdrücke" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informationen zum öffentlichen Schlüssel" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signatur" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Zertifikat exportieren …" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Schlüssel-Algorithmus" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Schlüsselparameter" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Schlüssellänge" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1-Fingerabdruck des Schlüssels" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Signatur-Algorithmus" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parameter der Signatur" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritisch" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Zertifikatanfrage" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Typ" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Aufgabe" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Details" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "»%s« kann nicht angezeigt werden" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Datei kann nicht angezeigt werden" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Grund" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Eine Datei dieses Typs kann nicht angezeigt werden." + +# Verschlüsselungsverfahren +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Verschlüsseln" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Signieren" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Zertifizieren" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Legitimieren" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Deaktiviert" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Unbekannt" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Ungültig" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Deaktiviert" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Widerrufen" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Abgelaufen" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Unbestimmtes Vertrauen" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nicht vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Teilweise vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Vollständig vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Ultimativ vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Die Informationen in diesem Schlüssel wurde noch nicht verifiziert." + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Dieser Schlüssel ist ungültig" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Dieser Schlüssel wurde deaktiviert" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Dieser Schlüssel wurde wiederrufen" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Dieser Schlüssel ist abgelaufen" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Dieser Schlüssel ist nicht vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Dieser Schlüssel ist teilweise vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Der Schlüssel ist vollständig vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Dieser Schlüssel ist ultimativ vertrauenswürdig" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Schlüsselkennung" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algorithmus" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Erzeugt" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Ablaufdatum" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Fähigkeiten" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Vertrauenswürdigkeit des Besitzers" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Name" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Kommentar" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Benutzerattribut" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Größe" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signatur des Binär-Dokumentes" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signatur des Canonical-Textdokumentes" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Eigenständige Signatur" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Allgemeine Zertifizierung des Schlüssels" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Personenbezogene Zertifizierung des Schlüssels" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Zufällige Zertifizierung des Schlüssels" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Positive Zertifizierung des Schlüssels" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Signatur mit Nebenschlüssel" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Signatur mit Hauptschlüssel" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Signatur gehört direkt zum Schlüssel" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Signatur der Zertifikatrücknahmeliste" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Untergeordnete Signatur der Zertifikatrücknahmeliste" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Signatur zum Widerruf des Zertifikats" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Zeitstempel-Signatur" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Fremde Bestätigungssignatur" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasse" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Nur lokal" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportierbar" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Widerrufungsschlüssel" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Fingerabdruck" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Öffentlicher Unterschlüssel" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Geheimer Schlüssel" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Versteckter Unterschlüssel" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Initialisieren …" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Import läuft …" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importiert nach: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importieren nach: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" +"Importieren nicht möglich, da keine kompatiblen Importierer verfügbar sind" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Keine Dateien zu importieren" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Schlüssel" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privater RSA-Schlüssel" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privater DSA-Schlüssel" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Privater elliptischer Kurvenschlüssel" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Öffentlicher DSA-Schlüssel" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Öffentlicher elliptischer Kurvenschlüssel" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u Bit" +msgstr[1] "%u Bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Länge" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Fingerabdrücke" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "A_bbrechen" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatisch ausgewählt" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Der Benutzer brach den Vorgang ab" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Um den Import zu starten, geben Sie bitte das Passwort ein." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Passwort:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Entsperren" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Bezeichnung:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Einstellungen importieren" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Bestätige:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Passwörter stimmen nicht überein." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Passwortfeld kann nicht leer sein" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Zugangsnachfrage" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Den Zugang zu Passwörtern und anderen Geheimnissen entsperren" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Eine Datei dieses Namens existiert bereits." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Wollen Sie sie durch eine neue Datei ersetzen?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Ersetzen" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Der Vorgang wurde abgebrochen." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Zertifikat exportieren" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Speichern" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Zertifikatdateien" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-Dateien" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Diesen Schlüsselbund beim Anmelden automatisch entsperren" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Diesen Schlüsselbund beim Abmelden automatisch sperren." + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Diesen Schlüsselbund sperren nach" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Diesen Schlüsselbund bei Untätigkeit sperren nach" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "Minuten" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Entsperren: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Passwort" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Der Inhalt von »%s« ist gesperrt. Um den Inhalt anzeigen zu können, geben " +"Sie das korrekte Passwort ein." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Der Inhalt ist gesperrt. Um den Inhalt anzeigen zu können, geben Sie das " +"korrekte Passwort ein." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR Zertifikat- und Schlüsselbetrachter" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Die Version der Anwendung anzeigen" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[Datei …]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Zertifikat- und Schlüsseldateien anzeigen" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Zertifikatbetrachter" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Das Passwort war nicht korrekt" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importiert" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Der Vorgang ist fehlgeschlagen" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importieren" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "S_chließen" diff --git a/po/dz.po b/po/dz.po new file mode 100644 index 0000000..b517e03 --- /dev/null +++ b/po/dz.po @@ -0,0 +1,1014 @@ +# Dzongkha translation of gnome-keyring +# Copyright @ Free Software Foundation, Inc. +# Mindu Dorji +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD.dz\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2008-09-18 11:01+0530\n" +"Last-Translator: Dawa pemo \n" +"Language-Team: DZONGKHA \n" +"Language: dz\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2;plural=(n!=1);\n" +"X-Poedit-Language: Dzongkha\n" +"X-Poedit-Country: BHUTAN\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +#, fuzzy +msgid "Certificate" +msgstr "ལག་ཁྱེར་ ལྡེ་མིག་ཁ་ཕྱེ་ " + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "ལག་ཁྱེར་ ལྡེ་མིག་ཁ་ཕྱེ་ " + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "ལག་ཁྱེར་དེ་ ལྡེ་མིག་ཕྱེ་ནིའི་དོན་ལུ་ ཆོག་ཡིག་བཙུགས་ " + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +#, fuzzy +msgid "Issued Certificate" +msgstr "ལག་ཁྱེར་ ལྡེ་མིག་ཁ་ཕྱེ་ " + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "ལྡེ་འཁོར་ལྡེ་མིག་ཕྱེ།" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "ལྡེ་འཁོར་དེ་ ཧེ་མ་ལས་རང་ ལྡེ་མིག་ཕྱེ་དེ་འདུག། " + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "ལག་ཁྱེར་ ལྡེ་མིག་ཁ་ཕྱེ་ " + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "གནས་ཁོངས་ (_L)" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "མི་མང་གི་ལྡེ་མིག་ ཕྱེ་ " + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +#, fuzzy +msgid "Private Key" +msgstr "སྒེར་དོན་གྱི་ ལྡེ་མིག་ཕྱེ་ " + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +#, fuzzy +msgid "Unrecognized or unsupported data." +msgstr "ངོས་འཛིན་མ་འབདཝ་ ཡང་ན་ རྒྱབ་སྐྱོར་མེད་པའི་ ཡིག་སྣོད། " + +#: ../gcr/gcr-parser.c:2183 +#, fuzzy +msgid "Could not parse invalid or corrupted data." +msgstr "ནུས་མེད་ ཡང་ན་ ངན་ཅན་གྱི་ ཡིག་སྣོད་ མིང་དཔྱད་འབད་མ་ཚུགས། " + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "ང་ ནང་བསྐྱོད་འབདཝ་ད་ལུ་ འདི་ རང་བཞིན་གྱིས་ ལྡེ་མིག་ཕྱེ་ " + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "ལྡེ་མིག་ཕྱེ " + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "ཆོག་ཡིག་:(_P)" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "ང་ ནང་སྤྱོད་འབད་བའི་སྐབས་ ལྡེ་འཁོར་འདི་ རང་བཞིན་གྱིས་ ཁ་ཕྱེ། " + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "ང་ ནང་སྤྱོད་འབད་བའི་སྐབས་ ལྡེ་འཁོར་འདི་ རང་བཞིན་གྱིས་ ཁ་ཕྱེ། " + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "ལྡེ་མིག་ཕྱེ " + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "ལྡེ་མིག་ཕྱེ " + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "ཆོག་ཡིག་:(_P)" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "གློག་རིམ་གྱིས་ལྡེ་འཁོར་ལུ་ འཛུལ་སྤྱོད་འབད་བཅུག" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "ཆོག་ཡིག་གསརཔ་གི་ཤུགས་ཚད" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..093ebe9 --- /dev/null +++ b/po/el.po @@ -0,0 +1,1146 @@ +# translation of el.po to Greek +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER. +# Kostas Papadimas , 2004, 2006. +# Jennie Petoumenou , 2009, 2010. +# Christos Spyroglou , 2010. +# Dimitris Spingos (Δημήτρης Σπίγγος) , 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: el\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-07 00:41+0200\n" +"Last-Translator: Tom Tryfonidis \n" +"Language-Team: www.gnome.gr\n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Συστατικό στοιχείο τομέα" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Ταυτότητα χρήστη" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Διεύθυνση ηλ. αλληλογγραφίας" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Ημερομηνία γέννησης" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Τοποθεσία γέννησης" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Φύλο" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Χώρα υπηκοότητας" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Χώρα διαμονής" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Κοινό όνομα" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Επώνυμο" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Σειριακός αριθμός" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Χώρα" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Περιοχή" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Πολιτεία" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Οδός" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Οργανισμός" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Μονάδα οργανισμού" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Τίτλος" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Τηλέφωνο" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Όνομα, βαφτιστικό" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Αρχικά" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Προσδιοριστικό γενιάς" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Προσδιοριστικό DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Ψευδώνυμο" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 με RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 με RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 με RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 με DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Ελλειπτική καμπύλη" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 με ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 με ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 με ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 με ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 με ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Πιστοποίηση διακομιστή" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Πιστοποίηση πελάτη" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Υπογραφή κώδικα" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Προστασία ηλ. αλληλογγραφίας" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Χρονική σήμανση" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Σφάλμα κατά την εκκίνηση του αρθρώματος PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Αδύνατη η αρχικοποίηση του αρθρώματος PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Αδύνατη η αρχικοποίηση του κατωχηρωμένου αρθρώματος PKCS#11: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Το URI έχει μη έγκυρη κωδικοποίηση." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Το URI δεν έχει το σχήμα «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Το URI έχει κακή σύνταξη." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Το URI έχει κακό αριθμό έκδοσης." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Η ροή έκλεισε" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Όνομα" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Εκδόθηκε από" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Λήγει" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Πιστοποιητικό" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Άλλο όνομα" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Ηλ. αλληλογγραφία" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Διεύθυνση X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Όνομα καταλόγου" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI Party Name" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Διεύθυνση IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Εγγεγραμμένη ταυτότητα" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Μη υποστηριζόμενος τύπος κλειδιού για την αίτηση πιστοποίησης" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Το κλειδί δεν μπόρεσε να χρησιμοποιηθεί για να υπογράφει η αίτηση" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Κλειδοθήκη GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Κλειδοθήκη GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Κλειδί PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Αναγνωριστικό κλειδιού" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Η διεργασία Gnupg τερματίστηκε με κωδικό: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Η διεργασία Gnupg τερματίστηκε με σήμα: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Η διεργασία ακυρώθηκε" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Ιδιωτικό κλειδί" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Δημόσιο κλειδί" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Αίτηση πιστοποιητικού" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Μη αναγνωρίσιμα ή μη υποστηριζόμενα δεδομένα." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Αδυναμία ανάλυσης άκυρων ή κατεστραμμένων δεδομένων." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Τα δεδομένα είναι κλειδωμένα" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Συνέχεια" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Ακύρωση" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Εισάγετε το συνθηματικό ασφαλούς κελύφους σας" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Άγνωστες ή μη διαθέσιμες ιδιότητες για το κλειδί" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Αδυναμία δημιουργίας δημόσιου κλειδιού" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Ένα άλλο τερματικό βρίσκεται ήδη σε εξέλιξη" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" +"Αδυναμία εύρεσης τοποθεσίας για την αποθήκευση του καρφιτσωμένου " +"πιστοποιητικού" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Βασικοί περιορισμοί" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Αρχή πιστοποίησης" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ναι" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Όχι" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Μέγιστο μήκος διαδρομής" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Απεριόριστο" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Εκτεταμένη χρήση κλειδιού" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Επιτρεπόμενοι σκοποί" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Αναγνωριστικό κλειδί υποκειμένου" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Αναγνωριστικό κλειδί" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Ψηφιακή υπογραφή" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Κρυπτογράφηση κλειδιού" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Κρυπρογράφηση δεδομένων" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Άδεια κλειδιού" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Πιστοποιητικό υπογραφής" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Λίστα ανάκτησης υπογραφών" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Χρήση κλειδιού" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Χρήσεις" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Εναλλακτικά ονόματα υποκειμένου" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Επέκταση" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Αναγνωριστικό" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Τιμή" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Αδυναμία εξαγωγής πιστοποιητικού." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Ταυτότητα" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Επαληθεύτηκε από" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Λήγει" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Όνομα θέματος" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Όνομα εκδότη" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Εκδοθέν πιστοποιητικό" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Έκδοση" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Έναρξη ισχύος" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Λήξη ισχύος" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Πιστοποιητικό αποτυπωμάτων" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Πληροφορίες δημοσίου κλειδιού" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Υπογραφή" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Εξαγωγή πιστοποιητικού…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Αλγόριθμος κλειδιού" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Παράμετροι κλειδιού" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Μέγεθος κλειδιού" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Αποτύπωμα κλειδιού SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Αλγόριθμος υπογραφής" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Παράμετροι υπογραφής" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Κρίσιμο" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Αίτηση πιστοποίησης" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Χαρακτηριστικό" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Τύπος" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Πρόκληση" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Λεπτομέρειες" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Αδύνατη η εμφάνιση του «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Αδύνατη η εμφάνιση του αρχείου" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Αιτία" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Δεν είναι δυνατή η προβολή τέτοιου τύπου αρχείου." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Κρυπτογράφηση" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Υπογραφή" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Βεβαίωση" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Πιστοποίηση" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Απενεργοποιημένο" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Άγνωστο" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Μη έγκυρο" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Απενεργοποιημένο" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Ανακλήθηκε" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Έληξε" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Ακαθόριστη εμπιστοσύνη" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Δύσπιστο" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Οριακά έμπιστο" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Πλήρως έμπιστο" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Απολύτως έμπιστο" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Οι πληροφορίες σε αυτό το κλειδί δεν έχουν ακόμα επαληθευτεί" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Αυτό το κλειδί δεν είναι έγκυρο" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Αυτό το κλειδί έχει απενεργοποιηθεί" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Αυτό το κλειδί έχει αποσυρθεί" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Αυτό το κλειδί έχει λήξει" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Αυτό το κλειδί δεν είναι έμπιστο" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Αυτό το κλειδί είναι οριακά αξιόπιστο" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Αυτό το κλειδί είναι πλήρως αξιόπιστο" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Αυτό το κλειδί είναι απολύτως αξιόπιστο" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Αναγνωριστικό κλειδιού" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Αλγόριθμος" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Δημιουργήθηκε" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Λήξη" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Δυνατότητες" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Εμπιστοσύνη ιδιοκτήτη" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Όνομα" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Σχόλιο" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Χαρακτηριστικό χρήστη" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Μέγεθος" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Υπογραφή ενός δυαδικού εγγράφου" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Υπογραφή ενός κανονικού εγγράφου κειμένου" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Αυτόνομη υπογραφή" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Γενική πιστοποίηση του κλειδιού" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Προσωπική πιστοποίηση του κλειδιού" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Γενική πιστοποίηση του κλειδιού" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Θετική πιστοποίηση του κλειδιού" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Δεσμευτική υπογραφή υποκλειδιού" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Δεσμευτική υπογραφή πρωτεύοντος κλειδιού" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Υπογραφή απευθείας στο κλειδί" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Υπογραφή κλειδιού ανάκλησης" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Υπογραφή υποκλειδιού ανάκλησης" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Πιστοποιητικό ανάκλησης υπογραφής" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Υπογραφή χρονικής σήμανσης" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Υπογραφή επιβεβαίωσης τρίτων" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Κλάση" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Μόνο τοπικά" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Εξαγωγίσιμο" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Κλειδί ανάκλησης" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Αποτύπωμα" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Δημόσιο υποκλειδί" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Μυστικό κλειδί" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Μυστικό υποκλείδι" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Αρχικοποίηση…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Η εισαγωγή είναι σε εξέλιξη…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Εισήχθη στο: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Εισαγωγή σε: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Αδυναμία εισαγωγής διότι δεν υπάρχουν συμβατοί εισαγωγείς" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Δεν υπάρχουν δεδομένα για εισαγωγή" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Κλειδί" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Ιδιωτικό κλειδί RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Ιδιωτικό κλειδί DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Ιδιωτικό κλειδί ελλειπτικής καμπύλης " + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Δημόσιο κλειδί DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Δημόσιο κλειδί ελλειπτικής καμπύλης " + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Ισχύς" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Αποτυπώματα" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "A_κύρωση" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "Ε_ντάξει" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Επιλέχθηκε αυτόματα" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Ο χρήστης ακύρωσε την λειτουργία" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Για να γίνει εισαγωγή, παρακαλούμε δώστε τον κωδικό πρόσβασης." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Κωδικός πρόσβασης:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Διακριτικό:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Ξεκλείδωμα" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Ετικέτα:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Εισαγωγή ρυθμίσεων" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Επιβεβαίωση:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Τερματικό" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Ξεκλειδώστε την πρόσβαση σε κωδικούς πρόσβασης και άλλα μυστικά" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Υπάρχει ήδη ένα αρχείο με αυτό το όνομα." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Θέλετε να το αντικαταστήσετε με ένα νέο αρχείο;" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Αντικατάσταση" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Η λειτουργία ακυρώθηκε." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Εξαγωγή πιστοποιητικού" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "Απο_θήκευση" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Aρχεία πιστοποιητικού" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Αρχεία PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Αυτόματο ξεκλείδωμα αυτής της κλειδοθήκης κατά την είσοδό μου" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Κλείδωμα αυτής της κλειδοθήκης όταν αποσυνδεθώ" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Κλείδωμα αυτής της κλειδοθήκης μετά από" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Κλείδωμα αυτής της κλειδοθήκης αν είναι αδρανές για" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "λεπτά" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Ξεκλείδωμα: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Κωδικός πρόσβασης" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Τα περιεχόμενα του «%s» είναι κλειδωμένα. Για να τα δείτε, πληκτρολογήστε το " +"σωστό συνθηματικό." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Τα περιεχόμενα είναι κλειδωμένα. Για να τα δείτε, πληκτρολογήστε τον σωστό " +"κωδικό πρόσβασης." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Εφαρμογή προβολής πιστοποιητικών GCR και κλειδιών" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Εμφάνιση έκδοσης της εφαρμογής" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[αρχείο...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Προβολή πιστοποιητικών και κλειδιών" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Εφαρμογή προβολής πιστοποιητικών" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Ο κωδικός πρόσβασης ήταν λάθος" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Εισήχθη" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Η εισαγωγή απέτυχε" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Εισαγωγή" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Κλείσιμο" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Μη έγκυρο αρθρώμα PKCS#11: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Αδυναμία ρύθμισης του αρθρώματος PKCS#11: %s" + +#~ msgid "Label" +#~ msgstr "Ετικέτα" + +#~ msgid "Unlock" +#~ msgstr "Ξεκλείδωμα" diff --git a/po/en@shaw.po b/po/en@shaw.po new file mode 100644 index 0000000..9297377 --- /dev/null +++ b/po/en@shaw.po @@ -0,0 +1,1065 @@ +# Shavian translation for gnome-keyring. +# Copyright (C) 2009 The Gnome Foundation. +# Thomas Thurman , 2009. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2010-05-12 18:36 -0400\n" +"Last-Translator: Thomas Thurman \n" +"Language-Team: Shavian \n" +"Language: en@shaw\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n!=1;\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "𐑛𐑴𐑥𐑱𐑯 𐑒𐑩𐑥𐑐𐑴𐑯𐑩𐑯𐑑" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "𐑿𐑟𐑼 ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "𐑛𐑱𐑑 𐑝 𐑚𐑻𐑔" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "𐑐𐑤𐑱𐑕 𐑝 𐑚𐑻𐑔" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "𐑡𐑧𐑯𐑛𐑻" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "𐑒𐑳𐑯𐑑𐑮𐑰 𐑝 𐑕𐑦𐑑𐑦𐑟𐑩𐑯𐑖𐑦𐑐" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "𐑒𐑳𐑯𐑑𐑮𐑰 𐑝 𐑮𐑧𐑟𐑦𐑛𐑩𐑯𐑕" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "𐑒𐑪𐑥𐑩𐑯 𐑯𐑱𐑥" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "𐑕𐑻𐑯𐑱𐑥" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "𐑕𐑦𐑮𐑰𐑩𐑤 𐑯𐑳𐑥𐑚𐑼" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "𐑒𐑳𐑯𐑑𐑮𐑰" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "𐑤𐑴𐑒𐑩𐑤𐑦𐑑𐑦" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "𐑕𐑑𐑱𐑑" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "𐑕𐑑𐑮𐑰𐑑" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "𐑹𐑜𐑩𐑯𐑦𐑟𐑱𐑖𐑩𐑯" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "𐑪𐑮𐑜𐑩𐑯𐑩𐑟𐑱𐑖𐑩𐑯𐑩𐑤 𐑿𐑯𐑦𐑑" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "𐑑𐑲𐑑𐑩𐑤" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "𐑑𐑧𐑤𐑩𐑓𐑴𐑯 𐑯𐑳𐑥𐑚𐑼" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "𐑜𐑦𐑝𐑩𐑯 𐑯𐑱𐑥" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "𐑦𐑯𐑦𐑖𐑩𐑤𐑟" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "𐑡𐑧𐑯𐑻𐑱𐑖𐑪𐑯 𐑒𐑢𐑭𐑤𐑩𐑓𐑲𐑻" + +#: ../egg/egg-oid.c:93 +#, fuzzy +msgid "DN Qualifier" +msgstr "DN 𐑒𐑢𐑭𐑤𐑩𐑓𐑲𐑻" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "𐑕𐑵𐑛𐑩𐑯𐑦𐑥" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +#, fuzzy +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +#, fuzzy +msgid "MD2 with RSA" +msgstr "MD2 𐑢𐑦𐑞 RSA" + +#: ../egg/egg-oid.c:100 +#, fuzzy +msgid "MD5 with RSA" +msgstr "MD5 𐑢𐑦𐑞 RSA" + +#: ../egg/egg-oid.c:101 +#, fuzzy +msgid "SHA1 with RSA" +msgstr "SHA1 𐑢𐑦𐑞 RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +#, fuzzy +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +#, fuzzy +msgid "SHA1 with DSA" +msgstr "SHA1 𐑢𐑦𐑞 DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "SSL 𐑕𐑻𐑝𐑼 𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "SSL 𐑒𐑤𐑲𐑩𐑯𐑑 𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "𐑞 𐑕𐑧𐑖𐑩𐑯 𐑦𐑟 𐑒𐑤𐑴𐑟𐑛" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "_Name:" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "𐑦𐑖𐑵𐑛 𐑪𐑯" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "𐑦𐑒𐑕𐑐𐑲𐑻𐑟 𐑪𐑯" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "𐑞 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑢𐑪𐑟 𐑒𐑨𐑯𐑕𐑩𐑤𐑛" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "𐑩𐑯𐑤𐑭𐑒 𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "𐑦𐑖𐑵𐑻 𐑯𐑱𐑥" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "𐑰𐑥𐑱𐑤" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "𐑕𐑳𐑚𐑡𐑧𐑒𐑑 𐑯𐑱𐑥" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "𐑘𐑧𐑕" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "𐑯𐑴" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "𐑲𐑛𐑧𐑯𐑑𐑦𐑓𐑲𐑼" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "𐑲𐑛𐑧𐑯𐑑𐑦𐑓𐑲𐑼" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "𐑒𐑰 𐑐𐑼𐑨𐑥𐑩𐑑𐑼𐑟" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "𐑕𐑳𐑚𐑡𐑧𐑒𐑑 𐑯𐑱𐑥" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "𐑩𐑒𐑕𐑑𐑧𐑯𐑖𐑩𐑯" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "𐑲𐑛𐑧𐑯𐑑𐑦𐑓𐑲𐑼" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "𐑝𐑨𐑤𐑿" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "𐑒𐑮𐑦𐑑𐑦𐑒𐑩𐑤" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "𐑧𐑯𐑑𐑼 𐑐𐑭𐑕𐑢𐑼𐑛 𐑑 𐑩𐑯𐑤𐑭𐑒 𐑞 𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "𐑲𐑛𐑧𐑯𐑑𐑦𐑓𐑲𐑼" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "𐑦𐑒𐑕𐑐𐑲𐑻𐑟 𐑪𐑯" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "𐑕𐑳𐑚𐑡𐑧𐑒𐑑 𐑯𐑱𐑥" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "𐑦𐑖𐑵𐑻 𐑯𐑱𐑥" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "𐑦𐑖𐑵𐑛 𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "𐑝𐑻𐑠𐑩𐑯" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "𐑯𐑪𐑑 𐑝𐑨𐑤𐑦𐑛 𐑚𐑦𐑓𐑹" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "𐑯𐑪𐑑 𐑝𐑨𐑤𐑦𐑛 𐑭𐑓𐑑𐑼" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "𐑓𐑦𐑙𐑜𐑼𐑐𐑮𐑦𐑯𐑑𐑕" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼 𐑨𐑤𐑜𐑻𐑦𐑞𐑩𐑥" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼 𐑐𐑼𐑨𐑥𐑩𐑑𐑼𐑟" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "𐑐𐑳𐑚𐑤𐑦𐑒 𐑒𐑰 𐑦𐑯𐑓𐑴" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "𐑒𐑰 𐑨𐑤𐑜𐑻𐑦𐑞𐑩𐑥" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "𐑒𐑰 𐑐𐑼𐑨𐑥𐑩𐑑𐑼𐑟" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "𐑒𐑰 𐑕𐑲𐑟" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 𐑓𐑦𐑙𐑜𐑼𐑐𐑮𐑦𐑯𐑑" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "𐑐𐑳𐑚𐑤𐑦𐑒 𐑒𐑰" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "_Details:" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "𐑩𐑯𐑤𐑭𐑒 𐑒𐑰𐑮𐑦𐑙" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "𐑞 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑢𐑪𐑟 𐑒𐑨𐑯𐑕𐑩𐑤𐑛" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "𐑳𐑯𐑴𐑯 𐑻𐑼" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "𐑦𐑒𐑕𐑐𐑲𐑻𐑟 𐑪𐑯" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "𐑞 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑦𐑟 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝 𐑯 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑮𐑦𐑝𐑰𐑤𐑛" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "𐑞 𐑕𐑧𐑖𐑩𐑯 𐑦𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "𐑞 𐑥𐑪𐑛𐑿𐑤 𐑣𐑨𐑟 𐑯𐑪𐑑 𐑚𐑰𐑯 𐑦𐑯𐑦𐑖𐑩𐑤𐑲𐑟𐑛" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "𐑞 𐑒𐑰 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑮𐑨𐑐𐑑" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "𐑞 𐑐𐑭𐑕𐑢𐑼𐑛 𐑹 PIN 𐑣𐑨𐑟 𐑦𐑒𐑕𐑐𐑲𐑮𐑛" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "𐑞 𐑒𐑰 𐑦𐑟 𐑝 𐑞 𐑮𐑪𐑙 𐑑𐑲𐑐" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "𐑒𐑰 𐑨𐑤𐑜𐑻𐑦𐑞𐑩𐑥" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "𐑦𐑒𐑕𐑐𐑲𐑻𐑟 𐑪𐑯" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "_Name:" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "𐑒𐑰 𐑕𐑲𐑟" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼 𐑐𐑼𐑨𐑥𐑩𐑑𐑼𐑟" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "𐑩𐑯𐑤𐑭𐑒 𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "𐑕𐑦𐑜𐑯𐑩𐑗𐑼 𐑐𐑼𐑨𐑥𐑩𐑑𐑼𐑟" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "𐑤𐑴𐑒𐑩𐑤𐑦𐑑𐑦" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "𐑓𐑦𐑙𐑜𐑼𐑐𐑮𐑦𐑯𐑑𐑕" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "𐑐𐑳𐑚𐑤𐑦𐑒 𐑒𐑰" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "𐑦𐑯𐑦𐑖𐑩𐑤𐑟" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "𐑦𐑥𐑐𐑹𐑑 𐑦𐑯𐑑𐑫:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "𐑦𐑥𐑐𐑹𐑑 𐑦𐑯𐑑𐑫:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑦𐑥𐑐𐑹𐑑 𐑚𐑦𐑒𐑪𐑟 𐑞 𐑒𐑰 𐑦𐑟 𐑝 𐑞 𐑮𐑪𐑙 𐑑𐑲𐑐" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "𐑯𐑴 𐑤𐑴𐑒𐑱𐑖𐑩𐑯 𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤 𐑑 𐑦𐑥𐑐𐑹𐑑 𐑑" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "𐑐𐑮𐑲𐑝𐑩𐑑 𐑒𐑰" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "𐑐𐑮𐑲𐑝𐑩𐑑 𐑒𐑰" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "𐑐𐑮𐑲𐑝𐑩𐑑 𐑒𐑰" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "𐑐𐑳𐑚𐑤𐑦𐑒 𐑒𐑰" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "𐑕𐑑𐑮𐑰𐑑" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "𐑓𐑦𐑙𐑜𐑼𐑐𐑮𐑦𐑯𐑑𐑕" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑹 𐑳𐑯𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑛𐑱𐑑𐑩." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑐𐑸𐑕 𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑹 𐑒𐑼𐑳𐑐𐑑𐑩𐑛 𐑛𐑱𐑑𐑩." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "𐑞 𐑛𐑱𐑑𐑩 𐑦𐑟 𐑤𐑪𐑒𐑑" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "𐑩𐑯𐑤𐑭𐑒" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "𐑦𐑯 𐑹𐑛𐑼 𐑑 𐑦𐑥𐑐𐑹𐑑 '%s', 𐑦𐑑 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑩𐑯𐑤𐑭𐑒𐑑" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "𐑐𐑭𐑕𐑢𐑼𐑛:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "𐑗𐑵𐑟 𐑩 𐑤𐑴𐑒𐑱𐑖𐑩𐑯 𐑑 𐑕𐑑𐑹 𐑞 𐑦𐑥𐑐𐑹𐑑𐑩𐑛 𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑𐑕/𐑒𐑰𐑟." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "𐑷𐑑𐑩𐑥𐑨𐑑𐑦𐑒𐑤𐑦 𐑩𐑯𐑤𐑭𐑒 𐑞𐑦𐑕 𐑒𐑰𐑮𐑦𐑙 𐑢𐑧𐑯𐑧𐑝𐑼 𐑲'𐑧𐑥 𐑤𐑪𐑜𐑛 𐑦𐑯" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +#, fuzzy +msgid "Lock this keyring after" +msgstr "𐑤𐑪𐑒 𐑞𐑦𐑕 𐑒𐑰𐑮𐑦𐑙 𐑭𐑓𐑑𐑼" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +#, fuzzy +msgid "Lock this keyring if idle for" +msgstr "𐑤𐑪𐑒 𐑞𐑦𐑕 𐑒𐑰𐑮𐑦𐑙 𐑦𐑓 𐑲𐑛𐑩𐑤 𐑓𐑹" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "𐑤𐑪𐑒 𐑞𐑦𐑕 𐑒𐑰𐑮𐑦𐑙 𐑢𐑧𐑯 𐑲 𐑤𐑪𐑜 𐑬𐑑" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +#, fuzzy +msgid "minutes" +msgstr "𐑥𐑦𐑯𐑦𐑑𐑕" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "𐑩𐑯𐑤𐑭𐑒" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "𐑩𐑯𐑤𐑭𐑒" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "𐑐𐑭𐑕𐑢𐑼𐑛:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑 𐑯 𐑒𐑰 𐑕𐑑𐑹𐑦𐑡" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑 𐑯 𐑒𐑰 𐑕𐑑𐑹𐑦𐑡" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "𐑕𐑩𐑑𐑦𐑓𐑦𐑒𐑩𐑑" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "𐑞 𐑩𐑯𐑤𐑭𐑒 𐑐𐑭𐑕𐑢𐑼𐑛 𐑢𐑪𐑟 𐑦𐑯𐑒𐑩𐑮𐑧𐑒𐑑" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "𐑦𐑥𐑐𐑹𐑑 𐑦𐑯𐑑𐑫:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "𐑞 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑓𐑱𐑤𐑛" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "𐑦𐑥𐑐𐑹𐑑 𐑦𐑯𐑑𐑫:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/en_CA.po b/po/en_CA.po new file mode 100644 index 0000000..0cbc773 --- /dev/null +++ b/po/en_CA.po @@ -0,0 +1,1002 @@ +# Canadian English translation of gnome-keyring +# Copyright (C) Adam Weinberger and the GNOME Foundation +# This file is distributed under the same licence as the gnome-keyring package. +# Adam Weinberger , 2004. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring 0.1.90\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2005-01-14 23:42-0500\n" +"Last-Translator: Adam Weinberger \n" +"Language-Team: Canadian English \n" +"Language: en_CA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Unlock Keyring" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "The keyring has already been unlocked." + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "_Location:" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Password:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Automatically unlock this keyring when I log in." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "Automatically unlock this keyring when I log in." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "Unlock Keyring" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Password:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Allow application access to keyring?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "New password strength" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..832b906 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,1140 @@ +# English (British) translation. +# Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-keyring package. +# Gareth Owen , 2004. +# Philip Withnall , 2009, 2010. +# Bruce Cowan , 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2014-04-19 20:37+0000\n" +"PO-Revision-Date: 2016-09-18 11:15+0100\n" +"Last-Translator: David King \n" +"Language-Team: British English \n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domain Component" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "User ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-mail Address" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Date of Birth" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Place of Birth" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Gender" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Country of Citizenship" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Country of Residence" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Common Name" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Surname" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serial Number" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Country" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Locality" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "County" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Street" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisation" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organisational Unit" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Title" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telephone Number" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Given Name" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Initials" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Generation Qualifier" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN Qualifier" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 with RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 with RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 with RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 with DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptic Curve" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 with ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 with ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 with ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 with ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 with ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Server Authentication" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Client Authentication" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Code Signing" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-mail Protection" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Time Stamping" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Error loading PKCS#11 module: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Couldn't initialise PKCS#11 module: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Couldn't initialise registered PKCS#11 modules: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "The URI has invalid encoding." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "The URI does not have the 'pkcs11' scheme." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "The URI has bad syntax." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "The URI has a bad version number." + +#: ../gcr/gcr-callback-output-stream.c:62 +#: ../gcr/gcr-callback-output-stream.c:79 +#, c-format +msgid "The stream was closed" +msgstr "The stream was closed" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Name" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Issued By" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Expires" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificate" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Other Name" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 Address" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Directory Name" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI Party Name" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP Address" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registered ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Unsupported key type for certificate request" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "The key cannot be used to sign the request" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG Keyring" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG Keyring: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP Key" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Key ID" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg process exited with code: %d" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg process was terminated with signal: %d" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2551 +#: ../gcr/gcr-parser.c:3157 ../gcr/gcr-system-prompt.c:924 +msgid "The operation was cancelled" +msgstr "The operation was cancelled" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Private Key" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Public Key" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Certificate Request" + +#: ../gcr/gcr-parser.c:2554 +msgid "Unrecognized or unsupported data." +msgstr "Unrecognised or unsupported data." + +#: ../gcr/gcr-parser.c:2557 +msgid "Could not parse invalid or corrupted data." +msgstr "Could not parse invalid or corrupted data." + +#: ../gcr/gcr-parser.c:2560 +msgid "The data is locked" +msgstr "The data is locked" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continue" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Cancel" + +#: ../gcr/gcr-subject-public-key.c:407 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Unrecognised or unavailable attributes for key" + +#: ../gcr/gcr-subject-public-key.c:493 ../gcr/gcr-subject-public-key.c:579 +msgid "Couldn't build public key" +msgstr "Couldn't build public key" + +#: ../gcr/gcr-system-prompt.c:905 +msgid "Another prompt is already in progress" +msgstr "Another prompt is already in progress" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:366 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Couldn't find a place to store the pinned certificate" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Basic Constraints" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Certificate Authority" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Yes" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "No" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Max Path Length" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Unlimited" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Extended Key Usage" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Allowed Purposes" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Subject Key Identifier" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Key Identifier" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digital signature" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Key encypherment" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Data encypherment" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Key agreement" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Certificate signature" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Revocation list signature" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Key Usage" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Usages" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Subject Alternative Names" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extension" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifier" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Value" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "Couldn't export the certificate." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identity" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verified by" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Expires" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Subject Name" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Issuer Name" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Issued Certificate" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Version" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Not Valid Before" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Not Valid After" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Certificate Fingerprints" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Public Key Info" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signature" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Export Certificate…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Key Algorithm" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Key Parameters" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Key Size" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Key SHA1 Fingerprint" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Signature Algorithm" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Signature Parameters" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Critical" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Certificate request" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attribute" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Type" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:317 +msgid "_Details" +msgstr "_Details" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "Could not display '%s'" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Could not display file" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Reason" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Cannot display a file of this type." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Encrypt" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Sign" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certify" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Authenticate" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Disabled" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Unknown" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Invalid" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Disabled" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revoked" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Expired" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Undefined trust" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Distrusted" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Marginally trusted" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Fully trusted" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Ultimately trusted" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "The information in this key has not yet been verified" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "This key is invalid" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "This key has been disabled" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "This key has been revoked" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "This key has expired" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "This key is distrusted" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "This key is marginally trusted" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "This key is fully trusted" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "This key is ultimately trusted" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Key ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algorithm" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Created" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Expiry" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Capabilities" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Owner trust" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Name" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comment" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "User Attribute" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Size" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signature of a binary document" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signature of a canonical text document" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Standalone signature" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Generic certification of key" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Persona certification of key" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Casual certification of key" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Positive certification of key" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Subkey binding signature" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Primary key binding signature" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Signature directly on key" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Key revocation signature" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Subkey revocation signature" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Certification revocation signature" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Timestamp signature" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Third-party confirmation signature" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Class" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Local only" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportable" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Revocation Key" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Fingerprint" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Public Subkey" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Secret Key" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Secret Subkey" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Initialising…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Import is in progress…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Imported to: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Import to: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Cannot import because there are no compatible importers" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "No data to import" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Key" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Private RSA Key" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Private DSA Key" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Private Elliptic Curve Key" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Public DSA Key" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Public Elliptic Curve Key" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Strength" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Fingerprints" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:502 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Cancel" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:505 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatically chosen" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "The user cancelled the operation" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "In order to import, please enter the password." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:563 +msgid "Password:" +msgstr "Password:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Unlock" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Label:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Import settings" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:580 +msgid "Confirm:" +msgstr "Confirm:" + +#: ../ui/gcr-prompt-dialog.c:648 +msgid "Passwords do not match." +msgstr "Passwords do not match." + +#: ../ui/gcr-prompt-dialog.c:655 +msgid "Password cannot be blank" +msgstr "Password cannot be blank" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Access Prompt" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Unlock access to passwords and other secrets" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "A file already exists with this name." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Do you want to replace it with a new file?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Replace" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "The operation was cancelled." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Export certificate" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Save" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Certificate files" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM files" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Automatically unlock this keyring whenever I'm logged in" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Lock this keyring when I log out" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Lock this keyring after" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Lock this keyring if idle for" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutes" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Unlock: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Password" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"The contents are locked. In order to view the contents, enter the correct " +"password." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR Certificate and Key Viewer" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Show the version of the application" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[file…]" + +#: ../ui/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "- View certificate and key files" + +#: ../ui/gcr-viewer-tool.c:118 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Certificate Viewer" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "The password was incorrect" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Imported" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Import failed" + +#: ../ui/gcr-viewer-window.c:107 +msgid "Import" +msgstr "Import" + +#: ../ui/gcr-viewer-window.c:116 +msgid "_Close" +msgstr "_Close" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Invalid PKCS#11 module: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Couldn't setup PKCS#11 module: %s" + +#~ msgid "Label" +#~ msgstr "Label" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Unlock" diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 0000000..c2e311f --- /dev/null +++ b/po/eo.po @@ -0,0 +1,1141 @@ +# Esperanto translation for gcr. +# Copyright (C) 2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the gcr package. +# Michael MORONI, < >, 2011. +# Kristjan SCHMIDT , 2011, 2016, 2017. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-02-22 19:17+0000\n" +"PO-Revision-Date: 2017-12-23 21:23+0200\n" +"Last-Translator: Kristjan SCHMIDT \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Uzanto-ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Retpoŝtadreso" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Naskiĝdato" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Naskiĝloko" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sekso" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Civitlando" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Loĝlando" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Komuna nomo" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Familinomo" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Seria numero" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Lando" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Urbo" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Ŝtato" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Strato" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizo" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organiza unuo" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titolo" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonnumero" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Donita nomo" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inicialoj" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseŭdonimo" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 kun RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 kun RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 kun RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 kun DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 kun ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 kun ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 kun ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 kun ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 kun ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Servilo-aŭtentigo" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Kliento-aŭtentigo" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Retpoŝta protekto" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Eraro dum ŝarĝo de PKCS#11-modulo: %s" + +#: ../gck/gck-module.c:358 +#, fuzzy, c-format +#| msgid "Error loading PKCS#11 module: %s" +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Eraro dum ŝarĝo de PKCS#11-modulo: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "La URI havas nevalidan kodadon." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "La URI havas malbonan sintakson." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "La URI havas malbonan versionombron." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "La fluo estas fermita" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nomo" + +#: ../gcr/gcr-certificate.c:352 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Eldonite je" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Senvalidiĝos" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Atestilo" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Alia nomo" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP-adreso" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Retpoŝtadreso" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-adreso" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Dosierujo-nomo" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-adreso" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrita ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nesubtenata ŝlosiltipo por aŭtentigilo-peto" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "La ŝlosilo ne povas esti uzita subskribi la peton" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG-ŝlosilaro" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG-ŝlosilaro: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-ŝlosilo" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Ŝlosil-ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "La ago estis nuligita" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privata ŝlosilo" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Publika ŝlosilo" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Atestil-peto" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Nekonataj aŭ nesubtenataj datumoj." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Ne povus analizi nevalidan aŭ difektitan datumojn." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "La datumoj estas ŝlositaj" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Daŭrigi" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Nuligi" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +#| msgid "Couldn't build public key" +msgid "Couldn’t build public key" +msgstr "Ne eblis krei publikan ŝlosilon" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, fuzzy, c-format +#| msgid "Couldn't export the certificate." +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Ne eblis trovi lokon por konservi la atestilon" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Atestilaŭtoritato" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Jes" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ne" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Nelimigite" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Ŝlosil-identigilo" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Ŝlosil-identigilo" + +#: ../ui/gcr-certificate-renderer.c:186 +#, fuzzy +msgid "Digital signature" +msgstr "Subskribo" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Atestil-subskribo" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Etendaĵo" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identigilo" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valoro" + +#: ../ui/gcr-certificate-renderer.c:287 +#| msgid "Couldn't export the certificate." +msgid "Couldn’t export the certificate." +msgstr "Ne eblis elporti la atestilon." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identeco" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Konfirmita de" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Senvalidiĝos" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nomo de la eldoninto" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Atestilo de la eldoninto" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versio" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Ne valida antaŭe" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Ne valida poste" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Fingropremaĵoj" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Subskribo" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Elporti atestilon…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Ŝlosilgrando" + +#: ../ui/gcr-certificate-renderer.c:876 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1-Fingropremaĵo" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritike" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Atestilo-peto" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atributo" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipo" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detaloj" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +#| msgid "Could not display '%s'" +msgid "Could not display “%s”" +msgstr "Ne eblis montri na “%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Ne eblis montri dosieron" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Kialo" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Ne povas montri dosieron de ĉi tiu tipo." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Ĉifradi" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Subskribi" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Atesti" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Aŭtentigi" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Elŝaltite" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Nekonate" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Nevalide" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Elŝaltite" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Senvalidiĝis" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "La informo en ĉi tiu ŝlosilo ankoraŭ ne estas konfirmita" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "La ŝlosilo estas nevalida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Ĉi tiu ŝlosilo estis elŝaltita" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Ĉi tiu ŝlosilo eksvalidiĝis" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Ĉi tiu ŝlosilo estas malfidita" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Ŝlosil-ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmo" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Kreite" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +#, fuzzy +msgid "Expiry" +msgstr "Senvalidiĝos" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Kapabloj" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nomo" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Komento" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Grando" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:510 +#, fuzzy +msgid "Standalone signature" +msgstr "Subskribo" + +#: ../ui/gcr-gnupg-renderer.c:512 +#, fuzzy +msgid "Generic certification of key" +msgstr "Malŝlosi atestilon" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klaso" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Nur loke" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Elportebla" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Fingropremaĵo" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Publika subŝlosilo" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Sekreta ŝlosilo" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Pravaloriante…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Enportado estas farata…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Enportite al: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Enporti al: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Ne eblas enporti ĉar ne estas kongruaj enportiloj" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Neniu datumo por enporti" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Ŝlosilo" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privata RSA-ŝlosilo" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privata DSA-ŝlosilo" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Publika DSA-ŝlosilo" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bito" +msgstr[1] "%u bitoj" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Forto" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Fingropremaĵoj" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Nuligi" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Bone" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Aŭtomate elektita" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "La uzanto nuligis la operacion" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Por enporti, bonvole enigu pasvorton." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Pasvorto:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Ĵetono:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Malŝlosi" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etikedo:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Enport-agordoj" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Konfirmi:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Pasvortoj ne kongruas." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Pasvorto ne povas esti malplena" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Malŝlosi aliron al pasvortoj kaj aliaj sekretoj" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Dosiero jam ekzistas kun ĉi tiu nomo." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Ĉu vi volas anstataŭigi ĝin per nova dosiero?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Anstataŭigi" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "La ago estis nuligita." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Elporti atestilon" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "Kon_servi" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Atestil-dosieroj" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-dosieroj" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +#| msgid "Automatically unlock this keyring whenever I'm logged in" +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Aŭtomate malŝlosi ĉi tiun ŝlosilaron ĉiam kiam mi estas ensalutita" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Ŝlosi ĉi tiun ŝlosilaron kiam mi elsalutas" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Ŝlosi ĉi tiun ŝlosilaron poste" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutoj" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Malŝlosi: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Pasvorto" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Vidigilo por GCR-atestiloj kaj ŝlosiloj" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Montri la version de la programo" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[dosiero...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Montri dosierojn de atestiloj kaj ŝlosiloj" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Atestil-vidigilo" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "La pasvorto estis nekorekta" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Enportite" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Enporto malsukcesis" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Enporti" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Fermi" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Malŝlosi" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..1f13044 --- /dev/null +++ b/po/es.po @@ -0,0 +1,1156 @@ +# translation of gnome-keyring.master.po to Español +# Translation of gnome-keyring to Spanish. +# This file is distributed under the same license as the gnome-keyring package. +# Copyright (C) 2006 The Free Software Foundation. +# +# Francisco Javier F. Serrador , 2003, 2004, 2006. +# +# Jorge González , 2007, 2009-2011. +# Daniel Mustieles , 2011-2014, 2016-2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-04-15 18:27+0000\n" +"PO-Revision-Date: 2017-06-21 08:18+0200\n" +"Last-Translator: Daniel Mustieles \n" +"Language-Team: es \n" +"Language: es\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" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Componente del dominio" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID del usuario" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Dirección de correo electrónico" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Fecha nacimiento" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Lugar de nacimiento" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sexo" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "País de nacionalidad" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "País de residencia" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nombre común" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Apellido" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Número de serie" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localidad" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Estado" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Calle" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organización" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unidad de organización" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Tratamiento" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Número de teléfono" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nombre de pila" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniciales" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Generador del calificador" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Calificador del nombre de dominio" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Seudónimo" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 con RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 con RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 con RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 con DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Curva elíptica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 con ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 con ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 con ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 con ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 con ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autenticación del servidor" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autenticación del clente" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Firmado de código" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Protección de correo-e" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Marca de tiempo" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Error al cargar el módulo PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "No se pudo inicializar el módulo PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "No se pudieron inicializar los módulos PKCS#11 registrados: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "El URI tiene una codificación no válida." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "El URI no tiene el esquema «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "El URI tiene una sintaxis incorrecta." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "El URI tiene un número de versión incorrecto." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Se cerró el flujo" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nombre" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emitido por" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Caduca" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificado" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Otro nombre" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Dirección XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "Servidor de DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Correo-e" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Dirección X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nombre de la carpeta" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nombre del grupo EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Dirección IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID registrado" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipo de clave no soportada para la solicitud del certificado" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "No se puede usar la clave para firmar la solicitud" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Depósito GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Depósito GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Clave GPG" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID de la clave" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "El proceso Gnupg finalizó con el código: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "El proceso Gnupg terminó con la señal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Se canceló la operación" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Clave privada" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Clave pública" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Solicitud de certificado" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Datos no reconocidos o no soportados." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "No se pudieron analizar los datos no válidos o corruptos." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Los datos están bloqueados" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continuar" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Cancelar" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atributos de la clave no reconocidos o no disponibles" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "No se pudo generar la clave pública" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Ya hay otra petición en progreso" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "No se pudo encontrar un lugar para almacenar el certificado firmado" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Restricciones básicas" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoridad de certificación" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Sí" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "No" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Longitud máxima de la ruta" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Sin límite" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Uso extendido de la clave" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Propósitos permitidos" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificador del asunto de la clave" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificador de clave" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Firma digital" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Cifrado de la clave" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Cifrado de los datos" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acuerdo de la clave" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Firma del certificado" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Firma de la lista de revocación" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Uso de la clave" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Usos" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Nombres alternativos del asunto" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extensión" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificador" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valor" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "No se pudo exportar el certificado." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identidad" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificado por" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Caduca" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nombre del asunto" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nombre del emisor" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificado emitido" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versión" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "No es válido antes de" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "No es válido después de" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Huellas de certificados" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Información de la clave pública" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Firma" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportar certificado…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Clave del algoritmo" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parámetros de la clave" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Tamaño de la clave" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Huella de la clave SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritmo de firma" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parámetros de la firma" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Crítico" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Solicitud de certificador" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atributo" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipo" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Desafío" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detalles" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "No se pudo mostrar «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "No se pudo mostrar el archivo" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Razón" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "No se pueden mostrar los archivos de este tipo." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Cifrar" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Firmar" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certificar" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autenticar" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Desactivada" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Desconocida" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "No válida" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Desactivada" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revocada" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Caducada" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Confianza no definida" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "No confiada" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Confianza marginal" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Confianza completa" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Confianza última" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Todavía no se ha verificado la información de esta clave" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "La clave no es válida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Esta clave se ha desactivado" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Esta clave se ha revocado" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Esta clave ha caducado" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Esta clave no está confiada" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Esta clave está confiada marginalmente" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Esta clave está confiada completamente" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Esta clave está confiada útimamente" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID de la clave" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmo" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Creada" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Caducidad" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Prestaciones" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Propietario de la confianza" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nombre" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comentario" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atributo de usuario" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Tamaño" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Firma de un documento binario" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Firma de un documento de texto canónico" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Firma independiente" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificación genérica de la clave" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificación personal de la clave" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificación casual de la clave" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificación positiva de la clave" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Firma de la vinculación de la subclave" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Firma de la vinculación de la clave primaria" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Firmar directamente en la clave" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Firma de la clave de revocación" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Firma de la subclave de revocación" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Firma del certificado de revocación" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Marca de tiempo de la firma" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Firma de la confirmación de la clave de terceras partes" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Clase" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Sólo local" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportable" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Clave de revocación" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Huella" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Subclave pública" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Clave secreta" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Subclave secreta" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicializando…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importación en progreso…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importar en: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importar en: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "No se puede importar porque no hay importadores compatibles" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "No hay datos que importar" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Clave" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Clave privada RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Clave privada DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Clave privada de la curva elíptica" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Clave pública DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Clave pública de la curva elíptica" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Fortaleza" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Huellas" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Cancelar" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Aceptar" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Elegidos automáticamente" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "El usuario canceló la operación" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Para poder importar, introduzca la contraseña." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Contraseña:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Desbloquear" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiqueta:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importar configuración" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirmar:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Las contraseñas no coinciden." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "La contraseña no puede estar vacía" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Petición de acceso" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Desbloquear el acceso a contraseñas y otros secretos" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "La existe un archivo con este nombre." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "¿Quiere reemplazarlo por uno nuevo?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Reemplazar" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Se canceló la operación." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exportar certificado" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Guardar" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Archivos de certificados" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Archivos PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Desbloquear este depósito de claves siempre que haya iniciado sesión" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloquear este depósito de claves al cerrar la sesión" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloquear después este depósito de claves" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloquear este depósito de claves si está inactivo durante" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutos" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Desbloquear: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Contraseña" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"El contenido de «%s» está bloqueado. Para poder ver el contenido debe " +"introducir la contraseña correcta." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"El contenido está bloqueado. Introduzca la contraseña correcta para poder " +"ver el contenido." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Certificado GCR y visor de claves" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostrar la versión de la aplicación" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[archivo…]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr ": ver certificados y archivos de claves" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visor de certificados" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "La contraseña era incorrecta" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importado" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Falló al importar" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importar" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Cerrar" + +#~| msgid "Capabilities" +#~ msgctxt "Disabled" +#~ msgid "capability" +#~ msgstr "prestaciones" + +#~| msgid "Owner trust" +#~ msgctxt "Disabled" +#~ msgid "ownertrust" +#~ msgstr "propietario de la confianza" + +#~| msgid "Export certificate" +#~ msgid "Export Certificate..." +#~ msgstr "Exportar certificado…" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Módulos PKCS#11 no válido: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "No se pudo configurar el módulo PKCS#11: %s" + +#~ msgid "Label" +#~ msgstr "Etiqueta" + +#~ msgid "Unlock" +#~ msgstr "Desbloquear" diff --git a/po/et.po b/po/et.po new file mode 100644 index 0000000..7ad8d55 --- /dev/null +++ b/po/et.po @@ -0,0 +1,1051 @@ +# GNOME võtmerõnga eesti keele tõlge. +# Estonian translation of GNOME-keyring. +# +# Copyright (C) 2005, 2006 Free Software Foundation, Inc. +# Copyright (C) 2007–2011 The GNOME Project. +# This file is distributed under the same license as the gnome-keyring package. +# +# Ivar Smolin , 2005–2011. +# Priit Laes , 2005, 2006, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring MASTER\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2011-03-10 08:00+0200\n" +"Last-Translator: Ivar Smolin \n" +"Language-Team: Estonian \n" +"Language: et\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Domeeni osa" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "Kasutaja ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "E-posti aadress" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Sünniaeg" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Sünnikoht" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Sugu" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Koduriik" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Asukohariik" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Üldine nimi" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Perekonnanimi" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "Seerianumber" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Riik" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Paikkond" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Maakond" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Tänav" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Organisatsioon" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Organisatsiooni üksus" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Tiitel" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Telefoni number" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Eesnimi" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Initsiaalid" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Põlvkonna eraldaja" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "Eraldusnime (DN) eraldaja" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonüüm" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 koos RSA-ga" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 koos RSA-ga" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 koos RSA-ga" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 koos DSA-ga" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Seanss on suletud" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "_Nimi:" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Väljaandja nimi" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "Aegub" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Toiming katkestati" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Võta sertifikaat lukust lahti" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "Väljaandja nimi" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +#, fuzzy +msgid "X400 Address" +msgstr "E-posti aadress" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "Subjekti nimi" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +#, fuzzy +msgid "IP Address" +msgstr "E-posti aadress" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "Jah" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "Ei" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Identifitseerja" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "Identifitseerja" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "Allkiri" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "Võtme parameetrid" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Sertifikaat" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "Subjekti nimi" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "Laiend" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "Identifitseerja" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "Väärtus" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "Kriitiline" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "Sertifikaati pole võimalik eksportida." + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "Identiteet" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "Verifitseerija" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "Aegub" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "Subjekti nimi" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "Väljaandja nimi" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "Väljastatud sertifikaat" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "Versioon" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "Pole kehtiv enne" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "Pole kehtiv pärast" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Sõrmejäljed" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "Allkiri" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "Allkirja algoritm" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "Allkirja parameetrid" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "Avaliku võtme andmed" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "Võtme algoritm" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "Võtme parameetrid" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "Võtme suurus" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "Sõrmejälg" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Avalik võti" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "_Üksikasjad:" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Võtmerõnga avamine" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "PGP-võti: %s" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +#, fuzzy +msgid "PGP Key" +msgstr "PGP-võti: %s" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Toiming katkestati" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "Allkiri" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Sertifikaat" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Sertifikaat" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "Tundmatu" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "Aegub" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Need andmed on tundlikud ja neid ei saa avaldada" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Seanss on vigane" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "Moodul on lähtestamata" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Seda võtit pole võimalik mähkida" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Parool või PIN on aegunud" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Võti on valet liiki" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "Algoritm" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "Aegub" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "_Nimi:" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "Suurus" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "Allkirja parameetrid" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "Allkiri" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Võta sertifikaat lukust lahti" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "Allkirja parameetrid" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "Paikkond" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "Sõrmejälg" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Avalik võti" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "Initsiaalid" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "Impordi kuhu:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Impordi kuhu:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Importimine pole võimalik, kuna võti on valet liiki" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "Asukohta, kuhu importida, pole saadaval" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "Võti" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "Salajane RSA-võti" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "Salajane DSA-võti" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Salajane võti" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "Avalik DSA-võti" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d bitt" +msgstr[1] "%d bitti" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "Tugevus" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "Sõrmejäljed" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "Arusaamatud või toetamata andmed." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "Vigaseid või rikutud andmeid pole võimalik töödelda." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "Andmed on lukustatud" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Võta lukust lahti" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s' importimiseks ei tohi see olla lukus" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "Parool:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Määratud sertifikaadi säilitamiseks pole võimalik kohta leida" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "See võtmerõngas võetakse minu sisselogimisel automaatselt lukust lahti" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "See võtmerõngas lukustatakse pärast" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "See võtmerõngas lukustatakse pärast jõudeolekut" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "See võtmerõngas pannakse minu väljalogimisel lukku" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutit" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Võta lukust lahti" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Võta lukust lahti" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "Parool:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "Sertifikaadi- ja võtmehoidla" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "Sertifikaadi- ja võtmehoidla" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Sertifikaat" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Lukust lahtivõtmise parool ei ole korrektne" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Impordi kuhu:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Toiming nurjus" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "Impordi kuhu:" + +#: ../gck/gck-uri.c:223 +#, fuzzy, c-format +msgid "The URI has invalid encoding." +msgstr "Vigane URI süntaks. Välja '%s' kooditabel on vigane." + +#: ../gck/gck-uri.c:227 +#, fuzzy +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI-l puudub skeem 'pkcs11'." + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..c5509f3 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,1148 @@ +# Basque translation of gcr +# translation of gnome-keyring.HEAD.po to Basque +# Copyright (C) 2004 THE eu'S COPYRIGHT HOLDER +# This file is distributed under the same license as the eu package. +# +# Alberto Fernández , 2004. +# Julen Ruiz Aizpuru , 2011. +# Iñaki Larrañaga Murgoitio , 2004, 2006, 2008, 2009, 2010, 2011. +# Iñaki Larrañaga Murgoitio , 2012, 2013, 2014, 2017. +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-10-18 09:40+0000\n" +"PO-Revision-Date: 2017-02-16 17:15+0100\n" +"Last-Translator: Iñaki Larrañaga Murgoitio \n" +"Language-Team: Basque \n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.5\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domeinuaren osagaia" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Erabiltzailearen IDa" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Helbide elektronikoa" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Jaiotze-data" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Jaioterria" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sexua" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Hiritartasunaren estatua" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Egoitzaren estatua" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Izen arrunta" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Abizena" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serie-zenbakia" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Estatua" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Herria" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Herrialdea" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Kalea" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Erakundea" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Erakundeko saila" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titulua" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefono zenbakia" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Izena" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Sigla" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Identifikatzaileen sortzailea" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN identifikatzailea" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Goitizena" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 RSA-rekin" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 RSA-rekin" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 RSA-rekin" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 DSA-rekin" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Kurba eliptikoa" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 ECDSA-rekin" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 ECDSA-rekin" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 ECDSA-rekin" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 ECDSA-rekin" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 ECDSA-rekin" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Zerbitzariaren autentifikazioa" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Bezeroaren autentifikazioa" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Kode sinaketa" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Posta elektronikoaren babesa" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Denbora markatzea" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Errorea PKCS#11 modulua kargatzean: %s" + +#: ../gck/gck-module.c:358 +#, c-format +#| msgid "Couldn't initialize PKCS#11 module: %s" +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Ezin izan da PKCS#11 modulua hasieratu: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +#| msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Ezin izan dira erregistratutako PKCS#11 moduluak hasieratu: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URIak kodeketa baliogabea du." + +#: ../gck/gck-uri.c:228 +#| msgid "The URI does not have the 'pkcs11' scheme." +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URIak ez dauka “pkcs11“ eskema." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URIaren sintaxia okerra da." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URIak bertsio-zenbaki okerra dauka." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Korrontea itxi da" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Izena" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Jaulkitzailea" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Iraungitze-data" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Ziurtagiria" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Bestelako izena" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP helb" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Posta elektronikoa" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 helbidea" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Direktorio-izena" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI taldearen izena" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URIa" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP helbidea" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Erregistratutako IDa" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Onartu gabeko gako mota ziurtagiriaren eskaeran" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Gakoa ezin da erabili eskaera sinatzeko" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG gako-sorta" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG gako-sorta: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP gakoa" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Gakoaren IDa" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg prozesua ondorengo kodearekin irten da: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg prozesua ondorengo seinalearekin amaitu da: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Eragiketa bertan behera utzi da" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Gako pribatua" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Gako publikoa" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Ziurtagiriaren eskaera" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Datu ezezaguna edo onartu gabea." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Ezin izan dira hondatutako edo baliogabeak diren datuak analizatu." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Datuak blokeatuta daude" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Jarraitu" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Utzi" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Gakoaren atributu ezezagunak edo erabilkaitzak" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +#| msgid "Couldn't build public key" +msgid "Couldn’t build public key" +msgstr "Ezin izan da gako publikoa eraiki" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Beste gonbite bat jadanik lantzen ari da" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +#| msgid "Couldn't find a place to store the pinned certificate" +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Ezin izan da salbuespen-ziurtagiria gordetzeko lekurik aurkitu" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Oinarrizko murriztapenak" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Ziurtagiri-emailea" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Bai" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ez" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Bide-izenaren gehienezko luzera" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Mugagabea" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Tekla gehigarriaren erabilera" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Onartutako xedeak" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Gai gakoaren identifikatzailea" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Gako identifikatzailea" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Sinadura digitala" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Gako-zifraketa" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Datu-zifraketa" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Gako-hitzarmena" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Ziurtagiriaren sinadura" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Errebokatze-zerrendaren sinadura" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Gakoaren erabilera" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Erabilerak" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Gaiaren bestelako izenak" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Luzapena" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikatzailea" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Balioa" + +#: ../ui/gcr-certificate-renderer.c:287 +#| msgid "Couldn't export the certificate." +msgid "Couldn’t export the certificate." +msgstr "Ezin izan da ziurtagiria esportatu." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitatea" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Honek egiaztatuta" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Iraungitze-data" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Gaiaren izena" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Jaulkitzailearen izena" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Jaulkitako ziurtagiria" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Bertsioa" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Ez da baliozkoa honen aurretik" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Ez da baliozkoa honen ondoren" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Ziurtagiriaren hatz-markak" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Gako publikoaren informazioa" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Sinadura" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Esportatu ziurtagiria…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Gakoaren algoritmoa" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Gakoaren parametroak" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Gakoaren tamaina" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Gakoaren SHA1 hatz-marka" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Sinaduraren algoritmoa" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Sinaduraren parametroak" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Larria" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Ziurtagiriaren eskaera" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atributua" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Mota" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Erronka" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Xehetasunak" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +#| msgid "Could not display '%s'" +msgid "Could not display “%s”" +msgstr "Ezin izan da “%s“ bistaratu" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Ezin izan da fitxategia bistaratu" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Arrazoia" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Ezin da mota honetako fitxategirik bistaratu." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Enkriptatu" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Sinatu" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Ziurtatu" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentifikatu" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Desgaituta" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Ezezaguna" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Baliogabea" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Desgaituta" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Errebokatuta" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Iraungita" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Definitu gabeko fidagarritasuna" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Fidagarritasunik ez" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Fidagarritasun marjinala" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Fidagarritasun osoa" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Azken aldiko fidagarritasuna" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Gako honen informazioa ez da oraindik egiaztatu" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Gakoa baliogabea da" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Gako hori desgaitu egin da" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Gako hori errebokatu egin da" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Gako hori iraungi egin da" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Gako hori ez da fidagarria" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Gako hori marjinalki fidagarria da" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Gako hori oso fidagarria da" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Gako hori azken aldiko fidagarritasuna du" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Gakoaren IDa" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmoa" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Sortuta" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Iraungitze-data" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Gaitasunak" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Jabearen fidagarritasuna" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Izena" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Iruzkina" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Erabiltzailearen atributua" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Tamaina" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Dokumentu bitar baten sinadura" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Testu-dokumentu kanoniko baten sinadura" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Bakarkako sinadura" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Gakoaren ziurtagiri orokorra" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Gakoaren ziurtagiri pertsonala" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Gakoaren azaleko ziurtagiria" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Gakoaren ziurtagiri positiboa" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Azpigakoaren loturaren sinadura" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Gako nagusiaren loturaren sinadura" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Zuzeneko sinadura gakoan" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Gakoa errebokatzeko sinadura" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Azpigakoa errebokatzeko sinadura" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Ziurtagiria errebokatzeko sinadura" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Sinadura data-zigiluarekin" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Beste batzuen berrespenaren sinadura" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasea" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Lokalak bakarrik" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Esportagarria" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Errebokatze-gakoa" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Hatz-marka" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Azpigako publikoa" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Ezkutuko gakoa" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Ezkutuko azpigakoa" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Hasieratzen…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Inportatzen ari da…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Hona inportatuta: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Inportatu hona: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Ezin da inportatu ez daudelako inportatzaile bateragarririk" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Ez dago daturik inportatzeko" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Gakoa" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "RSA gako pribatua" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "DSA gako pribatua" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Kurba eliptikoaren gako pribatua" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "DSA gako publikoa" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Kurba eliptikoaren gako publikoa" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "bit %u" +msgstr[1] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Indarra" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Hatz-markak" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Utzi" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Ados" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatikoki aukeratuta" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Erabiltzaileak bertan behera utzitako eragiketa" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Inportatzeko xedearekin, sartu pasahitza." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Pasahitza:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Tokena:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Desblokeatu" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiketa:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Inportatzeko ezarpenak" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Berretsi:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Pasahitzak ez datoz bat" + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Pasahitza ezin da hutsa izan" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Sarbidetzaren gonbitea" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Desblokeatu sarbidea pasahitzetara eta bestelako sekretuetara" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Badago lehendik izen hori duen fitxategi bat." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Fitxategi berriarekin ordeztu nahi duzu?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Ordeztu" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Eragiketa bertan behera utzi da." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Esportatu ziurtagiria" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Gorde" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Ziurtagiri-fitxategiak" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM fitxategiak" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +#| msgid "Automatically unlock this keyring whenever I'm logged in" +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Desblokeatu automatikoki gako-sorta hau saioa hastean" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Blokeatu gako-sorta saioa amaitzean" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Blokeatu gako-sorta:" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Blokeatu gako-sorta inaktibo badago:" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minututan" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Desblokeatu: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Pasahitza" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +#| msgid "" +#| "The contents of '%s' are locked. In order to view the contents, enter the " +#| "correct password." +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Blokeatuta daude “%s“(r)en edukiak. Ikusi ahal izateko, sartu pasahitz " +"zuzena." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Blokeatuta daude edukiak. Ikusi ahal izateko, sartu pasahitz zuzena." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR ziurtagiria eta gakoen ikustailea" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Erakutsi aplikazioaren bertsioa" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fitxategia...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Ikusi ziurtagien eta gakoen fitxategiak" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Ziurtagiri-ikustailea" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Pasahitza okerra da" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Inportatuta" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Huts egin du inportatzeak" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Inportatu" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Itxi" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "PKCS#11 modulu baliogabea: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Ezin izan da PKCS#11 modulua konfiguratu: %s" + +#~ msgid "Unlock" +#~ msgstr "Desblokeatu" diff --git a/po/fa.po b/po/fa.po new file mode 100644 index 0000000..fec153d --- /dev/null +++ b/po/fa.po @@ -0,0 +1,1129 @@ +# Persian translation for gnome-keyring. +# Copyright (C) 2011 Iranian Free Software Users Group (IFSUG.org)translation team. +# This file is distributed under the same license as the gnome-keyring package. +# Arash Mousavi , 2011, 2012, 2013, 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2015-09-16 17:07+0000\n" +"PO-Revision-Date: \n" +"Last-Translator: Arash Mousavi \n" +"Language-Team: Persian\n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: UTF-8\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.8.4\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "عناصر دامنه" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "شناسه کاربر" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "آدرس پست الکترونیکی" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "تاریخ تولد" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "محل تولد" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "جنسیت" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "کشور تابعیت" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "کشور محل اقامت" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "نام متعارف" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "نام خانوادگی" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "شماره سریال" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "کشور" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "مکان" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "استان" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "خیابان" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "سازمان" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "واحد سازمانی" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "سمت" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "شماره تلفن" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "نام" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "قسمت‌های اولیه" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "توصیف کننده ساخت" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "توصیف کننده DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "اسم مستعار" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 همراه با RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 همراه با RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 همراه با RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 همراه با DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "منحنی بیضوی" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 همراه با ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 همراه با ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 همراه با ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 همراه با ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 همراه با ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "تصدیق هویت کارگزار" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "تصدیق هویت کارگیر" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "امضا کد" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "محافظت از پست‌الکترونیکی" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "ثبت وقایع" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "خطا در هنگام بار کردن ماژول PKCS#11، خطا: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "نمی‌توان ماژول PKCS#11 را مقدار دهی اولیه کرد: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "نمی‌توان ماژول PKCS#11 ثبت شده را مقدار دهی اولیه کرد: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "کدگذاری آدرس نادرست است." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "آدرس شِمای «pkcs11» را ندارد." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "آدرس ترکیب بدی دارد." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "عدد نسخه آدرس مناسب نیست." + +#: ../gcr/gcr-callback-output-stream.c:60 ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "جریان بسته شد" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "نام" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "صادر شده توسط" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "انقضا" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "گواهینامه" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "نام دیگر" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "آدرس XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "پست‌الکترونیکی" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "دی‌ان‌اس" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "آدرس X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "نام شاخه" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "نام دسته EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "آدرس اینترنتی" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "آدرس آی‌پی" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "شناسه ثبت شده" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "نوع کلید پشتیبانی نشده برای درخواست گواهینامه" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "برای امضا درخواست نمی‌توان از کلید استفاده کرد" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "دسته‌کلید GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "دسته‌کلید GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "کلید PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "شناسه کلید" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "فراروند Gnupg با کد مقابل خارج شد: %Id" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "فراروند Gnupg با کد پایان یافت: %Id" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 ../gcr/gcr-parser.c:3160 +#: ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "عملیات لغو شد" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "کلید خصوصی" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "کلید عمومی" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "درخواست گواهینامه" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "اطلاعات پشتیبانی یا تشخیص داده نشده." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "نمی‌توان اطلاعات نادرست یا خراب را تجزیه کرد." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "اطلاعات قفل است" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "ادامه" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "لغو" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "متغیرهای ناشناخته یا ناموجود برای کلید" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "نمی‌توان کلید عمومی را ساخت" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "یک فرمان دیگر در حال اجراست." + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "نمی‌توان یک محل برای دخیره گواهینامه پین شده پیدا کرد" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "محدودیت‌های پایه" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "گواهینامه مجاز" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "بله" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "خیر" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "بیشینه اندازه مسیر" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "نامحدود" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "نحوه استفاده از کلید تعمیم یافته" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "اهداف مجاز" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "شناساگر کلید موضوع" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "شناساگر کلید" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "امضا دیجیتالی" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "کلید encipherment" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "اطلاعات encipherment" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "موافقتنامه کلید" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "امضا گواهینامه" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "فهرست ابطال امضا" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "نحوه استفاده کلید" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "نحوه استفاده" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "نام‌های جایگزین موضوع" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "افزونه" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "شناساگر" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "مقدار" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "نمی‌توان گواهینامه صادر کرد." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "هویت" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "تایید شده توسط" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "انقضا" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "نام موضوع" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "نام صادر کننده" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "گواهینامه صادر شده" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "نسخه" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "معتبر نیست قبل از" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "معتبر نیست بعد از" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "اثرهای انگشت گواهینامه" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "اطلاعات کلید عمومی" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "امضا" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "صدور گواهینامه..." + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "الگوریتم کلید" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "پارامترهای کلید" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "اندازه کلید" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "کلید اثرانگشت SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "الگوریتم امضا" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "پارامترهای امضا" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "حیاتی" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "درخواست گواهینامه" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "متغیر" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "نوع" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "چالش" + +#: ../ui/gcr-display-view.c:316 +msgid "_Details" +msgstr "_جزئیات" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "نمی‌توان «%s» را نمایش داد" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "نمی‌توان پرونده را نمایش داد" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "دلیل" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "نمی‌توان پرونده‌ای با این نوع را نمایش داد." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "رمزنگاری" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "امضا" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "گواهی" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "تصدیق‌هویت" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "غیرفعال شده" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "ناشناس" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "نامعتبر" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "غیرفعال شده" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "لغو شد" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "منقضی شده" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "اطمینان تعریف نشده" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "نامطمئن شد" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "حدودا مورد اطمینان شد" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "کاملا مورد اطمینان شد" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "به شدت مورد اطمینان شد" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "اطلاعات درون این کلید تایید نشده‌اند" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "این کلید نامعتبر است" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "این کلید غیرفعال شده است" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "این کلید لغو شده است" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "این کلید منقضی شده است" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "این کلید مورد اطمینان نیست" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "این کلید تقریبا مورد اطمینان است" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "این کلید کاملا مورد اطمینان است" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "این کلید به شدت قابل اعتماد است" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "شناسه کلید" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "الگوریتم" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "ساخته شده" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "انقضا" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "قابلیت‌ها" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "اعتماد مالک" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "نام" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "نظر" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "متغیر کاربر" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "اندازه" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "امضا یک سند باینری" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "امضا یک سند متنی معیار" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "امضا متکی به خود" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "گواهینامه عمومی کلید" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "گواهینامه شخصی کلید" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "گواهینامه اتفاقی کلید" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "گواهینامه مثبت کلید" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "امضا مقیدسازی زیرکلید" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "امضا مقیدسازی کلید اصلی" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "امضا مستقیما بر کلید" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "امضا لغو کلید" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "امضا لغو زیرکلید" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "امضا لغو گواهینامه" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "امضا زمان" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "امضا تایید شخص‌ثالث" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "کلاس" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "تنها محلی" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "قابل خارج کردن" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "کلید لغو" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "اثر انگشت" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "زیرکلید عمومی" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "کلید مخفی" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "زیرکلیدهای مخفی" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "درحال مقداردهی اولیه..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "وارد کردن در حال پیشروی است..." + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "وارد شد به: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "وارد کردن به: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "بدلیل اینکه هیچ واردکننده‌ی سازگاری وجود ندارد، نمی‌توان وارد کرد" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "هیچ اطلاعاتی برای واردکردن نیست" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "کلید" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "کلید RSA خصوصی" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "کلید DSA خصوصی" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "کلید منحنی بیضوی خصوصی" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "کلید DSA عمومی" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "کلید منحنی بیضوی عمومی" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%Iu بیت" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "استحکام" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "اثرهای انگشت" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_لغو" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_تایید" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "به‌طور خودکار انتخاب شد" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "کاربر عملیات را لغو کرد" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "برای وارد کردن، لطفا گذرواژه را وارد کنید." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "گذرواژه:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "نشان:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "بازکردن قفل" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "برچسب:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "وارد کردن تنظیمات" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "تایید:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "گذرواژه‌ها مطابقت ندارند." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "گذرواژه نمی‌تواند خالی باشد" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "فرمان دسترسی" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "باز کردن قفل دسترسی به گذرواژها و رازهای دیگر" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "یک پرونده از قبل با این نام وجود دارد." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "آیا می‌خواهید آن را با پرونده جدید جای‌گزین کنید؟" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_جای‌گزین کردن" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "عملیات لغو شد." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "صدور گواهینامه" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_ذخیره" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "پرونده‌های گواهینامه" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "پرونده‌های PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "به طور خودکار هنگامی که وارد سیستم شدم قفل این دسته‌کلید را باز کن" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "قفل کردن این دسته‌کلید هنگامی که از سیستم خارج شدم" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "قفل کردن این دسته‌کلید بعد از" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "قفل کردن این دسته‌کلید اگر بیکار بود، برای" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "دقیقه" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "بازکردن قفل: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "گذرواژه" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "محتویات «%s» قفل شده است. جهت نمایش محتویات، گذرواژه صحیح را وارد کنید." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "محتویات قفل شده‌اند. جهت نمایش محتویات، گذرواژه صحیح را وارد کنید." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "نمایشگر گواهی‌نامه و کلید GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "نمایش نسخه برنامه" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[file...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- نمایش پرونده‌های گواهینامه و کلید" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "نمایشگر گواهینامه" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "گذرواژه‌ نادرست بود" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "وارد شد" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "وارد کردن شکست خورد" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "واردکردن" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_خروج" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "ماژول PKCS#11 نامعتبر: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "نمی‌توان ماژول PKCS#11 را نصب کرد: %s" + +#~ msgid "Label" +#~ msgstr "برچسب" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "بازکردن قفل" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..8fd7558 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,1166 @@ +# Finnish translation for gnome-keyring +# Copyright (C) 2004-2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# +# Sanastoa: +# keyring = avainnippu +# Timo Jyrinki , 2008. +# Ilkka Tuohela , 2005-2009. +# Tommi Vainikainen , 2004-2006, 2009-2010. +# Jiri Grönroos , 2012, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-03 18:11+0200\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: suomi \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Launchpad-Export-Date: 2011-09-08 09:16+0000\n" +"X-Generator: Poedit 1.8.7.1\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Aluenimen osa" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Käyttäjätunniste" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Sähköpostiosoite" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Syntymäpäivä" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Synnyinpaikka" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sukupuoli" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Kotimaa" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Asuinmaa" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Yleinen nimi" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Sukunimi" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Sarjanumero" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Lääni" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Paikkakunta" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Valtio" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Katu" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisaatio" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organisaatioyksikkö" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titteli" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Puhelinnumero" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Etunimi" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Nimikirjaimet" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Luontimääre" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN-määre" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonyymi" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 ja RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 ja RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 ja RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 ja DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "" + +#: ../egg/egg-oid.c:106 +#| msgid "SHA1 with DSA" +msgid "SHA1 with ECDSA" +msgstr "SHA1 ja ECDSA" + +#: ../egg/egg-oid.c:107 +#| msgid "SHA1 with DSA" +msgid "SHA224 with ECDSA" +msgstr "SHA224 ja ECDSA" + +#: ../egg/egg-oid.c:108 +#| msgid "SHA1 with DSA" +msgid "SHA256 with ECDSA" +msgstr "SHA256 ja ECDSA" + +#: ../egg/egg-oid.c:109 +#| msgid "SHA1 with DSA" +msgid "SHA384 with ECDSA" +msgstr "SHA384 ja ECDSA" + +#: ../egg/egg-oid.c:110 +#| msgid "SHA1 with DSA" +msgid "SHA512 with ECDSA" +msgstr "SHA512 ja ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Virhe PKCS#11-moduulia ladatessa: %s" + +#: ../gck/gck-module.c:358 +#, fuzzy, c-format +#| msgid "Couldn't initialize PKCS#11 module: %s" +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "PKCS#11-moduulin alustaminen epäonnistui: %s" + +#: ../gck/gck-modules.c:62 +#, fuzzy, c-format +#| msgid "Couldn't initialize PKCS#11 module: %s" +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "PKCS#11-moduulin alustaminen epäonnistui: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Istunto on suljettu" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nimi" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Myöntänyt" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Vanhenee" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Varmenne" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Muu nimi" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Sähköpostiosoite" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-osoite" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-osoite" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG -avainnippu" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG-avainnippu: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-avain" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg-prosessi poistui koodilla: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg-prosessi lopetettiin signalilla: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Toiminto peruttiin" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Salainen avain" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Julkinen avain" + +#: ../gcr/gcr-parser.c:353 +#, fuzzy +#| msgid "Certificate" +msgid "Certificate Request" +msgstr "Varmenne" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Tuntematon tai ei tuettu tieto." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Virheellistä tai viallista tietoa ei voitu tulkita." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "tiedot on lukittu" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Jatka" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Peru" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Anna OpenSSH-tunnuslauseesi" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Julkista avainta ei voitu rakentaa" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, fuzzy, c-format +#| msgid "Couldn't export the certificate." +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Varmenteen vienti epäonnistui." + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Varmentaja" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Kyllä" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ei" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Sallitut tarkoitukset" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Avaimen tunniste" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitaalinen allekirjoitus" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Pääte" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Tunniste" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Arvo" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Varmenteen vienti epäonnistui." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identiteetti" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Vanhenee" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Kohteen nimi" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Myöntäjän nimi" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Myöntäjän varmenne" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versio" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Ei voimassa ennen" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Ei voimassa jälkeen" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Varmenteen tunnistetiedot" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Tietoja julkisesta avaimesta" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Allekirjoitus" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Vie varmenne…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Avaimen algoritmi" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Avaimen parametrit" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Avaimen koko" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Avaimen SHA1-tunnistetieto" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Allekirjoituksen algoritmi" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Allekirjoituksen parametrit" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kriittinen" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +#, fuzzy +#| msgid "Certificate" +msgid "Certificate request" +msgstr "Varmenne" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tyyppi" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Tiedot" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Ei voitu näyttää “%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Ei voitu näyttää tiedostoa" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Syy" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Tämän tyyppistä tiedostoa ei voi näyttää." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:216 +#, fuzzy +msgid "Sign" +msgstr "Allekirjoitus" + +#: ../ui/gcr-gnupg-renderer.c:218 +#, fuzzy +msgid "Certify" +msgstr "Varmenne" + +#: ../ui/gcr-gnupg-renderer.c:220 +#, fuzzy +msgid "Authenticate" +msgstr "Varmenne" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Tuntematon" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Virheellinen" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Kumottu" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Vanhentunut" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Määrittämätön luotto" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Ei luotettu" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Hieman luotettu" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Täysin luotettu" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Erittäin luotettu" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Tämän avaimen tietoja ei ole vielä vahvistettu" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Avain on virheellinen" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Tämä avain on poistettu käytöstä" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Avain on kumottu" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Avain on vanhentunut" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Avain ei ole luotettu" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Avain on hieman luotettu" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Avain on täysin luotettu" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Avain on erittäin luotettu" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmi" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Luotu" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +#, fuzzy +msgid "Expiry" +msgstr "Vanhenee" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nimi" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Kommentti" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Koko" + +#: ../ui/gcr-gnupg-renderer.c:506 +#, fuzzy +msgid "Signature of a binary document" +msgstr "Allekirjoituksen parametrit" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:510 +#, fuzzy +msgid "Standalone signature" +msgstr "Allekirjoitus" + +#: ../ui/gcr-gnupg-renderer.c:512 +#, fuzzy +msgid "Generic certification of key" +msgstr "Avaa varmenne" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:524 +#, fuzzy +msgid "Signature directly on key" +msgstr "Allekirjoituksen parametrit" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Luokka" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Vain paikallinen" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Kumoamisavain" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Tunnistetieto" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Julkinen aliavain" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Salainen avain" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Salainen aliavain" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Alustetaan…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Tuonti on meneillään…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Tuotu kohteeseen: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Tuo kohteeseen: %s" + +#: ../ui/gcr-import-button.c:164 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Tuonti epäonnistui, koska avain oli väärän tyyppinen" + +#: ../ui/gcr-import-button.c:173 +#, fuzzy +msgid "No data to import" +msgstr "Kohteen tuontia varten ei ole sijaintia saatavilla" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Avain" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Yksityinen RSA-avain" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Yksityinen DSA-avain" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Julkinen DSA-avain" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bitti" +msgstr[1] "%u bittiä" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Vahvuus" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Tunnistetiedot" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Peru" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automaattisesti valittu" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Käyttäjä perui toiminnon" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Anna salasana suorittaaksesi tuonnin." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Salasana:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Avaa lukitus" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Nimike:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Tuontiasetukset" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Vahvista:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Salasanat eivät täsmää" + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Salasana ei voi olla tyhjä" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Avaa lukitus salasanoihin ja muihin salaisuuksiin" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Samalla nimellä on jo tiedosto olemassa." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Haluatko korvata sen uudella tiedostolla?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Korvaa" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Toiminto peruttiin." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Vie varmenne" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Tallenna" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Varmennetiedostot" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-tiedostot" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Avaa tämä avainnippu automaattisesti kun olen sisäänkirjautunut" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Lukitse tämä avainnippu kun kirjaudun ulos" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Lukitse tämä avainnippu" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Lukitse tämä avainnippu jouten oltaessa" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minuutin kuluttua" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Avaa lukitus: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Salasana" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Kohteen “%s” sisältö on lukittu. Jotta voit nähdä sen sisällön, anna oikea " +"salasana." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Sisältö on lukittu. Jotta voit nähdä sisällön, anna oikea salasana." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR - varmenteiden ja avainten katselin" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Näytä sovelluksen versio" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[tiedosto...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Katsele varmenne- ja avaintiedostoja" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Varmennekatselin" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Salasana oli väärä" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Tuotu" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Tuonti epäonnistui" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Tuo" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Sulje" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Virheellinen PKCS#11-moduuli: %s" + +#~ msgid "Label" +#~ msgstr "Nimike" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Avaa lukitus" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..368f255 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,1145 @@ +# French translation of gnome-keyring. +# Copyright (C) 2004-2017 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# +# Sébastien Bacher , 2004. +# Christophe Merlet , 2004. +# Laurent Richard , 2006. +# Jonathan Ernst , 2006. +# Yann Simon , 2007. +# Claude Paroz , 2007-2017. +# Robert-André Mauchin , 2008. +# Bruno Brouard , 2008-2011. +# Laurent Coudeur , 2009-2010. +# Gérard Baylard , 2011. +# Cédric Felizard , 2011. +# Josselin TILLAY-DOLEDEC , 2012. +# Alexandre Franke , 2012. +# Guillaume Bernard , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring HEAD\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-03 13:27+0100\n" +"Last-Translator: Guillaume Bernard \n" +"Language-Team: GNOME French Team \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" +"X-Generator: Poedit 2.0.6\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Composant du domaine" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID utilisateur" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Adresse électronique" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Date de naissance" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Lieu de naissance" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sexe" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Pays de citoyenneté" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Pays de résidence" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nom courant" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Nom de famille" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Numéro de série" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Pays" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localité" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "État" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Rue" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisation" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unité d’organisation" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titre" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Numéro de téléphone" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Prénom" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Initiales" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Qualificatif de génération" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Qualificatif DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonyme" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD avec RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 avec RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA+ avec RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 avec DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Courbe elliptique" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 avec ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 avec ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 avec ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 avec ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 avec ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Authentification de serveur" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Authentification de client" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Signature de code" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Protection de courriel" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Horodatage" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Erreur de chargement du module PKCS#11 : %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Impossible d’initialiser le module PKCS#11 : %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Impossible d’initialiser les modules PKCS#11 enregistrés : %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Le codage de l’URI n’est pas valide." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "L’URI ne respecte pas le modèle « pkcs11 »." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "La syntaxe de l’URI n’est pas correcte." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Le numéro de version de l’URI n’est pas correct." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Le flux a été fermé" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nom" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Émis par" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Expire" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Autre nom" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Adresse XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Courriel" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Adresse X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nom d’annuaire" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nom de partenaire EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Adresse IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID enregistré" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Type de clé non pris en charge pour une requête de certification" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "La clé ne peut pas être utilisée pour signer la requête" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Trousseau de clé GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Trousseau de clé GnuPG : %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Clé PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID de la clé" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Le processus gnupg s’est terminé avec le code : %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Le processus gnupg a été fermé par le signal : %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "L’opération a été annulée" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Clé privée" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Clé publique" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Requête de certificat" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Données non valides ou non gérées." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Impossible d’analyser les données non valides ou corrompues." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Les données sont verrouillées" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continuer" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Annuler" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Saisissez votre phrase de passe OpenSSH" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Attributs de clé non reconnu ou non valide" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Impossible de créer la clé publique" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Une autre invite est déjà en cours" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" +"Impossible de trouver un emplacement pour enregistrer le certificat accepté." + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Contraintes de base" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autorité de certification" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Oui" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Non" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Longueur de chemin maximale" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Illimité" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utilisation de clé étendue" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Usages autorisés" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificateur de clé du sujet" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificateur de clé" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Signature numérique" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Chiffrement de clé" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Chiffrement de données" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Accord de clé" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Signature de certificat" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Signature de liste de révocation" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Utilisation de clé" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Utilisations" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Noms alternatifs du sujet" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extension" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificateur" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valeur" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Impossible d’exporter le certificat." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identité" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Vérifié par" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Expire" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nom du sujet" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nom d’émetteur" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificat émis" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Version" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Non valide avant" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Non valide après" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Empreintes de certificat" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Information sur la clé publique" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signature" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exporter le certificat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algorithme de la clé" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Paramètres de la clé" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Taille de la clé" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Empreinte SHA1 de clé" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algorithme de signature" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Paramètres de signature" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Critique" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Demande de certificat" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Type" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Détails" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Impossible d’afficher « %s »" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Impossible d’afficher le fichier" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Motif" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Impossible d’afficher un fichier de ce type." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Chiffrer" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Signer" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certifier" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Authentifier" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Désactivée" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Inconnu" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Non valide" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Désactivée" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Révoqué" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Expiré" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Confiance non définie" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Suspicieux" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Faible confiance" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Entière confiance" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Confiance ultime" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "L’information contenue dans cette clé n’a pas encore été vérifiée" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Cette clé est non valide" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "La clé a été désactivée" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "La clé a été révoquée" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "La clé a expiré" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "La clé est dénigrée" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "La confiance dans cette clé est faible" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "La confiance dans cette clé est entière" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "La confiance dans cette clé est ultime" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Identifiant de la clé" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algorithme" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Créé" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Expiration" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Capacités" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Fiabilité du propriétaire" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nom" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Commentaire" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Attribut utilisateur" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Taille" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signature d’un document binaire" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signature d’un document texte canonique" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Signature autonome" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certification générique de clé" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certification de clé d’un pseudonyme" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certification temporaire de clé" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certification positive de clé" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Signature de lien à la sous-clé" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Signature de lien à la clé primaire" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Signature directement sur la clé" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Signature de révocation de clé" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Signature de révocation de sous-clé" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Signature de révocation de certificat" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Signature avec date" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Signature de confirmation tierce" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classe" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Seulement local" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportable" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Clé de révocation" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Empreintes" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Sous-clé publique" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Clé secrète" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Sous-clé secrète" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Initialisation…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importation en cours…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importé vers : %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importer vers : %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Impossible d’importer car il n’y a pas d’importateur compatible" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Aucune donnée à importer" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Clé" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Clé RSA privée" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Clé DSA privée" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Clé courbe elliptique privée" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Clé DSA publique" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Clé courbe elliptique publique" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Robustesse" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Empreintes" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Annuler" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Valider" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Choisi automatiquement" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "L’utilisateur a annulé l’opération" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Afin d’importer, saisissez le mot de passe." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Mot de passe :" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Jeton :" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Déverrouiller" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Étiquette :" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Paramètres d’importation" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirmer :" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Les mots de passe ne correspondent pas." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Le mot de passe ne peut être vide" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Invite d’accès" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Débloquer l’accès aux mots de passe et autres secrets" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Un fichier portant ce nom existe déjà." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Voulez-vous le remplacer par un nouveau fichier ?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Remplacer" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "L’opération a été annulée." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exporter le certificat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Enregistrer" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Fichiers de certificat" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Fichiers PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "" +"Déverrouiller automatiquement ce trousseau de clés quand je suis connecté" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Verrouiller ce trousseau de clés quand je me déconnecte" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Verrouiller ce trousseau de clés après" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Verrouiller ce trousseau de clés s’il est inactif pendant" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutes" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Déverrouiller : %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Mot de passe" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Le contenu de « %s » est verrouillé. Pour voir ce contenu, saisissez le mot " +"de passe correct." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Le contenu est verrouillé. Pour voir ce contenu, saisissez le mot de passe " +"correct." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Afficheur de certificats et de clés GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Affiche la version de l’application" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fichier...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Afficher des fichiers de certificats et de clés" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Afficheur de certificats" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Le mot de passe n’est pas correct" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importé" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Échec de l’importation" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importer" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Fermer" diff --git a/po/fur.po b/po/fur.po new file mode 100644 index 0000000..03a9ef9 --- /dev/null +++ b/po/fur.po @@ -0,0 +1,1124 @@ +# Friulian translation for gcr. +# Copyright (C) 2016 gcr's COPYRIGHT HOLDER +# This file is distributed under the same license as the gcr package. +# Fabio Tomat , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-10-18 09:40+0000\n" +"PO-Revision-Date: 2016-10-25 22:24+0200\n" +"Last-Translator: Fabio Tomat \n" +"Language-Team: Friulian \n" +"Language: fur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.8\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Component domini" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID utent" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Direzion e-mail" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Date di nassite" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Lûc di nassite" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Gjenar" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Paîs di citadinance" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Paîs di residence" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Non comun" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Cognon" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Numar seriâl" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Paîs" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localitât" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Stât" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Strade" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizazion" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unitât organizative" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titul" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Numar telefonic" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Non" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniziâls" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Cualificadôr gjenerazion" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Cualificadôr DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 cun RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 cun RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 cun RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 cun DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Curve elitiche" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 cun ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 cun ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 cun ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 cun ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 cun ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autenticazion servidôr" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autenticazion client" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Firme codiç" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Protezion e-mail" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Marcadure temporâl" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Erôr tal cjariâ il modul PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Impussibil inizializâ il modul PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Impussibil inizializâ i modui PKCS#11 regjistrâts: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Il URI al à une codifiche no valide." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Il URI nol à il scheme “pkcs11”." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Il URI al à une sintassi sbaliade." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Il URI al à un numar di version sbaliât." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Il flùs al è stât sierât" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Non" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Dât fûr di" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Scjadence" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificât" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Altri non" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Direzion XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "SRV DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Direzion X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Non cartele" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Non grup EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Direzion IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID regjistrât" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Gjenar di clâf no supuartât pe domande di certificât" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "La clâf no pues jessi doprade par firmâ la domande" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Puarteclâfs GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Puarteclâfs GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Clâf PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID clâf" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Procès Gnupg jessût cul codiç: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Procès Gnupg terminât cul segnâl: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "La operazion e je stade anulade" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Clâf privade" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Clâf publiche" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Domande di certificât" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Dâts no ricognossûts o no supuartâts." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Impussibil analizâ i dâts no valits o ruvinâts." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "I dâts a son blocâts" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continue" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Anule" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atribûts pe clâf no ricognossûts o no disponibii." + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Impussibil costruî la clâf publiche" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Une altre domande e je in elaborazion" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Impussibil cjatâ une posizion par archiviâ il certificât pontât" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Vincui di base" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoritât di certificazion" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Sì" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "No" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Lungjece massime dal percors" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Cence limit" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Ûs complet de clâf" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Proposits ametûts" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificadôr clâf sogjet" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificadôr clâf" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Firme digjitâl" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Cifradure clâf" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Cifradure dâts" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acuardi clâf" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Firme certificât" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Firme de liste di revoche" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Ûs de clâf" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Utilizazions" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Nons alternatîfs sogjet" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Estension" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificadôr" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valôr" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Impussibil espuartâ il certificât." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitât" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificât di" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Scjadence" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Non sogjet" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Non di cui che al à emetût" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificât dât fûr" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Version" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "No valit prime dal" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "No valit daspò il" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Impronte digjitâl certificât" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informazions clâf publiche" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Firme" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Espuarte certificât..." + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritmi de clâf" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametris de clâf" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Dimension de clâf" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Impronte digjitâl de clâf SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritmi di firme" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametris de firme" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Critic" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Domande di certificât" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribût" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Gjenar" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Sfide" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detais" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Impussibil visualizâ “%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Impussibil visualizâ il file" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Motîf" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Impussibil visualizâ un file di chest gjenar." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Cifre" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Firme" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certifiche" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentiche" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Disabilitade" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "No cognossude" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "No valide" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Disabilitade" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revocade" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Scjadude" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Fiducie no definide" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Cence fiducie" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Fiducie margjinâl" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Fiducie plene" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Fiducie complete" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "" +"Lis informazions contignudis in cheste clâf no son ancjemò stadis verificadis" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Cheste clâf no je valide" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Cheste clâf e je stade disabilitade" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Cheste clâf e je stade revocade" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Cheste clâf e je scjadude" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Cheste clâf no je fidade" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "La fiducie di cheste clâf e je margjinâl" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "La fiducie di cheste clâf e je plene" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "La fiducie di cheste clâf e je complete" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID clâf" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmi" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Creade" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Scjadence" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Funzionalitâts" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Fiducie tal proprietari" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Non" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Coment" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atribût utent" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Dimension" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Firme di un document binari" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Firme di un document in test normâl" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Firme indipendente" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificazion gjeneriche de clâf" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificazion personâl de clâf" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificazion casuâl de clâf" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificazion positive de clâf" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Firme vincul sot-clâf" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Firme vincul clâf primarie" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Firme direte su pe clâf" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Firme revoche di clâf" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Firme revoche di sot-clâf" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Firme revoche di certificât" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Firme marcadure orarie" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Firme conferme di tiercis parts" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classe" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Dome locâl" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Espuartabil" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Clâf di revoche" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Impronte digjitâl" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Sot-clâf publiche" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Clâf segrete" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Sot-clâf segrete" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Daûr a inizializâ..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importazion in cors..." + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Impuartât in: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Impuarte in: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Impussibil eseguî la operazion pe mancjance di impuartadôrs compatibii" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nissun dât di impuartâ" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Clâf" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Clâf privade RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Clâf privade DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Clâf curve elitiche privade" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Clâf publiche DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Clâf curve elitiche publiche" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Robustece" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Improntis digjitâi" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "A_nule" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Sielt in automatic" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "L'utent al à anulât la operazion" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Par podê impuartâ, inserî la password." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Password:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Sbloche" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etichete:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Impostazions importazion" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Conferme:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Lis password no corispuindin." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "La password no pues jessi vueide" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Pronte l'acès" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Sbloche l'acès aes password e altris segrets" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Un file cul stes non al esist za." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Sostituîlu cul gnûf file?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Sostituìs" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "La operazion e je stade anulade." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Espuarte certificât" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Salve" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "File certificâts" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "File PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Sbloche in automatic chest puarteclâfs al acès" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloche chest puarteclâfs ae jessude de session" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloche chest puarteclâfs daspò" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloche chest puarteclâfs se inatîf par" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minûts" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Sbloche: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Password" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"I contignûts di “%s” a son blocâts. Par podêju viodi, inserìs la password " +"juste." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "I contignûts a son blocâts. Par podêju viodi, scrîf la password juste." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Visualizadôr di certificâts e di clâfs GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostre la version de aplicazion" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[file...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Visualize certificâts e file di clâfs" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visualizadôr di certificâts" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "La password no je juste" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Impuartade" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importazion falide" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Impuarte" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Siere" diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..167104e --- /dev/null +++ b/po/ga.po @@ -0,0 +1,1012 @@ +# Irish translations for gnome-keyring package. +# Copyright (C) 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Seán de Búrca , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2009-08-15 00:13-0600\n" +"Last-Translator: Seán de Búrca \n" +"Language-Team: Irish \n" +"Language: ga\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=5; plural=n==1 ? 0 : (n%10==1 || n%10==2) ? 1 : (n" +"%10>=3 && n%10<= 6) ? 2 : ((n%10>=7 && n%10<=9) || n==10) ? 3 : 4;\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 le RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 le RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 le RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 le DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Díghlasáil teastas" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Iontráil focal faire chun an teastas a dhíghlasáil" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Díghlasáil Fáinne Eochracha" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Díghlasáil teastas" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Díghlasáil eochair phoiblí" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "Díghlasáil é seo go huathoibríoch nuair a logálaim isteach" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Díghlasáil" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Focal faire:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" +"Díghlasáil an fáinne eochracha seo go huathoibríoch nuair a logálaim isteach." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "" +"Díghlasáil an fáinne eochracha seo go huathoibríoch nuair a logálaim isteach." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Díghlasáil" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Díghlasáil" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Focal faire:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Ceadaigh d'fheidhmchlár an fáinne eochracha a rochtain?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Iontráil focal faire chun díghlasáil" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..55d4507 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,1160 @@ +# Galician translation of gcr. +# This file is distributed under the same license as the gcr package. +# Copyright (C) 2010 Fran Diéguez. +# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas +# colaborar connosco, podes atopar máis información en http://www.trasno.net +# Ignacio Casal Quinteiro , 2005, 2006. +# Ignacio Casal Quinteiro , 2007, 2008. +# Mancomún - Centro de Referencia e Servizos de Software Libre , 2009. +# Antón Méixome , 2009. +# Fran Diéguez , 2009, 2010, 2011, 2012. +# Leandro Regueiro , 2012. +# Fran Dieguez , 2013, 2014, 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-03 12:42+0200\n" +"Last-Translator: Fran Dieguez \n" +"Language-Team: Galician\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Compoñente de dominio" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID de usuario" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Enderezos de correo electrónico" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data de nacemento" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Lugar de nacemento" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sexo" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "País de nacionalidade" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "País de residencia" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nome común" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Apelidos" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Número de serie" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localidade" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Estado" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Rúa" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organización" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unidade de organización" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Tratamento" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Número de teléfono" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nome propio" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniciais" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Cualificador de xeración" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Cualificador de nome de dominio (DN)" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudónimo" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 con RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 con RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 con RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 con DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Curva elíptica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 con ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 con ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 con ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 con ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 con ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autenticación do servidor" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autenticación do cliente" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Asinado de código" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Protección de correo-e" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Selado de tempo" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Produciuse un erro ao cargar o módulo PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Non foi posíbel inicializar o módulo PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Non foi posíbel inicializar os módulos PKCS#11 rexistrador: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "O URI ten unha sintaxe incorrecta." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "O URI non ten un esquema «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "O URI ten unha sintaxe incorrecta." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "O URI ten un número de versión incorrecto." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Pechouse o fluxo" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nome" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emitido por" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Caduca" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificado" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Outro nome" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Enderezo XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "SRV do DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Correo electrónico" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Enderezos X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nome do directorio" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nome do grupo EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Enderezo IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID rexistrado" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipo de chave non admitida para a solicitude do certificado" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Non é posíbel usar a chave para firmar a solicitude" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Anel GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Anel GPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Chave GPG" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID da chave" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "O proceso Gnupg pechouse có código: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "O proceso de Gnupg terminou co sinal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Cancelouse a operación" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Chave privada" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Chave pública" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Solicitude de certificado" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Datos non recoñecíbeis ou non soportados." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Non é posíbel analizar datos danados ou non válidos." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Os datos están bloqueados" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continuar" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Cancelar" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Escriba a frase de paso de OpenSSH" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atributos da chave non recoñecidos ou non dispoñíbeis" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Non foi posíbel xerar a chave pública" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Xa hai outra petición en progreso" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Non foi posíbel atopar un lugar para almacenar o certificado anclado" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Restricións básicas" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoridade de certificación" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Si" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Non" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Lonxitude máxima da ruta" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Sen límite" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Uso estendido da chave" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Propósitos permitidos" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificador do asunto da chave" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificador da chave" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Sinatura dixital" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Cifrado da chave" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Cifrado dos datos" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acordo da chave" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Sinatura do certificado" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Sinatura da lista de revogación" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Uso da chave" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Usos" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Nomes alternativos do asunto" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extensión" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificador" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valor" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Non foi posíbel exportar o certificado" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identidade" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificado por" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Caduca" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nome do asunto" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nome do emisor" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificado emitido" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versión" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Non é válido antes de" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Non é válido despois de" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Pegadas dixitais dos certificados" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Información de chave pública" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Sinatura" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportar certificado…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritmo de chave" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parámetros de chave" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Tamaño de chave" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Pegada dixital da chave SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritmo de sinatura" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parámetros de sinatura" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Crítico" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Solicitude de certificador" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atributo" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipo" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Desafío" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detalles" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Non foi posíbel mostrar «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Non foi posíbel mostrar o ficheiro" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Razón" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Non foi posíbel mostrar un ficheiro deste tipo." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Cifrar" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Asinar" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certificar" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autenticar" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Desactivada" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Descoñecida" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Non válida" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Desactivada" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revocada" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Caducada" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Confianza non definida" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Non confiada" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Confianza marxinal" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Confianza completa" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Confianza última" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Aínda no se verificou a información desta chave" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "A chave non é válida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Esta chave foi desactivada" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Esta chave foi revogada" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Esta chave caducou" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Esta chave non está confiada" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Esta chave está confiada marxinalmente" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Esta chave está confiada completamente" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Esta chave está confiada últimamente" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID da chave" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmo" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Creada" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Caducidade" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Prestacións" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Propietario da confianza" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nome" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comentario" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atributo do usuario" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Tamaño" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Sinatura dun documento binario" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Sinatura dun documento de texto canónico" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Sinatura indpendente" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificación xenérica da chave" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificación persoal da chave" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificación casual da chave" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificación positiva da chave" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Firma da ligazón da subchave" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Firma da ligazón da chave primaria" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Asinar directamente na chave" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Sinatura da chave de revogación" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Sinatura da subchave de revogación" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Sinatura do certificado de revogación" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Marca de tempo da sinatura" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Firma da confirmación da chave de terceiras partes" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Clase" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Só local" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportábel" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Chave de revogación" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Pegada" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Subchave pública" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Chave segreda" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Subchave segreda" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicializando…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importación en progreso…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importar en: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importar en: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Non é posíbel importar porque non hai importadores compatíbeis" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "No hai datos que importar" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Chave" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Chave privada RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Chave privada DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Chave da curva elíptica privada" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Chave pública DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Chave da curva elíptica pública" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Fortaleza" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Impresións dixitais" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Cancelar" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Aceptar" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Seleccionados automaticamente" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "O usuario cancelou a operación" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Para poder importar, escriba o contrasinal." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Contrasinal:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Desbloquear" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiqueta:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importar configuración" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirmar:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Os contrasinais non coinciden." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "O contrasinal non pode estar baleiro" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Petición de acceso" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Desbloquear o acceso a contrasinais e outros segredos" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Xa existe un ficheiro con ese nome." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Desexa substituílo por un novo ficheiro?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Substituír" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Cancelouse a operación." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exportar certificado" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Gardar" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Ficheiros de certificados" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Ficheiros PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Desbloquear automaticamente este anel de chaves cando inicie a sesión" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloquear este anel de chaves cando saia da sesión" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloquear este anel de chaves despois de" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloquear este anel de chaves se estou inactivo durante" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutos" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Desbloquear: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Contrasinal" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Os contidos de '%s' están bloqueados. Para poder velos, introduza o " +"contrasinal correcto." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Os contidos están bloqueados. Para poder velos, escriba o contrasinal " +"correcto." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Visor de chaves e certificados GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostrar a versión do aplicativo" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[ficheiro...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Vexa certificados e ficheiros de chave" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visor de certificados" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "O contrasinal era incorrecto" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importado" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Fallou a importación" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importar" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Pechar" + +#~ msgctxt "Disabled" +#~ msgid "capability" +#~ msgstr "capacidade" + +#~ msgctxt "Disabled" +#~ msgid "ownertrust" +#~ msgstr "propietario da confianza" + +#~ msgid "Export Certificate..." +#~ msgstr "Exportar certificado…" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Módulos PKCS#11 non válido: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Non foi posíbel configurar o módulo PKCS#11: %s" + +#~ msgid "Label" +#~ msgstr "Etiqueta" + +#~ msgid "Unlock" +#~ msgstr "Desbloquear" diff --git a/po/gu.po b/po/gu.po new file mode 100644 index 0000000..000bfa3 --- /dev/null +++ b/po/gu.po @@ -0,0 +1,1058 @@ +# translation of gu.po to Gujarati +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# Ankit Patel , 2005, 2006. +# Ankit Patel , 2007, 2009. +# Sweta Kothari , 2008, 2009, 2011. +msgid "" +msgstr "" +"Project-Id-Version: gu\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2011-04-01 17:02+0530\n" +"Last-Translator: Sweta Kothari \n" +"Language-Team: Gujarati\n" +"Language: gu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "ડોમેઇન ઘટક" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "વપરાશકર્તા ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "ઇમેલ સરનામું" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "જન્મની તારીખ" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "જન્મનું સ્થાન" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "લિંગ" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "નાગરિક નો દેશ" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "રહેઠાણનો દેશ" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "સામાન્ય નામ" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "અટક" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "ક્રમાંક નંબર" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "દેશ" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "સ્થાન" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "સ્થિતિ" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "શેરી" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "સંસ્થા" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Organizational Unit" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "શિર્ષક" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "ટેલિફોન નંબર" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "આપેલ નામ" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "શરૂઆત કરો" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Generation Qualifier" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN Qualifier" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA સાથે MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA સાથે MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA સાથે SHA1 " + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA સાથે SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "સત્ર બંધ થયેલ છે" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "નામ (_N):" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "પ્રકાશિત કરનારનું નામ" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "નિવૃત્ત" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "પ્રમાણપત્ર" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "પ્રક્રિયા રદ કરી દીધી હતી" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "પ્રમાણપત્રનું તાળુ ખોલો" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "પ્રમાણપત્ર" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "પ્રકાશિત કરનારનું નામ" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +#, fuzzy +msgid "X400 Address" +msgstr "ઇમેલ સરનામું" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "વિષય નામ" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +#, fuzzy +msgid "IP Address" +msgstr "ઇમેલ સરનામું" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "પ્રમાણપત્ર" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "હા" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "ના" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "ઓળખનાર" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "ઓળખનાર" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "હસ્તાક્ષર" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "કી પરિમાણો" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "પ્રમાણપત્ર" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "વિષય નામ" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "એક્સટેન્શન" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "ઓળખનાર" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "કિંમત" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "સંકટમય" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "આયાત કરેલ પ્રમાણપત્રો/કીઓ ને સંગ્રહ કરવા માટે સ્થાન ને પસંદ કરો." + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "ઓળખણ" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "દ્દારા ચકાસેલ છે" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "નિવૃત્ત" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "વિષય નામ" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "પ્રકાશિત કરનારનું નામ" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "મોકલેલ પ્રમાણપત્ર" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "આવૃત્તિ" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "પહેલા યોગ્ય નથી" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "પછી યોગ્ય નથી" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "ફિંગરપ્રિંટો" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "હસ્તાક્ષર" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "હસ્તાક્ષરનાં ઍલ્ગરિધમ" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "હસ્તાક્ષરનાં પરિમાણો" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "સાર્વજનિક કી જાણકારી" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "કી ઍલ્ગરિધમ" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "કી પરિમાણો" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "કી માપ" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "આંગળીની છાપ" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "સાર્વજનિક કી" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "વિગતો (_D):" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "કીરીંગનું તાળુ ખોલો" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "PGP કી: %s" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +#, fuzzy +msgid "PGP Key" +msgstr "PGP કી: %s" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "પ્રક્રિયા રદ કરી દીધી હતી" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "હસ્તાક્ષર" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "પ્રમાણપત્ર" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "પ્રમાણપત્ર" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "અજ્ઞાત" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "નિવૃત્ત" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "જાણકારી સંવેદનશીલ છે અને ખોલી શકાતી નથી" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "સત્ર એ અયોગ્ય છે" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "મોડ્યુલની શરૂઆત કરી દેવામાં આવી નથી" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "કી ને વીંટાળી શકાતી નથી" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "પાસવર્ડ અથવા PIN એ નિવૃત્ત થયેલ છે" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "કી એ ખોટા પ્રકારની છે" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "ઍલ્ગરિધમ" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "નિવૃત્ત" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "નામ (_N):" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "માપ" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "હસ્તાક્ષરનાં પરિમાણો" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "હસ્તાક્ષર" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "પ્રમાણપત્રનું તાળુ ખોલો" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "હસ્તાક્ષરનાં પરિમાણો" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "સ્થાન" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "આંગળીની છાપ" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "સાર્વજનિક કી" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "શરૂઆત કરો" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "માં આયાત કરો:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "માં આયાત કરો:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "આયાત કરી શકાતુ નથી કારણ કે કી એ ખોટા પ્રકારની છે" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "આયાત કરવા માટે ઉપલ્બધ સ્થાન નથી" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "કી" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "ખાનગી RSA કી" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "ખાનગી DSA કી" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "ખાનગી કી" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "સાર્વજનિક DSA કી" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d બીટ" +msgstr[1] "%d બીટ" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "તાકાત" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "ફિંગરપ્રિંટો" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "ઓળખાતી નથી અથવા આધારિત માહિતી નથી." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "અયોગ્ય અથવા બગડેલ માહિતી ને પદચ્છેદન કરી શકાયુ નહિં." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "માહિતી ને તાળુ મારેલ છે" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "તાળુ ખોલો" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s' આયાત કરવા માટે ક્રમમાં. તેનું તાળુ ખોલેલ હોવુ જ જોઇએ" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "પાસવર્ડ:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "આયાત કરેલ પ્રમાણપત્રો/કીઓ ને સંગ્રહ કરવા માટે સ્થાન ને પસંદ કરો." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "જ્યારે હું પ્રવેશ કરું ત્યારે આ કીરીંગ આપોઆપ ખોલો." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "પછીથી આ કીરીંગને તાળુ મારો" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "જો તેની માટે નિષ્ક્રિય હોય તો આ કીરીંગને તાળુ મારો" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "જ્યારે હું બહાર નીકળુ ત્યારે આ કીરીંગનું તાળુ મારો" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "મિનિટ" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "તાળુ ખોલો" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "તાળુ ખોલો" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "પાસવર્ડ:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "પ્રમાણપત્ર અને કી સંગ્રહ" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "પ્રમાણપત્ર અને કી સંગ્રહ" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "પ્રમાણપત્ર" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "પાસવર્ડ અથવા PIN એ અચોક્કસ છે" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "માં આયાત કરો:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "કાર્ય નિષ્ફળ થયેલ છે" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "માં આયાત કરો:" + +#: ../gck/gck-uri.c:223 +#, fuzzy, c-format +msgid "The URI has invalid encoding." +msgstr "URI પાસે અયોગ્ય સિન્ટેક્ષ છે. '%s' ક્ષેત્ર સંગ્રહપદ્દતિ અયોગ્ય છે." + +#: ../gck/gck-uri.c:227 +#, fuzzy +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI પાસે 'pkcs11' યોજના નથી." + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..208958d --- /dev/null +++ b/po/he.po @@ -0,0 +1,1138 @@ +# Hebrew translation for gnome-keyring +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the gnome-keyring package. +# Yair Hershkovitz , 2007. +# Yosef Or Boczko , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-11-17 23:01+0200\n" +"PO-Revision-Date: 2016-11-17 23:03+0200\n" +"Last-Translator: Yosef Or Boczko \n" +"Language-Team: עברית <>\n" +"Language: he\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2007-11-27 11:20+0000\n" +"X-Generator: Gtranslator 2.91.6\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "רכיב מתחם" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "מזהה משתמש" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "כתובת דוא״ל" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "תאריך הלידה" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "מקום הלידה" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "מגדר" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "ארץ האזרחות" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "ארץ המגורים" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "שם נפוץ" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "שם משפחה" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "מספר סידורי" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "ארץ" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "מחוז" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "מדינה" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "רחוב" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "ארגון" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "יחידה ארגונית" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "תפקיד" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "מספר טלפון" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "שם פרטי" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "ראשי תיבות" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "תואר" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "בעל שם המתחם" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "כינוי" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 עם RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 עם RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 עם RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 עם DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "עקום אליפטי" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 עם ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 עם ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 עם ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 עם ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 עם ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "אימות שרת" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "אימות לקוח" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "חתימת קוד" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "הגנת דוא״ל" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "חותמת זמן" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "שגיאה בטעינת PKCS#11:‏ %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "לא ניתן להפעיל את מודול ה־PKCS#11:‏ %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "לא ניתן להפעיל את מודולי ה־PKCS#11 הרשומים: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "הכתובת הנה בקידוד שגוי." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "לכתובת אין את הסכמה „pkcs11”" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "לכתובת יש תחביר שגוי." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "לכתובת יש מספר גרסה שגוי." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "התזרים נסגר" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "שם" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "הונפקה על ידי" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "תפוגה" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "תעודה" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "שם אחר" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "כתובת ה־XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "שרת DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "דוא״ל" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "כתובת X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "שם הספרייה" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "שם צד ה־EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "כתובת ייחודית" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "כתובת ה־IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "מזהה רשום" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "סוג המפתח אינו נתמך עבור בקשת האישור" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "לא ניתן להשתמש במפתח כדי לחתום על האישור" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "קבוצת מפתחות GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "קבוצת מפתחות GnuPG‏: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "מפתח PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "מזהה המפתח" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "התהליך Gnupg יצא עם הקוד: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "התהליך Gnupg חוסל עם האות: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "הפעולה בוטלה" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "מפתח פרטי" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "מפתח ציבורי" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "בקשת אישור" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "הנתונים אינם מוכרים או שאינם נתמכים." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "לא ניתן לנתח נתונים שגויים או פגומים." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "הנתונים נעולים" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "המשך" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "ביטול" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "מאפיין בלתי מוכר או בלתי זמין של המפתח" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "לא ניתן לבנות מפתח ציבורי" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "כבר מתבצע אימות אחר" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "לא ניתן למצוא את המיקום לאחסון האישור המוצמד" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "הגבלות בסיסיות" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "רשות תעודות" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "כן" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "לא" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "אורך הנתיב המרבי" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "מוגבל" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "שימוש מורחב במפתח" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "מטרות מורשות" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "מזהה מפתח של מקבל התעודה" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "מזהה מפתח" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "חתימה דיגיטלית" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "הצפנת מפתח" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "הצפנת נתונים" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "הסכם מפתח" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "חתימת התעודה" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "חתימת רשימת השלילה" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "שימוש במפתח" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "שימושים" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "שמות חלופיים למקבל התעודה" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "הרחבה" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "מזהה" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "ערך" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "לא ניתן לייצא את האישור." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "זהות" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "אומת על ידי" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "תפוגה" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "שם מקבל התעודה" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "שם החותם" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "תעודה שהונפקה" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "גרסה" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "לא תקף לפני" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "לא תקף לאחר" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "טביעות אצבע של תעודה" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "נתוני מפתח ציבואי" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "חתימה" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "יצוא אישור…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "אלגוריתם המפתח" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "הפרמטרים של המפתח" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "גודל המפתח" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "טביעת אצבע של מפתח SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "אלגוריתם החתימה" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "הפרמטרים של החתימה" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "קריטי" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "בקשת אישור" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "מאפיין" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "סוג" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "אתגר" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_פרטים" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "לא ניתן להציג את „%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "לא ניתן להציג את הקובץ" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "סיבה" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "לא ניתן להציג קבצים מסוג זה" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "אל־‏גמאל" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "הצפנה" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "חתימה" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "אישור" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "אימות" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "מנוטרל" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "לא ידוע" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "שגוי" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "מנוטרל" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "נשלל" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "פג" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "מהימנות בלי מוגדרת" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "לא מהימן" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "מהימן באופן גבולי" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "מהימן לגמרי" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "מהימן לחלוטין" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "המידע במפתח זה לא אומת" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "מפתח זה שגוי" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "מפתח זה נוטרל" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "מפתח זה נשלל" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "מפתח זה פג" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "המפתח אינו מהימן" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "מפתח זה מהימן באופן גבולי" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "מפתח זה מהימן לחלוטין" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "מפתח זה מהימן לחלוטין" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "מזהה המפתח" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "אלגוריתם" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "נוצר" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "תפוגה" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "יכולות" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "מהימנות הבעלים" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "שם" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "הערה" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "תכונת המשתמש" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "גודל" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "חתימה של מסמך בינרי" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "חתימת מסמך טקסט קנוני" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "חתימה עצמאית" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "חתימה כללית של מפתח" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "חתימה אישית של מפתח" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "חתימה רגילה של מפתח" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "חתימה חיובית של מפתח" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "חתימת איגוד תת־מפתח" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "חתימת איגוד מפתח עיקרי" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "חתימה ישירות על מפתח" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "חתימת שלילת מפתח" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "חתימת שלילת תת־מפתח" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "חתימת שלילת האישור" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "חתימת טביעת זמן" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "חתימת אישור צד־שלישי" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "מחלקה" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "מקומי בלבד" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "ניתן לייצוא" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "מפתח שלילה" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "טביעת אצבע" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "תת־מפתח ציבורי" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "מפתח סודי" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "תת־מפתח סודי" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "בהליכי הפעלה…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "מתבצע ייבוא…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "ייובא לתוך: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "ייבוא אל: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "לא ניתן לייבא כיוון שאין מייבאים נתמכים" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "אין נתונים לייבוא" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "מפתח" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "מפתח RSA פרטי" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "מפתח DSA פרטי" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "מפתח עקום אליפטי פרטי" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "מפתח DSA ציבורי" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "מפתח עקום אליפטי ציבורי" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "סיבית אחת" +msgstr[1] "%u סיביות" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "חוזק" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "טביעות אצבע" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_ביטול" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_אישור" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "נבחר אוטומטית" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "המשתמש ביטל את הפעולה" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "כדי לייבא, יש להזין את הססמה." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "ססמה:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "אסימון:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "פתח" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "תווית:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "ייבוא הגדרות" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "אימות:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "הססמאות אינן תואמות." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "הססמה לא יכולה להיות ריקה" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "אימות גישה" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "שחרור הגישה לססמאות ולסודות אחרים" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "כבר קיים קובץ בשם הזה." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "האם ברצונך להחליף אותו בקובץ חדש?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "ה_חלפה" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "הפעולה בוטלה." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "יצוא אישור" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_שמירה" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "קובצי אישורים" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "קובצי PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "יש לפתוח קבוצת ססמאות זו באופן אוטומטי בעת הכניסה למערכת" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "יש לנעול קבוצת מפתחות זו בעת הניתוק" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "נעילת קבוצת ססמאות זו לאחר" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "קבוצת ססמאות זו תנעל אם אינה בשימוש למשך" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "דקות" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "שחרור: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "ססמה" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "התכנים של „%s” נעולים. כדי לצפות בתוכן, יש להזין את הססמה הנכונה." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "התכנים נעולים. כדי לצפות בתכנים, נא להזין את הססמה הנכונה." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "CRG – מציג מפתחות ואישורים" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "הצגת גרסת היישום" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[file...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- צפייה באישור ובקובצי המפתח" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "מציג אישורים" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "הססמה לא הייתה נכונה" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "ייובא" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "הייבוא נכשל" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "ייבוא:" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_סגירה" + +#~ msgid "Export Certificate..." +#~ msgstr "יצוא האישור…" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "מודול PKCS#11 שגוי:‏ %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "לא ניתן להגדיר את מודול ה־PKCS#11:‏ %s" + +#~ msgid "Label" +#~ msgstr "תווית" + +#~ msgid "Unlock" +#~ msgstr "פתח" diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 0000000..e19d462 --- /dev/null +++ b/po/hi.po @@ -0,0 +1,1092 @@ +# translation of gnome-keyring.master.po to Hindi +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# Rajesh Ranjan , 2005, 2006, 2009. +# Rajesh Ranjan , 2009. +# rajesh , 2012. +# chandankumar , 2013. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2013-02-12 05:56+0000\n" +"PO-Revision-Date: 2013-03-25 18:25+0000\n" +"Last-Translator: chandankumar \n" +"Language-Team: Hindi \n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.5\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "डोमेन घटक" + +#: ../egg/egg-oid.c:43 ../ui/gcr-gnupg-renderer.c:410 +#: ../ui/gcr-gnupg-renderer.c:579 +msgid "User ID" +msgstr "उपयोक्ता पहचान" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "ई-मेल पता" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "जन्म दिन" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "जन्म स्थान" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "लिंग" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "नागरिकता देश" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "निवास देश" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "सामान्य नाम" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "कुलनाम" + +#: ../egg/egg-oid.c:69 ../ui/gcr-certificate-renderer.c:558 +msgid "Serial Number" +msgstr "क्रम संख्या" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "देश" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "जगह" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "स्थिति" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "सड़क" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "संगठन " + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "संगठनात्मक इकाई" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "शीर्षक" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "टेलीफोन नंबर" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "दिया गया नाम" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "प्रथमाक्षर" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "जनन उत्तीर्णकर्ता" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN उत्तीर्णकर्ता" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "छद्मनाम" + +#: ../egg/egg-oid.c:98 ../ui/gcr-gnupg-renderer.c:201 +#: ../ui/gcr-key-renderer.c:430 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA के साथ MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA के साथ MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA के साथ SHA1" + +#: ../egg/egg-oid.c:103 ../ui/gcr-gnupg-renderer.c:205 +#: ../ui/gcr-key-renderer.c:432 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA के साथ SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "सर्वर प्रमाणपत्र" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "क्लाइंट प्रमाणपत्र" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "कोड हस्ताक्षर" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "ईमेल सुरक्षा" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "समय स्टैंपिंग" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr " PKCS#11 मॉड्यूल को लोड करने में त्रुटि: %s" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "अवैध PKCS#11 module: %s" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "PKCS#11मॉड्यूल सेट नहीं कर सका: %s" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr " PKCS#11 मॉड्यूल प्रारंभ नहीं कर सका: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr " PKCS#11 पंजीकृत मॉड्यूल प्रारंभ नहीं किया जा सका: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "यूआरआइ के पास अमान्य एन्कोडिंग है." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "यूआरआइ 'pkcs11' योजना नहीं है." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "यूआरआइ के पास खराब वाक्यविन्यास है." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "यूआरआइ के पास संस्करण क्रमांक है." + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "स्ट्रीम बंद कर दिया गया था" + +#. later +#. later +#: ../gcr/gcr-certificate.c:308 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "नाम" + +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Issued By" +msgstr "इसके द्वारा निर्गत" + +#. later +#: ../gcr/gcr-certificate.c:312 +msgctxt "column" +msgid "Expires" +msgstr "समाप्त" + +#: ../gcr/gcr-certificate.c:1133 ../gcr/gcr-parser.c:322 +#: ../ui/gcr-certificate-renderer.c:103 ../ui/gcr-certificate-exporter.c:469 +msgid "Certificate" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "अन्य नाम" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:204 ../ui/gcr-gnupg-renderer.c:423 +#: ../ui/gcr-gnupg-renderer.c:705 +msgid "Email" +msgstr "ईमेल" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "X400 पता" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "निर्देशिका नाम" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "EDI पार्टी नाम" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "IP पता" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "पंजीकृत ID" + +#: ../gcr/gcr-certificate-request.c:418 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "प्रमाणपत्र का अनुरोध करने के लिए असमर्थित कुंजी प्रकार" + +#: ../gcr/gcr-certificate-request.c:505 ../gcr/gcr-certificate-request.c:590 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "कुंजी के लिए अनुरोध पर हस्ताक्षर करने के लिए नहीं किया जा सकता" + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "GnuPG कीरिंग" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG कीरिंग: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-parser.c:328 +#: ../ui/gcr-gnupg-renderer.c:89 +msgid "PGP Key" +msgstr "पीजीपी कुंजी" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "कुंजी आईडी" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "प्रक्रिया gnupg कोड के साथ बाहर निकलें: %d" + +#: ../gcr/gcr-gnupg-process.c:874 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg प्रक्रिया संकेत के साथ समाप्त किया गया: %d" + +#: ../gcr/gcr-gnupg-process.c:928 ../gcr/gcr-parser.c:2424 +#: ../gcr/gcr-parser.c:2917 ../gcr/gcr-system-prompt.c:902 +msgid "The operation was cancelled" +msgstr "यह ऑपरेशन रद्द कर दी गई थी" + +#: ../gcr/gcr-parser.c:319 ../ui/gcr-key-renderer.c:408 +msgid "Private Key" +msgstr "निजी कुंजी" + +#: ../gcr/gcr-parser.c:325 ../ui/gcr-certificate-renderer.c:891 +#: ../ui/gcr-gnupg-renderer.c:738 ../ui/gcr-key-renderer.c:415 +msgid "Public Key" +msgstr "सार्वजनिक कुंजी" + +#: ../gcr/gcr-parser.c:331 +msgid "Certificate Request" +msgstr "प्रमाणपत्र निवेदन" + +#: ../gcr/gcr-parser.c:2427 +msgid "Unrecognized or unsupported data." +msgstr "अपरिचित या असमर्थित आँकड़ा." + +#: ../gcr/gcr-parser.c:2430 +msgid "Could not parse invalid or corrupted data." +msgstr "अवैध या खराब आँकड़ा विश्लेषित नहीं कर सका." + +#: ../gcr/gcr-parser.c:2433 +msgid "The data is locked" +msgstr "यह आँकड़ा तालाकित है." + +#: ../gcr/gcr-prompt.c:227 +msgid "Continue" +msgstr "जारी रखें" + +#: ../gcr/gcr-prompt.c:236 +msgid "Cancel" +msgstr "रद्द करें" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "कुंजी के लिए अपरिचित या अनुपलब्ध गुण" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "सार्वजनिक कुंजी का निर्माण नहीं किया जा सका" + +#: ../gcr/gcr-system-prompt.c:883 +msgid "Another prompt is already in progress" +msgstr "एक और शीघ्र प्रगति में पहले से ही है" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "टिकी प्रमाणपत्र की स्टोर करने के लिए करने के लिए एक जगह नहीं मिल सका" + +#: ../ui/gcr-certificate-renderer.c:118 +msgid "Basic Constraints" +msgstr "मौलिक निर्धारक" + +#: ../ui/gcr-certificate-renderer.c:120 +msgid "Certificate Authority" +msgstr "प्रमाणन प्राधिकार" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:962 +msgid "Yes" +msgstr "हाँ" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:962 +msgid "No" +msgstr "नहीं" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Max Path Length" +msgstr "अधिकतम कुंजी लंबाई" + +#: ../ui/gcr-certificate-renderer.c:125 +msgid "Unlimited" +msgstr "असीमित" + +#: ../ui/gcr-certificate-renderer.c:144 +msgid "Extended Key Usage" +msgstr "विस्तारित कुंजी प्रयोग" + +#: ../ui/gcr-certificate-renderer.c:155 +msgid "Allowed Purposes" +msgstr " प्रयोजनों संबंधी अनुमति दी" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Subject Key Identifier" +msgstr "विषय कुंजी पहचानकर्ता" + +#: ../ui/gcr-certificate-renderer.c:176 +msgid "Key Identifier" +msgstr "बीज पहचानकर्ता" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Digital signature" +msgstr "डिजिटल हस्ताक्षर..." + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Key encipherment" +msgstr "कुंजी इनसिफरमेंट" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Data encipherment" +msgstr "आंकड़ा इनसाइफरमेंट" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Key agreement" +msgstr "कुंजी मसौदा" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Certificate signature" +msgstr "प्रमाणपत्र हस्ताक्षर" + +#: ../ui/gcr-certificate-renderer.c:192 +msgid "Revocation list signature" +msgstr "निरसन सूची हस्ताक्षर" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Key Usage" +msgstr "कुँजी प्रयोग" + +#: ../ui/gcr-certificate-renderer.c:218 +msgid "Usages" +msgstr "प्रयोग" + +#: ../ui/gcr-certificate-renderer.c:238 +msgid "Subject Alternative Names" +msgstr "विषय वैकल्पिक नाम" + +#: ../ui/gcr-certificate-renderer.c:265 +msgid "Extension" +msgstr "विस्तार" + +#: ../ui/gcr-certificate-renderer.c:269 +msgid "Identifier" +msgstr "पहचानकर्ता" + +#: ../ui/gcr-certificate-renderer.c:270 +#: ../ui/gcr-certificate-request-renderer.c:273 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-gnupg-renderer.c:431 +msgid "Value" +msgstr "मान" + +#: ../ui/gcr-certificate-renderer.c:295 +msgid "Couldn't export the certificate." +msgstr "प्रमाणपत्र निर्यात नहीं किया जा सका." + +#: ../ui/gcr-certificate-renderer.c:520 +#: ../ui/gcr-certificate-request-renderer.c:314 +msgid "Identity" +msgstr "पहचान" + +#: ../ui/gcr-certificate-renderer.c:524 +msgid "Verified by" +msgstr "इसके द्वारा सत्यापित" + +#: ../ui/gcr-certificate-renderer.c:531 ../ui/gcr-gnupg-renderer.c:719 +msgid "Expires" +msgstr "समाप्त" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:538 +#: ../ui/gcr-certificate-request-renderer.c:320 +msgid "Subject Name" +msgstr "विषय नाम" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:543 +msgid "Issuer Name" +msgstr "निर्गतकर्ता नाम" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:548 +msgid "Issued Certificate" +msgstr "निर्गत प्रमाणपत्र" + +#: ../ui/gcr-certificate-renderer.c:553 +#: ../ui/gcr-certificate-request-renderer.c:331 +msgid "Version" +msgstr "संस्करण" + +#: ../ui/gcr-certificate-renderer.c:567 +msgid "Not Valid Before" +msgstr "इससे पहले वैध नहीं" + +#: ../ui/gcr-certificate-renderer.c:572 +msgid "Not Valid After" +msgstr "इससे बाद वैध नहीं" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:577 +msgid "Certificate Fingerprints" +msgstr "प्रमाणपत्र फिंगरप्रिंट" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:583 +#: ../ui/gcr-certificate-request-renderer.c:334 +#: ../ui/gcr-certificate-request-renderer.c:380 +msgid "Public Key Info" +msgstr "सार्वजनिक कुंजी सूचना" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:598 ../ui/gcr-certificate-renderer.c:919 +#: ../ui/gcr-certificate-request-renderer.c:350 +#: ../ui/gcr-certificate-request-renderer.c:387 ../ui/gcr-gnupg-renderer.c:560 +msgid "Signature" +msgstr "हस्ताक्षर" + +#: ../ui/gcr-certificate-renderer.c:865 +msgid "Key Algorithm" +msgstr "कुंजी अलगोरिथम" + +#: ../ui/gcr-certificate-renderer.c:870 +msgid "Key Parameters" +msgstr "कुंजी पैरामीटर" + +#: ../ui/gcr-certificate-renderer.c:878 ../ui/gcr-gnupg-renderer.c:353 +msgid "Key Size" +msgstr "कुंजी आकार" + +#: ../ui/gcr-certificate-renderer.c:886 +msgid "Key SHA1 Fingerprint" +msgstr "मुख्य SHA1 फिंगरप्रिंट" + +#: ../ui/gcr-certificate-renderer.c:908 +msgid "Signature Algorithm" +msgstr "हस्ताक्षर अलगोरिथम" + +#: ../ui/gcr-certificate-renderer.c:912 +msgid "Signature Parameters" +msgstr "हस्ताक्षर पैरामीटर" + +#: ../ui/gcr-certificate-renderer.c:961 +msgid "Critical" +msgstr "नाजुक" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:96 +#: ../ui/gcr-certificate-request-renderer.c:309 +#: ../ui/gcr-certificate-request-renderer.c:324 +#: ../ui/gcr-certificate-request-renderer.c:367 +#: ../ui/gcr-certificate-request-renderer.c:372 +msgid "Certificate request" +msgstr "प्रमाणपत्र निवेदन" + +#: ../ui/gcr-certificate-request-renderer.c:262 +msgid "Attribute" +msgstr "विशेषता" + +#: ../ui/gcr-certificate-request-renderer.c:266 +#: ../ui/gcr-certificate-request-renderer.c:325 +#: ../ui/gcr-certificate-request-renderer.c:373 ../ui/gcr-gnupg-renderer.c:591 +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Type" +msgstr "प्रकार" + +#: ../ui/gcr-certificate-request-renderer.c:377 +msgid "Challenge" +msgstr "चुनौती" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "विवरण (_D)" + +#: ../ui/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "'%s' को प्रदर्शित नहीं कर पाया" + +#: ../ui/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "प्रदर्शित नहीं कर सका" + +#: ../ui/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "कारण" + +#: ../ui/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "इस प्रकार की एक फ़ाइल प्रदर्शित नहीं हो सकता." + +#: ../ui/gcr-gnupg-renderer.c:203 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Encrypt" +msgstr "गोपन करें" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Sign" +msgstr "हस्ताक्षर करें" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Certify" +msgstr "प्रमाणपत्र" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgid "Authenticate" +msgstr "प्रमाणपत्र" + +#: ../ui/gcr-gnupg-renderer.c:224 ../ui/gcr-gnupg-renderer.c:259 +msgid "Disabled" +msgstr "अक्षम" + +#: ../ui/gcr-gnupg-renderer.c:255 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-key-renderer.c:434 ../ui/gcr-key-renderer.c:439 +msgid "Unknown" +msgstr "अज्ञात" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgid "Invalid" +msgstr "अमान्य" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Revoked" +msgstr "रद्द" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Expired" +msgstr "मियाद ख़त्म" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Undefined trust" +msgstr "अपरिभाषित भरोसेमंद" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Distrusted" +msgstr "नापसंद" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Marginally trusted" +msgstr "गुंजाइश भर भरोसेमंद" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Fully trusted" +msgstr "विश्वास योग्य" + +#: ../ui/gcr-gnupg-renderer.c:273 +msgid "Ultimately trusted" +msgstr "पूर्ण भरोसेमंद" + +#: ../ui/gcr-gnupg-renderer.c:287 +msgid "The information in this key has not yet been verified" +msgstr "इस चाबी में जानकारी अभी तक सत्यापित नहीं किया गया है" + +#: ../ui/gcr-gnupg-renderer.c:290 +msgid "This key is invalid" +msgstr "यह कुंजी अवैध है" + +#: ../ui/gcr-gnupg-renderer.c:293 +msgid "This key has been disabled" +msgstr "इस कुंजी को निष्क्रिय कर दिया गया है" + +#: ../ui/gcr-gnupg-renderer.c:296 +msgid "This key has been revoked" +msgstr "यह कुंजी वापस नहीं लिया जा सका" + +#: ../ui/gcr-gnupg-renderer.c:299 +msgid "This key has expired" +msgstr "इस कुंजी का समय समाप्त हो गया" + +#: ../ui/gcr-gnupg-renderer.c:304 +msgid "This key is distrusted" +msgstr "यह कुंजी नापसंद है" + +#: ../ui/gcr-gnupg-renderer.c:307 +msgid "This key is marginally trusted" +msgstr "यह कुंजी सीमांत पर भरोसा है" + +#: ../ui/gcr-gnupg-renderer.c:310 +msgid "This key is fully trusted" +msgstr "इस कुंजी को पूरी तरह से विश्वसनीय है" + +#: ../ui/gcr-gnupg-renderer.c:313 +msgid "This key is ultimately trusted" +msgstr "यह कुंजी अंततः विश्वसनीय है" + +#: ../ui/gcr-gnupg-renderer.c:338 ../ui/gcr-gnupg-renderer.c:564 +msgid "Key ID" +msgstr "कुंजी आईडी" + +#: ../ui/gcr-gnupg-renderer.c:346 ../ui/gcr-gnupg-renderer.c:572 +#: ../ui/gcr-gnupg-renderer.c:619 ../ui/gcr-key-renderer.c:435 +msgid "Algorithm" +msgstr "अलगोरिथम" + +#: ../ui/gcr-gnupg-renderer.c:361 ../ui/gcr-gnupg-renderer.c:438 +#: ../ui/gcr-gnupg-renderer.c:481 +msgid "Created" +msgstr "उत्पन्न किया" + +#: ../ui/gcr-gnupg-renderer.c:370 ../ui/gcr-gnupg-renderer.c:447 +#: ../ui/gcr-gnupg-renderer.c:490 +msgid "Expiry" +msgstr "यहाँ समय समाप्त" + +#: ../ui/gcr-gnupg-renderer.c:379 +msgid "Capabilities" +msgstr "योग्यता" + +#: ../ui/gcr-gnupg-renderer.c:392 +msgid "Owner trust" +msgstr "स्वामी पर भरोसा" + +#: ../ui/gcr-gnupg-renderer.c:420 +msgid "Name" +msgstr "नाम" + +#: ../ui/gcr-gnupg-renderer.c:426 ../ui/gcr-gnupg-renderer.c:708 +msgid "Comment" +msgstr "टिप्पणी" + +#: ../ui/gcr-gnupg-renderer.c:466 +msgid "User Attribute" +msgstr "उपयोगकर्ता के गुण" + +#: ../ui/gcr-gnupg-renderer.c:473 ../ui/gcr-key-renderer.c:442 +msgid "Size" +msgstr "आकार" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a binary document" +msgstr "एक द्विआधारी दस्तावेज़ के हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Signature of a canonical text document" +msgstr "एक विहित पाठ दस्तावेज़ के हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Standalone signature" +msgstr "अकेला हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Generic certification of key" +msgstr "कुंजी का सामान्य प्रमाणपत्र" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Persona certification of key" +msgstr "व्यक्तित्व प्रमाणीकरण की कुंजी" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Casual certification of key" +msgstr "कुंजी के आरामदायक प्रमाणीकरण" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Positive certification of key" +msgstr "कुंजी के सकारात्मक प्रमाणीकरण" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Subkey binding signature" +msgstr "उपकुंजी को बाध्यकारी हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Primary key binding signature" +msgstr "प्राथमिक कुंजी बाध्यकारी हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Signature directly on key" +msgstr "सीधे कुंजी पर हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Key revocation signature" +msgstr "कुंजी निरसन हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Subkey revocation signature" +msgstr "उपकुंजी को निरसन हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Certification revocation signature" +msgstr "प्रमाणीकरण निरसन हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Timestamp signature" +msgstr "टाइमस्टैम्प हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:536 +msgid "Third-party confirmation signature" +msgstr "तृतीय - पक्ष पुष्टि हस्ताक्षर" + +#: ../ui/gcr-gnupg-renderer.c:589 ../ui/gcr-gnupg-renderer.c:597 +msgid "Class" +msgstr "वर्ग" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Local only" +msgstr "स्थानीय केवल" + +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Exportable" +msgstr "निर्यात - योग्य" + +#: ../ui/gcr-gnupg-renderer.c:611 +msgid "Revocation Key" +msgstr "निरसन कुंजी" + +#: ../ui/gcr-gnupg-renderer.c:625 ../ui/gcr-gnupg-renderer.c:649 +#: ../ui/gcr-gnupg-renderer.c:651 +msgid "Fingerprint" +msgstr "फिंगरप्रिंट" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Public Subkey" +msgstr "सार्वजनिक उपकुंजी" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Key" +msgstr "गुप्त कुंजीः" + +#: ../ui/gcr-gnupg-renderer.c:744 +msgid "Secret Subkey" +msgstr "गुप्त उपकुंजीः" + +#: ../ui/gcr-import-button.c:112 +msgid "Initializing..." +msgstr "आरंभ कर रहा है..." + +#: ../ui/gcr-import-button.c:120 +msgid "Import is in progress..." +msgstr "आयात प्रगति में..." + +#: ../ui/gcr-import-button.c:127 +#, c-format +msgid "Imported to: %s" +msgstr "यहाँ आयात करें: %s" + +#: ../ui/gcr-import-button.c:147 +#, c-format +msgid "Import to: %s" +msgstr "यहाँ आयात करें: %s" + +#: ../ui/gcr-import-button.c:160 +msgid "Cannot import because there are no compatible importers" +msgstr "आयात नहीं किया जा सकता क्योंकि वहाँ कोई संगत आयातकों हैं" + +#: ../ui/gcr-import-button.c:169 +msgid "No data to import" +msgstr "आयात करने के लिए कोई डेटा नहीं" + +#: ../ui/gcr-key-renderer.c:90 +msgid "Key" +msgstr "कुंजी" + +#: ../ui/gcr-key-renderer.c:404 +msgid "Private RSA Key" +msgstr "निजी RSA कुंजी" + +#: ../ui/gcr-key-renderer.c:406 +msgid "Private DSA Key" +msgstr "निजी DSA कुंजी" + +#: ../ui/gcr-key-renderer.c:411 ../ui/gcr-key-renderer.c:413 +msgid "Public DSA Key" +msgstr "सार्वजनिक DSA कुंजी" + +#: ../ui/gcr-key-renderer.c:422 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d bit" +msgstr[1] "%d bits" + +#: ../ui/gcr-key-renderer.c:423 +msgid "Strength" +msgstr "ताकत" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:446 +msgid "Fingerprints" +msgstr "फिंगरप्रिंट" + +#: ../ui/gcr-key-renderer.c:450 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:455 +msgid "SHA256" +msgstr "SHA256" + +#: ../ui/gcr-pkcs11-import-dialog.c:188 +msgid "Automatically chosen" +msgstr "स्वतः चुना गया" + +#: ../ui/gcr-pkcs11-import-dialog.c:272 +#: ../ui/gcr-pkcs11-import-interaction.c:154 +#: ../ui/gcr-pkcs11-import-interaction.c:172 +#, c-format +msgid "The user cancelled the operation" +msgstr "उपयोक्ता ने संक्रिया रद्द किया" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "आदेश में आयात करने के लिए पासवर्ड दर्ज करें." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:564 +msgid "Password:" +msgstr "कूटशब्द: " + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "टोकेन:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:72 +#: ../ui/gcr-unlock-renderer.c:127 +msgid "Unlock" +msgstr "खोलें" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "लेबल:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "सेटिंग आयात करें" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:581 +msgid "Confirm:" +msgstr "निश्चित करें:" + +#: ../ui/gcr-prompt-dialog.c:649 +msgid "Passwords do not match." +msgstr "कूटशब्द मेल नहीं खाता है." + +#: ../ui/gcr-prompt-dialog.c:656 +msgid "Password cannot be blank" +msgstr "कूटशब्द खाली नहीं हो सकता है" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "कहने के लिए प्रेरित पहुँच" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "पासवर्ड और अन्य रहस्य के लिए पहुच अनलॉक करें" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "A file already exists with this name." +msgstr "फाइल पहले से इस नाम के साथ मौजूद है." + +#: ../ui/gcr-certificate-exporter.c:227 +msgid "Do you want to replace it with a new file?" +msgstr "क्या आप इसे एक नई फ़ाइल के साथ बदलना चाहते हैं?" + +#: ../ui/gcr-certificate-exporter.c:233 +msgid "_Replace" +msgstr "बदलें (_R)" + +#: ../ui/gcr-certificate-exporter.c:264 +#, c-format +msgid "The operation was cancelled." +msgstr "संक्रिया रद्द की गई थी." + +#: ../ui/gcr-certificate-exporter.c:308 +msgid "Export certificate" +msgstr "प्रमाणपत्र निर्यात करें" + +#: ../ui/gcr-certificate-exporter.c:320 +msgid "Certificate files" +msgstr "प्रमाणपत्र फाइल" + +#: ../ui/gcr-certificate-exporter.c:331 +msgid "PEM files" +msgstr "PEM फ़ाइल" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "स्वतः अनलॉक करें इस कीरिंग को जब मैं लॉगिन होता हूँ" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "इस कीरिंग लॉक जब मैं बाहर लॉग इन" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "के बाद इस कीरिंग लॉक करें" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "इस कीरिंग लॉक करें के लिए निष्क्रिय अगर" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "मिनट" + +#: ../ui/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "खोलें: %s" + +#: ../ui/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "कूटशब्द" + +#: ../ui/gcr-unlock-renderer.c:277 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"'%s' की सामग्री को बंद कर रहे हैं.आदेश में सामग्री को देखने के लिए, सही " +"पासवर्ड दर्ज करें." + +#: ../ui/gcr-unlock-renderer.c:280 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"सामग्री को बंद कर रहे हैं.आदेश में सामग्री को देखने के लिए, सही पासवर्ड दर्ज " +"करें." + +#: ../ui/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR प्रमाणपत्र और कुंजी दर्शक" + +#: ../ui/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "अनुप्रयोग संस्करण दिखाएँ" + +#: ../ui/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[file...]" + +#: ../ui/gcr-viewer-tool.c:105 +msgid "- View certificate and key files" +msgstr "- प्रमाण पत्र और कुंजी फ़ाइलों देखें" + +#: ../ui/gcr-viewer-tool.c:119 ../ui/gcr-viewer-widget.c:638 +msgid "Certificate Viewer" +msgstr "प्रमाणपत्र प्रदर्शक" + +#: ../ui/gcr-viewer-widget.c:204 +msgid "The password was incorrect" +msgstr "कूटशब्द गलत था" + +#: ../ui/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "आयातित" + +#: ../ui/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "आयात विफल" + +#: ../ui/gcr-viewer-window.c:108 +msgid "Import" +msgstr "आयात" + +#~ msgid "Label" +#~ msgstr "लेबल" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "खोलें" diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..8fee401 --- /dev/null +++ b/po/hr.po @@ -0,0 +1,1005 @@ +# Translation of gnome-keyring to Croatiann +# Copyright (C) Croatiann team +# Translators: Automatski Prijevod <>,Danijel Studen ,Tomislav Cavrag , +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring 0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2008-05-27 19:27+0000\n" +"Last-Translator: Launchpad Translations Administrators \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Launchpad-Export-Date: 2008-05-27 22:55+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Otključaj privjesak" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Skup ključeva je već otključan." + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "_Mjesto:" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +#, fuzzy +msgid "The data is locked" +msgstr "Odaberite lozniku za novi privjesak." + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Lozinka" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Automatski otključaj ovaj skup ključeva kada se prijavim." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "Automatski otključaj ovaj skup ključeva kada se prijavim." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Lozinka" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Dopusti pristup aplikaciji privjesku za ključeve?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Snaga nove lozinke" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..a964f44 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,1134 @@ +# Hungarian translation for gcr. +# Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016, 2018 Free Software Foundation, Inc. +# This file is distributed under the same license as the gcr package. +# +# Gergely Nagy , 2004. +# Laszlo Dvornik , 2004. +# Gabor Kelemen , 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016. +# Mate ORY , 2006. +# Balázs Úr , 2013, 2014, 2018. +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-04 20:49+0100\n" +"Last-Translator: Balázs Úr \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Tartomány-összetevő" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Felhasználóazonosító" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-mail cím" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Születési idő" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Születési hely" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Nem" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Állampolgárság" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Lakóhely" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Közönséges név" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Vezetéknév" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Sorozatszám" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Ország" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Helység" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Állam" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Utca" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Szervezet" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Szervezeti egység" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Megszólítás" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonszám" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Utónév" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Monogram" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Generációs előtag" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN minősítő" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Álnév" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 RSA-val" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 RSA-val" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 RSA-val" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 DSA-val" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptikus görbe" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 ECDSA-val" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 ECDSA-val" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 ECDSA-val" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 ECDSA-val" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 ECDSA-val" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Kiszolgálóhitelesítés" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Klienshitelesítés" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Kódaláírás" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-mail védelem" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Időbélyegzés" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Hiba a PKCS#11 modul betöltésekor: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Nem készíthető elő a PKCS#11 modul: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Nem készíthetők elő a regisztrált PKCS#11 modulok: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Az URI kódolása érvénytelen." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Az URI nem rendelkezik a „pkcs11” sémával." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Az URI szintaxisa hibás." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Az URI verziószáma hibás." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Az adatfolyam lezárult" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Név" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Kibocsátó" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Lejárat" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Tanúsítvány" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Egyéb név" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP cím" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 cím" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Címtár neve" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI fél neve" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-cím" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Regisztrált azonosító" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nem támogatott kulcstípus a tanúsítványkéréshez" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "A kulcs nem használható a kérés aláírásához" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG kulcstartó" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG kulcstartó: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP kulcs" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Kulcsazonosító" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "A Gnupg a következő kóddal lépett ki: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "A Gnupg folyamat befejeztetve a következő szignállal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "A művelet megszakítva" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Magánkulcs" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Nyilvános kulcs" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Tanúsítványkérés" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Ismeretlen vagy nem támogatott adatok." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Nem sikerült feldolgozni az érvénytelen vagy hibás adatokat." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Az adatok zárolva vannak" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Folytatás" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Mégse" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Adja meg az OpenSSH jelszavát" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "A kulcs attribútumai azonosítatlanok vagy nem érhetők el" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Nem építhető fel a nyilvános kulcs" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Már folyamatban van egy másik kérés" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Nem található tárolási hely a rögzített tanúsítványhoz" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Alap megszorítások" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Hitelesítésszolgáltató" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Igen" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nem" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Legnagyobb útvonalhossz" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Korlátlan" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Kibővített kulcshasználat" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Engedélyezett célok" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Alany kulcsazonosítója" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Kulcsazonosító" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitális aláírás" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Kulcstitkosítás" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Adattitkosítás" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Kulcsmegállapodás" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Tanúsítvány-aláírás" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Visszavonási lista aláírása" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Kulcshasználat" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Használat" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alany alternatív nevei" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Kiterjesztés" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Azonosító" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Érték" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Nem exportálható a tanúsítvány." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Személyazonosság" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Ellenőrizte" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Lejárat" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Alany neve" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Kibocsátó neve" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Kibocsátott tanúsítvány" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Verzió" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Nem érvényes eddig" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Nem érvényes ezután" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Tanúsítvány ujjlenyomatai" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Nyilvános kulcs információi" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Aláírás" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Tanúsítvány exportálása…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Kulcsalgoritmus" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Kulcs paraméterei" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Kulcsméret" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Kulcs SHA1 ujjlenyomata" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Aláírási algoritmus" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Aláírás paraméterei" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritikus" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Tanúsítványkérés" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attribútum" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Típus" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Kihívás" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "Rés_zletek" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "„%s” nem jeleníthető meg" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "A fájl nem jeleníthető meg" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Ok" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Az ilyen típusú fájl nem jeleníthető meg." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Titkosítás" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Aláírás" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Tanúsítás" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Hitelesítés" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Tiltva" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Ismeretlen" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Érvénytelen" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Tiltva" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Visszavonva" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Lejárt" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Nem definiált megbízhatóság" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nem megbízható" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Kismértékben megbízható" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Teljesen megbízható" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Tökéletesen megbízható" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "A kulcs információi még nem lettek ellenőrizve" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "A kulcs érvénytelen" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "A kulcsot letiltották" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "A kulcs vissza lett vonva" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "A kulcs lejárt" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "A kulcs nem megbízható" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "A kulcs kismértékben megbízható" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "A kulcs teljesen megbízható" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "A kulcs tökéletesen megbízható" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Kulcsazonosító" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmus" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Létrehozva" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Lejárat" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Képességek" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Tulajdonos megbízhatósága" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Név" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Megjegyzés" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Felhasználói attribútum" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Méret" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Bináris dokumentum aláírása" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Kanonikus szöveges dokumentum aláírása" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Önálló aláírás" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Kulcs általános tanúsítása" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Kulcs személyes tanúsítása" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Kulcs normál tanúsítása" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Kulcs pozitív tanúsítása" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Részkulcs kötelező aláírása" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Elsődleges kulcs kötelező aláírása" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Aláírás közvetlenül a kulcson" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Kulcsvisszavonási aláírás" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Részkulcs-visszavonási aláírás" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Tanúsítvány-visszavonási aláírás" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Időbélyeg aláírás" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Harmadik féltől származó megerősítési aláírás" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Osztály" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Csak helyi" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportálható" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Visszavonási kulcs" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Ujjlenyomat" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Nyilvános részkulcs" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Titkos kulcs" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Titkos részkulcs" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Előkészítés…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importálás folyamatban…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importálva ebbe: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importálás ebbe: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Nem lehet importálni, mert nincsenek kompatibilis importálók" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nincsenek importálható adatok" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Kulcs" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Magán RSA kulcs" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Magán DSA kulcs" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Személyes elliptikus görbe kulcs" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Nyilvános DSA kulcs" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Nyilvános elliptikus görbe kulcs" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Erősség" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Ujjlenyomatok" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "Mé_gse" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatikusan kiválasztott" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "A felhasználó megszakította a műveletet" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Az importáláshoz adja meg a jelszót." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Jelszó:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Jelsor:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Feloldás" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Címke:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importálás beállításai" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Megerősítés:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Nem egyeznek a jelszavak." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "A jelszó nem lehet üres" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Hozzáféréskérés" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Jelszavak és más titkos információk elérésének feloldása" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Már létezik egy ugyanilyen nevű fájl." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Le akarja cserélni az új fájllal?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Csere" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "A művelet megszakítva." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Tanúsítvány exportálása" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "M_entés" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Tanúsítványfájlok" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-fájlok" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Ezen kulcstartó automatikus feloldása amikor bejelentkezem" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Ezen kulcstartó zárolása kijelentkezéskor" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Kulcstartó zárolása:" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Kulcstartó zárolása üresjáratban töltött:" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "perc után" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Feloldás: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Jelszó" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"A(z) „%s” tartalma zárolva van. A tartalom megjelenítéséhez adja meg a " +"helyes jelszót." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"A tartalom zárolva van. A tartalom megjelenítéséhez adja meg a helyes " +"jelszót." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR tanúsítvány- és kulcsmegjelenítő" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Az alkalmazás verziószámának megjelenítése" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[FÁJL…]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "… Tanúsítvány- és kulcsfájlok megjelenítése" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Tanúsítványmegjelenítő" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "A jelszó helytelen volt" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importálva" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Az importálás meghiúsult" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importálás" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Bezárás" + diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..c98034c --- /dev/null +++ b/po/id.po @@ -0,0 +1,1121 @@ +# Indonesian translation of gnome-keyring +# Copyright (C) 2004 THE gnome-keyring'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-keyring package. +# Ahmad Riza H Nst 20040519 +# Dirgita , 2010, 2014. +# Andika Triwidada , 2010, 2011, 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-02-22 19:17+0000\n" +"PO-Revision-Date: 2017-02-25 18:05+0700\n" +"Last-Translator: Kukuh Syafaat \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Komponen Domain" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID Pengguna" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Alamat Surel" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Tanggal Lahir" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Tempat Lahir" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Gender" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Kewarganegaraan" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Negara Tempat Tinggal" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nama Umum" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Nama Keluarga" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Nomor Seri" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Negara" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Lokalitas" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Negara Bagian" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Jalan" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisasi" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unit Organisasi" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Jabatan" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Nomor Telepon" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nama Depan" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inisial" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Nomor Generasi" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Kualifier DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 dengan RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 dengan RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 dengan RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 dengan DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptic Curve" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 dengan ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 dengan ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 dengan ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 dengan ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 dengan ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Otentikasi Server" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Otentikasi Klien" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Penandatanganan Kode Program" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Proteksi Surel" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Penandaan Waktu" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Galat saat memuat modul PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Tak bisa menginisiasi modul PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Tak bisa menginisiasi modul PKCS#11 yang terdaftar: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI memiliki pengkodean yang tak valid." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI tak memiliki skema \"pkcs11\"." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI memiliki sintaks salah." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI memiliki nomor versi yang salah." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Stream ditutup" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nama" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Diterbitkan Oleh" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Kadaluarsa" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Sertifikat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Nama Lain" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Alamat XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Surel" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Alamat X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nama Direktori" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nama Partai EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Alamat IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID Terdaftar" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipe kunci tak didukung bagi permintaan sertifikat" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Kunci tak bisa dipakai untuk menandatangani permintaan" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Ring Kunci GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Kunci Ring GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Kunci PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID Kunci" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Proses gnupg keluar dengan kode: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Proses gnupg diakhiri dengan sinyal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Operasi dibatalkan" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Kunci Pribadi" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Kunci Publik" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Permintaan Sertifikat" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Data tak dikenali atau tak didukung." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Tak bisa mengurai data tak valid atau rusak." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Data dikunci" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Lanjutkan" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Batalkan" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atribut yang tak dikenal atau tak tersedia bagi kunci" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Tak bisa membangun kunci publik" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Sapaan lain tengah berlangsung" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Tak bisa menemukan tempat untuk menyimpan sertifikat yang dipin" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Kendala Dasar" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Otoritas Pengelola Sertifikat" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ya" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Tidak" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Panjang Path Maks" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Tanpa batas" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Penggunaan Kunci yang Diperluas" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Penggunaan yang Dibolehkan" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Pengenal Kunci Subjek" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Pengenal Kunci" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Tanda tangan digital" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Enkripsi kunci" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Enkripsi data" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Perjanjian kunci" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Tanda tangan sertifikat" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Tanda tangan daftar pencabutan" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Penggunaan Kunci" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Penggunaan" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Nama Alternatif Subjek" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Ekstensi" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifair" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Nilai" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Tak bisa mengekspor sertifikat." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitas" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Diverfikasi oleh" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Kadaluwarsa" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nama Subjek" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nama Penerbit" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Sertifikat Yang Diterbitkan" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versi" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Tak Valid Sebelum" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Tak Valid Setelah" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Sidik Jari Sertifikat" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Info Kunci Publik" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Tanda Tangan" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Ekspor Sertifikat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritma Kunci" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parameter Kunci" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Ukuran Kunci" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Sidik Jari SHA1 Kunci" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritma Tanda Tangan" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parameter Tanda Tangan" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritis" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Permintaan sertifikat" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipe" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detail" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Tak bisa menampilkan \"%s\"" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Tak bisa menampilkan berkas" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Alasan" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Tak bisa menampilkan berkas jenis ini." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Enkripsi" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Tanda Tangan" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Sertifikasi" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Mengotentikasi" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Dimatikan" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Tak dikenal" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Tak valid" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Dimatikan" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Dicabut" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Kadaluwarsa" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Kepercayaan tak didefinisikan" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Tak dipercaya" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Sedikit dipercaya" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Dipercaya penuh" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Dipercaya tanpa batas" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informasi dalam kunci ini belum diverifikasi" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Kunci ini tak valid" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Kunci ini telah dinonaktifkan" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Kunci ini telah dicabut" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Kunci ini telah kedaluarsa" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Kunci ini tak dipercaya" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Kunci ini agak dipercaya" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Kunci ini dipercaya sepenuhnya" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Kunci ini dipercaya tanpa batas" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID Kunci" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritma" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Dibuat" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Kadaluwarsa" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Kapabilitas" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Kepercayaan pemilik" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nama" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Komentar" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atribut Pengguna" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Ukuran" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Tanda tangan dari suatu dokumen biner" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Tanda tangan dari dokumen teks kanonis" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Tanda tangan mandiri" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Sertifikasi generik atas kunci" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Sertifikasi persona dari kunci" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Sertifikasi santai dari kunci" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Sertifikasi positif dari kunci" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Tanda tangan pengikatan sub kunci" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Tanda tangan pengikatan kunci primer" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Tanda tangan secara langsung pada kunci" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Tanda tangan pencabutan kunci" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Tanda tangan pencabutan sub kunci" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Tanda tangan pencabutan sertifikat" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Tanda tangan stempel waktu" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Tanda tangan konfirmasi pihak ketiga" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Kelas" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Hanya lokal" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Dapat diekspor" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Kunci Pencabutan" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Sidik Jari" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Sub Kunci Publik" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Kunci Rahasia" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Sub Kunci Rahasia" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Menginisialisasi…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Impor tengah berlangsung…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Diimpor ke: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Impor ke: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Tak bisa mengimpor karena tak ada pengimpor yang kompatibel" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Tak ada data untuk diimpor" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Kunci" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Kunci Privat RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Kunci Privat DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Kunci Privat Elliptic Curve" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Kunci Publik DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Kunci Publik Elliptic Curve" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Kekuatan" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Sidik Jari" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Batal" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Dipilih secara otomatis" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Pengguna membatalkan operasi" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Untuk mengimpor, silakan masukkan sandi." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Sandi:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Buka Kunci" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Label:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Pengaturan impor" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Konfirmasi:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Sandi tak cocok." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Sandi tak boleh kosong" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Sapaan Akses" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Buka kunci akses ke sandi dan rahasia lain" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Suatu berkas dengan nama ini telah ada." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Apakah Anda ingin menimpanya dengan suatu berkas baru?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Timpa" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operasi dibatalkan." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Ekspor sertifikat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Simpan" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Berkas sertifikat" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Berkas PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Otomatis buka ring kunci ini ketika saya log masuk" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Mengunci ring kunci ini ketika saya log keluar" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Mengunci ring kunci ini setelah" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Mengunci ring kunci ini bila menganggur selama" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "menit" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Buka kunci: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Sandi" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "Isi \"%s\" terkunci. Untuk melihat isi, masukkan sandi yang benar." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Isi terkunci. Untuk melihat isi, masukkan sandi yang benar." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Sertifikat GCR dan Penilik Kunci" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Tampilkan versi aplikasi" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[berkas...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Tilik berkas kunci dan sertifikat" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Penilik Sertifikat" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Sandi salah" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Diimpor" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Pengimporan gagal" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Impor" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Tutup" diff --git a/po/is.po b/po/is.po new file mode 100644 index 0000000..ab8515b --- /dev/null +++ b/po/is.po @@ -0,0 +1,991 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2004-03-13 06:31-0000\n" +"Last-Translator: helgi \n" +"Language-Team: Icelandic \n" +"Language: is\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +msgid "GnuPG Keyring" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:126 +msgid "Password" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..512b4db --- /dev/null +++ b/po/it.po @@ -0,0 +1,1159 @@ +# Italian Translation of gcr. +# Copyright (C) 2004 - 2010, 2011, 2012, 2013, 2014, 2017, 2018 Free Software Foundation, Inc +# This file is distributed under the same license as the gcr package. +# Luca Ferretti , 2008, 2009, 2010. +# Francesco Marletta , 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011. +# Milo Casagrande , 2011, 2012, 2013, 2014, 2017, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-05 13:43+0100\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Generator: Poedit 2.0.6\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Componente dominio" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID utente" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Indirizzo email" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data di nascita" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Luogo di nascita" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Genere" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Paese di cittadinanza" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Paese di residenza" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nome comune" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Cognome" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Numero seriale" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Paese" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Località" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Stato" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Strada" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizzazione" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unità organizzativa" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titolo" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Numero di telefono" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nome" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniziali" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Qualificatore generazione" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Qualificatore DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonimo" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 con RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 con RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 con RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 con DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Curva ellittica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 con ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 con ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 con ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 con ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 con ECDSA" + +# sarebbe titolo dialogo +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autenticazione server" + +# sarebbe titolo dialogo +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autenticazione client" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Firma codice" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Protezione email" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Marcatura temporale" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Errore nel caricare il modulo PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Impossibile inizializzare il modulo PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Impossibile inizializzare i moduli PKCS#11 registrati: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "L'URI presenta una codifica non valida." + +# FIXME? +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "L'URI non presenta lo schema «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "L'URI presenta una sintassi non valida." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "L'URI presenta un numero di versione errato." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Il flusso è stato chiuso" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nome" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emesso da" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Scadenza" + +# sarebbe titolo dialogo +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificato" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Altro nome" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Indirizzo XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "SRV DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Email" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Indirizzo X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nome directory" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nome gruppo EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Indirizzo IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID registrato" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipo di chiave non supportato per la richiesta di certificato" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "La chiave non può essere utilizzata per firmare la richiesta" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Portachiavi GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Portachiavi GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Chiave PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID chiave" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Processo Gnupg uscito col codice %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Processo Gnupg terminato col segnale %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "L'operazione è stata annullata" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Chiave privata" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Chiave pubblica" + +# +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Richiesta certificato" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Dati non riconosciuti o non supportati." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Impossibile analizzare i dati non validi o danneggiati." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "I dati sono bloccati" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continua" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Annulla" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Inserire la passphrase per OpenSSH" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Attributi per la chiave non riconosciuti o non disponibili" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Impossibile generare la chiave pubblica" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "C'è già un altro prompt in elaborazione" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" +"Impossibile trovare una posizione per archiviare il certificato vincolato " +"(pinned)" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Vincoli di base" + +# sarebbe titolo dialogo +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autorità di certificazione" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Sì" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "No" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Lunghezza massima percorso" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Illimitata" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utilizzo esteso della chiave" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Obiettivi consentiti" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificatore chiave soggetto" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificatore chiave" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Firma digitale" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Cifratura chiave" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Cifratura dati" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Parametri chiave" + +# sarebbe titolo dialogo +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Firma certificato" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Firma elenco revoca" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Utilizzo chiave" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Utilizzi" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Nomi alternativi soggetto" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Estensione" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificatore" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valore" + +# FIXME: magari ha già una traduzione in Firefox o altro?? +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Impossibile esportare il certificato." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identità" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificato da" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Scadenza" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nome soggetto" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nome emanatore" + +# sarebbe titolo dialogo +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificato emesso" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versione" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Non valido prima del" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Non valido dopo il" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Impronte digitali certificato" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informazioni chiave pubblica" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Firma" + +# sarebbe titolo dialogo +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Esporta certificato..." + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritmo della chiave" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametri della chiave" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Dimensione della chiave" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Impronta digitale della chiave SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritmo di firma" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametri della firma" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Critico" + +# +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Richiesta di certificato" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attributo" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipo" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Dettagli" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Impossibile visualizzare «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Impossibile visualizzare il file" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Motivo" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Impossibile visualizzare un file di questo tipo." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Cifra" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Firma" + +# sarebbe titolo dialogo +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certifica" + +# sarebbe titolo dialogo +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentica" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Disabilitata" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Sconosciuta" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Non valida" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Disabilitata" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revocata" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Scaduta" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Fiducia non definita" + +# (ndt) sfiduciata? fiducia nulla? +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nessuna fiducia" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Fiducia parziale" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Fiducia totale" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Fiducia completa" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "" +"Le informazioni contenute in questa chiave non sono ancora state verificate" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Questa chiave non è valida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Questa chiave è stata disabilitata" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Questa chiave è stata revocata" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Questa chiave è scaduta" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Questa chiave è inaffidabile" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "La fiducia di questa chiave è marginale" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "La fiducia di questa chiave è totale" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "La fiducia di questa chiave è completa" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID chiave" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmo" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Creata" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Scadenza" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Funzionalità" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Fiducia nel proprietario" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nome" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Commento" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Attributo utente" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Dimensione" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Firma di un documento binario" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Firma di un documento in testo normale" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Firma indipendente" + +# sarebbe titolo dialogo +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificazione generica della chiave" + +# (ndt) credo ci sia un typo nell'originale +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificazione personale della chiave" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificazione casuale della chiave" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificazione positiva della chiave" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Firma vincolo sotto-chiave" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Firma vincolo chiave primaria" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Firma diretta sulla chiave" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Firma revoca di chiave" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Firma revoca di sotto-chiave" + +# sarebbe titolo dialogo +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Firma revoca di certificato" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Firma marcatura oraria" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Firma conferma di terze parti" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classe" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Solo locale" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Esportabile" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Chiave di revoca" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Impronta digitale" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Sotto-chiave pubblica" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Chiave segreta" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Sotto-chiave segreta" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inizializzazione..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importazione in corso" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importa in: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importa in: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" +"Impossibile eseguire l'operazione per la mancanza di importatori compatibili" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nessun dato da importare" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Chiave" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Chiave privata RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Chiave privata DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Chiave privata Curva ellittica" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Chiave pubblica DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Chiave pubblica Curva ellittica" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Robustezza" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Impronte digitali" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "A_nnulla" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Scelto automaticamente" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "L'utente ha annullato l'operazione" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Per poter eseguire l'importazione, inserire la password." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Password:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +# sarebbe titolo dialogo +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Sblocca" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etichetta:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Impostazioni importazione" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Conferma:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Le password non corrispondono." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "La password non può essere vuota" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Prompt di accesso" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Sblocca l'accesso alle password e altri segreti" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Un file con lo stesso nome esiste già." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Sostituirlo col nuovo file?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Sostituisci" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "L'operazione è stata annullata." + +# sarebbe titolo dialogo +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Esporta certificato" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Salva" + +# +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "File certificati" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "File PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Sbloccare automaticamente questo portachiavi all'accesso" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloccare questo portachiavi al termine della sessione" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloccare questo portachiavi dopo" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloccare questo portachiavi se inattivo per" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minuti" + +# sarebbe titolo dialogo +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Sblocca: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Password" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Il contenuto di «%s» è bloccato. Per poterlo visualizzare, digitare la " +"password corretta." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Il contenuto è bloccato. Per poterlo visualizzare, digitare la password " +"corretta." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Visualizzatore di certificati GCR e di chiavi" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostra la versione dell'applicazione" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[FILE...]" + +# sarebbe titolo dialogo +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Visualizza certificati e file di chiavi" + +# sarebbe titolo dialogo +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visualizzatore di certificati" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "La password non è corretta" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importata" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importazione non riuscita" + +# (ndt) pulsante +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importa" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Chiudi" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..8aa52b4 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,1070 @@ +# gnome-keyring ja.po. +# Copyright (C) 2003-2010,2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Takeshi AIHANA , 2003-2009. +# Satoru SATOH , 2006. +# Takayuki KUSANO , 2009-2010, 2012. +# Hideki Yamane (Debian-JP) , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring gnome-3-6\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2013-09-23 00:13+0000\n" +"PO-Revision-Date: 2013-09-03 15:43+0900\n" +"Last-Translator: Jiro Matsuzawa \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +# 参考: インターネットX.509 PKI: 証明書と CRL のプロファイル +# http://www.ipa.go.jp/security/rfc/RFC5280-04JA.html +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "ドメイン・コンポーネント" + +#: ../egg/egg-oid.c:43 ../ui/gcr-gnupg-renderer.c:410 +#: ../ui/gcr-gnupg-renderer.c:579 +msgid "User ID" +msgstr "ユーザー ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "E-メールアドレス" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "誕生日" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "出生地" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "性別" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "市民権を持つ国" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "住居のある国" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "一般名" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "姓" + +#: ../egg/egg-oid.c:69 ../ui/gcr-certificate-renderer.c:561 +msgid "Serial Number" +msgstr "シリアル番号" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "国" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "地方" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "都道府県" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "通り" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "会社" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "部署" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "役職" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "電話番号" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "名" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "イニシャル" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "世代修飾子" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN 修飾子" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "仮名" + +#: ../egg/egg-oid.c:98 ../ui/gcr-gnupg-renderer.c:201 +#: ../ui/gcr-key-renderer.c:430 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA 付きの MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA 付きの MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA 付きの SHA1" + +#: ../egg/egg-oid.c:103 ../ui/gcr-gnupg-renderer.c:205 +#: ../ui/gcr-key-renderer.c:432 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA 付きの SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "サーバー認証" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "クライアント認証" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "コード署名" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "E-メール保護" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "タイムスタンプ" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 モジュールの読み込み中にエラー: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "PKCS#11 モジュールを初期化できませんでした: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "登録された PKCS#11 モジュールを初期化できませんでした: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI が不正な文字コードです。" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI が 'pkcs11' スキームではありません。" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI の文法が正しくありません。" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI のバージョン番号が正しくありません。" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "ストリームがクローズされました" + +#. later +#. later +#: ../gcr/gcr-certificate.c:343 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "名前" + +#: ../gcr/gcr-certificate.c:345 +msgctxt "column" +msgid "Issued By" +msgstr "発行元" + +#. later +#: ../gcr/gcr-certificate.c:347 +msgctxt "column" +msgid "Expires" +msgstr "有効期限" + +#: ../gcr/gcr-certificate.c:1185 ../gcr/gcr-parser.c:320 +#: ../ui/gcr-certificate-renderer.c:104 ../ui/gcr-certificate-exporter.c:466 +msgid "Certificate" +msgstr "証明書" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "他の名前" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "XMPP アドレス" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:204 ../ui/gcr-gnupg-renderer.c:423 +#: ../ui/gcr-gnupg-renderer.c:705 +msgid "Email" +msgstr "E-メール" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "X.400 アドレス" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "ディレクトリ名" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "EDI パーティ名" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "IP アドレス" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "登録済 ID" + +#: ../gcr/gcr-certificate-request.c:416 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "証明書署名要求に使用できないタイプの鍵です" + +#: ../gcr/gcr-certificate-request.c:503 ../gcr/gcr-certificate-request.c:588 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "この鍵は要求を署名するのに使用できません" + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "GnuPG キーリング" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG キーリング: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-parser.c:326 +#: ../ui/gcr-gnupg-renderer.c:89 +msgid "PGP Key" +msgstr "PGP 鍵" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "鍵 ID" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "gnupg プロセスが次の終了コードで終了しました: %d" + +#: ../gcr/gcr-gnupg-process.c:874 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "gnupg プロセスが次のシグナルにより終了しました: %d" + +#: ../gcr/gcr-gnupg-process.c:928 ../gcr/gcr-parser.c:2422 +#: ../gcr/gcr-parser.c:2915 ../gcr/gcr-system-prompt.c:925 +msgid "The operation was cancelled" +msgstr "処理をキャンセルしました" + +#: ../gcr/gcr-parser.c:317 ../ui/gcr-key-renderer.c:408 +msgid "Private Key" +msgstr "秘密鍵" + +#: ../gcr/gcr-parser.c:323 ../ui/gcr-certificate-renderer.c:883 +#: ../ui/gcr-gnupg-renderer.c:738 ../ui/gcr-key-renderer.c:415 +msgid "Public Key" +msgstr "公開鍵" + +#: ../gcr/gcr-parser.c:329 +msgid "Certificate Request" +msgstr "証明書署名要求" + +#: ../gcr/gcr-parser.c:2425 +msgid "Unrecognized or unsupported data." +msgstr "認識できないまたはサポートしていないデータです" + +#: ../gcr/gcr-parser.c:2428 +msgid "Could not parse invalid or corrupted data." +msgstr "データが不正または壊れているため解析できませんでした" + +#: ../gcr/gcr-parser.c:2431 +msgid "The data is locked" +msgstr "データにはロックがかかっています" + +#: ../gcr/gcr-prompt.c:227 +msgid "Continue" +msgstr "続行" + +#: ../gcr/gcr-prompt.c:236 +msgid "Cancel" +msgstr "キャンセル" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "鍵の認識できないか利用できない属性" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "公開鍵を生成できませんでした" + +#: ../gcr/gcr-system-prompt.c:906 +msgid "Another prompt is already in progress" +msgstr "別の入力待ちが既に進行中です" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "例外として受け入れた証明書の保存場所を見つけられませんでした" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Basic Constraints" +msgstr "基本制約" + +#: ../ui/gcr-certificate-renderer.c:121 +msgid "Certificate Authority" +msgstr "認証局" + +#: ../ui/gcr-certificate-renderer.c:122 ../ui/gcr-certificate-renderer.c:954 +msgid "Yes" +msgstr "はい" + +#: ../ui/gcr-certificate-renderer.c:122 ../ui/gcr-certificate-renderer.c:954 +msgid "No" +msgstr "いいえ" + +#: ../ui/gcr-certificate-renderer.c:125 +msgid "Max Path Length" +msgstr "最大パス長" + +#: ../ui/gcr-certificate-renderer.c:126 +msgid "Unlimited" +msgstr "無制限" + +#: ../ui/gcr-certificate-renderer.c:145 +msgid "Extended Key Usage" +msgstr "拡張鍵用途" + +#: ../ui/gcr-certificate-renderer.c:156 +msgid "Allowed Purposes" +msgstr "許可した用途" + +#: ../ui/gcr-certificate-renderer.c:176 +msgid "Subject Key Identifier" +msgstr "サブジェクト鍵識別子" + +#: ../ui/gcr-certificate-renderer.c:177 +msgid "Key Identifier" +msgstr "鍵識別子" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Digital signature" +msgstr "電子署名" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key encipherment" +msgstr "鍵暗号化" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Data encipherment" +msgstr "データ暗号化" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Key agreement" +msgstr "鍵合致" + +#: ../ui/gcr-certificate-renderer.c:192 +msgid "Certificate signature" +msgstr "証明書署名" + +#: ../ui/gcr-certificate-renderer.c:193 +msgid "Revocation list signature" +msgstr "失効リスト署名" + +#: ../ui/gcr-certificate-renderer.c:218 +msgid "Key Usage" +msgstr "鍵用途" + +#: ../ui/gcr-certificate-renderer.c:219 +msgid "Usages" +msgstr "用途" + +#: ../ui/gcr-certificate-renderer.c:239 +msgid "Subject Alternative Names" +msgstr "サブジェクト代替名称" + +#: ../ui/gcr-certificate-renderer.c:266 +msgid "Extension" +msgstr "拡張" + +#: ../ui/gcr-certificate-renderer.c:270 +msgid "Identifier" +msgstr "識別子" + +#: ../ui/gcr-certificate-renderer.c:271 +#: ../ui/gcr-certificate-request-renderer.c:271 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-gnupg-renderer.c:431 +msgid "Value" +msgstr "値" + +#: ../ui/gcr-certificate-renderer.c:289 +msgid "Couldn't export the certificate." +msgstr "証明書をエクスポートできませんでした。" + +#: ../ui/gcr-certificate-renderer.c:523 +#: ../ui/gcr-certificate-request-renderer.c:312 +msgid "Identity" +msgstr "識別子" + +#: ../ui/gcr-certificate-renderer.c:527 +msgid "Verified by" +msgstr "確認者" + +#: ../ui/gcr-certificate-renderer.c:534 ../ui/gcr-gnupg-renderer.c:719 +msgid "Expires" +msgstr "有効期限" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:541 +#: ../ui/gcr-certificate-request-renderer.c:318 +msgid "Subject Name" +msgstr "サブジェクト名" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:546 +msgid "Issuer Name" +msgstr "発行者の名前" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:551 +msgid "Issued Certificate" +msgstr "発行済の証明書" + +#: ../ui/gcr-certificate-renderer.c:556 +#: ../ui/gcr-certificate-request-renderer.c:329 +msgid "Version" +msgstr "版" + +#: ../ui/gcr-certificate-renderer.c:570 +msgid "Not Valid Before" +msgstr "次より古い日付は妥当ではない" + +#: ../ui/gcr-certificate-renderer.c:575 +msgid "Not Valid After" +msgstr "次より新しい日付は妥当ではない" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:580 +msgid "Certificate Fingerprints" +msgstr "証明書の指紋" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:586 +#: ../ui/gcr-certificate-request-renderer.c:332 +#: ../ui/gcr-certificate-request-renderer.c:378 +msgid "Public Key Info" +msgstr "公開鍵の情報" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:601 ../ui/gcr-certificate-renderer.c:911 +#: ../ui/gcr-certificate-request-renderer.c:348 +#: ../ui/gcr-certificate-request-renderer.c:385 ../ui/gcr-gnupg-renderer.c:560 +msgid "Signature" +msgstr "署名" + +#: ../ui/gcr-certificate-renderer.c:618 +msgid "Export Certificate…" +msgstr "証明書をエクスポート…" + +#: ../ui/gcr-certificate-renderer.c:857 +msgid "Key Algorithm" +msgstr "鍵のアルゴリズム" + +#: ../ui/gcr-certificate-renderer.c:862 +msgid "Key Parameters" +msgstr "鍵のパラメーター" + +#: ../ui/gcr-certificate-renderer.c:870 ../ui/gcr-gnupg-renderer.c:353 +msgid "Key Size" +msgstr "鍵のサイズ" + +#: ../ui/gcr-certificate-renderer.c:878 +msgid "Key SHA1 Fingerprint" +msgstr "鍵の SHA1 指紋" + +#: ../ui/gcr-certificate-renderer.c:900 +msgid "Signature Algorithm" +msgstr "署名アルゴリズム" + +#: ../ui/gcr-certificate-renderer.c:904 +msgid "Signature Parameters" +msgstr "署名のパラメーター" + +#: ../ui/gcr-certificate-renderer.c:953 +msgid "Critical" +msgstr "重大" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:96 +#: ../ui/gcr-certificate-request-renderer.c:307 +#: ../ui/gcr-certificate-request-renderer.c:322 +#: ../ui/gcr-certificate-request-renderer.c:365 +#: ../ui/gcr-certificate-request-renderer.c:370 +msgid "Certificate request" +msgstr "証明書署名要求" + +#: ../ui/gcr-certificate-request-renderer.c:260 +msgid "Attribute" +msgstr "属性" + +#: ../ui/gcr-certificate-request-renderer.c:264 +#: ../ui/gcr-certificate-request-renderer.c:323 +#: ../ui/gcr-certificate-request-renderer.c:371 ../ui/gcr-gnupg-renderer.c:591 +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Type" +msgstr "タイプ" + +#: ../ui/gcr-certificate-request-renderer.c:375 +msgid "Challenge" +msgstr "チャレンジ" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "詳細(_D)" + +#: ../ui/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "'%s' を表示できませんでした" + +#: ../ui/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "ファイルを表示できませんでした" + +#: ../ui/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "理由" + +#: ../ui/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "このタイプのファイルは表示できません。" + +#: ../ui/gcr-gnupg-renderer.c:203 +msgid "Elgamal" +msgstr "エルガマル" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Encrypt" +msgstr "暗号化" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Sign" +msgstr "署名" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Certify" +msgstr "証明" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgid "Authenticate" +msgstr "認証" + +#: ../ui/gcr-gnupg-renderer.c:224 +msgctxt "capability" +msgid "Disabled" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:255 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-key-renderer.c:434 ../ui/gcr-key-renderer.c:439 +msgid "Unknown" +msgstr "不明" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgid "Invalid" +msgstr "不正" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Revoked" +msgstr "破棄済み" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Expired" +msgstr "期限切れ" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Undefined trust" +msgstr "信用レベル設定なし" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Distrusted" +msgstr "信用しない" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Marginally trusted" +msgstr "ある程度信用する" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Fully trusted" +msgstr "完全に信用する" + +#: ../ui/gcr-gnupg-renderer.c:273 +msgid "Ultimately trusted" +msgstr "究極的に信用する" + +#: ../ui/gcr-gnupg-renderer.c:287 +msgid "The information in this key has not yet been verified" +msgstr "この鍵の中の情報はまだ確認されていません" + +#: ../ui/gcr-gnupg-renderer.c:290 +msgid "This key is invalid" +msgstr "この鍵は無効です" + +#: ../ui/gcr-gnupg-renderer.c:293 +msgid "This key has been disabled" +msgstr "この鍵は無効化されています" + +#: ../ui/gcr-gnupg-renderer.c:296 +msgid "This key has been revoked" +msgstr "この鍵は失効しました" + +#: ../ui/gcr-gnupg-renderer.c:299 +msgid "This key has expired" +msgstr "この鍵は有効期限が切れました" + +#: ../ui/gcr-gnupg-renderer.c:304 +msgid "This key is distrusted" +msgstr "この鍵は信頼できないものとされました" + +# http://lpic.jp/centos/GPG.pdf +#: ../ui/gcr-gnupg-renderer.c:307 +msgid "This key is marginally trusted" +msgstr "この鍵はある程度信頼されています" + +#: ../ui/gcr-gnupg-renderer.c:310 +msgid "This key is fully trusted" +msgstr "この鍵は完全に信頼されています" + +#: ../ui/gcr-gnupg-renderer.c:313 +msgid "This key is ultimately trusted" +msgstr "この鍵は絶対的に信頼されています" + +#: ../ui/gcr-gnupg-renderer.c:338 ../ui/gcr-gnupg-renderer.c:564 +msgid "Key ID" +msgstr "鍵 ID" + +#: ../ui/gcr-gnupg-renderer.c:346 ../ui/gcr-gnupg-renderer.c:572 +#: ../ui/gcr-gnupg-renderer.c:619 ../ui/gcr-key-renderer.c:435 +msgid "Algorithm" +msgstr "アルゴリズム" + +#: ../ui/gcr-gnupg-renderer.c:361 ../ui/gcr-gnupg-renderer.c:438 +#: ../ui/gcr-gnupg-renderer.c:481 +msgid "Created" +msgstr "作成日" + +#: ../ui/gcr-gnupg-renderer.c:370 ../ui/gcr-gnupg-renderer.c:447 +#: ../ui/gcr-gnupg-renderer.c:490 +msgid "Expiry" +msgstr "有効期限" + +#: ../ui/gcr-gnupg-renderer.c:379 +msgid "Capabilities" +msgstr "能力" + +#: ../ui/gcr-gnupg-renderer.c:392 +msgid "Owner trust" +msgstr "所有者の信用" + +#: ../ui/gcr-gnupg-renderer.c:420 +msgid "Name" +msgstr "名前" + +#: ../ui/gcr-gnupg-renderer.c:426 ../ui/gcr-gnupg-renderer.c:708 +msgid "Comment" +msgstr "コメント" + +#: ../ui/gcr-gnupg-renderer.c:466 +msgid "User Attribute" +msgstr "ユーザー属性" + +#: ../ui/gcr-gnupg-renderer.c:473 ../ui/gcr-key-renderer.c:442 +msgid "Size" +msgstr "サイズ" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a binary document" +msgstr "バイナリードキュメントの署名" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Signature of a canonical text document" +msgstr "正統なテキストドキュメントの署名" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Standalone signature" +msgstr "署名単体" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Generic certification of key" +msgstr "鍵の一般的な証明" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Persona certification of key" +msgstr "鍵の個人的な証明" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Casual certification of key" +msgstr "鍵の略式の証明" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Positive certification of key" +msgstr "鍵の積極的な証明" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Subkey binding signature" +msgstr "副鍵と結びついている署名" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Primary key binding signature" +msgstr "主鍵と結びついている署名" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Signature directly on key" +msgstr "鍵に直接されている署名" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Key revocation signature" +msgstr "鍵を破棄する署名" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Subkey revocation signature" +msgstr "副鍵を破棄する署名" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Certification revocation signature" +msgstr "証明書を破棄する署名" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Timestamp signature" +msgstr "タイムスタンプの署名" + +#: ../ui/gcr-gnupg-renderer.c:536 +msgid "Third-party confirmation signature" +msgstr "第三者確認用の署名" + +#: ../ui/gcr-gnupg-renderer.c:589 ../ui/gcr-gnupg-renderer.c:597 +msgid "Class" +msgstr "クラス" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Local only" +msgstr "ローカル専用" + +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Exportable" +msgstr "エクスポート可能" + +#: ../ui/gcr-gnupg-renderer.c:611 +msgid "Revocation Key" +msgstr "鍵の破棄" + +#: ../ui/gcr-gnupg-renderer.c:625 ../ui/gcr-gnupg-renderer.c:649 +#: ../ui/gcr-gnupg-renderer.c:651 +msgid "Fingerprint" +msgstr "指紋" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Public Subkey" +msgstr "公開副鍵" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Key" +msgstr "秘密鍵" + +#: ../ui/gcr-gnupg-renderer.c:744 +msgid "Secret Subkey" +msgstr "秘密副鍵" + +#: ../ui/gcr-import-button.c:112 +msgid "Initializing…" +msgstr "初期化中…" + +#: ../ui/gcr-import-button.c:120 +msgid "Import is in progress…" +msgstr "インポートが進行中…" + +#: ../ui/gcr-import-button.c:127 +#, c-format +msgid "Imported to: %s" +msgstr "インポート先: %s" + +#: ../ui/gcr-import-button.c:147 +#, c-format +msgid "Import to: %s" +msgstr "インポート先: %s" + +#: ../ui/gcr-import-button.c:160 +msgid "Cannot import because there are no compatible importers" +msgstr "インポート処理できる仕組みがないのでインポートできません" + +#: ../ui/gcr-import-button.c:169 +msgid "No data to import" +msgstr "インポートするデータがありません" + +#: ../ui/gcr-key-renderer.c:90 +msgid "Key" +msgstr "鍵" + +#: ../ui/gcr-key-renderer.c:404 +msgid "Private RSA Key" +msgstr "秘密 RSA 鍵" + +#: ../ui/gcr-key-renderer.c:406 +msgid "Private DSA Key" +msgstr "秘密 DSA 鍵" + +#: ../ui/gcr-key-renderer.c:411 ../ui/gcr-key-renderer.c:413 +msgid "Public DSA Key" +msgstr "公開 DSA 鍵" + +#: ../ui/gcr-key-renderer.c:422 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d ビット" + +#: ../ui/gcr-key-renderer.c:423 +msgid "Strength" +msgstr "強度" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:446 +msgid "Fingerprints" +msgstr "指紋" + +#: ../ui/gcr-key-renderer.c:450 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:455 +msgid "SHA256" +msgstr "SHA256" + +#: ../ui/gcr-pkcs11-import-dialog.c:188 +msgid "Automatically chosen" +msgstr "自動選択" + +#: ../ui/gcr-pkcs11-import-dialog.c:272 +#: ../ui/gcr-pkcs11-import-interaction.c:154 +#: ../ui/gcr-pkcs11-import-interaction.c:172 +#, c-format +msgid "The user cancelled the operation" +msgstr "ユーザーが処理をキャンセルしました" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "インポートする場合は、パスワードを入力してください。" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:564 +msgid "Password:" +msgstr "パスワード:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "トークン:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:72 +#: ../ui/gcr-unlock-renderer.c:127 +msgid "Unlock" +msgstr "ロック解除" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "ラベル:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "インポート設定" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:581 +msgid "Confirm:" +msgstr "確認:" + +#: ../ui/gcr-prompt-dialog.c:649 +msgid "Passwords do not match." +msgstr "パスワードが一致しません。" + +#: ../ui/gcr-prompt-dialog.c:656 +msgid "Password cannot be blank" +msgstr "空のパスワードは認められません" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "アクセスプロンプト" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "パスワードその他の秘密情報へのアクセスを解除" + +#: ../ui/gcr-certificate-exporter.c:227 +msgid "A file already exists with this name." +msgstr "この名前のファイルが既に存在します。" + +#: ../ui/gcr-certificate-exporter.c:228 +msgid "Do you want to replace it with a new file?" +msgstr "新しいファイルで置換しますか?" + +#: ../ui/gcr-certificate-exporter.c:231 +msgid "_Replace" +msgstr "置換(_R)" + +#: ../ui/gcr-certificate-exporter.c:261 +#, c-format +msgid "The operation was cancelled." +msgstr "処理をキャンセルしました。" + +#: ../ui/gcr-certificate-exporter.c:305 +msgid "Export certificate" +msgstr "証明書をエクスポート" + +#: ../ui/gcr-certificate-exporter.c:317 +msgid "Certificate files" +msgstr "証明書ファイル" + +#: ../ui/gcr-certificate-exporter.c:328 +msgid "PEM files" +msgstr "PEM ファイル" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "ログインしたら、このキーリングのロックを自動的に解除する" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "ログアウトしたら、このキーリングの自動的にロックする" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "このキーリングを以下の時間経過したらロック:" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "このキーリングを以下の時間アイドルだったらロックする:" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "分" + +#: ../ui/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "ロック解除: %s" + +#: ../ui/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "パスワード" + +#: ../ui/gcr-unlock-renderer.c:277 +#, c-format +msgid "The contents of '%s' are locked. In order to view the contents, enter the correct password." +msgstr "'%s' の内容はロックされています。内容を見るには正しいパスワードを入力してください。" + +#: ../ui/gcr-unlock-renderer.c:280 +msgid "The contents are locked. In order to view the contents, enter the correct password." +msgstr "この内容はロックされています。内容を見るには正しいパスワードを入力してください。" + +#: ../ui/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR 証明書・鍵ビューアー" + +#: ../ui/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "アプリケーションのバージョンを表示する" + +#: ../ui/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[ファイル...]" + +#: ../ui/gcr-viewer-tool.c:105 +msgid "- View certificate and key files" +msgstr "- 証明書や鍵ファイルを表示する" + +#: ../ui/gcr-viewer-tool.c:119 ../ui/gcr-viewer-widget.c:638 +msgid "Certificate Viewer" +msgstr "証明書ビューアー" + +#: ../ui/gcr-viewer-widget.c:204 +msgid "The password was incorrect" +msgstr "パスワードが間違っています" + +#: ../ui/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "インポートしました" + +#: ../ui/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "インポートに失敗しました" + +#: ../ui/gcr-viewer-window.c:108 +msgid "Import" +msgstr "インポート" diff --git a/po/ka.po b/po/ka.po new file mode 100644 index 0000000..dda5f53 --- /dev/null +++ b/po/ka.po @@ -0,0 +1,992 @@ +# Georgian translation for Gnome Keyring. +# Copyright © 2006 Ubuntu Georgian Translators. +# Alexander Didebulidze , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2006-02-21 14:31+0100\n" +"Last-Translator: Alexander Didebulidze \n" +"Language-Team: Georgian \n" +"Language: ka\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "გახსენი Keyring–ი" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "გახსენი Keyring–ი" + +#: ../gcr/gcr-unlock-renderer.c:126 +msgid "Password" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/kk.po b/po/kk.po new file mode 100644 index 0000000..230ad75 --- /dev/null +++ b/po/kk.po @@ -0,0 +1,1120 @@ +# Kazakh translation for gcr. +# Copyright (C) 2015 gcr's COPYRIGHT HOLDER +# This file is distributed under the same license as the gcr package. +# Baurzhan Muftakhidinov , 2015-2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-10-18 09:40+0000\n" +"PO-Revision-Date: 2017-02-21 13:42+0500\n" +"Last-Translator: Baurzhan Muftakhidinov \n" +"Language-Team: Kazakh \n" +"Language: kk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.8.11\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Электронды пошта" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Жынысы" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Сериялық нөмірі" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Ел" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Көше" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Ұйым" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Әкесінің аты" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Аты" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Кім берген" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Басқа аты" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Эл. пошта" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 адресі" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP адресі" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP кілті" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Кілт идентификаторы" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Жалғастыру" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Бас тарту" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Иә" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Шектелмеген" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Кеңейту" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Анықтағыш" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Мәні" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Сертификатты экспорттау мүмкін емес." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Идентификация" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Нұсқасы" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Қолтаңба" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Критикалық" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Атрибут" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Түрі" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "Көбір_ек" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Себебі" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Шифрлеу" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Қолтаңба" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Аутентификация" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Сөндірулі" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Белгісіз" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Қате" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Сөндірулі" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Бұл кілт жарамсыз" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Бұл кілт сөндірілген" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Бұл кілт қайта шақырылған" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Бұл кілттің мерзімі аяқталған" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Бұл кілтке сенім жоқ" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Бұл кілт шамалы сенімді" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Бұл кілт толығымен сенімді" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Бұл кілт шексіз сенімді" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Кілт идентификаторы" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Алгоритмі" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Жасалған" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Аты" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Түсіндірме" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Өлшемі" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Кілт" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Жеке RSA кілті" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Жеке DSA кілті" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u бит" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Мықтылығы" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "Ба_с тарту" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "О_К" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Пароль:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Токен:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Босату" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Белгісі:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Импорттау баптаулары" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Растау:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Парольдер өзара сәйкес келмейді." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Пароль бос болуы мүмкін емес" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Олай аталатын файл бар болып тұр." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Оны жаңа файлмен алмастыруды қалайсыз ба?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "А_лмастыру" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Әрекеттен бас тартылды." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Сертификатты экспорттау" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Сақтау" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Сертификаттар файлдары" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM файлдары" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "минут" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Босату: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Пароль" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR сертификаттар және кілдер шолушысы" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Қолданба нұсқасын көрсету" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[файл...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Сертификаттар және кілт файларын қарау" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Сертификаттар шолушысы" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Пароль қате" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Импортталған" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Импорттау сәтсіз" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Импорт" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Жабу" diff --git a/po/kn.po b/po/kn.po new file mode 100644 index 0000000..c7320d9 --- /dev/null +++ b/po/kn.po @@ -0,0 +1,1057 @@ +# translation of gnome-keyring.master.kn.po to Kannada +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Shankar Prasad , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master.kn\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2009-09-16 00:32+0530\n" +"Last-Translator: Shankar Prasad \n" +"Language-Team: Kannada \n" +"Language: kn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "ಡೊಮೈನಿನ ಘಟಕ" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ಬಳಕೆದಾರ ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "ಹುಟ್ಟಿದ ದಿನಾಂಕ" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "ಹುಟ್ಟಿದ ಸ್ಥಳ" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "ಲಿಂಗ" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "ನಾಗರೀಕತ್ವವನ್ನು ಹೊಂದಿದ ದೇಶ" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "ವಾಸವಾಗಿರುವ ದೇಶ" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "ಸಾಮಾನ್ಯ ಹೆಸರು" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "ಉಪನಾಮ" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "ಅನುಕ್ರಮ ಸಂಖ್ಯೆ" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "ದೇಶ" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "ಪ್ರದೇಶ" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "ರಾಜ್ಯ" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "ಬೀದಿ" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "ಸಂಸ್ಥೆ" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "ಸಂಸ್ಥೆಯ ಘಟಕ" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "ಶೀರ್ಷಿಕೆ" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "ದೂರವಾಣಿ ಸಂಖ್ಯೆ" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "ಒದಗಿಸಲಾದ ಹೆಸರು" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "ಇನಿಶಿಯಲ್‌ಗಳು" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "ಕ್ವಾಲಿಫಯರ್ ಅನ್ನು ಉತ್ಪಾದಿಸಲಾಗುತ್ತಿದೆ" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN ಕ್ವಾಲಿಫಯರ್" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "ಗುಪ್ತನಾಮ" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA ಯೊಂದಿಗಿನ MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA ಯೊಂದಿಗಿನ MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA ಯೊಂದಿಗಿನ SHA1" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA ಯೊಂದಿಗಿನ SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "SSL ಪರಿಚಾರಕ ಪ್ರಮಾಣಪತ್ರ" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "SSL ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರ" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, fuzzy, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "ಕಡತವನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "ಅಧಿವೇಶನವು ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "ಒದಗಿಸಲಾದ ದಿನಾಂಕ" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "ಅವಧಿ ಮುಗಿಯುವ ದಿನಾಂಕ" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "ಕಾರ್ಯವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "ಪ್ರಮಾಣಪತ್ರವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "ಒದಗಿಸಿದವರ ಹೆಸರು" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "ಇಮೇಲ್" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "ವಿಷಯದ ಹೆಸರು" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "ಹೌದು" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "ಇಲ್ಲ" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "ಪತ್ತೆಗಾರ" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "ಪತ್ತೆಗಾರ" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "ಸಹಿ" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "ಕೀಲಿ ನಿಯತಾಂಕಗಳು" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "ವಿಷಯದ ಹೆಸರು" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "ವಿಸ್ತರಣೆ" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "ಪತ್ತೆಗಾರ" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "ಮೌಲ್ಯ" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "ಸಂದಿಗ್ಧ" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "ಪ್ರಮಾಣಪತ್ರವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "ಪತ್ತೆಗಾರ" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "ಅವಧಿ ಮುಗಿಯುವ ದಿನಾಂಕ" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "ವಿಷಯದ ಹೆಸರು" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "ಒದಗಿಸಿದವರ ಹೆಸರು" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "ಒದಗಿಸಲಾದ ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "ಆವೃತ್ತಿ" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "ಇದಕ್ಕೂ ಮುಂಚೆ ಮಾನ್ಯವಲ್ಲ" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "ಇದರ ನಂತರ ಮಾನ್ಯವಲ್ಲ" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "ಫಿಂಗರ್-ಪ್ರಿಂಟ್‌ಗಳು" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "ಸಹಿ" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "ಸಹಿ ಅಲ್ಗಾರಿತಮ್" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "ಸಹಿ ನಿಯತಾಂಕಗಳು" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "ಸಾರ್ವಜನಿಕ ಕೀಲಿ ಮಾಹಿತಿ" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "ಕೀಲಿ ಅಲ್ಗಾರಿತಮ್" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "ಕೀಲಿ ನಿಯತಾಂಕಗಳು" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "ಕೀಲಿ ಗಾತ್ರ" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 ಫಿಂಗರ್-ಪ್ರಿಂಟ್" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "ಸಾರ್ವಜನಿಕ ಕೀಲಿ" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +#, fuzzy +msgid "Could not display file" +msgstr "ಕಡತವನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "ಕೀಲಿ ಸುರುಳಿಯನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "ಕಾರ್ಯವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "ಸಹಿ" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "ಗೊತ್ತಿಲ್ಲದ ದೋಷ" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "ಅವಧಿ ಮುಗಿಯುವ ದಿನಾಂಕ" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "ಮಾಹಿತಿಯು ಸೂಕ್ಷ್ಮವಾದ್ದರಿಂದ ಅದನ್ನು ಬಹಿರಂಗ ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "ಅಮಾನ್ಯವಾದ ಅಧಿವೇಶನ" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "ಘಟಕವು ಇನ್ನೂ ಆರಂಭಗೊಂಡಿಲ್ಲ" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "ಕೀಲಿಸುರುಳಿಯು ಈಗಾಗಲೆ ಅನ್‌ಲಾಕ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "ಗುಪ್ತಪದ ಅಥವ PIN ನ ವಾಯಿದೆಯು ತೀರಿದೆ" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "ತಪ್ಪಾದ ಬಗೆಯ ಕೀಲಿಯಾಗಿದೆ" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "ಕೀಲಿ ಅಲ್ಗಾರಿತಮ್" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "ರಚಿಸು(_r)" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "ಅವಧಿ ಮುಗಿಯುವ ದಿನಾಂಕ" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "ಕೀಲಿ ಗಾತ್ರ" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "ಸಹಿ ನಿಯತಾಂಕಗಳು" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "ಸಹಿ" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "ಪ್ರಮಾಣಪತ್ರವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "ಸಹಿ ನಿಯತಾಂಕಗಳು" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "ಪ್ರದೇಶ" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "ಫಿಂಗರ್-ಪ್ರಿಂಟ್‌ಗಳು" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "ಸಾರ್ವಜನಿಕ ಕೀಲಿ" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "ಇನಿಶಿಯಲ್‌ಗಳು" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "ಇದಕ್ಕೆ ಆಮದು ಮಾಡು:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "ಇದಕ್ಕೆ ಆಮದು ಮಾಡು:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "ಕೀಲಿಯನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಅದು ಒಂದು ಅಮಾನ್ಯ ಬಗೆಯದ್ದಾಗಿದೆ" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "ಆಮದು ಮಾಡಲು ಯಾವುದೆ ಸ್ಥಳವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "ಖಾಸಗಿ ಕೀಲಿ" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "ಖಾಸಗಿ ಕೀಲಿ" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "ಖಾಸಗಿ ಕೀಲಿ" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "ಸಾರ್ವಜನಿಕ ಕೀಲಿ" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "ಬೀದಿ" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "ಫಿಂಗರ್-ಪ್ರಿಂಟ್‌ಗಳು" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "ಗುರುತಿಸಲಾಗದ ಅಥವ ಬೆಂಬಲವಿಲ್ಲದ ದತ್ತಾಂಶ." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "ಅಮಾನ್ಯವಾದ ಅಥವ ಭ್ರಷ್ಟಗೊಂಡ ದತ್ತಾಂಶವನ್ನು ಪಾರ್ಸ್ ಮಾಡಲಾಗಿಲ್ಲ." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "ದತ್ತಾಂಶವನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "ನಾನು ಒಳಗೆ ಪ್ರವೇಶಿಸಿದಾಗ ತಾನಾಗಿಯೆ ಅನ್‌ಲಾಕ್ ಆಗುವಂತೆ ಮಾಡು" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s' ಅನ್ನು ಆಮದುಕೊಳ್ಳಲು, ಅದು ಲಾಕ್ ಆಗಿರಬಾರದು" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "ಗುಪ್ತಪದ:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "ಆಮದು ಮಾಡಲಾದ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು/ಕೀಲಿಗಳನ್ನು ಇರಿಸಿಲು ಒಂದು ಸ್ಥಳವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "ನಾನು ಒಳಗೆ ಪ್ರವೇಶಿಸಿದಾಗ ಈ ಕೀಲಿ ಸುರುಳಿಯನ್ನು ತಾನಾಗಿಯೆ ಅನ್‌ಲಾಕ್ ಆಗುವಂತೆ ಮಾಡು." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "ನಾನು ಒಳಗೆ ಪ್ರವೇಶಿಸಿದಾಗ ಈ ಕೀಲಿ ಸುರುಳಿಯನ್ನು ತಾನಾಗಿಯೆ ಅನ್‌ಲಾಕ್ ಆಗುವಂತೆ ಮಾಡು." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "ಗುಪ್ತಪದ:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "ಅನ್ವಯವು ಕೀಲಿ ಸುರಳಿಯನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಅನುಮತಿಸಬೇಕೆ?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "ಪ್ರಮಾಣಪತ್ರ" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "ಗುಪ್ತಪದ ಅಥವ PIN ಸರಿಯಾಗಿಲ್ಲ" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "ಇದಕ್ಕೆ ಆಮದು ಮಾಡು:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "ಕಾರ್ಯವು ವಿಫಲಗೊಂಡಿದೆ" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "ಇದಕ್ಕೆ ಆಮದು ಮಾಡು:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..f2cf135 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,1122 @@ +# gcr Korean translation +# This file is distributed under the same license as the gcr package. +# +# Young-Ho Cha , 2006. +# Changwoo Ryu , 2004, 2006-2014, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-02-22 19:17+0000\n" +"PO-Revision-Date: 2017-03-04 03:28+0900\n" +"Last-Translator: Changwoo Ryu \n" +"Language-Team: GNOME Korea \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "도메인 구성 요소" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "사용자 ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "전자메일 주소" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "생년월일" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "출생지" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "성별" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "국적" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "거주 국가" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "공통 이름" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "성" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "일련 번호" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "국가" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "소재지" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "주" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "도로" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "기관" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "기관 부서" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "직급" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "전화번호" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "이름" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "이니셜" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "생성 권한" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN 권한" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "필명" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 및 RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 및 RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 및 RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 및 DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "타원 곡선" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 및 ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 및 ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 및 ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 및 ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 및 ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "서버 인증" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "클라이언트 인증" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "코드 서명" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "전자메일 보호" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "타임스탬프" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 모듈을 읽어들이는데 오류: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "PKCS#11 모듈을 초기화할 수 없습니다: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "등록한 PKCS#11 모듈을 초기화할 수 없습니다: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI 인코딩이 잘못되었습니다." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI에 “pkcs11” 스킴이 들어있지 않습니다." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI 형식이 잘못되었습니다." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI 버전이 잘못되었습니다." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "스트림이 잠겨 있습니다" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "이름" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "발급 날짜" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "만료 날짜" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "인증서" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "다른 이름" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP 주소" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS 서버" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "전자메일" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 주소" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "디렉터리 이름" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI 파티 이름" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP 주소" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "등록 ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "인증서 요청에 있는 키 종류를 지원하지 않습니다" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "요청에 서명하는데 이 키를 사용할 수 없습니다" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG 키 모음" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG 키 모음: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP 키" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "키 ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "gnupg 프로세스가 다음 리턴값으로 끝났습니다: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "gnupg 프로세스가 다음 시그널로 강제 종료되었습니다: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "작업을 취소했습니다" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "개인 키" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "공개 키" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "인증서 요청" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "알지 못하거나 지원하지 않는 데이터." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "잘못되었거나 손상된 데이터를 파싱할 수 없습니다." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "데이터가 잠겨 있습니다" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "계속" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "취소" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "키에 알 수 없는 속성이 있거나 속성이 없습니다" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "공개키를 만들 수 없습니다" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "다른 프롬프트가 이미 진행 중입니다" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "지정한 인증서를 저장할 위치를 찾을 수 없습니다" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "기본 제한" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "인증 기관" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "예" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "아니요" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "최대 경로 길이" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "무제한" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "확장된 키 사용" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "허용한 목적" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "제목 식별 이름" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "키 식별 이름" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "디지털 서명" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "키 암호화" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "데이터 암호화" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "키 교환" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "인증서 서명" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "철회 목록 서명" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "키 사용" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "사용" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "제목 다른 이름" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "확장" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "식별 이름" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "값" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "인증서를 내보낼 수 없습니다." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "신원" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "확인한 곳" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "만료 날짜" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "제목" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "발급자 이름" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "발급한 인증서" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "버전" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "유효 기간 시작" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "유효 기간 끝" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "인증서 핑거프린트" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "공개 키 정보" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "서명" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "인증서 내보내기…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "키 알고리듬" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "키 파라미터" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "키 크기" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "키 SHA1 핑거프린트" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "서명 알고리듬" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "서명 파라미터" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "중대함" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "인증서 요청" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "속성" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "종류" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "시험" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "상세 정보(_D)" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "“%s”을(를) 표시할 수 없습니다" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "파일을 표시할 수 없습니다" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "이유" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "이 종류의 파일을 표시할 수 없습니다." + +# 알고리듬 이름 +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "암호화" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "서명" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "공인" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "인증" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "사용 안 함" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "알 수 없음" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "잘못됨" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "사용 안 함" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "철회됨" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "만료됨" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "신뢰 정의되지 않음" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "신뢰하지 않음" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "어느 정도 신뢰" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "완전히 신뢰" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "절대적 신뢰" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "이 키에 대한 정보가 아직 확인되지 않았습니다" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "이 키는 올바르지 않습니다" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "이 키는 사용하지 않습니다" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "이 키는 철회되었습니다" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "이 키는 만료되었습니다" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "이 키는 신뢰하지 않습니다" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "이 키는 어느 정도 신뢰합니다" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "이 키는 완전히 신뢰합니다" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "이 키는 절대적으로 신뢰합니다" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "키 ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "알고리듬" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "만든 시점" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "만료 시점" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "기능" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "소유자 신뢰" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "이름" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "추가 설명" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "사용자 속성" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "크기" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "바이너리 문서의 서명" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "규칙에 맞는 텍스트 문서의 서명" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "단독 서명" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "키의 일반 인증서" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "키의 페르소나 인증서" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "키의 캐주얼 인증서" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "키의 포지티브 인증서" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "서브키 바인딩 서명" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "프라이머리 키 바인딩 서명" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "키에 있는 직접 서명" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "키 철회 서명" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "서브키 철회 서명" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "인증서 철회 서명" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "타임스탬프 서명" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "서드파티 확인 서명" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "클래스" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "로컬 전용" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "내보내기 가능" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "철회 키" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "핑거프린트" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "공개 서브키" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "비밀 키" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "비밀 서브키" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "초기화 중…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "가져오기가 진행 중입니다…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "가져온 위치: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "다음 위치에 가져오기: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "호환되는 가져오기 기능이 없으므로 가져올 수 없습니다" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "가져올 데이터가 없습니다" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "키" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "개인 RSA 키" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "개인 DSA 키" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "개인 타원 곡선 키" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "공개 DSA 키" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "공개 타원 곡선 키" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u비트" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "강도" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "핑거프린트" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "취소(_C)" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "확인(_O)" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "자동으로 선택" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "사용자가 작업을 취소했습니다" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "가져오려면 암호를 입력하십시오." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "암호:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "토큰:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "잠금 풀기" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "레이블:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "가져오기 설정" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "확인:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "암호가 일치하지 않습니다." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "암호를 비워둘 수 없습니다" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "프롬프트 접근" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "암호 및 기타 비밀 정보 접근에 대한 잠금을 풉니다" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "같은 이름의 파일이 이미 있습니다." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "이 파일을 새 파일로 덮어쓰시겠습니까?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "바꾸기(_R)" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "작업을 취소했습니다." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "인증서 내보내기" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "저장(_S)" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "인증서 파일" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM 파일" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "로그인할 때 자동으로 이 키 모음 잠금 풀기" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "로그아웃할 때 이 키 모음 잠그기" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "다음 동작 뒤에 키 모음 잠그기" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "일정 시간 입력이 없으면 키 모음 잠그기" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "분" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "잠금 풀기: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "암호" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "“%s”의 내용이 잠겨 있습니다. 내용을 보려면 올바른 암호를 입력하십시오." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "내용이 잠겨 있습니다. 내용을 보려면 올바른 암호를 입력하십시오." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR 인증서 및 키 보기" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "프로그램의 버전을 표시합니다" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[파일...]" + +# 커맨드 옵션 분류 +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- 인증서 및 키 파일 보기" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "인증서 보기" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "암호가 올바르지 않습니다" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "가져옴" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "가져오기 실패" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "가져오기" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "닫기(_C)" diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..6384b85 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,1133 @@ +# translation of lt.po to Lithuanian +# Lithuanian translation of gnome-keyring. +# Copyright (C) 2004-2007, 2008, 2010 Free Software Foundation, Inc. +# Tomas Kuliavas , 2004. +# Žygimantas Beručka , 2004-2007, 2010. +# Gintautas Miliauskas , 2008. +# Aurimas Černius , 2013, 2014, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring HEAD\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 17:22+0000\n" +"PO-Revision-Date: 2018-03-02 20:18+0200\n" +"Last-Translator: Moo\n" +"Language-Team: Lietuvių \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.0.4\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domeno komponentas" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Naudotojo ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "El. pašto adresas" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Gimimo data" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Gimimo vieta" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Lytis" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Pilietybės šalis" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Gyvenamoji šalis" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Bendrinis vardas" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Pavardė" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serijos numeris" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Šalis" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Vieta" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Valstija" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Gatvė" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizacija" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Padalinys" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Antraštė" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefono numeris" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Vardas" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Slapyvardis" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Kartos kvalifikatorius" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN kvalifikatorius" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Slapyvardis" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 su RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 su RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "MD2 su RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 su DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elisinė kreivė" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 su ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 su ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 su ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 su ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 su ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Serverio tapatybės patikrinimas" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Kliento tapatybės patikrinimas" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Kodo pasirašymas" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "El. pašto apsauga" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Laiko žymos" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Klaida įkeliant PKCS#11 modulį: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Nepavyko inicijuoti PKCS#11 modulio: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Nepavyko inicijuoti registruotų PKCS#11 modulių: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Bloga URI koduotė." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI neturi „pkcs11“ schemos." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Bloga URI sintaksė." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Blogas URI versijos numeris." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Srautas buvo užvertas" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Vardas" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Išdavė" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Galioja iki" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Liudijimas" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Kitas vardas" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP adresas" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "El. paštas" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 adresas" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Katalogo pavadinimas" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI šalies pavadinimas" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP adresas" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registracijos ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nepalaikomas rakto tipas liudijimo užklausai" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Raktas negali būti naudojamas užklausai pasirašyti" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG raktinė" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "PGP raktinė: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP raktas" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Rakto ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg procesas baigėsi su kodu: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg procesas baigėsi su signalu: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Operacija nutraukta" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privatus raktas" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Viešasis raktas" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Liudijimo užklausa" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Duomenys netaisyklingi arba neatpažinti." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Nepavyko apdoroti netaisyklingų arba sugadintų duomenų." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Duomenys užrakinti" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Tęsti" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Atsisakyti" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Įveskite savo OpenSSH slaptafrazę" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Neatpažinti arba nepasiekiami rakto atributai" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Negalima sukurti viešojo rakto" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Kitas užklausimas yra yra eigoje" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Nepavyksta rasti vietos prisegto liudijimo įrašymui" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Pagrindiniai ribojimai" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Liudijimo įstaiga" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Taip" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ne" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Didžiausias kelio ilgis" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Neribojamas" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Išplėstinis rakto naudojimas" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Leidžiami tikslai" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Subjekto rakto identifikatorius" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Rakto identifikatorius" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Skaitmeninis parašas" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Rakto šifravimas" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Duomenų šifravimas" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Rakto sutartis" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Liudijimo parašas" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Panaikinimų sąrašo parašas" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Rakto naudojimas" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Naudojimai" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Subjekto alternatyvūs vardai" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Plėtinys" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikatorius" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Reikšmė" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Nepavyko eksportuoti liudijimo." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Tapatybė" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Patikrino" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Galioja iki" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Kam išduotas" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Kas išdavė" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Išduotasis liudijimas" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versija" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Negalioja iki" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Negalioja po" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Liudijimo kontroliniai kodai" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Viešojo rakto informacija" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Parašas" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Eksportuoti liudijimą…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Viešojo rakto algoritmas" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Rakto parametrai" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Rakto dydis" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Rakto SHA1 kontrolinis kodas" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Parašo algoritmas" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parašo parametrai" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritinis" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Liudijimo užklausa" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atributas" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipas" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Išsami informacija" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Nepavyko parodyti „%s“" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Nepavyko parodyti failo" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Priežastis" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Nepavyksta parodyti šio tipo failo." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Šifruoti" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Pasirašyti" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Liudyti" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Patvirtinti tapatybę" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Išjungta" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Nežinoma" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Netinkama" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Išjungta" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Atšauktas" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Nebegalioja" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Neapibrėžtas pasitikėjimas" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nepasitikima" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Dalinai pasitikima" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Visiškai pasitikima" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Besąlygiškai pasitikima" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Šio rakto informacija dar nebuvo patikrinta" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Šis raktas yra netinkamas" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Šis raktas buvo išjungtas" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Šis raktas atšauktas" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Šis raktas nebegalioja" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Šiuo raktu nepasitikima" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Šiuo raktu dalinai pasitikima" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Šiuo raktu visiškai pasitikima" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Šiuo raktu besąlygiškai pasitikima" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Rakto ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmas" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Sukurtas" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Galioja iki" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Galimybės" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Savininko pasitikėjimas" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Vardas" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Komentaras" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Naudotojo atributas" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Dydis" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Dvejetainio dokumento parašas" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Kanoninio teksto dokumento parašas" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Pavienis parašas" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Bendrinis rakto liudijimas" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Asmens liudijimo raktas" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Įprastinis liudijimo raktas" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Teigiamas liudijimo raktas" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Porakčio susiejimo parašas" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Pirminio rakto susiejimo parašas" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Parašas tiesiogiai rakte" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Rakto atšaukimo parašas" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Porakčio atšaukimo parašas" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Liudijimo atšaukimo parašas" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Laiko žymos parašas" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Trečiosios šalies patvirtinimo parašas" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasė" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Tik vietinis" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Eksportuojamas" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Atšaukimo raktas" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Kontroliniai kodai" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Viešasis poraktis" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Slaptas raktas" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Slaptas poraktis" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicijuojama…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importavimas eigoje…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importuota į: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importuoti į: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Negalima importuoti, nes nėra suderinamų importuotojų" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nėra importuojamų duomenų" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Raktas" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privatus RSA raktas" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privatus DSA raktas" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Privatus elipsinės kreivės raktas" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Viešasis DSA raktas" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Viešas elipsinės kreivės raktas" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bitas" +msgstr[1] "%u bitai" +msgstr[2] "%u bitų" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Stiprumas" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Kontroliniai kodai" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Atsisakyti" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Gerai" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatiškai pasirinktas" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Naudotojas atšaukė veiksmą" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Importavimui įveskite slaptažodį." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Slaptažodis:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Leksema:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Atrakinti" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Žyma:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importavimo nustatymai" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Patvirtinti:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Slaptažodžiai nesutampa." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Slaptažodis negali būti tuščias" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Prieigos užklausimas" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Atrakinti prieigą prie slaptažodžių ir kitų paslapčių" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Jau yra failas tokiu pavadinimu." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Ar norite jį pakeisti nauju failu?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "Pa_keisti" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operacija nutraukta." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Eksportuoti liudijimą" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "Į_rašyti" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Liudijimo failai" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM failai" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Automatiškai atrakinti šią raktinę, kai prisijungiu" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Užrakinti šią raktinę, kai atsijungiu" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Užrakinti šią raktinę po" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Užrakinti šią raktinę, jei nenaudojama" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minučių" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Atrakinti: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Slaptažodis" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"„%s“ turinys užrakintas. Norėdami pamatyti turinį, įveskite teisingą " +"slaptažodį." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Turinys užrakintas. Norėdami pamatyti turinį, įveskite teisingą slaptažodį." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR liudijimų ir raktų žiūryklė" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Rodyti programos versiją" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[failas...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- žiūrėti liudijimų ir raktų failus" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Liudijimų žiūryklė" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Slaptažodis neteisingas" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importuota" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importavimas nepavyko" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importavimas" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Užverti" diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..a5a2e04 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,1132 @@ +# translation of lv.po to Latvian +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# Linux Centrs , 2006. +# Raivis Dejus , 2006. +# Peteris Krisjanis , 2010. +# Rudolfs , 2011. +# Rūdofls Mazurs , 2011, 2012, 2013, 2014, 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: lv\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-k" +"eyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-04 17:59+0200\n" +"Last-Translator: Rūdolfs Mazurs \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2009-01-04 12:36+0000\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :" +" 2);\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domēna komponente" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Lietotāja ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-pasta adrese" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Dzimšanas datums" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Dzimšanas vieta" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Dzimums" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Pilsonības valsts" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Dzīves vietas valsts" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Vārds" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Uzvārds" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Sērijas numurs" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Valsts" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Apgabals" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Štats" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Iela" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizācija" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organizācijas struktūrvienība" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Amats" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Tālruņa numurs" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Dotais vārds" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniciāļi" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Ģenerācijas identifikators" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN identifikators" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseidonīms" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 ar RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 ar RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 ar RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 ar DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Eliptisko līkņu" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 ar ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 ar ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 ar ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 ar ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 ar ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Servera autentificēšana" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Klienta autentificēšana" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Koda parakstīšana" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-pasta aizsardzība" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Laika apzīmogošana" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Kļūda, ielādējot PKCS#11 moduli — %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Nevarēja inicializēt PKCS#11 moduli — %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Nevarēja inicializēt reģistrētus PKCS#11 moduļus — %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Šai URI ir nederīgs kodējums." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI neatbilst “pkcs11” shēmai." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Šai URI ir slikta sintakse." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Šai URI ir slikts versijas numurs." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Straume tika aizvērta" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nosaukums" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Izdevējs" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Derīguma termiņš" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Sertifikāts" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Cits nosaukums" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP adrese" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-pasta adrese" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 adrese" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Direktorijas nosaukums" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI paritātes nosaukums" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP adrese" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Reģistrēts ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Neatbalstīts atslēgas veids sertifikāta pieprasījumam" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Šo atslēgu nevar izmantot, lai parakstītu pieprasījumu" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG atslēgu saišķis" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG atslēgu saišķis — %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP atslēga" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Atslēgas ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg process izgāja ar kodu: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg process tika pārtraukts ar signālu: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Darbība tika atcelta" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privātā atslēga" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Publiskā atslēga" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Sertifikāta pieprasījums" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Neatpazīti vai neatbalstīti dati." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Neizdevās parsēt nederīgus vai bojātus datus." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Dati ir noslēgti" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Turpināt" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Atcelt" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Ievadiet savu OpenSSH paroli" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Neatpazīti vai nepieejami atslēgas atribūti" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Nevarēja izveidot publisko atslēgu" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Jau darbojas cita uzvedne" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Nevarēja atrast vietu, kur glabāt sertifikātu" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Pamata ierobežojumi" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Sertifikāta institūcija" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Jā" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nē" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maksimālais ceļa garums" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Neierobežots" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Paplašināta atslēgas izmantošana" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Atļautie mērķi" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Subjekta atslēgas identifikators" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Atslēgas identifikators" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Ciparparaksts" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Atslēgas šifrējums" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Datu šifrējums" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Atslēgas vienošanās" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Sertifikāta paraksts" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Atsaukumu saraksta paraksts" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Atslēgas lietojums" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Lietojumi" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Subjekta alternatīvie nosaukumi" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Paplašinājums" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikators" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Vērtība" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Neizdevās eksportēt sertifikātu." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitāte" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Pārbaudīja" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Derīguma termiņš" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Subjekta nosaukums" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Izsniedzēja nosaukums" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Izsniegtais sertifikāts" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versija" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Nav derīgs pirms" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Nav derīgs pēc" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Sertifikāta nospiedumi" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informācija par publisko atslēgu" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Paraksts" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Eksportēt sertifikātu…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Atslēgas algoritms" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Atslēgas parametri" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Atslēgas izmērs" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Atslēgas SHA1 nospiedums" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Paraksta algoritms" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Paraksta parametri" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritisks" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Sertifikāta pieprasījums" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribūts" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tips" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Izaicinājums" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Sīkāka informācija" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Neizdevās attēlot “%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Neizdevās attēlot datni" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Iemesls" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Nevar parādīt šāda tipa datni." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Šifrēt" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Parakstīt" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Sertificēt" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentificēt" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Deaktivēts" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Nezināms" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Nederīga" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Deaktivēts" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Atsaukta" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Beidzies derīguma termiņš" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Nedefinēta uzticēšanās" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Neuzticama" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Nedaudz uzticama" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Pilnībā uzticama" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Absolūti uzticama" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Šīs atslēgas informācija vēl nav pārbaudīta" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Atslēga nav derīga" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Atslēga tika deaktivēta" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Šī atslēga tika atsaukta" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Atslēgai beidzās derīguma termiņš" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Atslēga nav uzticama" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Atslēga ir nedaudz uzticama" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Atslēga ir pilnībā uzticama" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Atslēga ir absolūti uzticama" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Atslēgas ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritms" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Izveidota" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Derīga līdz" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Iespējas" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Īpašnieka uzticamība" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nosaukums" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Komentārs" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Lietotāja atribūts" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Izmērs" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Bināra dokumenta paraksts" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Kanoniska teksta dokumenta paraksts" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Savrups ciparparaksts" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Vispārīgs atslēgas sertifikāts" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Personas atslēgas sertifikāts" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Ikdienišķs atslēgas sertifikāts" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Pozitīvs atslēgas sertifikāts" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Apakšatslēgas sasaistes paraksts" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Primārās atslēgas sasaistes paraksts" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Paraksts tieši uz atslēgas" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Atslēgas atsaukšanas paraksts" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Apakšatslēgas atsaukšanas paraksts" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Sertifikāta atsaukšanas paraksts" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Laika spiedoga paraksts" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Trešās puses apstiprinājuma paraksts" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klase" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Tikai lokālos" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Eksportējams" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Atsaukšanas atslēga" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Nospiedums" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Publiskā apakšatslēga" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Slepenā atslēga" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Slepenā apakšatslēga" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicializē…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Notiek importēšana…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importēts uz — %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importēt uz — %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Nevar importēt, jo nav savietojamu importētāju" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nav datu, ko importēt" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Atslēga" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privātā RSA atslēga" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privātā DSA atslēga" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Privātā eliptisko līkņu atslēga" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Publiskā DSA atslēga" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Publiskā eliptisko līkņu atslēga" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bits" +msgstr[1] "%u biti" +msgstr[2] "%u bitu" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Stiprums" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Nospiedumi" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "At_celt" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Labi" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automātiski izvēlēti" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Lietotājs atcēla darbību" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Lai importētu, ievadiet paroli." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Parole:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Marķieris:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Atslēgt" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiķete:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importēt iestatījumus" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Apstiprināt:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Paroles nesakrīt." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Parole nevar būt tukša" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Piekļuves uzvedne" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Atbloķēt pieeju pie parolēm un citiem noslēpumiem" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Datne ar tādu nosaukumu jau eksistē." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Vai vēlaties aizstāt to ar jaunu datni?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Aizvietot" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Darbība tika atcelta." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Eksportēt sertifikātu" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Saglabāt" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Sertifikāta datnes" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM datnes" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Automātiski atbloķēt šo saišķi tad, kad es ierakstos" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloķēt šo saišķi, kad es izrakstos" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloķēt šo saišķi pēc" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloķēt šo saišķi, ja nekas nenotiek" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minūtes" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Atbloķēt — %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Parole" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "“%s” saturs ir bloķēts. Lai skatītu saturu, ievadiet pareizu paroli." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Saturs ir bloķēts. Lai skatītu saturu, ievadiet pareizu paroli." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR sertifikātu un atslēgu skatītājs" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Rādīt lietotnes versiju" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[datne...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Skatīt sertifikātu un atslēgu datnes" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Sertifikātu skatītājs" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Parole nebija pareiza" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importēts" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importēšana neizdevās" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importēt" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Aizvērt" diff --git a/po/mai.po b/po/mai.po new file mode 100644 index 0000000..14344b6 --- /dev/null +++ b/po/mai.po @@ -0,0 +1,1015 @@ +# translation of gnome-keyring.HEAD.po to Maithili +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Sangeeta Kumari , 2009. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2009-03-15 16:12+0530\n" +"Last-Translator: Sangeeta Kumari \n" +"Language-Team: Maithili \n" +"Language: mai\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "प्रयोक्ता आइ डी" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "जनमदिन" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "लिंग" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "क्रम संख्या" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "देश" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "नगर" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "स्थिति" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "सड़क" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "संस्था" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "शीर्षक" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "टेलीफोन नंबर" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "देल नाम" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "आरंभिक" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "क' द्वारा निर्गत" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "देल नाम" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "इमेल" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "हँ" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "नहि" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "पहचानकएनिहार" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "पहचानकएनिहार" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "हस्ताक्षर" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "विस्तार" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "पहचानकएनिहार" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "मान" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "पहचानकएनिहार" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "संस्करण" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "हस्ताक्षर" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "हस्ताक्षर अलगोरिथम" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "सार्वजनिक कुंजी" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "कीरिंग खोलू" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "हस्ताक्षर" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "अज्ञात त्रुटि" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "हस्ताक्षर अलगोरिथम" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "बनाबू (_r)" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "हस्ताक्षर" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "नगर" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "फ़िंगरप्रिंट्स" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "सार्वजनिक कुंजी" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "आरंभिक" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "सार्वजनिक कुंजी" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "सड़क" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "अनलौक करु" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "कूटशब्द: " + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "अनलौक करु" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "अनलौक करु" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "कूटशब्द: " + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "कीरिंगमे अनुप्रयोग पहुंच स्वीकारू?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/mg.po b/po/mg.po new file mode 100644 index 0000000..3df5be8 --- /dev/null +++ b/po/mg.po @@ -0,0 +1,995 @@ +# Translation of gnome-keyring to Malagasy. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Thierry Randrianiriana , 2006. +msgid "" +msgstr "" +"Project-Id-Version: GNOME-KEYRING VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2006-08-18 23:15+0300\n" +"Last-Translator: Fano Rajaonarisoa \n" +"Language-Team: MALAGASY \n" +"Language: mg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Manafaka ilay rojom-panalahidy" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Teny fanalahidy:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "Manafaka ilay rojom-panalahidy" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Teny fanalahidy:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Avela hampiasa ny rojom-panalahidy ilay rindranasa?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/mk.po b/po/mk.po new file mode 100644 index 0000000..7b46931 --- /dev/null +++ b/po/mk.po @@ -0,0 +1,1039 @@ +# translation of gnome-keyring.HEAD.mk.po to Macedonian +# Macedonian translation for gnome-keyring +# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005 +# This file is distributed under the same license as the gnome-keyring package. +# +# Арангел Ангов , 2005. +# Arangel Angov , 2006, 2008. +# Arangel Angov , 2007. +# Jovan Naumovski , 2008. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD.mk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2008-09-25 18:22+0200\n" +"Last-Translator: Jovan Naumovski \n" +"Language-Team: Macedonian \n" +"Language: mk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1\n" +"X-Generator: KBabel 1.11.4\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +#, fuzzy +msgid "Generation Qualifier" +msgstr "Операцијата не успеа" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, fuzzy, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "PKCS#11 модули" + +#: ../gck/gck-module.c:369 +#, fuzzy, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "Не можам да ја избришам датотеката: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Сесијата е затворена" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Операцијата беше откажана" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Увези сертификат" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Увези сертификат" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +#, fuzzy +msgid "Issued Certificate" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Сертификат" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +#, fuzzy +msgid "Public Key Info" +msgstr "Јавен клуч" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Јавен клуч" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +#, fuzzy +msgid "Could not display file" +msgstr "Не можам да ја избришам датотеката: %s" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Отклучи привезок" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Операцијата беше откажана" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Сертификат" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Сертификат" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "Непозната грешка" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Информациите се доверливи и не може да бидат откриени" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Сесијата е невалидна" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "Модулот не беше иницијализиран" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Привезокот е веќе отклучен." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Лозинката или PIN-от истече" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Клучот е од неправилен тип" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "К_реирај" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Отклучи сертификат" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "_Локација:" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Јавен клуч" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Увези" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Не можам да увезам, бидејќи клучот е од неправилен тип" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "Приватен клуч" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "Приватен клуч" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Приватен клуч" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "Јавен клуч" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +#, fuzzy +msgid "Unrecognized or unsupported data." +msgstr "Непозната и неподдржана датотека." + +#: ../gcr/gcr-parser.c:2183 +#, fuzzy +msgid "Could not parse invalid or corrupted data." +msgstr "Не можам да го ја парсирам невалидната расипана датотека." + +#: ../gcr/gcr-parser.c:2186 +#, fuzzy +msgid "The data is locked" +msgstr "Податоците не можат да бидат заклучени" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "Автоматски отклучи го ова кога ќе се најавам." + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Отклучи" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Лозинка:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Автоматски отклучи го привезокот кога ќе се најавам." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "Автоматски отклучи го привезокот кога ќе се најавам." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Отклучи" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Отклучи" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Лозинка:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Да дозволам пристап на апликациите до привезокот?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Сертификат" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Лозинката или PIN-от не е точен" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Увези" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Увези сертификат" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "Увези" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/ml.po b/po/ml.po new file mode 100644 index 0000000..d102574 --- /dev/null +++ b/po/ml.po @@ -0,0 +1,1092 @@ +# translation of gnome-keyring.master.ml.po to +# translation of gnome-keyring.HEAD.ml.po to +# This file is distributed under the same license as the gnome-keyring package. +# Copyright (C) 2006-2008 gnome-keyring'S COPYRIGHT HOLDER. +# Ani Peter , 2006, 2009. +# ashik salahudeen , 2008. +# Reviewed by Praveen Arimbrathodiyil , 2008. +# Anish A , 2012. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master.ml\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2012-09-22 15:41+0000\n" +"PO-Revision-Date: 2012-09-22 21:55+0530\n" +"Last-Translator: Anish A \n" +"Language-Team: Swatantra Malayalam Computing\n" +"Language: ml\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.6.1\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "ഡൊമെയിന്‍ ഘടകം" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:409 +#: ../gcr/gcr-gnupg-renderer.c:578 +msgid "User ID" +msgstr "ഉപയോക്തൃ ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "ഇമെയില്‍ വിലാസം" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "ജനന തീയതി" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "ജനന സ്ഥലം" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "ലിംഗം" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "നിങ്ങള്‍ക്കു് അംഗത്വമുള്ള രാജ്യം" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "താമസിക്കുന്ന രാജ്യം" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "കോമണ്‍ നെയിം" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "കുടുംബപ്പേരു്" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:557 +msgid "Serial Number" +msgstr "സീരിയല്‍ നംബര്‍‍" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "രാജ്യം" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "സ്ഥലം" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "സംസ്ഥാനം" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "സ്ട്രീറ്റ്" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "സ്ഥാപനം" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "ഓര്‍ഗനൈസേഷണല്‍ യൂണിറ്റ്" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "തലക്കെട്ട്" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "ടെലിഫോണ്‍ നംബര്‍" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "നല്‍കിയിരിക്കുന്ന പേരു്" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "ഇനീഷ്യല്‍" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "ജനറേഷന്‍ ക്വാളിഫയര്‍" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN ക്വാളിഫയര്‍" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:200 +#: ../gcr/gcr-key-renderer.c:429 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA-യ്ക്കൊപ്പം MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA-യ്ക്കൊപ്പം MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA-യ്ക്കൊപ്പം SHA1" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:204 +#: ../gcr/gcr-key-renderer.c:431 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA-യ്ക്കൊപ്പം SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "സേവകന്റെ ആധികാരപ്പെടുത്തല്‍" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "ക്ലൈന്റിന്റെ ആധികാരപ്പെടുത്തല്‍" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "കോഡ് സാക്ഷ്യപ്പെടുത്തല്‍" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "ഇമെയില്‍ സംരക്ഷണം" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "സമയമുദ്ര" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 ഭാഗം ലോഡ് ചെയ്യുന്നതില്‍ പിഴവ്: %s" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "അസാധുവായ PKCS#11 ഭാഗം: %s" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "PKCS#11 ഭാഗം സജ്ജീകരിക്കാന്‍ കഴിഞ്ഞില്ല: %s" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "PKCS#11 ഭാഗത്തിന്റെ തുടക്കമിടാന്‍ കഴിഞ്ഞില്ല: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "രേഖപ്പെടുത്തിയ PKCS#11 ഭാഗത്തിന്റെ തുടക്കമിടാന്‍ കഴിഞ്ഞില്ല: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI യുടെ ആലേഖനം ശരിയല്ല." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI യുടെ വ്യാകരണം ശരിയല്ല." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI യുടെ പതിപ്പിന്റെ സംഖ്യ ശരിയല്ല." + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "ഈ സ്ട്രീം അവസാനിച്ചിരിക്കുന്നു" + +#. later +#. later +#: ../gcr/gcr-certificate.c:308 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "പേരു്" + +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Issued By" +msgstr "നല്‍കിയത്" + +#. later +#: ../gcr/gcr-certificate.c:312 +msgctxt "column" +msgid "Expires" +msgstr "കാലാവധി തീരുന്നതു്" + +#: ../gcr/gcr-certificate.c:1133 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:102 ../gcr/gcr-parser.c:322 +msgid "Certificate" +msgstr "സാക്ഷ്യപത്രം" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" +"ഇതേ പേരില്‍ ഒരു ഫയല്‍ ഉണ്ട്.\n" +"\n" +"അതിനു പകരമായി പുതിയ ഫയല്‍ വെയ്ക്കണോ?" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "മാറ്റുക (_R)" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "പ്രവര്‍ത്തനത്തെ റദ്ദാക്കി." + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "സാക്ഷ്യപത്രം കയറ്റുമതി ചെയ്യുക" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "സാക്ഷ്യപത്ര ഫയലുകള്‍" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "PEM ഫയലുകള്‍" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "വേറേ പേരു്" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "XMPP വിലാസം" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:204 ../gcr/gcr-gnupg-renderer.c:422 +#: ../gcr/gcr-gnupg-renderer.c:704 +msgid "Email" +msgstr "ഈമെയില്‍" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "X400 വിലാസം" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "അറയുടെ പേര്" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "EDI ആളുടെ പേര്" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "ഐപി വിലാസം" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "ഐഡി രേഖപ്പെടുത്തിയിട്ടില്ല" + +#: ../gcr/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "സാക്ഷ്യപത്ര അധികാരി" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "Yes" +msgstr "ഉവ്വു്" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "No" +msgstr "ഇല്ല" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "പരിമിതികളില്ലാത്ത" + +#: ../gcr/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "അനുവദിച്ച ഉപയോഗങ്ങള്‍" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "ഐഡന്റിഫയര്‍" + +#: ../gcr/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "കീ ഐഡന്റിഫയര്‍" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "ഡിജിറ്റല്‍ ഒപ്പ്" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "കീ സമ്മതിപത്രം" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "സാക്ഷ്യപത്രത്തിന്റെ ഒപ്പ്" + +#: ../gcr/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "തടഞ്ഞ പട്ടികയുടെ ഒപ്പ്" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "ഉപയോഗങ്ങള്‍" + +#: ../gcr/gcr-certificate-renderer.c:237 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "വിഷയം" + +#: ../gcr/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "എക്സ്റ്റെന്‍ഷന്‍" + +#: ../gcr/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "ഐഡന്റിഫയര്‍" + +#: ../gcr/gcr-certificate-renderer.c:269 +#: ../gcr/gcr-certificate-request-renderer.c:272 +#: ../gcr/gcr-gnupg-renderer.c:413 ../gcr/gcr-gnupg-renderer.c:430 +msgid "Value" +msgstr "മൂല്ല്യം" + +#: ../gcr/gcr-certificate-renderer.c:294 +msgid "Couldn't export the certificate." +msgstr "സാക്ഷ്യപത്രം കയറ്റുമതി ചെയ്യാനാകുന്നില്ല." + +#: ../gcr/gcr-certificate-renderer.c:519 +#: ../gcr/gcr-certificate-request-renderer.c:313 +msgid "Identity" +msgstr "തിരിച്ചറിയല്‍" + +#: ../gcr/gcr-certificate-renderer.c:523 +msgid "Verified by" +msgstr "പരിശോധിച്ചത്" + +#: ../gcr/gcr-certificate-renderer.c:530 ../gcr/gcr-gnupg-renderer.c:718 +msgid "Expires" +msgstr "കാലാവധി തീരുന്നതു്" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:537 +#: ../gcr/gcr-certificate-request-renderer.c:319 +msgid "Subject Name" +msgstr "വിഷയം" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:542 +msgid "Issuer Name" +msgstr "നല്‍കിയവരുടെ പേരു്" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:547 +msgid "Issued Certificate" +msgstr "നല്‍കിയിരിക്കുന്ന സാക്ഷ്യപത്രം" + +#: ../gcr/gcr-certificate-renderer.c:552 +#: ../gcr/gcr-certificate-request-renderer.c:330 +msgid "Version" +msgstr "പതിപ്പു്" + +#: ../gcr/gcr-certificate-renderer.c:566 +msgid "Not Valid Before" +msgstr "ഇതിനു് മുമ്പു് ഉപയോഗമില്ല" + +#: ../gcr/gcr-certificate-renderer.c:571 +msgid "Not Valid After" +msgstr "ഇതിനു് ശേഷം ഉപയോഗമില്ല" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:576 +msgid "Certificate Fingerprints" +msgstr "സാക്ഷ്യപത്ര വിരലടയാളങ്ങള്‍" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:582 +#: ../gcr/gcr-certificate-request-renderer.c:333 +#: ../gcr/gcr-certificate-request-renderer.c:379 +msgid "Public Key Info" +msgstr "പബ്ളിക് കീ വിവരം" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:597 ../gcr/gcr-certificate-renderer.c:918 +#: ../gcr/gcr-certificate-request-renderer.c:349 +#: ../gcr/gcr-certificate-request-renderer.c:386 +#: ../gcr/gcr-gnupg-renderer.c:559 +msgid "Signature" +msgstr "സിഗ്നേച്ചര്‍" + +#: ../gcr/gcr-certificate-renderer.c:864 +msgid "Key Algorithm" +msgstr "കീ ആല്‍ഗോരിഥം" + +#: ../gcr/gcr-certificate-renderer.c:869 +msgid "Key Parameters" +msgstr "കീ പരാമീറ്ററുകള്‍" + +#: ../gcr/gcr-certificate-renderer.c:877 ../gcr/gcr-gnupg-renderer.c:352 +msgid "Key Size" +msgstr "കീയുടെ വ്യാപ്തി" + +#: ../gcr/gcr-certificate-renderer.c:885 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 കീ വിരലടയാളം" + +#: ../gcr/gcr-certificate-renderer.c:890 ../gcr/gcr-gnupg-renderer.c:737 +#: ../gcr/gcr-key-renderer.c:414 ../gcr/gcr-parser.c:325 +msgid "Public Key" +msgstr "പബ്ളിക് കീ" + +#: ../gcr/gcr-certificate-renderer.c:907 +msgid "Signature Algorithm" +msgstr "സിഗ്നേച്ചര്‍ ആല്‍ഗോരിഥം" + +#: ../gcr/gcr-certificate-renderer.c:911 +msgid "Signature Parameters" +msgstr "സിഗ്നേച്ചര്‍ പരാമീറ്ററുകള്‍" + +#: ../gcr/gcr-certificate-renderer.c:960 +msgid "Critical" +msgstr "അത്യാവശ്യം" + +#: ../gcr/gcr-certificate-request.c:418 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:505 ../gcr/gcr-certificate-request.c:590 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "" + +#. The certificate request type +#: ../gcr/gcr-certificate-request-renderer.c:95 +#: ../gcr/gcr-certificate-request-renderer.c:308 +#: ../gcr/gcr-certificate-request-renderer.c:323 +#: ../gcr/gcr-certificate-request-renderer.c:366 +#: ../gcr/gcr-certificate-request-renderer.c:371 +msgid "Certificate request" +msgstr "സാക്ഷ്യപത്ര അപേക്ഷ" + +#: ../gcr/gcr-certificate-request-renderer.c:261 +msgid "Attribute" +msgstr "" + +#: ../gcr/gcr-certificate-request-renderer.c:265 +#: ../gcr/gcr-certificate-request-renderer.c:324 +#: ../gcr/gcr-certificate-request-renderer.c:372 +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:592 +msgid "Type" +msgstr "തരം" + +#: ../gcr/gcr-certificate-request-renderer.c:376 +msgid "Challenge" +msgstr "വെല്ലുവിളി" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "_വിശദാംശങ്ങള്‍" + +#: ../gcr/gcr-failure-renderer.c:160 +#, c-format +msgid "Could not display '%s'" +msgstr "'%s' കാണിക്കാനാകുന്നില്ല" + +#: ../gcr/gcr-failure-renderer.c:162 +msgid "Could not display file" +msgstr "ഫയല്‍ കാണിക്കാനാകുന്നില്ല" + +#: ../gcr/gcr-failure-renderer.c:167 +msgid "Reason" +msgstr "കാരണം" + +#: ../gcr/gcr-failure-renderer.c:217 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "GnuPG ചാവിക്കൂട്ടം" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG ചാവിക്കൂട്ടം: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:328 +msgid "PGP Key" +msgstr "PGP ചാവി" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "ചാവി ID" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2424 +#: ../gcr/gcr-parser.c:2917 +msgid "The operation was cancelled" +msgstr "പ്രവര്‍ത്തനത്തെ റദ്ദാക്കി" + +#: ../gcr/gcr-gnupg-renderer.c:202 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:215 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Sign" +msgstr "ഒപ്പിടു" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Certify" +msgstr "സാക്ഷ്യപ്പെടുത്തു" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Authenticate" +msgstr "തിരിച്ചറിയു" + +#: ../gcr/gcr-gnupg-renderer.c:223 ../gcr/gcr-gnupg-renderer.c:258 +msgid "Disabled" +msgstr "പ്രവര്‍ത്തന രഹിതം" + +#: ../gcr/gcr-gnupg-renderer.c:254 ../gcr/gcr-gnupg-renderer.c:413 +#: ../gcr/gcr-key-renderer.c:433 ../gcr/gcr-key-renderer.c:438 +msgid "Unknown" +msgstr "അപരിചിതം" + +#: ../gcr/gcr-gnupg-renderer.c:256 +msgid "Invalid" +msgstr "അസാധു" + +#: ../gcr/gcr-gnupg-renderer.c:260 +msgid "Revoked" +msgstr "തിരിച്ചെടുത്തു" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Expired" +msgstr "കാലാവധി തീര്‍ന്നു" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Undefined trust" +msgstr "അറിയാത്ത വിശ്വാസം" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Distrusted" +msgstr "വിശ്വാസമില്ല" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Marginally trusted" +msgstr "ചെറുതായി വിശ്വാസമുണ്ട്" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Fully trusted" +msgstr "പൂര്‍ണ്ണ വിശ്വാസം" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Ultimately trusted" +msgstr "ഏറ്റവും വിശ്വാസം" + +#: ../gcr/gcr-gnupg-renderer.c:286 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "ഈ വിവരം രഹസ്യസ്വഭാവമുള്ള ഒന്നായതിനാല്‍ അതു കാണിക്കാന്‍ പറ്റില്ല" + +#: ../gcr/gcr-gnupg-renderer.c:289 +msgid "This key is invalid" +msgstr "ഈ ചാവി അസാധുവാണ്" + +#: ../gcr/gcr-gnupg-renderer.c:292 +msgid "This key has been disabled" +msgstr "ഈ ചാവി പ്രവര്‍ത്തനരഹിതമാണ്" + +#: ../gcr/gcr-gnupg-renderer.c:295 +msgid "This key has been revoked" +msgstr "ഈ ചാവി തിരിച്ചെടുത്തതാണ്" + +#: ../gcr/gcr-gnupg-renderer.c:298 +msgid "This key has expired" +msgstr "ഈ കീയുടെ കാലാവധി കഴിഞ്ഞുപോയിരിക്കുന്നു" + +#: ../gcr/gcr-gnupg-renderer.c:303 +msgid "This key is distrusted" +msgstr "ഈ ചാവിയെ വിശ്വാസമില്ല" + +#: ../gcr/gcr-gnupg-renderer.c:306 +msgid "This key is marginally trusted" +msgstr "ഈ ചാവിയെ ചെറുതായി വിശ്വാസമുണ്ട്" + +#: ../gcr/gcr-gnupg-renderer.c:309 +msgid "This key is fully trusted" +msgstr "ഈ ചാവിയെ പൂര്‍ണ്ണ വിശ്വാസമുണ്ട്" + +#: ../gcr/gcr-gnupg-renderer.c:312 +msgid "This key is ultimately trusted" +msgstr "ഈ ചാവിയെ ഏറ്റവും വിശ്വാസമുണ്ട്" + +#: ../gcr/gcr-gnupg-renderer.c:337 ../gcr/gcr-gnupg-renderer.c:563 +msgid "Key ID" +msgstr "ചാവി ID" + +#: ../gcr/gcr-gnupg-renderer.c:345 ../gcr/gcr-gnupg-renderer.c:571 +#: ../gcr/gcr-gnupg-renderer.c:618 ../gcr/gcr-key-renderer.c:434 +msgid "Algorithm" +msgstr "ആല്‍ഗോരിഥം" + +#: ../gcr/gcr-gnupg-renderer.c:360 ../gcr/gcr-gnupg-renderer.c:437 +#: ../gcr/gcr-gnupg-renderer.c:480 +msgid "Created" +msgstr "ഉണ്ടാക്കി" + +#: ../gcr/gcr-gnupg-renderer.c:369 ../gcr/gcr-gnupg-renderer.c:446 +#: ../gcr/gcr-gnupg-renderer.c:489 +msgid "Expiry" +msgstr "കാലാവധി തീരുന്നതു്" + +#: ../gcr/gcr-gnupg-renderer.c:378 +msgid "Capabilities" +msgstr "കഴിവുകള്‍" + +#: ../gcr/gcr-gnupg-renderer.c:391 +msgid "Owner trust" +msgstr "ഉടമയുടെ വിശ്വാസം" + +#: ../gcr/gcr-gnupg-renderer.c:419 +msgid "Name" +msgstr "പേരു്" + +#: ../gcr/gcr-gnupg-renderer.c:425 ../gcr/gcr-gnupg-renderer.c:707 +msgid "Comment" +msgstr "അഭിപ്രായം" + +#: ../gcr/gcr-gnupg-renderer.c:465 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:472 ../gcr/gcr-key-renderer.c:441 +msgid "Size" +msgstr "വലിപ്പം" + +#: ../gcr/gcr-gnupg-renderer.c:507 +#, fuzzy +msgid "Signature of a binary document" +msgstr "സിഗ്നേച്ചര്‍ പരാമീറ്ററുകള്‍" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +#, fuzzy +msgid "Standalone signature" +msgstr "സിഗ്നേച്ചര്‍" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Generic certification of key" +msgstr "സാക്ഷ്യപത്രത്തിന്റെ പൂട്ടു തുറക്കുക" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +#, fuzzy +msgid "Signature directly on key" +msgstr "സിഗ്നേച്ചര്‍ പരാമീറ്ററുകള്‍" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:588 ../gcr/gcr-gnupg-renderer.c:596 +msgid "Class" +msgstr "തരം" + +#: ../gcr/gcr-gnupg-renderer.c:590 +msgid "Local only" +msgstr "പ്രാദേശികം മാത്രം" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Exportable" +msgstr "കയറ്റുമതിചെയ്യാനാകുന്ന" + +#: ../gcr/gcr-gnupg-renderer.c:610 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:648 +#: ../gcr/gcr-gnupg-renderer.c:650 +msgid "Fingerprint" +msgstr "വിരലടയാളം" + +#: ../gcr/gcr-gnupg-renderer.c:739 +msgid "Public Subkey" +msgstr "പൊതു ഉപ ചാവി" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Secret Key" +msgstr "രഹസ്യ ചാവി" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Subkey" +msgstr "രഹസ്യ ഉപ ചാവി" + +#: ../gcr/gcr-import-button.c:111 +msgid "Initializing..." +msgstr "തുടങ്ങുന്നു..." + +#: ../gcr/gcr-import-button.c:119 +msgid "Import is in progress..." +msgstr "ഇറക്കുമതി ചെയ്തുകൊണ്ടിരിക്കുന്നു..." + +#: ../gcr/gcr-import-button.c:126 +#, c-format +msgid "Imported to: %s" +msgstr "%s ലേക്ക് ഇറക്കുമതി ചെയ്തു" + +#: ../gcr/gcr-import-button.c:146 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "%s ലേക്ക് ഇറക്കുമതി ചെയ്യു" + +#: ../gcr/gcr-import-button.c:159 +msgid "Cannot import because there are no compatible importers" +msgstr "യോജിച്ച ഇറക്കുമതികാര്‍ ഇല്ലാത്തതിനാല്‍ അത് ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല" + +#: ../gcr/gcr-import-button.c:168 +msgid "No data to import" +msgstr "ഇറക്കുമതി ചെയ്യുന്നതിനായി ഒരു വിവരവും ഇല്ല" + +#: ../gcr/gcr-key-renderer.c:89 +msgid "Key" +msgstr "ചാവി" + +#: ../gcr/gcr-key-renderer.c:403 +msgid "Private RSA Key" +msgstr "സ്വകാര്യ RSA ചാവി" + +#: ../gcr/gcr-key-renderer.c:405 +msgid "Private DSA Key" +msgstr "സ്വകാര്യ DSA ചാവി" + +#: ../gcr/gcr-key-renderer.c:407 ../gcr/gcr-parser.c:319 +msgid "Private Key" +msgstr "സ്വകാര്യ ചാവി" + +#: ../gcr/gcr-key-renderer.c:410 ../gcr/gcr-key-renderer.c:412 +msgid "Public DSA Key" +msgstr "പൊതു DSA ചാവി" + +#: ../gcr/gcr-key-renderer.c:421 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d ബിറ്റ്" +msgstr[1] "%d ബിറ്റുകള്‍" + +#: ../gcr/gcr-key-renderer.c:422 +msgid "Strength" +msgstr "ശക്തി" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:445 +msgid "Fingerprints" +msgstr "വിരലടയാളങ്ങള്‍" + +#: ../gcr/gcr-key-renderer.c:449 +msgid "SHA1" +msgstr "SHA1" + +#: ../gcr/gcr-key-renderer.c:454 +msgid "SHA256" +msgstr "SHA256" + +#: ../gcr/gcr-parser.c:331 +msgid "Certificate Request" +msgstr "സാക്ഷ്യപത്ര അപേക്ഷ" + +#: ../gcr/gcr-parser.c:2427 +msgid "Unrecognized or unsupported data." +msgstr "പിന്തുണയില്ലാത്ത അല്ലെങ്കില്‍ തിരിച്ചറിയാന്‍ കഴിയാത്ത ഡേറ്റാ." + +#: ../gcr/gcr-parser.c:2430 +msgid "Could not parse invalid or corrupted data." +msgstr "അസാധുവായ അല്ലെങ്കില്‍ തെറ്റുകളുള്ള ഡേറ്റാ പാഴ്സ് ചെയ്യാന്‍ കഴിഞ്ഞില്ല. " + +#: ../gcr/gcr-parser.c:2433 +msgid "The data is locked" +msgstr "ഡേറ്റ പൂട്ടിയിരിക്കുന്നു" + +#: ../gcr/gcr-pkcs11-import-dialog.c:187 +msgid "Automatically chosen" +msgstr "തനിയെ തെരഞ്ഞെടുത്ത" + +#: ../gcr/gcr-pkcs11-import-dialog.c:271 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "ഉപയോക്താവ് പ്രവര്‍ത്തനം നിര്‍ത്തിവെച്ചു" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "ഇറക്കുമതി ചെയ്യുന്നതിനായി രഹസ്യവാക്ക് കൊടുക്കുക." + +#. The password label +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 ../gcr/gcr-prompt-dialog.c:559 +msgid "Password:" +msgstr "അടയാളവാക്കു്:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "ടോക്കണ്‍:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "പേര്" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 ../gcr/gcr-unlock-renderer.c:71 +#: ../gcr/gcr-unlock-renderer.c:128 +msgid "Unlock" +msgstr "പൂട്ടു തുറക്കുക" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Label:" +msgstr "പേര്:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Import settings" +msgstr "ഇറക്കുമതി ക്രമീകരണങ്ങള്‍" + +#: ../gcr/gcr-prompt.c:218 +msgid "Continue" +msgstr "തുടരുക" + +#: ../gcr/gcr-prompt.c:227 +msgid "Cancel" +msgstr "റദ്ദാക്കു" + +#. The confirm label +#: ../gcr/gcr-prompt-dialog.c:576 +msgid "Confirm:" +msgstr "തീര്‍ച്ചപ്പെടുത്തുക:" + +#: ../gcr/gcr-prompt-dialog.c:643 +msgid "Passwords do not match." +msgstr "രഹസ്യവാക്കുകള്‍ ചേരുന്നുല്ല." + +#: ../gcr/gcr-prompt-dialog.c:650 +msgid "Password cannot be blank" +msgstr "രഹസ്യവാക്ക് ശൂന്യമാകാനാകില്ല" + +#: ../gcr/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "" + +#: ../gcr/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "പൊതു ചാവി ഉണ്ടാക്കാന്‍ പറ്റുന്നില്ല" + +#: ../gcr/gcr-system-prompt.c:749 +msgid "Another prompt is already in progress" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "ഇംപോര്‍ട്ട് ചെയ്ത സാക്ഷ്യപത്രങ്ങള്‍/കീകള്‍ എന്നിവ സൂക്ഷിക്കുന്നതിനുള്ള ഒരു സ്ഥാനം തെരഞ്ഞെടുക്കുക." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "ഞാന്‍ അകത്തുകയറുമ്പോള്‍ തന്നെ ഈ ചാവിക്കൂട്ടം സ്വയം തുറക്കുക" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "ഞാന്‍ പുറത്തിറങ്ങുമ്പോള്‍ ഈ ചാവിക്കൂട്ടം സ്വയം പൂട്ടുക" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "മിനിറ്റുകള്‍" + +#: ../gcr/gcr-unlock-renderer.c:69 +#, c-format +msgid "Unlock: %s" +msgstr "തുറക്കുക: %s" + +#: ../gcr/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "രഹസ്യവാക്ക്" + +#: ../gcr/gcr-unlock-renderer.c:278 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:281 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "പ്രയോഗത്തിന്റെ പതിപ്പു് കാണിയ്ക്കുക" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[file...]" + +#: ../gcr/gcr-viewer-tool.c:103 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:117 ../gcr/gcr-viewer-widget.c:635 +msgid "Certificate Viewer" +msgstr "സാക്ഷ്യപത്രം കാണുക" + +#: ../gcr/gcr-viewer-widget.c:203 +msgid "The password was incorrect" +msgstr "അടയാളവാക്കു് തെറ്റാണ്" + +#: ../gcr/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "ഇറക്കുമതി ചെയ്തു" + +#: ../gcr/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "ഇറക്കുമതി പരാജയം" + +#: ../gcr/gcr-viewer-window.c:108 +msgid "Import" +msgstr "ഇറക്കുമതി" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "പൂട്ടു തുറക്കുക" diff --git a/po/mn.po b/po/mn.po new file mode 100644 index 0000000..6afdad0 --- /dev/null +++ b/po/mn.po @@ -0,0 +1,997 @@ +# translation of gnome-keyring.HEAD.po to Mongolian +# Mongolian translation gnome-keyring. +# Copyright (C) 2004 +# This file is distributed under the same license as the PACKAGE package. +# Jargalsaikhan Tamir , 2004. +# Munkhtugs / 2006. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2006-06-07 18:34+0900\n" +"Last-Translator: tamir \n" +"Language-Team: Mongolian \n" +"Language: mn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Кейринг түгжээг тайлах" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Нэвтрэх үг:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "Кейринг түгжээг тайлах" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Нэвтрэх үг:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Кейринг рүү хандах програмыг зөвшөөрөх үү?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/mr.po b/po/mr.po new file mode 100644 index 0000000..02e4674 --- /dev/null +++ b/po/mr.po @@ -0,0 +1,1061 @@ +# translation of mr.po to Marathi +# Marathi Translation for gnome-keyring. +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER,2006. +# +# Sameer N. Ingole , 2006. +# Rahul Bhalerao , 2006. +# Sandeep Shedmake , 2008, 2009. +# Sandeep Shedmake , 2009. +msgid "" +msgstr "" +"Project-Id-Version: mr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2009-09-11 19:12+0530\n" +"Last-Translator: Sandeep Shedmake \n" +"Language-Team: Marathi \n" +"Language: mr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "क्षेत्र घटक" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "वापरकर्ता ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "जन्म तारीख" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "जन्म स्थान" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "लिंग" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "नागरिकत्व देश" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "मुक्काम देश" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "सामान्य नाव" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "आडनाव" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "सिरीयल क्रमांक" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "देश" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "ठिकाण" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "राज्य" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "रस्ता" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "संघटना" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "संघटना यूनीट" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "शिर्षक" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "टेलिफोन क्रमांक" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "प्रविष्ट नाव" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "इनीशीअल्स्" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "जेनरेशन कॉलीफायर" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN कॉलीफायर" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 RSA सह" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 RSA सह" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 RSA सह" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 DSA सह" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "SSL सर्वर प्रमाणपत्र" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "SSL क्लाऐंट प्रमाणपत्र" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, fuzzy, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "फाइल काढून टाकू शकत नाही: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "सत्र बंद झाले" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "यावेळी पुरवले" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "यावेळी एक्सपायर होईल" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "कार्यपद्धती रद्द केले गेली" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "प्रमाणपत्र उघडा" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "देयकाचे नाव" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "ईमेल" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "विषयाचे नाव" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "होय" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "नाही" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "ओळखकर्ता" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "ओळखकर्ता" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "स्वाक्षरी" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "कि बाब" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "विषयाचे नाव" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "वाढ" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "ओळखकर्ता" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "मूल्य" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "गंभीर" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "प्रमाणपत्र उघडण्याकरीता पासवर्ड प्रविष्ट करा" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "ओळखकर्ता" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "यावेळी एक्सपायर होईल" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "विषयाचे नाव" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "देयकाचे नाव" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "देयक प्रमाणपत्र" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "आवृत्ती" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "या आधी वैध नाही" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "या नंतर वैध नाही" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "फिंगरप्रिन्ट" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "स्वाक्षरी" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "स्वाक्षरी अल्गोरिदम" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "स्वाक्षरी बाब" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "सार्वजणीक कि माहिती" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "कि अल्गोरिदम" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "कि बाब" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "कि आकार" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 फिंगरप्रिन्ट" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "व्यक्तिगत कि" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +#, fuzzy +msgid "Could not display file" +msgstr "फाइल काढून टाकू शकत नाही: %s" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "कीरिंगचे कुलूप उघडा" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "कार्यपद्धती रद्द केले गेली" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "स्वाक्षरी" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "अपरिचीत त्रुटी" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "यावेळी एक्सपायर होईल" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "माहिती संवेदनशील आहे व उघडकीस केले जाऊ शकत नाही" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "सत्र अवैध आहे" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "विभाग प्रारंभ केले गेले नाही" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "किरींग आधिपासूनच विनाकुलूप केले गेले." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "पासवर्ड किंवा PIN कालबाह्य झाले" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "की चा प्रकार चूकीचा आहे" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "कि अल्गोरिदम" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "निर्माण करा(_r)" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "यावेळी एक्सपायर होईल" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "कि आकार" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "स्वाक्षरी बाब" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "स्वाक्षरी" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "प्रमाणपत्र उघडा" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "स्वाक्षरी बाब" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "ठिकाण" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "फिंगरप्रिन्ट" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "व्यक्तिगत कि" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "इनीशीअल्स्" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "येथे आयात करा:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "येथे आयात करा:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "कि चा प्रकार चुकीचा असल्यामुळे प्राप्त केला जाऊ शकत नाही" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "आयात करण्याकरीता ठिकाण उपलब्ध नाही" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "व्यक्तिगत कि" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "व्यक्तिगत कि" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "व्यक्तिगत कि" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "व्यक्तिगत कि" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "रस्ता" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "फिंगरप्रिन्ट" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "अपरिचीत किंवा असमर्थीत डेटा." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "अवैध किंवा सदोषीत डेटा वाचू शकत नाही." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "डेटा कुलूपबंद आहे" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "दाखलन झाल्यासआपोआप यास उघडा" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "कुलूप उघडा" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s' आयात करण्याकरीता, विनाकुलूपबंद असायला हवे" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "पासवर्ड:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "आयात केलेले प्रमाणपत्र/किज साठवण्याकरीता ठिकाण नीवडा." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "दाखलन केल्यावर आपोआप ही कीरींग विनाकुलूप करा." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "दाखलन केल्यावर आपोआप ही कीरींग विनाकुलूप करा." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "कुलूप उघडा" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "कुलूप उघडा" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "पासवर्ड:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "अनुप्रयोगास कीरिंगच्या वापराची परवानगी द्यायची?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "पासवर्ड किंवा PIN अयोग्य आहे" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "येथे आयात करा:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "कार्यपद्धती अपयशी" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "येथे आयात करा:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000..43a2aa1 --- /dev/null +++ b/po/ms.po @@ -0,0 +1,1050 @@ +# Malay message of gnome-keyring +# Copyright (C) 2003 Free Software Foundation, Inc. +# Hasbullah Bin Pit (sebol) , 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2010-05-14 22:56+0800\n" +"Last-Translator: Ahmed Noor Kader Mustajir Md Eusoff \n" +"Language-Team: Projek Gabai \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Komponen Domain" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ID Pengguna" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Tarikh Lahir" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Tempat Lahir" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Jantina" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Kerakyatan Negara" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Negara Tempat Tinggal" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Nama Biasa" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Nama keluarga" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "Nombor Siri" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Negara" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Lokaliti" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Negeri" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Jalan" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Organisasi" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Unit Organisasi" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Tajuk" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Nombor Telefon" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Nama Diberi" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Inisial" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 dengan RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 dengan RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 dengan RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 dengan DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "Sijil SSL Pelayan" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "Sijil SSL Pelanggan" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Sesi ditutup" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "_Nama:" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Dikeluarkan Pada" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "Luput Pada" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Sijil" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Operasi dibatalkan" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Buka sijil" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Sijil" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "Nama Pengeluar" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "Email" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "Nama Subjek" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Sijil" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "Ya" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "Tidak" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Pengenalan" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "Pengenalan" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "Tandatangan" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "Parameter Kekunci" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Sijil" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "Nama Subjek" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "Sambungan" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "Pengenalan" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "Nilai" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "Kritikal" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Masukkan katalaluan untuk membuka sijil" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "Pengenalan" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "Luput Pada" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "Nama Subjek" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "Nama Pengeluar" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "Sijil Dikeluarkan" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "Versi" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "Tidak Sah Sebelum" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "Tidak Sah Selepas" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Sijil" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "Tandatangan" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "Info Kekunci Umum" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "Algoritma Kekunci" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "Parameter Kekunci" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "Saiz Kekunci" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 Fingerprint" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Kekunci Umum" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "_Butiran:" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Buka Keyring" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Operasi dibatalkan" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "Tandatangan" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Sijil" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Sijil" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "Ralat tidak diketahui" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "Luput Pada" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Informasi ini sensitif dan tidak boleh didedahkan" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Sesi tidak sah" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Katalaluan atau PIN sudah luput" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Kekunci adalah salah jenis" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "Algoritma Kekunci" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "Luput Pada" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "_Nama:" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "Saiz Kekunci" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "Tandatangan" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Buka sijil" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "Lokaliti" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "MD5 Fingerprint" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Kekunci Umum" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "Inisial" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "Maklumat Import:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Maklumat Import:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Tidak dapat export kerana kekunci mempunyai jenis salah" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "Tiada lokasi untuk import kepada" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "Kekunci Peribadi" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "Kekunci Peribadi" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Kekunci Peribadi" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "Kekunci Umum" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "Jalan" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "Data dikunci" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Membuka" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "Untuk mengimport '%s', ianya mesti dibuka" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "Katalaluan:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Pilih lokasi untuk menyimpan sijil/kekunci yang diimport." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "Kunci keyring ini selepas" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "Kunci keyring ini bila saya log keluar" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minit" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Membuka" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Membuka" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "Katalaluan:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "Sijil dan Penyimpanan Kekunci" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Izinkan aplikasi mengakses keyring?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "Sijil dan Penyimpanan Kekunci" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Sijil" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Katalaluan untuk buka tidak betul" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Maklumat Import:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Operasi gagal" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "Maklumat Import:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..bdb2df3 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,1121 @@ +# Norwegian bokmål translation of gcr. +# Copyright (C) 2003 Red Hat Inc. +# This file is distributed under the same license as the gnome-keyring package. +# +# Kjartan Maraas , 2003-2017. +# Torstein Adolf Winterseth , 2010. +msgid "" +msgstr "" +"Project-Id-Version: gcr 3.23.x\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-10-18 09:40+0000\n" +"PO-Revision-Date: 2017-02-18 11:54+0100\n" +"Last-Translator: Kjartan Maraas \n" +"Language-Team: Norwegian bokmål \n" +"Language: nb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domenekomponent" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Bruker-ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-postadresse" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Fødselsdato" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Fødested" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Kjønn" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Land med statsborgerskap" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Bostedsland" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Vanlig navn" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Etternavn" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serienummer" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Land" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Lokalitet" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Stat" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Gate" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisasjon" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organisasjonsenhet" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Tittel" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonnummer" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Gitt navn" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Initialer" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Kvalifikator for generering" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN-kvalifikator" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 med RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 med RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 med DSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 med DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Eliptisk kurve" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 med ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 med ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 med ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 med ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 med ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Tjenerautentisering" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Klientautentisering" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Kodesignering" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Beskyttelse av e-post" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Tidsstempling" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Feil under lasting av PKCS#11-modul: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Kunne ikke initiere PKCS#11-modul: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Kunne ikke initiere registrerte PKCS#11-moduler: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI har ugyldig koding." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI har ikke skjema «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI har uygyldig syntaks." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI har feil versjonsnummer." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Strømmen ble lukket" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Navn" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Utstedt av" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Utløper" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Sertifikat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Annet navn" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP-adresse" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-post" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-adresse" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Navn på katalog" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Navn på EDI-partner" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-adresse" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrert ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Ikke støttet nøkkeltype for sertifikatforespørsel" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Nøkkelen kan ikke brukes til å signere forespørselen" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG nøkkelring" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG-nøkkelring: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-nøkkel" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Nøkkel-ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg-prosessen avsluttet med kode: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg-prosessen ble terminert med signal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Operasjonen ble avbrutt" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privat nøkkel" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Offentlig nøkkel" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Sertifikatforespørsel" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Ikke gjenkjente eller støttede data." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Kunne ikke lese ugyldige eller korrupte data." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Data er låst" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Fortsett" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Avbryt" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Ikke gjenkjent eller utilgjengelige attributter for nøkkel" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Klarte ikke å bygge offentlig nøkkel" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "En annen dialog er allerede i gang" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Klarte ikke å finne en plass å lagre festet sertifikat" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Grunnleggende begrensninger" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Sertifikatautoritet" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ja" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nei" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maksimal lengde på sti" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Ubegrenset" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utvidet bruk av nøkkel" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Tillatte formål" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identifikator for subjektnøkkel" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identifikator for nøkkel" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digital signatur" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Metode for kryptering av nøkkel" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Metode for kryptering av data" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Nøkkelavtale" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Sertifikatsignatur" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Signatur for tilbaketrekkingsliste" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Bruk av nøkkel" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Bruksområder" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternative navn på subjekt" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Utvidelse" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikator" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Verdi" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Klarte ikke å eksportere sertifikatet." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitet" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verifisert av" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Utløper" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Navn på subjekt" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Navn på utsteder" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Utstedt sertifikat" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versjon" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Ikke gyldig før" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Ikke gyldig etter" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Fingeravtrykk for sertifikat" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informasjon om offentlig nøkkel" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signatur" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Eksporter sertifikat …" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritme for nøkkel" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Nøkkelparametere" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Størrelse på nøkkel" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1-fingeravtrykk for nøkkel" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritme for signatur" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametere for signatur" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritisk" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Sertifikatforespørsel" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attributt" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Type" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Utfordring" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detaljer" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Kunne ikke vise «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Kunne ikke vise fil" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Årsak" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Kan ikke vise en fil av denne typen." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Krypter" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Signer" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Sertifiser" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentiser" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Slått av" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Ukjent" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Ugyldig" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Slått av" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Trukket tilbake" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Utløpt" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Udefinert tillitsforhold" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Uten tillit" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Marginal tillit" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Full tillit" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Absolutt tillit" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informasjonen i denne nøkkelen er ikke verifisert ennå" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Denne nøkkelen er ugyldig" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Denne nøkkelen er deaktivert" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Denne nøkkelen er trukket tilbake" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Denne nøkkelen er utløpt" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Stoler ikke på denne nøkkelen" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Stoler marginalt på denne nøkkelen" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Stoler på denne nøkkelen" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Stoler helt og fullt på denne nøkkelen" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Nøkkel-ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritme" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Laget" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Utløper" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Evner" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Tillitsforhold til eier" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Navn" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Kommentar" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Brukerattributt" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Størrelse" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signatur for et binært dokument" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signatur på et tekstdokument" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Frittstående signatur" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Generisk sertifisering av nøkkel" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Persona sertifisering av nøkkel" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Tilfeldig sertifisering av nøkkel" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Positiv sertifisering av nøkkel" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Bindende signatur med undernøkkel" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Bindende signatur med primærnøkkel" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Signatur direkte på nøkkelen" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Signatur for tilbaketrekkings av nøkkel" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Signatur for tilbaketrekking av undernøkkel" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Signatur for tilbaketrekking av sertifisering" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Signatur for tidsstempel" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Signatur for tredjeparts bekreftelse" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasse" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Kun lokal" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Eksporterbar" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Nøkkel for tilbaketrekking" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Fingeravtrykk" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Offentlig undernøkkel" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Hemmelig nøkkel" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Hemmelig undernøkkel" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Initierer …" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Import pågår …" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importert til: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importer til: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Kan ikke importere fordi det finnes ingen kompatible importerere" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Ingen data å importere" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Nøkkel" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privat RSA-nøkkel" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privat DSA-nøkkel" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Privat eliptisk kurve nøkkel" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Offentlig DSA-nøkkel" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Offentlig eliptisk kurve nøkkel" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Styrke" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Fingeravtrykk" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "A_vbryt" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatisk valgt" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Bruker avbrøt operasjonen" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Vennligst oppgi passordet for å importere." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Passord:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Tegn:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Lås opp" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etikett:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Innstillinger for import" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Bekreft:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Passordene er ikke like." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Passordet kan ikke være tomt" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Tilgangsdialog" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Lås opp tilgang til passord og andre hemmeligheter" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "En fil med dette navnet eksisterer allerede." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Vil du erstatte den med en ny fil?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "E_rstatt" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operasjonen ble avbrutt." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Eksporter sertifikat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Lagre" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Sertifikatfiler" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-filer" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Lås opp denne nøkkelringen automatisk når jeg er logget inn" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Lås denne nøkkelringen når jeg logger ut" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Lås denne nøkkelringen etter" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Lås denne nøkkelringen hvis inaktiv i" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutter" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Lås opp: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Passord" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Innholdet i «%s» er låst. Du må oppgi korrekt passord for å vise innholdet." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Innholdet er låst. Du må oppgi korrekt passord for å vise innholdet." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Visning av GCR-sertifikat og nøkkel" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Vis programmets versjon" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fil …]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Vis sertifikat- og nøkkelfiler" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Sertifikatvisning" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Passordet var feil" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importert" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Import feilet" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importer" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "L_ukk" diff --git a/po/ne.po b/po/ne.po new file mode 100644 index 0000000..a3b557d --- /dev/null +++ b/po/ne.po @@ -0,0 +1,1277 @@ +# translation of gnome-keyring.HEAD.ne.po to Nepali +# Nepali Translation Project. +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# Shiva Pokharel , 2005. +# Jaydeep Bhusal , 2005. +# Mahesh subedi , 2006. +# Nabin Gautam , 2007. +msgid "" +msgstr "" +"Project-Id-Version: Gnome Nepali Translation Project\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-02-22 19:17+0000\n" +"PO-Revision-Date: 2017-07-30 17:55+0545\n" +"Last-Translator: Pawan Chitrakar \n" +"Language-Team: Nepali Translation Team \n" +"Language: ne\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Poedit 2.0.3\n" +"Plural-Forms: nplurals=2; plural=n !=1;\n" + +#: ../egg/egg-oid.c:40 +#, fuzzy +msgid "Domain Component" +msgstr "डोमेन" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "प्रयोगकर्ता आईडी" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "इमेल ठेगाना" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "जन्म मिति" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "जन्म स्थान" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "लिङ्ग" + +#: ../egg/egg-oid.c:59 +#, fuzzy +msgid "Country of Citizenship" +msgstr "देश" + +#: ../egg/egg-oid.c:61 +#, fuzzy +msgid "Country of Residence" +msgstr "देश" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "साझा नाम" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "क्रम सङ्ख्या" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "देश" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "स्थानीयता" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "स्थिति" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "सडक" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "सङ्गठन" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "सङ्गठनात्मक एकाइ" + +#: ../egg/egg-oid.c:82 +#, fuzzy +msgid "Title" +msgstr "शीर्षक" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "टेलिफोन नम्बर" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "दिइएको नाम" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:90 +#, fuzzy +msgid "Generation Qualifier" +msgstr "निर्भरता सिर्जना" + +#: ../egg/egg-oid.c:92 +#, fuzzy +msgid "DN Qualifier" +msgstr "Pg Dn" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "आरएसए" + +#: ../egg/egg-oid.c:98 +#, fuzzy +msgid "MD2 with RSA" +msgstr "आरएसए" + +#: ../egg/egg-oid.c:99 +#, fuzzy +msgid "MD5 with RSA" +msgstr "MD5" + +#: ../egg/egg-oid.c:100 +#, fuzzy +msgid "SHA1 with RSA" +msgstr "SHA1" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "डीएसए" + +#: ../egg/egg-oid.c:103 +#, fuzzy +msgid "SHA1 with DSA" +msgstr "SHA1" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +#, fuzzy +msgid "Elliptic Curve" +msgstr "घुमाउरो प्रकार" + +#: ../egg/egg-oid.c:106 +#, fuzzy +msgid "SHA1 with ECDSA" +msgstr "SHA1" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "SHA256 with ECDSA" +msgstr "SHA256" + +#: ../egg/egg-oid.c:109 +#, fuzzy +msgid "SHA384 with ECDSA" +msgstr "SHA384" + +#: ../egg/egg-oid.c:110 +#, fuzzy +msgid "SHA512 with ECDSA" +msgstr "SHA512" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "सर्भरलाई प्रमाणीकरण" + +#: ../egg/egg-oid.c:114 +#, fuzzy +msgid "Client Authentication" +msgstr "प्रमाणीकरण" + +#: ../egg/egg-oid.c:115 +#, fuzzy +msgid "Code Signing" +msgstr "हस्ताक्षरित सन्देश" + +#: ../egg/egg-oid.c:116 +#, fuzzy +msgid "Email Protection" +msgstr "इमेल" + +#: ../egg/egg-oid.c:117 +#, fuzzy +msgid "Time Stamping" +msgstr "हालको समयसँग सम्बन्धित एक समय" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gck/gck-uri.c:224 +#, fuzzy, c-format +msgid "The URI has invalid encoding." +msgstr "अवैध '%s' URI: %s" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "" + +#: ../gck/gck-uri.c:232 +#, fuzzy +msgid "The URI has bad syntax." +msgstr "नराम्रो URI %s" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "नेटवर्कको प्रवाह अकस्मात रूपमा बन्द भयो" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "NAME" + +#: ../gcr/gcr-certificate.c:352 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "सर्भर प्रमाणपत्र एक अविश्वसनीय इकाइद्वारा जारी गरिएको छ।" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "म्याद समाप्त हुन्छ" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "प्रमाणपत्र" + +#: ../gcr/gcr-certificate-extensions.c:177 +#, fuzzy +msgid "Other Name" +msgstr "अन्य..." + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:191 +#, fuzzy +msgid "DNS SRV" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +#, fuzzy +msgid "Email" +msgstr "इमेल" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +#, fuzzy +msgid "X400 Address" +msgstr "ठेगाना" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "डाइरेक्टरी नाम" + +#: ../gcr/gcr-certificate-extensions.c:234 +#, fuzzy +msgid "EDI Party Name" +msgstr "तेस्रो-पक्ष सफ्टवेयर विकासकर्ताले प्रदान गरेका" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "आईपी ठेगाना" + +#: ../gcr/gcr-certificate-extensions.c:257 +#, fuzzy +msgid "Registered ID" +msgstr "दर्ता" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:94 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "GnuPG पूर्वानिर्धारित किरिङ्ग डाइरेक्टरी" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG पूर्वानिर्धारित किरिङ्ग डाइरेक्टरी" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "पीजीपी कुञ्जी" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "कुञ्जी आईडी" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:871 +#, fuzzy, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "प्रक्रियामा सङ्केत %s पठाउँदै: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "अनुरोध रद्द गरिएको थियो ।" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +#, fuzzy +msgid "Private Key" +msgstr "निजी कुञ्जी" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +#, fuzzy +msgid "Public Key" +msgstr "निम्न हस्ताक्षरहरू रूजू हुन सक्दैन किन भने सार्वजनिक कुञ्जी उपलब्ध छैन:\n" + +#: ../gcr/gcr-parser.c:334 +#, fuzzy +msgid "Certificate Request" +msgstr "प्रमाणपत्र अनुरोध" + +#: ../gcr/gcr-parser.c:2557 +#, fuzzy +msgid "Unrecognized or unsupported data." +msgstr "पहिचान नगरिएको" + +#: ../gcr/gcr-parser.c:2560 +#, fuzzy +msgid "Could not parse invalid or corrupted data." +msgstr "SVG डेटा पद वर्णन गर्न सकेन" + +#: ../gcr/gcr-parser.c:2563 +#, fuzzy +msgid "The data is locked" +msgstr "ताल्चा लगाइयो" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "जारी राख्नुहोस्" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "_रद्द" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "" + +#: ../gcr/gcr-system-prompt.c:911 +#, fuzzy +msgid "Another prompt is already in progress" +msgstr "अर्को उदाहरण पहिले नै चलिरहेछ" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:117 +#, fuzzy +msgid "Basic Constraints" +msgstr "आधारभूत" + +#: ../ui/gcr-certificate-renderer.c:119 +#, fuzzy +msgid "Certificate Authority" +msgstr "प्रमाणपत्र अधिकार विश्वास" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "ठिक छ" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:123 +#, fuzzy +msgid "Max Path Length" +msgstr "अधिकतम लम्बाई" + +#: ../ui/gcr-certificate-renderer.c:124 +#, fuzzy +msgid "Unlimited" +msgstr "असिमित अनुरोध" + +#: ../ui/gcr-certificate-renderer.c:143 +#, fuzzy +msgid "Extended Key Usage" +msgstr "उपयोग: " + +#: ../ui/gcr-certificate-renderer.c:154 +#, fuzzy +msgid "Allowed Purposes" +msgstr "उद्धेश्यहरू" + +#: ../ui/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "विषय" + +#: ../ui/gcr-certificate-renderer.c:175 +#, fuzzy +msgid "Key Identifier" +msgstr "पहिचायक:" + +#: ../ui/gcr-certificate-renderer.c:186 +#, fuzzy +msgid "Digital signature" +msgstr "सीडी डिजिटल अडियो" + +#: ../ui/gcr-certificate-renderer.c:187 +#, fuzzy +msgid "Key encipherment" +msgstr "कुञ्जी प्रतिध्वनि कुञ्जी कायम गरियो" + +#: ../ui/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Data encipherment" +msgstr "डेटा सङ्कुचन" + +#: ../ui/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Key agreement" +msgstr "इजाजतपत्र सम्झौता" + +#: ../ui/gcr-certificate-renderer.c:190 +#, fuzzy +msgid "Certificate signature" +msgstr "प्रमाणपत्र" + +#: ../ui/gcr-certificate-renderer.c:191 +#, fuzzy +msgid "Revocation list signature" +msgstr "खण्डनको वैकल्पिक वर्णन" + +#: ../ui/gcr-certificate-renderer.c:216 +#, fuzzy +msgid "Key Usage" +msgstr "उपयोग: " + +#: ../ui/gcr-certificate-renderer.c:217 +#, fuzzy +msgid "Usages" +msgstr "यो विकल्प उपलब्ध छैन । कृपया अरू सम्भाव्य प्रयोगहरूको लागि -सहयोगमा हेर्नुहोस् ।\n" + +#: ../ui/gcr-certificate-renderer.c:237 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "वैकल्पिक datadir" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "विस्तार" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "पहिचायक" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +#, fuzzy +msgid "Value" +msgstr "VALUE" + +#: ../ui/gcr-certificate-renderer.c:287 +#, fuzzy +msgid "Couldn’t export the certificate." +msgstr "%d मा समूह आइ डी सेट गर्न सकिएन" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "परिचय" + +#: ../ui/gcr-certificate-renderer.c:525 +#, fuzzy +msgid "Verified by" +msgstr "परिचय प्रमाणिकरण गर्न सकिएन" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "म्याद समाप्त हुन्छ" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +#, fuzzy +msgid "Subject Name" +msgstr "विषय:" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +#, fuzzy +msgid "Issuer Name" +msgstr "जारीकर्ता" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +#, fuzzy +msgid "Issued Certificate" +msgstr "" +"किनभने तपाईँले प्रमाणपत्र अधिकारीलाई विश्वास गर्नुहुन्न जसले यो प्रमाणपत्र जारी गर्यो, " +"त्यसपछि तपाईँले अन्यथा उल्लेख नगरे सम्म यो प्रमाणपत्रको आधिकारिकता माथि विश्वास गर्नुहुन्न" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +#, fuzzy +msgid "Version" +msgstr "संस्करण" + +#: ../ui/gcr-certificate-renderer.c:568 +#, fuzzy +msgid "Not Valid Before" +msgstr "अगाडि छ" + +#: ../ui/gcr-certificate-renderer.c:573 +#, fuzzy +msgid "Not Valid After" +msgstr "पछि छ" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "अंगुठाछाप प्रबिष्टि" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +#, fuzzy +msgid "Public Key Info" +msgstr "सार्वजनिक पीजीपी कुञ्जी" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +#, fuzzy +msgid "Signature" +msgstr "हस्ताक्षर आईडी" + +#: ../ui/gcr-certificate-renderer.c:616 +#, fuzzy +msgid "Export Certificate…" +msgstr "प्रमाणपत्र निर्यात असफल" + +#: ../ui/gcr-certificate-renderer.c:855 +#, fuzzy +msgid "Key Algorithm" +msgstr "एल्गोरिदम:" + +#: ../ui/gcr-certificate-renderer.c:860 +#, fuzzy +msgid "Key Parameters" +msgstr "परामिति:" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +#, fuzzy +msgid "Key Size" +msgstr "साइज" + +#: ../ui/gcr-certificate-renderer.c:876 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 औँठाछाप" + +#: ../ui/gcr-certificate-renderer.c:898 +#, fuzzy +msgid "Signature Algorithm" +msgstr "हस्ताक्षर अल्गोरिदम अज्ञात" + +#: ../ui/gcr-certificate-renderer.c:902 +#, fuzzy +msgid "Signature Parameters" +msgstr "परामिति:" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "नाजुक" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "प्रमाणपत्र अनुरोध" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "विशेषता" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "वर्ग" + +#: ../ui/gcr-certificate-request-renderer.c:373 +#, fuzzy +msgid "Challenge" +msgstr "चुनौती प्याक" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "विवरण" + +#: ../ui/gcr-failure-renderer.c:159 +#, fuzzy, c-format +msgid "Could not display “%s”" +msgstr "मद्दत प्रदर्शन गर्न सकेन: %s" + +#: ../ui/gcr-failure-renderer.c:161 +#, fuzzy +msgid "Could not display file" +msgstr "मद्दत प्रदर्शन गर्न सकेन: %s" + +#: ../ui/gcr-failure-renderer.c:166 +#, fuzzy +msgid "Reason" +msgstr "कारण:" + +#: ../ui/gcr-failure-renderer.c:216 +#, fuzzy, c-format +msgid "Cannot display a file of this type." +msgstr "जडान भएका प्रदर्शनपर्दा चयन गर्नुहोस् ।" + +#: ../ui/gcr-gnupg-renderer.c:201 +#, fuzzy +msgid "Elgamal" +msgstr "एलगामल" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "गुप्तीकरण गर्नुहोस्" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "चिनो लगाउनुहोस्" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:220 +#, fuzzy +msgid "Authenticate" +msgstr "प्रमाणीकरण" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "असक्षम" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +#, fuzzy +msgid "Unknown" +msgstr "अज्ञात" + +#: ../ui/gcr-gnupg-renderer.c:255 +#, fuzzy +msgid "Invalid" +msgstr "अवैध" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "असक्षम" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "खारेज गरियो" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "समाप्त भयो" + +#: ../ui/gcr-gnupg-renderer.c:263 +#, fuzzy +msgid "Undefined trust" +msgstr "अपरिभाषित" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:267 +#, fuzzy +msgid "Marginally trusted" +msgstr "सीमान्त" + +#: ../ui/gcr-gnupg-renderer.c:269 +#, fuzzy +msgid "Fully trusted" +msgstr "पुरा" + +#: ../ui/gcr-gnupg-renderer.c:271 +#, fuzzy +msgid "Ultimately trusted" +msgstr "आखिरी" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "This key is invalid" +msgstr "सुरुआतको एउटा अवैध सुरक्षा कुञ्जि" + +#: ../ui/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key has been disabled" +msgstr "यो कुञ्जी खारेज गरिएको छ" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "यो कुञ्जी खारेज गरिएको छ" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "यो कुञ्जीको समय समाप्त भएको छ" + +#: ../ui/gcr-gnupg-renderer.c:302 +#, fuzzy +msgid "This key is distrusted" +msgstr "कुञ्जी प्रतिध्वनि कुञ्जी कायम गरियो" + +#: ../ui/gcr-gnupg-renderer.c:305 +#, fuzzy +msgid "This key is marginally trusted" +msgstr "हटाइएको विश्वस्त कुञ्जी" + +#: ../ui/gcr-gnupg-renderer.c:308 +#, fuzzy +msgid "This key is fully trusted" +msgstr "विश्वस्त कुञ्जी हटाइदै" + +#: ../ui/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is ultimately trusted" +msgstr "हटाइएको विश्वस्त कुञ्जी" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "कुञ्जी आईडी" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "एल्गोरिदम" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "सिर्जना गरियो" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +#, fuzzy +msgid "Expiry" +msgstr "अवैध समप्ति मिति" + +#: ../ui/gcr-gnupg-renderer.c:377 +#, fuzzy +msgid "Capabilities" +msgstr "यन्त्र क्षमताहरू समर्थित छैनन्" + +#: ../ui/gcr-gnupg-renderer.c:390 +#, fuzzy +msgid "Owner trust" +msgstr "स्वामित्व विश्वास अधिरोहन गर्नुहोस्:" + +#: ../ui/gcr-gnupg-renderer.c:418 +#, fuzzy +msgid "Name" +msgstr "NAME" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +#, fuzzy +msgid "Comment" +msgstr "टिप्पणी" + +#: ../ui/gcr-gnupg-renderer.c:464 +#, fuzzy +msgid "User Attribute" +msgstr "विशेषता" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "साइज" + +#: ../ui/gcr-gnupg-renderer.c:506 +#, fuzzy +msgid "Signature of a binary document" +msgstr "बाइनरी देखाउनुहोस्" + +#: ../ui/gcr-gnupg-renderer.c:508 +#, fuzzy +msgid "Signature of a canonical text document" +msgstr "कागजातमा सबै पाठ चयन गर्नुहोस्" + +#: ../ui/gcr-gnupg-renderer.c:510 +#, fuzzy +msgid "Standalone signature" +msgstr "हस्ताक्षर उपलब्ध छैन" + +#: ../ui/gcr-gnupg-renderer.c:512 +#, fuzzy +msgid "Generic certification of key" +msgstr "सामान्य" + +#: ../ui/gcr-gnupg-renderer.c:514 +#, fuzzy +msgid "Persona certification of key" +msgstr "कुञ्जी प्रतिध्वनि कुञ्जी कायम गरियो" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:518 +#, fuzzy +msgid "Positive certification of key" +msgstr "इन्टिजर %ld धनात्मक हुनुपर्दछ" + +#: ../ui/gcr-gnupg-renderer.c:520 +#, fuzzy +msgid "Subkey binding signature" +msgstr "बाइन्डिङ:" + +#: ../ui/gcr-gnupg-renderer.c:522 +#, fuzzy +msgid "Primary key binding signature" +msgstr "कुञ्जी बन्धन" + +#: ../ui/gcr-gnupg-renderer.c:524 +#, fuzzy +msgid "Signature directly on key" +msgstr "जब अनुप्रयोगले सीधै औजारमा रङ्ग लगाउला" + +#: ../ui/gcr-gnupg-renderer.c:526 +#, fuzzy +msgid "Key revocation signature" +msgstr "खण्डनको वैकल्पिक वर्णन" + +#: ../ui/gcr-gnupg-renderer.c:528 +#, fuzzy +msgid "Subkey revocation signature" +msgstr "खण्डनको वैकल्पिक वर्णन" + +#: ../ui/gcr-gnupg-renderer.c:530 +#, fuzzy +msgid "Certification revocation signature" +msgstr "खण्डनको वैकल्पिक वर्णन" + +#: ../ui/gcr-gnupg-renderer.c:532 +#, fuzzy +msgid "Timestamp signature" +msgstr "अन्तिम अद्यावधिक टाइमस्ट्याम्प" + +#: ../ui/gcr-gnupg-renderer.c:534 +#, fuzzy +msgid "Third-party confirmation signature" +msgstr "तेस्रो-पक्ष सफ्टवेयर विकासकर्ताले प्रदान गरेका" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +#, fuzzy +msgid "Class" +msgstr "CLASS" + +#: ../ui/gcr-gnupg-renderer.c:589 +#, fuzzy +msgid "Local only" +msgstr "स्थानीय मात्र" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:609 +#, fuzzy +msgid "Revocation Key" +msgstr "खण्डनको वैकल्पिक वर्णन" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +#, fuzzy +msgid "Fingerprint" +msgstr "औठाछाप" + +#: ../ui/gcr-gnupg-renderer.c:738 +#, fuzzy +msgid "Public Subkey" +msgstr "सार्वजनिक" + +#: ../ui/gcr-gnupg-renderer.c:740 +#, fuzzy +msgid "Secret Key" +msgstr "कुञ्जी निर्यात गर्नुहोस्" + +#: ../ui/gcr-gnupg-renderer.c:742 +#, fuzzy +msgid "Secret Subkey" +msgstr "गोप्य" + +#: ../ui/gcr-import-button.c:116 +#, fuzzy +msgid "Initializing…" +msgstr "सुरुआत गरिँदैछ..." + +#: ../ui/gcr-import-button.c:124 +#, fuzzy +msgid "Import is in progress…" +msgstr "आयात गर्नुहोस्" + +#: ../ui/gcr-import-button.c:131 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "निम्न फाइलहरू आयात गर्न सकिएन: %s" + +#: ../ui/gcr-import-button.c:151 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "प्रमाणपत्र आयात असफल : %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../ui/gcr-import-button.c:173 +#, fuzzy +msgid "No data to import" +msgstr "आयात डेटा" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "कुञ्जी" + +#: ../ui/gcr-key-renderer.c:355 +#, fuzzy +msgid "Private RSA Key" +msgstr "आरएसए" + +#: ../ui/gcr-key-renderer.c:357 +#, fuzzy +msgid "Private DSA Key" +msgstr "डीएसए" + +#: ../ui/gcr-key-renderer.c:359 +#, fuzzy +msgid "Private Elliptic Curve Key" +msgstr "निजी कुञ्जी पासवर्ड:" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +#, fuzzy +msgid "Public DSA Key" +msgstr "सार्वजनिक पीजीपी कुञ्जी" + +#: ../ui/gcr-key-renderer.c:368 +#, fuzzy +msgid "Public Elliptic Curve Key" +msgstr "निम्न कुञ्जी IDs को लागि कुनै सार्वजनिक कुञ्जी उपलब्ध छैन:\n" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "" +msgstr[1] "" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "बल" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +#, fuzzy +msgid "Fingerprints" +msgstr "दर्ता भएको अंगुठाछाप मेट्नुहोस् ?" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_रद्द गर्ने" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_ठिक छ" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +#, fuzzy +msgid "Automatically chosen" +msgstr "चयन फाईल स्थानीय फाइल होइन ।." + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, fuzzy, c-format +msgid "The user cancelled the operation" +msgstr "अनुरोध रद्द गरिएको थियो ।" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "कृपया प्रमाणीकरणको रुपमा तपाईँको आफ्नो पासवर्ड प्रविष्ट गर्नुहोस् ।\n" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "पासवर्ड:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "Token:" +msgstr "प्रमाणिकरण टोकन पाउनमा त्रुटि " + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "ताल्चा खोल्नुहोस्" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "लेबुल" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Import settings" +msgstr "आयात गर्नुहोस्" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "यकिन:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "पासवर्ड मिलेन ।" + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "पासवर्ड खालि हुन सक्दैन" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +#, fuzzy +msgid "Access Prompt" +msgstr "ढाँचाका लागि प्रवर्धन गर्नुहोस्" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "" + +#: ../ui/gcr-certificate-exporter.c:225 +#, fuzzy +msgid "A file already exists with this name." +msgstr "मौज्दातमा नाम पहिला नै अवस्थित छ" + +#: ../ui/gcr-certificate-exporter.c:226 +#, fuzzy +msgid "Do you want to replace it with a new file?" +msgstr "के तपाईँले बचत गरिरहनु भएको छविसँग तपाईँ यसलाई बदल्न चाहनुहुन्छ ?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "प्रतिस्थापन गर्नुहोस्" + +#: ../ui/gcr-certificate-exporter.c:259 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "अनुरोध रद्द गरिएको थियो ।" + +#: ../ui/gcr-certificate-exporter.c:303 +#, fuzzy +msgid "Export certificate" +msgstr "प्रमाणपत्र निर्यात असफल" + +#: ../ui/gcr-certificate-exporter.c:306 +#, fuzzy +msgid "_Save" +msgstr "...यस रुपमा बचत गर्नुहोस्" + +#: ../ui/gcr-certificate-exporter.c:315 +#, fuzzy +msgid "Certificate files" +msgstr "सबै सीए प्रमाणपत्र फाइलहरू" + +#: ../ui/gcr-certificate-exporter.c:326 +#, fuzzy +msgid "PEM files" +msgstr "फाइलहरू:" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "मैले लगइन गर्दा यस किरिङको स्वचालित रूपले ताल्चा खोल्नुहोस् ।" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "मैले लगइन गर्दा यस किरिङको स्वचालित रूपले ताल्चा खोल्नुहोस् ।" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +#, fuzzy +msgid "Lock this keyring after" +msgstr "स्क्रिन पछि लक गर्ने:" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring if idle for" +msgstr "किरिङ" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +#, fuzzy +msgid "minutes" +msgstr "मिनेट" + +#: ../ui/gcr-unlock-renderer.c:67 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "ताल्चा हटाउनुहोस्" + +#: ../ui/gcr-unlock-renderer.c:122 +#, fuzzy +msgid "Password" +msgstr "पासवर्ड:" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../ui/gcr-viewer-tool.c:40 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "कुञ्जीहरू वा प्रमाणपत्र मेट्नुहोस्" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "एप्लिकेशनको संसकरण देखाउने" + +#: ../ui/gcr-viewer-tool.c:49 +#, fuzzy +msgid "[file...]" +msgstr "यस रूपमा फाइल गर्नुहोस्" + +#: ../ui/gcr-viewer-tool.c:100 +#, fuzzy +msgid "- View certificate and key files" +msgstr "सबै इमेल प्रमाणपत्र फाइलहरू" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +#, fuzzy +msgid "Certificate Viewer" +msgstr "प्रमाणपत्र" + +#: ../ui/gcr-viewer-widget.c:202 +#, fuzzy +msgid "The password was incorrect" +msgstr "पासवर्ड गलत हुनसक्छ" + +#: ../ui/gcr-viewer-window.c:75 +#, fuzzy +msgid "Imported" +msgstr "आयात डेटा पुर्वावलोकन" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "आयात असफल भयो" + +#: ../ui/gcr-viewer-window.c:106 +#, fuzzy +msgid "Import" +msgstr "आयात गर्नुहोस्" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Close" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..bbee0a1 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,1154 @@ +# Dutch translation for gnome-keyring +# +# This file is distributed under the same license as the gnome-keyring package. +# +# Daniel van Eeden , 2004, 2008. +# Tino Meinen , 2005. +# Wouter Bolsterlee , 2006–2011. +# Redmar , 2012, 2013. +# Rachid BM , 2013. +# Justin van Steijn , 2016. +# Nathan Follens , 2017. +# +# Keyring vertalen we als sleutelbos (Wouter Bolsterlee, Tino Meinen) +# ‘Secret service’ laat ik voorlopig even onvertaald (Wouter Bolsterlee) +# ‘Expiry’ is de verloopdatum +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-02-22 19:17+0000\n" +"PO-Revision-Date: 2017-09-09 20:28+0200\n" +"Last-Translator: Nathan Follens \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Launchpad-Export-Date: 2013-02-02 09:32+0000\n" +"X-Generator: Poedit 2.0.3\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domeincomponent" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Gebruikers-ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-mailadres" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Geboortedatum" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Geboorteplaats" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Geslacht" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Nationaliteit" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Verblijfplaats" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Algemene naam" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Achternaam" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serienummer" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Land" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Gebied" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Staat" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Straat" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisatie" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organisatieonderdeel" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titel" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefoonnummer" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Voornaam" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Initialen" + +# Onvertaald gelaten (Wouter Bolsterlee) +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Generation Qualifier" + +# Onvertaald gelaten (Wouter Bolsterlee) +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN Qualifier" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudoniem" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 met RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 met RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 met RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 met DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptische kromme" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 met ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 met ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 met ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 met ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 met ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Server-authenticatie" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Client-authenticatie" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Ondertekenen van code" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-mailbeveiliging" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Toevoegen van tijdstempel" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Fout bij laden PKCS#11-module: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Kan PKCS#11-module niet initialiseren: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Kan geregistreerde PKCS#11-modules niet initialiseren: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "De URI heeft ongeldige codering." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "De URI heeft niet het ‘pkcs11’-schema." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "De URI heeft ongeldige syntaxis." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "De URI heeft een ongeldig versienummer." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "De stream werd gesloten" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Naam" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Uitgegeven door" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Verloopt op" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificaat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Andere naam" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP-adres" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-adres" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Mapnaam" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI-partijnaam" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-adres" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Geregistreerd ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Niet-ondersteund sleuteltype voor certificaatverzoek" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "De sleutel kan niet gebruikt worden om het verzoek te ondertekenen" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG-sleutelbos" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG-sleutelbos: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-sleutel" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Sleutel-ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "GnuPG-proces is beëindigd met code: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "GnuPG-proces is beëindigd met signaal:%d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "De bewerking werd geannuleerd" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privé-sleutel" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Publieke sleutel" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Certificaatverzoek" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Onherkenbare of niet ondersteunde gegevens." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Kon ongeldige of kapotte gegevens niet verwerken." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "De gegevens zijn vergrendeld" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Doorgaan" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Annuleren" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Onherkende of onbeschikbare eigenschappen voor sleutel" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Kon publieke sleutel niet bouwen" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Er is al een andere prompt actief" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Kon geen locatie vinden om het ‘pinned’ certificaat op te slaan" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Basisbeperkingen" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Certificaatauthoriteit" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ja" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nee" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maximale padlengte" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Onbeperkt" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Uitgebreid sleutelgebruik" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Toegestane doeleinden" + +# Subject Key Identifier is jargon en dus niet iets als "onderwerpsleutel" (Wouter Bolsterlee) +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Subject Key Identifier" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Sleutel-identificatie" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitale handtekening" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Sleutelcodering" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Gegevenscodering" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Sleutelovereenkomst" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Certificaatondertekening" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Ondertekening van intrekkingslijst" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Sleutelgebruik" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Gebruik" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Subject Alternative Names" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extensie" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificatie" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Waarde" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Kon het certificaat niet exporteren." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identiteit" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Geverifieerd door" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Verloopt op" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Naam van subject" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Naam uitgever" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Uitgegeven certificaat" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versie" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Niet geldig voor" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Niet geldig na" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Vingerafdrukken van certificaat" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Publieke sleutelinformatie" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Ondertekening" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Certificaat exporteren…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Sleutelalgoritme" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Sleutelparameters" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Sleutelgrootte" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1-vingerafdruk van sleutel" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritme voor ondertekening" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parameters voor ondertekening" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritiek" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Certificaatverzoek" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Eigenschap" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Type" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Uitdaging" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Details" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Kan ‘%s’ niet weergeven" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Kan bestand niet weergeven" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Reden" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Kan dit type bestanden niet weergeven." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Versleutelen" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Ondertekenen" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certificeren" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Authenticeren" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Uitgeschakeld" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Onbekend" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Ongeldig" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Uitgeschakeld" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Ingetrokken" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Verlopen" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Vertrouwen niet gedefinieerd" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Niet vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Beperkt vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Volledig vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Ultiem vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "De informatie in deze sleutel is niet geverifieerd" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Deze sleutel is ongeldig" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Deze sleutel is uitgeschakeld" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Deze sleutel is ingetrokken" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Deze sleutel is verlopen" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Deze sleutel is niet vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Deze sleutel is beperkt vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Deze sleutel is volledig vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Deze sleutel is ultiem vertrouwd" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Sleutel-ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritme" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Aangemaakt" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Verloopdatum" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Mogelijkheden" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Vertrouwen eigenaar" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Naam" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Commentaar" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Gebruikersattribuut" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Grootte" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Ondertekening van een binair document" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Ondertekening van een canonical-tekstdocument" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Losstaande ondertekening" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Algemene certificatie van sleutel" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Persoonlijke certificatie van sleutel" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Eenvoudige certificatie van sleutel" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Positieve certificatie van sleutel" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Ondertekening verbonden op subsleutel" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Ondertekening verbonden aan primaire sleutel" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Ondertekening direct op de sleutel" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Handtekening voor intrekking sleutel" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Handtekening voor intrekking subsleutel" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Handtekening voor intrekking certificaat" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Digitale handtekening" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Bevestigingsondertekening van derde partij" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasse" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Alleen lokaal" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exporteerbaar" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Intrekkings sleutel" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Vingerafdruk" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Publieke subsleutel" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Geheime sleutel" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Geheime subsleutel" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Initialiseren…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Aan het importeren…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Geïmporteerd naar: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importeren naar: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" +"Kan niet importeren, omdat er geen geschikte importeermethode beschikbaar is" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Geen data om te importeren" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Sleutel" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privé-sleutel (RSA)" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privé-sleutel (DSA)" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Privésleutel met elliptische kromme" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Publieke DSA-sleutel" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Publieke sleutel met elliptische kromme" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Sterkte" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Vingerafdrukken" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Annuleren" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Oké" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatisch gekozen" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "De gebruiker heeft de bewerking afgebroken" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Voer het wachtwoord in om te importeren." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Wachtwoord:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Ontgrendelen" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Label:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Import-instellingen" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Bevestigen:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "De wachtwoorden komen niet overeen." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Een leeg wachtwoord is niet toegestaan" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Toegang verkrijgen" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Toegang tot wachtwoorden en andere geheimen ontgrendelen" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Er bestaat al een bestand met deze naam." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Wilt u het overschrijven met een nieuw bestand?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Vervangen" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "De bewerking is geannuleerd." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Certificaat exporteren" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Opslaan" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Certificaatbestanden" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-bestanden" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Deze sleutelbos automatisch ontgrendelen bij aanmelden" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Deze sleutelbos automatisch vergrendelen bij afmelden" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Deze sleutelbos vergrendelen na" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Deze sleutelbos vergrendelen na inactiviteit van" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minuten" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Ontgrendelen: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Wachtwoord" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"De inhoud van ‘%s’ is vergrendeld. U moet het juiste wachtwoord invoeren om " +"de inhoud in te zien." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"De inhoud is vergrendeld. U moet het juiste wachtwoord invoeren om de inhoud " +"in te zien." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR certificaat- en sleutelbeheer" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Versie van de applicatie weergeven" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[bestand...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Certificaat- en sleutelbestanden weergeven" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Certificaten weergeven" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Het wachtwoord was onjuist" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Geïmporteerd" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importeren is mislukt" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importeren" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Sluiten" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Ongeldige PKCS#11-module: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Kan PKCS#11-module niet instellen: %s" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Ontgrendelen" + +#~ msgid "Label" +#~ msgstr "Label" diff --git a/po/nn.po b/po/nn.po new file mode 100644 index 0000000..4ac741d --- /dev/null +++ b/po/nn.po @@ -0,0 +1,1067 @@ +# Norwegian translations for gnome-keyring. +# Copyright (C) 2003 Red Hat Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Kjartan Maraas , 2003-2006. +# Eskild Hustvedt , 2007-2008 +# Torstein Adolf Winterseth , 2010. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring 0.4.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2010-12-05 17:32+0200\n" +"Last-Translator: Torstein Adolf Winterseth \n" +"Language-Team: Norwegian Nynorsk \n" +"Language: nn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.6.1\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Domenekomponent" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "Brukar-ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "E-postadresse" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Fødselsdato" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Fødselstad" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Kjønn" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Land med statsborgarskap" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Opphaldsland" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Trivialnamn" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Etternamn" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "Serienummer" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Land" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Lægje" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Stat" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Gate" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Organisasjon" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Organisasjonseining" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Tittel" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Telefonnummer" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Personnamn" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Initial" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Generasjonskvalifikator" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN-kvalifikator" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 med RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 med RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 med RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 med DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Økta er lukka" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "_Namn" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Namn på utgjevar" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "Går ut" + +# +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Sertifikat" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Operasjonen var avbroten" + +# +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Lås opp sertifikat" + +# +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Sertifikat" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "Namn på utgjevar" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +#, fuzzy +msgid "X400 Address" +msgstr "E-postadresse" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "Namn på subjekt" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +#, fuzzy +msgid "IP Address" +msgstr "E-postadresse" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +# +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Sertifikat" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "Ja" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "Nei" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Identifikator" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "Identifikator" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "Signatur" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "Nøkkelparameter" + +# +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Sertifikat" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "Namn på subjekt" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "Utviding" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "Identifikator" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "Verdi" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "Kritisk" + +# +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Oppgje passord for for å låsa opp sertifikat" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "Identitet" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "Verifisert av" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "Går ut" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "Namn på subjekt" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "Namn på utgjevar" + +# +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "Utgjeve sertifikat" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "Versjon" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "Ikkje gyldig før" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "Ikkje gyldig etter" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Fingeravtrykk" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "Signatur" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "Signaturalgoritme" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "Signaturparameter" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "Info om offentleg nøkkel" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "Nøkkelalgoritme" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "Nøkkelparameter" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "Nøkkelstorleik" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "Fingeravtrykk" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Offentleg nøkkel" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "_Detaljar" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Lås opp nøkkelring" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "PGP-nøkkel: %s" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +#, fuzzy +msgid "PGP Key" +msgstr "PGP-nøkkel: %s" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Operasjonen var avbroten" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "Signatur" + +# +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Sertifikat" + +# +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Sertifikat" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "Ukjend" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "Går ut" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Informasjonen er sensitiv og kan ikkje openberrast" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Økta er ugyldig" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "Modulen har ikkje vorte starta" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Nøkkelen kan ikkje innpakkast" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Passordet eller PIN har gått ut på dato" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Nøkkelen er av feil type" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "Algoritme" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "Går ut" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "_Namn" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "Storleik" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "Signaturparameter" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "Signatur" + +# +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Lås opp sertifikat" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "Signaturparameter" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "Lægje" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "Fingeravtrykk" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Offentleg nøkkel" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "Initial" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "Info om import:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Info om import:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Klarte ikkje importera fordi nøkkelen er av feil type" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "Ingen adresse tilgjengeleg for å importerast til" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "Nøkkel" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "Privat RSA-nøkkel" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "Privat DSA-nøkkel" + +# +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Privat nøkkel" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "Offentleg DSA-nøkkel" + +#: ../gcr/gcr-key-renderer.c:299 +#, fuzzy, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d bitar" +msgstr[1] "%d bitar" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "Styrke" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "Fingeravtrykk" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "Ikkje gjenkjent eller støtta data." + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "Klarte ikkje lesa ugyldig eller korrupt data." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "Dataa er låst" + +# +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "Lås denne opp automatisk når eg loggar inn." + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +# +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Lås opp" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "For å importera «%s» må det låsast opp" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "Passord:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Vel adresse for å lagra dei importerte sertifikata/nøklane." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Lås opp denne nøkkelringa automatisk når eg loggar inn" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "Lås denne nøkkelringen etter" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "Lås denne nøkkelringen viss inaktiv for" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "Lås denne nøkkelringen når du loggar ut" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutt" + +# +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Lås opp" + +# +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Lås opp" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "Passord:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "Serifikat- og nøkkellager" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Gje program tilgang til nøkkelring?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "Serifikat- og nøkkellager" + +# +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Sertifikat" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Passord for å låsa opp var ikkje korrekt" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Info om import:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Operasjonen feila" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "Info om import:" + +#: ../gck/gck-uri.c:223 +#, fuzzy, c-format +msgid "The URI has invalid encoding." +msgstr "URI-en har ugyldig syntaks. Feltet «%s» har ugyldig teiknkoding" + +#: ../gck/gck-uri.c:227 +#, fuzzy +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI-en har ikkje «pkcs11»-teiknkoding" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/oc.po b/po/oc.po new file mode 100644 index 0000000..b78c460 --- /dev/null +++ b/po/oc.po @@ -0,0 +1,1131 @@ +# Occitan translatiion of gnome-keyring. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Cédric Valmary (totenoc.eu) , 2016. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-05-19 05:43+0000\n" +"PO-Revision-Date: 2016-05-29 20:46+0200\n" +"Last-Translator: Cédric Valmary (totenoc.eu) \n" +"Language-Team: Tot En Òc\n" +"Language: oc\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Component del domeni" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID utilizaire" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Adreça electronica" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data de naissença" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Luòc de naissença" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sèxe" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "País de cuitadanetat" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "País de résidence" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nom corrent" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Nom de familha" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Numèro de seria" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localitat" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Estat" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Carrièra" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizacion" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unitat d'organizacion" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Títol" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Numèro de telefòn" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Prenom" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inicialas" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Qualificatiu de generacion" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Qualificatiu DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Escais" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD amb RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 amb RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA+ amb RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 amb DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Corba elliptica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 amb ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 amb ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 amb ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 amb ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 amb ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autentificacion de servidor" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autentificacion de client" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Signatura de còdi" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Proteccion de corrièr electronic" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Orodatatge" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Error de cargament del modul PKCS#11 : %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Impossible d'inicializar lo modul PKCS#11 : %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Impossible d'inicializar los moduls PKCS#11 enregistrats : %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "L'encodatge de l'URI es pas valid." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "L'URI respècta pas lo modèl « pkcs11 »." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "La sintaxi de l'URI es pas corrècta." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Lo numèro de version de l'URI es pas corrècte." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Lo flux es estat tampat" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nom" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emés per" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Expira" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Autre nom" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Adreça XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Corrièr electronic" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Adreça X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nom d'annuari" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nom de partenari EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Adreça IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID enregistrat" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipe de clau pas pres en carga per una requèsta de certificacion" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "La clau pòt pas èsser utilizada per signar la requèsta" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Trossèl de clau GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Trossèl de clau GnuPG : %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Clau PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID de la clau" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Lo processus gnupg s'es acabat amb lo còdi : %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Lo processus gnupg es estat tampat pel senhal : %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "L'operacion es estada anullada" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Clau privada" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Clau publica" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Requèsta de certificat" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Donadas invalids o pas geridas." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Impossible d'analisar las donadas invalids o corrompudas." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Las donadas son verrolhadas" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Contunhar" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Anullar" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atributs de clau pas reconegut o pas valid" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "Impossible de crear la clau publica" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Un autra convit es ja en cors" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" +"Impossible de trobar un emplaçament per enregistrar lo certificat acceptat." + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Constrenchas de basa" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoritat de certificacion" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Òc" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Non" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Longor de camin maximala" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Illimitat" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utilizacion de clau espandida" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Usatges autorizats" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificador de clau del subjècte" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificador de clau" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Signatura numerica" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Chiframent de clau" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Chiframent de donadas" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acòrd de clau" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Signatura de certificat" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Signatura de lista de revocacion" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Utilizacion de clau" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Utilizacions" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Noms alternatius del subjècte" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extension" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificador" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valor" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "Impossible d'exportar lo certificat." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitat" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificat per" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Expira" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nom del subjècte" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nom d'emeteire" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificat emés" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Version" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Invalid avant" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Invalid aprèp" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Emprentas de certificat" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informacion sus la clau publica" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signatura" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportar lo certificat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritme de la clau" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Paramètres de la clau" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Talha de la clau" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Emprenta SHA1 de clau" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritme de signatura" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Paramètres de signatura" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Critic" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Demanda de certificat" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipe" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detalhs" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "Impossible d'afichar « %s »" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Impossible d'afichar lo fichièr" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Motiu" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Impossible d'afichar un fichièr d'aqueste tipe." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Chifrar" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Signar" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certificar" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentificar" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Desactivada" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Desconegut" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Invalid" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Desactivada" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revocat" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Expirat" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Fisança non definida" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Sospechós" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Febla fisança" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Entièra fisança" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Fisança ultima" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "" +"L'informacion contenguda dins aquesta clau es pas encara estada verificada" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Aquesta clau es invalida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "La clau es estada desactivada" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "La clau es estada revocada" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "La clau a expirat" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "La clau es denigrada" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "La fisança dins aquesta clau es febla" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "La fisança dins aquesta clau es entièra" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "La fisança dins aquesta clau es ultima" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Identificant de la clau" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritme" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Creat" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Expiracion" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Capacitats" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Fisabilitat del proprietari" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nom" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comentari" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atribut utilizaire" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Talha" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signatura d'un document binari" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signatura d'un document tèxte canonic" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Signatura autonòma" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificacion generica de clau" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificacion de clau d'un escais" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificacion temporària de clau" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificacion positiva de clau" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Signatura de ligam a la sosclau" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Signatura de ligam a la clau primària" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Signatura dirèctament sus la clau" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Signatura de revocacion de clau" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Signatura de revocacion de sosclau" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Signatura de revocacion de certificat" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Signatura amb data" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Signatura de confirmacion tèrça" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classa" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Solament local" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportable" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Clau de revocacion" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Emprentas" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Sosclau publica" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Clau secreta" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Sosclau secreta" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicializacion…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importacion en cors…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importat cap a : %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importar cap a : %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Impossible d'importar perque i a pas d'importatador compatible" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Pas cap de donada d'importar" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Clau" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Clau RSA privada" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Clau DSA privada" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Clau corba elliptica privada" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Clau DSA publica" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Clau corba elliptica publica" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Vigor" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Emprentas" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Anullar" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Validar" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Causit automaticament" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "L'utilizaire a anullat l'operacion" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Per fin d'importar, sasissètz lo senhal." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Senhal :" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Geton :" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Desverrolhar" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiqueta :" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Paramètres d'importacion" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirmar :" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Los senhals correspondon pas." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Lo senhal pòt pas èsser void" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Convit d'accès" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Desblocar l'accès als senhals e autres secrets" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Un fichièr que pòrta aqueste nom existís ja." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Lo volètz remplaçar per un fichièr novèl ?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Remplaçar" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "L'operacion es estada anullada." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exportar lo certificat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Enregistrar" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Fichièrs de certificat" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Fichièrs PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" +"Desverrolhar automaticament aqueste trossèl de claus quand soi connectat" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Verrolhar aqueste trossèl de claus quand me desconnècti" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Verrolhar aqueste trossèl de claus aprèp" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Verrolhar aqueste trossèl de claus se es inactiu pendant" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutas" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Desverrolhar : %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Senhal" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Lo contengut de « %s » es verrolhat. Per veire aqueste contengut, sasissètz " +"lo senhal corrècte." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Lo contengut es verrolhat. Per veire aqueste contengut, sasissètz lo senhal " +"corrècte." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Afichador de certificats e de claus GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Aficha la version de l'aplicacion" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fichièr...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Afichar de fichièrs de certificats e de claus" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Afichador de certificats" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Lo senhal es pas corrècte" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importat" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Fracàs de l'importacion" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importar" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Tampar" + +#~ msgid "Usatges" +#~ msgstr "Utilizacions" diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000..c319b40 --- /dev/null +++ b/po/or.po @@ -0,0 +1,1067 @@ +# translation of gnome-keyring.master.or.po to Oriya +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# Subhransu Behera , 2006. +# Manoj Kumar Giri , 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master.or\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2010-05-12 12:41+0530\n" +"Last-Translator: Manoj Kumar Giri \n" +"Language-Team: Oriya \n" +"Language: or\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "ଡମେନ ଉପାଦାନ" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ଉପୟୋଗକର୍ତ୍ତା ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "ଜନ୍ମ ଦିନ" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "ଜନ୍ମ ସ୍ଥାନ" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "ଲିଙ୍ଗ" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "ଜନ୍ମ ଦେଶ" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "ଜନ୍ମ ସ୍ଥାନ" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "ସାଧାରଣ ନାମ" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "କୁଳ ନାମ" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "କ୍ରମିକ ସଂଖ୍ଯା" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "ଦେଶ" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "ସ୍ଥାନୀଯ" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "ରାଜ୍ଯ" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "ସାହି" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "ସଙ୍ଗଠନ" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "ସଙ୍ଘଠନ ମୂଳକ ଏକକ" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "ଶୀର୍ଷକ" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "ଟେଲିଫୋନ କ୍ରମିକ ସଂଖ୍ଯା" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "ଦିଆ ଯାଇଥିବା ନାମ" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "ପ୍ରାରମ୍ଭିକଗୁଡିକ" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "ସୃଷ୍ଟି ଯୋଗ୍ୟ" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN ଯୋଗ୍ୟ" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA ସହିତ MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA ସହିତ MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA ସହିତ SHA1" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA ସହିତ SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "SSL ସେବକ" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "SSL ଗ୍ରାହକ" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "ଅଧିବେଶନ ବନ୍ଦ ହୋଇଛି" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "ନାମ (_N):" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "ରେ" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "ରେ" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "ପ୍ରୟୋଗଟି ବାତିଲ ହୋଇଥିଲା" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "ପ୍ରମାଣପତ୍ରକୁ ପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "ପ୍ରଦାନକାରୀଙ୍କ ନାମ" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "ଇ-ଡାକ" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "ବିଷୟ ନାମ" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "ହଁ" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "ନାଁ" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "ପରିଚାୟକ" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "ପରିଚାୟକ" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "ହସ୍ତାକ୍ଷର" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "କି ପ୍ରାଚଳଗୁଡ଼ିକ" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "ବିଷୟ ନାମ" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "ବିସ୍ତାର" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "ପରିଚାୟକ" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "ମୂଲ୍ଯ" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "ଗୁରୁତର" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "ପ୍ରମାଣପତ୍ରକୁ ପରିବର୍ତ୍ତନୀୟ କରିବା ପାଇଁ ପ୍ରବେଶସଂକେତ ଭରଣ କରନ୍ତୁ" + +#: ../gcr/gcr-certificate-renderer.c:613 +#, fuzzy +msgid "Identity" +msgstr "ପରିଚାୟକ" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +#, fuzzy +msgid "Expires" +msgstr "ରେ" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "ବିଷୟ ନାମ" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "ପ୍ରଦାନକାରୀଙ୍କ ନାମ" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "ପ୍ରଦତ୍ତ ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "ସଂସ୍କରଣ" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "ପୂର୍ବରୁ ବୈଧ ନଥିଲା" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "ପରେ ବୈଧ ନଥିଲା" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "ଅଙ୍ଗୁଳି ଚିହ୍ନ" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "ହସ୍ତାକ୍ଷର" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "ହସ୍ତାକ୍ଷର ଆଲଗୋରିଦମ" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "ହସ୍ତକ୍ଷର ପ୍ରାଚଳଗୁଡ଼ିକ" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "ସାର୍ବଜନିକ କି ସୂଚନା" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "କି ଆଲଗୋରିଦମ" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "କି ପ୍ରାଚଳଗୁଡ଼ିକ" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "କି ଆକାର" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 ଅଙ୍ଗୁଳିଛବି " + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "ସର୍ବସାଧାରଣ କି " + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "କି-ରିଙ୍ଗକୁ ଅାନଲକ କରନ୍ତୁ" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "ପ୍ରୟୋଗଟି ବାତିଲ ହୋଇଥିଲା" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "ହସ୍ତାକ୍ଷର" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "ଅଜଣା ତ୍ରୁଟି" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "ରେ" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "ସୂଚନାଟି ସମ୍ବେଦନଶୀଳ ଅଟେ ଏବଂ ଏହାକୁ ପ୍ରକାଶ କରିହେବ ନାହିଁ" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "ଅଧିବେଶନ ଅବୈଧ ଅଟେ" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "ଏକକାଂଶଟିକୁ ଆରମ୍ଭ କରିହେବ ନାହିଁ" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "କିକୁ ଆବୃତ କରିହେବ ନାହିଁ" + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "ପ୍ରବେଶ ସଂକେତ କିମ୍ବା PIN ର ସମୟ ସମାପ୍ତ ହୋଇଛି" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "କି ଟି ଭୁଲ ପ୍ରକାରର" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +#, fuzzy +msgid "Algorithm" +msgstr "କି ଆଲଗୋରିଦମ" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "ରେ" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "ନାମ (_N):" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +#, fuzzy +msgid "Size" +msgstr "କି ଆକାର" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "ହସ୍ତକ୍ଷର ପ୍ରାଚଳଗୁଡ଼ିକ" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "ହସ୍ତାକ୍ଷର" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "ପ୍ରମାଣପତ୍ରକୁ ପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "ହସ୍ତକ୍ଷର ପ୍ରାଚଳଗୁଡ଼ିକ" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "ସ୍ଥାନୀଯ" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +#, fuzzy +msgid "Fingerprint" +msgstr "ଅଙ୍ଗୁଳି ଚିହ୍ନ" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "ସର୍ବସାଧାରଣ କି " + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "ପ୍ରାରମ୍ଭିକଗୁଡିକ" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "ଏହା ଭିତରକୁ ଆମଦାନି କରନ୍ତୁ:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "ଏହା ଭିତରକୁ ଆମଦାନି କରନ୍ତୁ:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "ଆମଦାନି କରିପାରିବ ନାହିଁ କାରଣ କି ଟି ଭୁଲ ପ୍ରକାରର ଅଟେ" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "କୁ ଆମଦାନି କରିବା ପାଇଁ କୌଣସି ସ୍ଥାନ ଉପଲବ୍ଧ ନାହିଁ" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "ବ୍ୟକ୍ତିଗତ କି" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "ବ୍ୟକ୍ତିଗତ କି" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "ବ୍ୟକ୍ତିଗତ କି" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "ସର୍ବସାଧାରଣ କି " + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +#, fuzzy +msgid "Strength" +msgstr "ସାହି" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "ଅଙ୍ଗୁଳି ଚିହ୍ନ" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "ଅଚିହ୍ନା ଅଥବା ଅସମର୍ଥିତ ତଥ୍ୟ।" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ ତଥ୍ୟକୁ ବିଶ୍ଳେଷଣ କରିପାରିଲା ନାହିଁ।" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "ତଥ୍ୟଟି ଅପରିବର୍ତ୍ତନିୟ ଅଛି" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "ପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s'କୁ ଆମଦାନି କରିବା ପାଇଁ, ଏହାକୁ ପରିବର୍ତ୍ତନୀୟ କରିବା ଉଚିତ" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "ପ୍ରବେଶ ସଙ୍କେତ:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, fuzzy, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "ଆମଦାନି ହୋଇଥିବା ପ୍ରମାଣପତ୍ର/କିଗୁଡ଼ିକୁ ସଞ୍ଚୟକରିବା ପାଇଁ ଗୋଟିଏ ସ୍ଥାନ ବାଛନ୍ତୁ।" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "ମୁଁ ଲଗଇନ ହେବା ସମୟରେ ଏହି କିରିଙ୍ଗକୁ ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଅପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ।" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "ମୁଁ ଲଗଇନ ହେବା ସମୟରେ ଏହି କିରିଙ୍ଗକୁ ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଅପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ।" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "ମିନିଟ" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "ପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "ପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "ପ୍ରବେଶ ସଙ୍କେତ:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "ପ୍ରମାଣପତ୍ର/କି ସଂଗ୍ରହାଳୟକୁ ପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "ପ୍ରମାଣପତ୍ର/କି ସଂଗ୍ରହାଳୟକୁ ପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "ପ୍ରମାଣପତ୍ର" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "ପ୍ରବେଶ ସଂକେତ କିମ୍ବା PIN ଟି ଭୁଲ ଅଛି" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "ଏହା ଭିତରକୁ ଆମଦାନି କରନ୍ତୁ:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "ପ୍ରୟୋଗ ବିଫଳ ହୋଇଛି" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "ଏହା ଭିତରକୁ ଆମଦାନି କରନ୍ତୁ:" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/pa.po b/po/pa.po new file mode 100644 index 0000000..4237059 --- /dev/null +++ b/po/pa.po @@ -0,0 +1,1143 @@ +# translation of gnome-keyring.HEAD.po to Punjabi +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# A S Alam ,2004,2005, 2006, 2007, 2009, 2010, 2011. +# Amanpreet Singh Alam , 2009, 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2014-09-21 04:50+0000\n" +"PO-Revision-Date: 2014-09-21 09:26-0500\n" +"Last-Translator: A S Alam \n" +"Language-Team: Punjabi/Panjabi \n" +"Language: pa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.5\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "ਡੋਮੇਨ ਭਾਗ" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ਯੂਜ਼ਰ ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "ਈਮੇਲ ਐਡਰੈੱਸ" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "ਜਨਮ ਦਿਨ" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "ਜਨਮ ਥਾਂ" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "ਲਿੰਗ" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "ਦੇਸ਼ ਦੀ ਨਾਗਰਿਕਤਾ" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "ਰਹਿਣ ਵਾਲਾ ਦੇਸ਼" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "ਆਮ ਨਾਂ" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "ਗੋਤ" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "ਸੀਰੀਅਲ ਨੰਬਰ" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "ਦੇਸ਼" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "ਟਿਕਾਣਾ" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "ਸੂਬਾ" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "ਗਲੀ" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "ਸੰਗਠਨ" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "ਸੰਗਠਨ ਇਕਾਈ" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "ਟਾਈਟਲ" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "ਟੈਲੀਫੋਨ ਨੰਬਰ" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "ਦਿੱਤਾ ਨਾਂ" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "ਸ਼ੁਰੂ" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "ਪੀੜ੍ਹੀ ਕੁਆਲੀਫਾਇਰ" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN ਕੁਆਲੀਫਾਇਰ" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "RSA ਨਾਲ MD2" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "RSA ਨਾਲ MD5" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "RSA ਨਾਲ SHA1" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "DSA ਨਾਲ SHA1" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "ਇੱਲਪਟਿਕ ਕਰਵ" + +#: ../egg/egg-oid.c:106 +#| msgid "SHA1 with DSA" +msgid "SHA1 with ECDSA" +msgstr "ECDSA ਨਾਲ SHA1" + +#: ../egg/egg-oid.c:107 +#| msgid "SHA1 with DSA" +msgid "SHA224 with ECDSA" +msgstr "ECDSA ਨਾਲ SHA224" + +#: ../egg/egg-oid.c:108 +#| msgid "SHA1 with DSA" +msgid "SHA256 with ECDSA" +msgstr "ECDSA ਨਾਲ SHA256" + +#: ../egg/egg-oid.c:109 +#| msgid "SHA1 with DSA" +msgid "SHA384 with ECDSA" +msgstr "ECDSA ਨਾਲ SHA384" + +#: ../egg/egg-oid.c:110 +#| msgid "SHA1 with DSA" +msgid "SHA512 with ECDSA" +msgstr "ECDSA ਨਾਲ SHA512" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "ਸਰਵਰ ਪਰਮਾਣਕਿਤਾ" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "ਕਲਾਇਟ ਪਰਮਾਣਕਿਤਾ" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "ਕੋਡ ਸਾਇਨਿੰਗ" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "ਈਮੇਲ ਸੁਰੱਖਿਆ" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "ਸਮਾਂ ਮੋਹਰ" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 ਮੋਡੀਊਲ ਲੋਡ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "PKCS#11 ਮੋਡੀਊਲ ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "ਰਜਿਸਟਰ ਹੋਏ PKCS#11 ਮੋਡੀਊਲ ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕੇ: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI ਲਈ ਗਲਤ ਇੰਕੋਡਿੰਗ ਹੈ।" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI 'pkcs11' ਸਕੀਮ ਨਹੀਂ ਹੈ।" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI ਦਾ ਗਲਤ ਸੰਟੈਕਸ ਹੈ।" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI ਦਾ ਗਲਤ ਵਰਜਨ ਨੰਬਰ ਹੈ।" + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "ਸਟਰੀਮ ਬੰਦ ਸੀ" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "ਨਾਂ" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "ਜਾਰੀ ਕਰਤਾ" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "ਮਿਆਦ" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "ਸਰਟੀਫਿਕੇਟ" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "ਹੋਰ ਨਾਂ" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP ਐਡਰੈਸ" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "ਈਮੇਲ" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 ਐਡਰੈਸ" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "ਡਾਇਰੈਕਟਰੀ ਨਾਂ" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI ਪਾਰਟੀ ਨਾਂ" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP ਐਡਰੈੱਸ" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ਰਜਿਸਟਰ ਕੀਤਾ ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "ਸਰਟੀਫਿਕੇਟ ਮੰਗ ਲਈ ਨਾ-ਸਹਾਇਕ ਕੁੰਜੀ ਕਿਸਮ" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "ਇਹ ਕੁੰਜੀ ਨੂੰ ਮੰਗ ਉੱਤੇ ਦਸਤਖਤ ਕਰਨ ਲਈ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG ਕੀਰਿੰਗ" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG ਕੀਰਿੰਗ: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP ਕੁੰਜੀ" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ਕੁੰਜੀ ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg ਕਾਰਵਾਈ ਅੱਗੇ ਦਿੱਤੇ ਕੋਡ ਨਾਲ ਬੰਦ ਹੋਇਆ: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg ਕਾਰਵਾਈ ਸਿਗਨਲ ਨਾਲ ਖਤਮ ਹੋ ਗਿਆ: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2551 +#: ../gcr/gcr-parser.c:3157 ../gcr/gcr-system-prompt.c:922 +msgid "The operation was cancelled" +msgstr "ਕਾਰਵਾਈ ਰੱਦ ਕੀਤੀ ਗਈ" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "ਪਬਲਿਕ ਕੁੰਜੀ" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "ਸਰਟੀਫਿਕੇਟ ਮੰਗ" + +#: ../gcr/gcr-parser.c:2554 +msgid "Unrecognized or unsupported data." +msgstr "ਗ਼ੈਰ-ਪਛਾਣ ਜਾਂ ਗ਼ੈਰ-ਸਹਾਇਕ ਡਾਟਾ ਹੈ।" + +#: ../gcr/gcr-parser.c:2557 +msgid "Could not parse invalid or corrupted data." +msgstr "ਅਢੁੱਕਵਾਂ ਜਾਂ ਨਿਕਾਰਾ ਹੋਇਆ ਡਾਟਾ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।" + +#: ../gcr/gcr-parser.c:2560 +msgid "The data is locked" +msgstr "ਡਾਟਾ ਲਾਕ ਹੈ" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "ਜਾਰੀ ਰੱਖੋ" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "ਰੱਦ ਕਰੋ" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "ਕੰਜੀ ਲਈ ਬੇਪਛਾਣ ਜਾਂ ਨਾ-ਉਪਲੱਬਧ ਗੁਣ" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "ਪਬਲਿਕ ਕੁੰਜੀ ਬਿਲਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ" + +#: ../gcr/gcr-system-prompt.c:903 +msgid "Another prompt is already in progress" +msgstr "ਹੋਰ ਪਰਾਉਂਟ ਪਹਿਲਾਂ ਹੀ ਜਾਰੀ ਹੈ" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "ਪਿੰਨ ਕੀਤਾ ਸਰਟੀਫਿਕੇਟ ਸੰਭਾਲਣ ਲਈ ਟਿਕਾਣਾ ਲੱਭਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "ਮੁੱਢਲੀਆਂ ਸ਼ਰਤਾਂ" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "ਸਰਟੀਫਿਕੇਟ ਅਥਾਰਟੀ" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "ਹਾਂ" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "ਨਹੀਂ" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "ਵੱਧੋ-ਵੱਧ ਪਾਥ ਲੰਬਾਈ" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "ਬੇਅੰਤ" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "ਐਕਸਟੈਂਡਡ ਕੁੰਜੀ ਵਰਤੋਂ" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "ਮਨਜ਼ੂਰ ਕੀਤੇ ਮਕਸਦ" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "ਵਿਸ਼ਾ ਕੁੰਜੀ ਪਛਾਣਕਰਤਾ" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "ਕੁੰਜੀ ਪਛਾਣਕਰਤਾ" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "ਡਿਜ਼ਿਟਲ ਦਸਤਖਤ" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "ਕੁੰਜੀ ਇਨਸੀਫੀਰਮੈਂਟ" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "ਡਾਟਾ ਇਨਸੀਫੀਰਮੈਂਟ" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "ਕੁੰਜੀ ਇਕਰਾਰਨਾਮਾ" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "ਸਰਟੀਫਿਕੇਟ ਦਸਤਖਤ" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "ਮਨਸੂਖ ਲਿਸਟ ਦਸਤਖਤ" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "ਕੁੰਜੀ ਵਰਤੋਂ" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "ਵਰਤੋਂ" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "ਵਿਸ਼ਾ ਬਦਲਵੇਂ ਨਾਂ" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "ਇਕਸਟੈਨਸ਼ਨ" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "ਪਛਾਣਕਰਤਾ" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "ਮੁੱਲ" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "ਸਰਟੀਫਿਕੇਟ ਐਕਸਪੋਰਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "ਪਛਾਣ" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "ਜਾਂਚ ਕਰਤਾ" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "ਮਿਆਦ" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "ਵਿਸ਼ਾ ਨਾਂ" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "ਜਾਰੀ ਕਰਤਾ ਨਾਂ" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "ਜਾਰੀ ਕੀਤਾ ਸਰਟੀਫਿਕੇਟ" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "ਵਰਜਨ" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਢੁੱਕਵਾਂ ਨਹੀਂ" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "ਇਸ ਤੋਂ ਬਾਅਦ ਢੁੱਕਵੀਂ ਨਹੀਂ" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "ਸਰਟੀਫਿਕੇਟ ਫਿੰਗਰ-ਪਰਿੰਟ" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "ਪਬਲਿਕ ਕੁੰਜੀ ਜਾਣਕਾਰੀ" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "ਦਸਤਖਤ" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "…ਸਰਟੀਫਿਕੇਟ ਐਕਸਪਰੋਟ" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "ਕੁੰਜੀ ਐਲੋਗਰਿਥਮ" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "ਕੁੰਜੀ ਪੈਰਾਮੀਟਰ" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "ਕੁੰਜੀ ਆਕਾਰ" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "ਕੁੰਜੀ SHA1 ਫਿੰਗਰਪਰਿੰਟ" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "ਦਸਤਖਤ ਐਲੋਗਰਿਥਮ" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "ਦਸਤਖਤ ਪੈਰਾਮੀਟਰ" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "ਨਾਜ਼ੁਕ" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "ਸਰਟੀਫਿਕੇਟ ਮੰਗ" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "ਗੁਣ" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "ਕਿਸਮ" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "ਦਾਅਵਾ" + +#: ../ui/gcr-display-view.c:316 +msgid "_Details" +msgstr "ਵੇਰਵਾ(_D)" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "\"'%s\" ਵੇਖਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "ਫਾਇਲ ਵੇਖਾਈ ਨਹੀਂ ਜਾ ਸਕੀ" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "ਕਾਰਨ" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "ਇਸ ਕਿਸਮ ਦੀ ਫਾਇਲ ਨਹੀਂ ਵੇਖਾਈ ਜਾ ਸਕਦੀ" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "ਇੰਕ੍ਰਿਪਟ" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "ਸਰਟੀ" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "ਪਰਮਾਣਕਿਤਾ" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "ਬੰਦ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "ਅਣਜਾਣ" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "ਅਢੁੱਕਵਾਂ" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "ਬੰਦ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "ਮਨਸੂਖ" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "ਮਿਆਦ ਪੁੱਗੀ" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "ਨਾ-ਪ੍ਰਭਾਸ਼ਿਤ ਭਰੋਸਾ" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "ਨਾ-ਭਰੋਸੇਯੋਗ" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "ਹਲਕੀ ਭਰੋਸੇਯੋਗ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "ਪੂਰਾ ਭਰੋਸਾ" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "ਬੇਅੰਤ ਭਰੋਸਾ" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "ਇਹ ਕੁੰਜੀ ਵਿਚਲੀ ਜਾਣਕਾਰੀ ਜਾਂਚੀ ਨਹੀਂ ਜਾ ਸਕੀ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "ਇਹ ਕੁੰਜੀ ਗਲਤ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "ਇਹ ਕੁੰਜੀ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "ਇਹ ਕੁੰਜੀ ਮਨਸੂਖ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "ਇਹ ਕੁੰਜੀ ਦੀ ਮਿਆਦ ਪੁੱਗੀ" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "ਇਹ ਕੁੰਜੀ ਬੇ-ਭਰੋਸੇਯੋਗ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "ਇਹ ਕੁੰਝੀ ਹਲਕੀ ਭਰੋਸੇਯੋਗ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "ਇਹ ਕੁੰਜੀ ਪੂਰੀ ਤਰ੍ਹਾਂ ਭਰੋਸੇਯੋਗ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "ਇਹ ਕੁੰਜੀ ਬੇਅੰਤ ਭਰੋਸੇਯੋਗ ਹੈ" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ਕੁੰਜੀ ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "ਐਲੋਗਰਿਥਮ" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "ਬਣਾਈ" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "ਮਿਆਦ" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "ਸਮੱਰਥਾ" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "ਓਨਰ ਟਰਸਟ" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "ਨਾਂ" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "ਟਿੱਪਣੀ" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "ਯੂਜ਼ਰ ਗੁਣ" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "ਆਕਾਰ" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "ਬਾਈਨਰੀ ਦਸਤਾਵੇ ਦੇ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "ਕਨੋਨੀਕਲ ਟੈਕਸਟ ਡੌਕੂਮੈਂਟ ਦੇ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "ਇੱਕਲੇ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "ਕੁੰਜੀ ਲਈ ਆਮ ਸਰਟੀਫਿਕੇਟ" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "ਕੁੰਜੀ ਦਾ ਪਰਸੋਨਾ ਸਰਟੀਫਿਕੇਟ" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "ਕੁੰਜੀ ਦਾ ਆਮ ਸਰਟੀਫਿਕੇਟ" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "ਕੁੰਜੀ ਦਾ ਠੀਕ ਸਰਟੀਫਿਕੇਟ" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "ਸਬ-ਕੁੰਜੀ ਬਾਈਡਿੰਗ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "ਪ੍ਰਾਇਮਰੀ ਕੁੰਜੀ ਬਾਈਡਿੰਗ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "ਕੁੰਜੀ ਉੱਤੇ ਸਿੱਧੇ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "ਕੁੰਜੀ ਮਨਸੂਖ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "ਸਬ-ਕੁੰਜੀ ਮਨਸੂਖ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "ਸਰਟੀਫਿਕੇਟ ਮਨਸੂਖ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "ਟਾਈਮ-ਸਟੈਂਪ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "ਸੁਤੰਤਰ-ਧਿਰ ਪੁਸ਼ਟੀ ਦਸਤਖਤ" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "ਕਲਾਸ" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "ਕੇਵਲ ਲੋਕਲ" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "ਐਕਸਪੋਰਟਯੋਗ" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "ਮਨਸੂਖ ਕੁੰਜੀ" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "ਫਿੰਗਰ-ਪਰਿੰਟ" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "ਪਬਲਿਕ ਸਬ-ਕੁੰਜੀ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "ਗੁਪਤ ਕੁੰਜੀ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "ਗੁਪਤ ਸਬ-ਕੁੰਜੀ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "...ਸ਼ੁਰੂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "…ਇੰਪੋਰਟ ਕਾਰਵਾਈ ਜਾਰੀ ਹੈ" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "ਇੰਪੋਰਟ ਕੀਤੀ: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "ਇੰਪੋਰਟ: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ, ਕਿਉਂਕਿ ਕੋਈ ਵੀ ਅਨੁਕੂਲ ਇੰਪੋਰਟ ਨਹੀਂ ਹਨ" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਕੋਈ ਡਾਟਾ ਨਹੀਂ" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "ਕੁੰਜੀ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "ਪ੍ਰਾਈਵੇਟ RSA ਕੁੰਜੀ" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "ਪ੍ਰਾਈਵੇਟ DSA ਕੁੰਜੀ" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "ਪ੍ਰਾਈਵੇਟ ਇੱਲਪਟਿਕ ਕਰਵ ਕੁੰਜੀ" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "ਪਬਲਿਕ DSA ਕੁੰਜੀ" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "ਪਬਲਿਕ ਇੱਲਪਟਿਕ ਕਰਵ ਕੁੰਜੀ" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +#| msgid "%d bit" +#| msgid_plural "%d bits" +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u ਬਿੱਟ" +msgstr[1] "%u ਬਿੱਟ" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "ਤਾਕਤ" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "ਫਿੰਗਰ-ਪਰਿੰਟ" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +#| msgid "Cancel" +msgid "_Cancel" +msgstr "ਰੱਦ ਕਰੋ(_C)" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "ਠੀਕ ਹੈ(_O)" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "ਆਪਣੇ-ਆਪ ਚੁਣੋ" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "ਯੂਜ਼ਰ ਨੇ ਓਪਰੇਸ਼ਨ ਰੱਦ ਕੀਤਾ" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "ਇੰਪੋਰਟ ਕਰਨ ਲਈ, ਪਾਸਵਰਡ ਦਿਉ ਜੀ।" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "ਪਾਸਵਰਡ:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "ਟੋਕਨ:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "ਅਣ-ਲਾਕ" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "ਲੇਬਲ:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "ਇੰਪੋਰਟ ਸੈਟਿੰਗ" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "ਪੁਸ਼ਟੀ:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "ਪਾਸਵਰਡ ਮਿਲਦਾ ਨਹੀਂ ਹੈ।" + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "ਪਾਸਵਰਡ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "ਅਸੈਸ ਪਰਾਉਂਟ" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਭੇਦ ਖੋਲ੍ਹਣ ਲਈ ਅਣ-ਲਾਕ ਕਰੋ" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "ਇਸ ਨਾਂ ਨਾਲ ਫਾਇਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਨਵੀਂ ਫਾਇਲ ਨਾਲ ਬਦਲਣਾ ਚਾਹੁੰਦੇ ਹੋ?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "ਬਦਲੋ(_R)" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "ਕਾਰਵਾਈ ਰੱਦ ਕੀਤੀ ਗਈ ਹੈ।" + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "ਸਰਟੀਫਿਕੇਟ ਐਕਸਪਰੋਟ" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "ਸੰਭਾਲੋ(_S)" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "ਸਰਟੀਫਿਕੇਟ ਫਾਇਲਾਂ" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM ਫਾਇਲਾਂ" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "ਜਦੋਂ ਮੈਂ ਲਾਗਇਨ ਕਰਾਂ ਤਾਂ ਇਹ ਕੀਰਿੰਗ ਆਟੋਮੈਟਿਕ ਹੀ ਅਣ-ਲਾਕ ਕਰੋ।" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "ਜਦੋਂ ਮੈਂ ਲਾਗਆਉਟ ਕਰਾਂ ਤਾਂ ਇਹ ਕੀਰਿੰਗ ਲਾਕ ਕਰੋ" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "ਇਸ ਦੇ ਬਾਅਦ ਇਹ ਕੀਰਿੰਗ ਲਾਕ ਕਰੋ" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "ਜੇ ਵੇਹਲਾ ਹੋਵੇ ਤਾਂ ਇਹ ਕੀਰਿੰਗ ਲਾਗ ਕਰੋ" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "ਮਿੰਟ" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "ਅਣ-ਲਾਕ: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "ਪਾਸਵਰਡ" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "'%s' ਦੀ ਸਮੱਗਰੀ ਲਾਕ ਕੀਤੀ ਹੈ। ਸਮੱਗਰੀ ਵੇਖਣ ਲਈ, ਠੀਕ ਪਾਸਵਰਡ ਦਿਉ ਜੀ।" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "ਸਮੱਗਰੀ ਲਾਕ ਕੀਤੀ ਹੋਈ ਹੈ। ਸਮੱਗਰੀ ਵੇਖਣ ਲਈ, ਠੀਕ ਪਾਸਵਰਡ ਦਿਉ ਜੀ।" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR ਸਰਟੀਫਿਕੇਟ ਅਤੇ ਕੁੰਜੀ ਦਰਸ਼ਕ" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਵਰਜਨ ਵੇਖੋ" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[file...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- ਸਰਟੀਫਿਕੇਟ ਅਤੇ ਕੁੰਜੀ ਫਾਇਲਾਂ ਵੇਖੋ" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "ਸਰਟੀਫਿਕੇਟ ਦਰਸ਼ਕ" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "ਪਾਸਵਰਡ ਗਲਤ ਹੈ" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "ਇੰਪੋਰਟ ਕੀਤੇ" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "ਇੰਪੋਰਟ ਫੇਲ੍ਹ" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "ਇੰਪੋਰਟ" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "ਬੰਦ ਕਰੋ(_C)" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "ਗਲਤ PKCS#11 ਮੋਡੀਊਲ: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "PKCS#11 ਮੋਡੀਊਲ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: %s" + +#~ msgid "Label" +#~ msgstr "ਲੇਬਲ" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "ਅਣ-ਲਾਕ" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..4f69380 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,1132 @@ +# Polish translation for gcr. +# Copyright © 2003-2018 the gcr authors. +# This file is distributed under the same license as the gcr package. +# Artur Flinta , 2003-2006. +# Stanisław Małolepszy , 2006. +# Tomasz Dominikowski , 2007-2009. +# Piotr Drąg , 2010-2018. +# Aviary.pl , 2006-2018. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-02 18:15+0100\n" +"PO-Revision-Date: 2018-03-02 18:20+0100\n" +"Last-Translator: Piotr Drąg \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Składnik domeny" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Identyfikator użytkownika" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Adres e-mail" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data urodzenia" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Miejsce urodzenia" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Płeć" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Obywatelstwo" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Kraj zamieszkania" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nazwa powszechna" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Nazwisko" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Numer seryjny" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Kraj" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Region" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Stan" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Ulica" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizacja" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Jednostka organizacyjna" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Tytuł" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Numer telefonu" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Imię" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inicjały" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Przydomek pokolenia" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Kwalifikator DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 z RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 z RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 z RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 z DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Krzywa eliptyczna" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 z ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 z ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 z ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 z ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 z ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Uwierzytelnienie serwera" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Uwierzytelnienie klienta" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Podpisywanie kodu" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Ochrona poczty e-mail" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Odstępy czasowe" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Błąd podczas wczytywania modułu PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Nie można zainicjować modułu PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Nie można zainicjować zarejestrowanych modułów PKCS#11: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Adres URI ma nieprawidłową kodowanie." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Adres URI nie ma schematu „pkcs11”." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Adres URI ma błędną składnię." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Adres URI ma błędny numer wersji." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Potok został zamknięty" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nazwa" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Wydane przez" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Wygasa" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certyfikat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Inna nazwa" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Adres XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "Serwer DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Adres X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nazwa katalogu" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nazwa partii EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "Adres URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Adres IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Zarejestrowany identyfikator" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nieobsługiwany typ klucza dla żądania certyfikatu" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Klucz nie może zostać użyty do podpisania żądania" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Baza kluczy GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Baza kluczy GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Klucz PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Identyfikator klucza" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Proces gnupg został zakończony z kodem: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Proces gnupg został zakończony za pomocą sygnału: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Anulowano działanie" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Klucz prywatny" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Klucz publiczny" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Żądanie certyfikatu" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Nierozpoznane lub nieobsługiwane dane." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Nie można przetworzyć nieprawidłowych lub uszkodzonych danych." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Dane są zablokowane" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Kontynuuj" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Anuluj" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Proszę podać hasło OpenSSH" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Nierozpoznane lub niedostępne atrybuty dla klucza" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Nie można zbudować klucza publicznego" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Trwa już inne zapytanie" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Nie można odnaleźć położenie do przechowywania przypiętego certyfikatu" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Podstawowe ograniczenia" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Ośrodek certyfikacji" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Tak" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nie" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maksymalna długość ścieżki" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Bez ograniczenia" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Rozszerzone zastosowanie klucza" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Dozwolone zastosowania" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identyfikator klucza tematu" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identyfikator klucza" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Podpis cyfrowy" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Szyfrowanie klucza" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Szyfrowanie danych" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Umowa klucza" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Podpis certyfikatu" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Podpis listy unieważnień" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Zastosowanie klucza" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Zastosowania" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternatywne nazwy tematu" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Rozszerzenie" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identyfikator" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Wartość" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Nie można wyeksportować certyfikatu." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Tożsamość" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Sprawdzone przez" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Wygasa" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nazwa podmiotu" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nazwa wydawcy" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Wydany certyfikat" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Wersja" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Nieważny przed" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Nieważny po" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Odciski certyfikatu" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informacje o kluczu publicznym" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Podpis" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Wyeksportuj certyfikat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algorytm klucza" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametry klucza" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Rozmiar klucza" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Odcisk klucza SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algorytm podpisu" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametry podpisu" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Krytyczne" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Żądanie certyfikatu" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atrybut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Typ" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Wyzwanie" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Szczegóły" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Nie można wyświetlić „%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Nie można wyświetlić pliku" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Przyczyna" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Nie można wyświetlić pliku tego typu." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "ElGamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Zaszyfruj" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Podpisz" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certyfikuj" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Uwierzytelnij" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Wyłączona" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Nieznany" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Nieprawidłowy" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Wyłączone" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Unieważniony" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Wygasły" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Nieokreślone zaufanie" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Niezaufany" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Częściowo zaufany" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "W pełni zaufany" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Bezwzględnie zaufany" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informacje w tym kluczu nie zostały jeszcze sprawdzone" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Ten klucz jest nieprawidłowy" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Ten klucz został wyłączony" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Ten klucz został unieważniony" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Ten klucz wygasł" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Ten klucz jest niezaufany" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Ten klucz jest częściowo zaufany" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Ten klucz jest w pełni zaufany" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Ten klucz jest bezwzględnie zaufany" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Identyfikator klucza" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algorytm" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Utworzono" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Wygasa" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Możliwości" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Zaufanie właściciela" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nazwa" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Komentarz" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atrybut użytkownika" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Rozmiar" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Podpis dokumentu binarnego" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Podpis wzorcowego dokumentu tekstowego" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Oddzielny podpis" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Ogólna certyfikacja klucza" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Osobista certyfikacja klucza" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Zwykła certyfikacja klucza" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Pozytywna certyfikacja klucza" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Podpis dowiązania podklucza" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Podpis dowiązania głównego klucza" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Podpis bezpośrednio na kluczu" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Podpis unieważnienia klucza" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Podpis unieważnienia podklucza" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Podpis unieważnienia certyfikatu" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Podpis daty" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Podpis potwierdzenia firmy trzeciej" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klasa" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Tylko lokalne" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Można eksportować" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Klucz unieważnienia" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Odcisk" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Podklucz publiczny" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Tajny klucz" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Tajny podklucz" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicjowanie…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Trwa importowanie…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Zaimportowano do: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importowanie do: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Nie można zaimportować, ponieważ brak zgodnych programów importujących" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Brak danych do zaimportowania" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Klucz" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Klucz prywatny RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Klucz prywatny DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Prywatny klucz krzywej eliptycznej" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Klucz publiczny DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Publiczny klucz krzywej eliptycznej" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bity" +msgstr[2] "%u bitów" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Siła" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Odciski" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Anuluj" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Wybór automatyczny" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Użytkownik anulował działanie" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Proszę podać hasło, aby zaimportować." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Hasło:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Odblokuj" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etykieta:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Ustawienia importowania" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Potwierdzenie:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Hasła się nie zgadzają." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Hasło nie może być puste" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Zapytanie o hasło" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Odblokowanie dostępu do haseł" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Plik o tej nazwie już istnieje." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Zastąpić go nowym plikiem?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Zastąp" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Anulowano działanie." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Eksport certyfikatu" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Zapisz" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Pliki certyfikatu" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Pliki PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Automatyczne odblokowanie tej bazy kluczy po zalogowaniu" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Zablokowanie tej bazy kluczy po wylogowaniu" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Zablokowanie tej bazy kluczy po" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Zablokowanie tej bazy kluczy w razie bezczynności przez" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "min" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Odblokowanie: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Hasło" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Treść pliku „%s” jest zablokowana. Aby ją wyświetlić, należy podać poprawne " +"hasło." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Treść jest zablokowana. Aby ją wyświetlić, należy podać poprawne hasło." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Przeglądarka certyfikatów i kluczy GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Wyświetla wersję programu" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[plik…]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "— wyświetla pliki certyfikatów i kluczy" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Przeglądarka certyfikatów" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Niepoprawne hasło" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Zaimportowano" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Zaimportowanie się nie powiodło" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Zaimportuj" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "Za_mknij" diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 0000000..eb7c82a --- /dev/null +++ b/po/pt.po @@ -0,0 +1,1140 @@ +# gcr's Portuguese translation. +# Copyright © 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 gcr +# This file is distributed under the same license as the gcr package. +# Duarte Loreto , 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Tiago S. , 2014. +# Pedro Albuquerque , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: 3.12\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2015-11-03 06:33+0000\n" +"PO-Revision-Date: 2015-06-25 08:46+0100\n" +"Last-Translator: Pedro Albuquerque \n" +"Language-Team: Português \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 2.91.6\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Componente de domínio" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID de utilizador" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Endereço de email" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data de nascimento" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Naturalidade" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sexo" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Nacionalidade" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "País de residência" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nome comum" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Apelido" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Número de série" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localidade" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Estado" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Rua" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organização" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unidade organizacional" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Título" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Número de telefone" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nome próprio" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniciais" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Qualificador de geração" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Qualificador DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudónimo" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 com RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 com RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 com RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 com DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Curva elíptica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 com ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA1 com ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA1 com ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA1 com ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA1 com ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autenticação no servidor" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autenticação no cliente" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Assinatura de código" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Proteção de email" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Marcar data e hora" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Erro ao ler o módulo PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Impossível inicializar o módulo PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Impossível inicializar os módulos PKCS#11 registados: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "O URI tem uma codificação inválida." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "O URI não tem o esquema \"pkcs11\"." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "O URI tem uma sintaxe inválida." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "O URI tem um número de versão inválido." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "O fluxo foi fechado" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nome" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emitido por" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Expira em" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificado" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Outro nome" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Endereço XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "Servidor DNS" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Email" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Endereço X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nome da pasta" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nome da parte EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Endereço IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID registado" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipo de chave não suportado para pedido de certificado" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "A chave não pode ser utilizada para assinar o pedido" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Chaveiro GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Chaveiro GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Chave PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID de chave" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Processo gnupg terminou com o código: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Processo gnupg foi terminado com o sinal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "A operação foi cancelada" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Chave privada" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Chave pública" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Pedido de certificado" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Dados desconhecidos ou não suportados." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Impossível processar dados inválidos ou corrompidos." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Os dados estão trancados" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continuar" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Cancelar" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atributos desconhecidos ou indisponíveis para chave" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "Impossível construir chave pública" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Já está em curso outro pedido de dados" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" +"Impossível encontrar uma localização onde armazenar o certificado marcado" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Restrições básicas" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoridade de certificação" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Sim" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Não" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Comprimento máximo do caminho" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Ilimitado" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utilização estendida da chave" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Propósitos permitidos" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificador da chave de sujeito" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificador da chave" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Assinatura digital" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Encriptação da chave" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Encriptação dos dados" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acordo da chave" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Assinatura do certificado" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Assinatura da lista de revogação" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Utilização da chave" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Utilizações" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Nomes alternativos do sujeito" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Extensão" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificador" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valor" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "Impossível exportar o certificado." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identidade" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificado por" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Expira a" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nome do assunto" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nome do emissor" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificado emitido" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versão" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Inválido antes de" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Inválido após" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Impressões digitais do certificado" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informação de chave pública" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Assinatura" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportar certificado…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algorítmo da chave" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parâmetros da chave" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Tamanho da chave" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Impressão digital SHA1 da chave" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algorítmo de assinatura" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parâmetros da assinatura" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Crítico" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Pedido de certificado" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atributo" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipo" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Desafio" + +#: ../ui/gcr-display-view.c:316 +msgid "_Details" +msgstr "_Detalhes" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "Impossível mostrar \"%s\"" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Impossível mostrar o ficheiro" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Motivo" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Impossível mostrar um ficheiro deste tipo." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Encriptar" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Assinar" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certificar" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autenticar" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Desativado" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Desconhecido" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Inválido" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Desativado" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revogado" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Expirado" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Confiança indefinida" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Não é de confiança" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Marginalmente de confiança" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "De confiança" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Totalmente de confiança" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "A informação nesta chave ainda não foi verificada" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Esta chave é inválida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Esta chave foi desativada" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Esta chave foi revogada" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Esta chave expirou" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Esta chave não é de confiança" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Esta chave não é marginalmente de confiança" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Esta chave é de confiança" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Esta chave é totalmente de confiança" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID de chave" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algorítmo" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Criada" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Expira" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Capacidades" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Confiança no dono" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nome" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comentário" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atributo de utilizador" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Tamanho" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Assinatura de um documento binário" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Assinatura de um documento canónico de texto" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Assinatura independente" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificação genérica de chave" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificação pessoal de chave" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificação casual de chave" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificação positiva de chave" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Assinatura de ligação de subchave" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Assinatura de ligação de chave principal" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Assinatura diretamente na chave" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Assinatura de revogação de chave" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Assinatura de revogação de subchave" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Assinatura de revogação de certificado" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Assinatura de data e hora" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Assinatura de confirmação de terceiros" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classe" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Só local" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportável" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Chave de revogação" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Impressão digital" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Subchave pública" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Chave secreta" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Subchave secreta" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "A inicializar…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importação em curso…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importado para: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importar para: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Impossível importar porque não existem importadores compatíveis" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nenhuns dados a importar" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Chave" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Chave RSA privada" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Chave DSA privada" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Chave privada da curva elíptica" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Chave DSA pública" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Chave pública da curva elíptica" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Força" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Impressões digitais" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Cancelar" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Aceitar" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Selecionada automaticamente" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "O utilizador cancelou a operação" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "De forma a importar, por favor, insira a senha." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Senha:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Bloco:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Destrancar" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Rótulo:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Definições de importação" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirmar:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Senhas não coincidem." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Senha não pode ser vazia" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Pedido de acesso" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Destrancar acesso a senhas e outros segredos" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Já existe um ficheiro com este nome." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Deseja substituí-lo por um novo ficheiro?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Substituir" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "A operação foi cancelada." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exportar o certificado" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Gravar" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Ficheiros do certificado" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Ficheiros PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" +"Destrancar automaticamente este chaveiro sempre que existir uma sessão minha" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Trancar este chaveiro ao terminar a sessão" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Trancar este chaveiro após" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Trancar este chaveiro se inativo por" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutos" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Destrancar: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Senha" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"O conteúdo de \"%s\" está trancado. Para poder ver o conteúdo, insira a " +"senha correta." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"O conteúdo está trancado. Para poder ver o conteúdo, insira a senha correta." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Certificado GCR e visualizador de chaves" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostrar a versão da aplicação" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[ficheiro...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- ver os ficheiros de certificados e chaves" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visualizador de certificado" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "A senha está incorreta" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importado" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Falha ao importar" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importar" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Fechar" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Módulo PKCS#11 inválido: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Incapaz de configurar o módulo PKCS#11: %s" + +#~ msgid "Label" +#~ msgstr "Etiqueta" + +#~ msgid "Unlock" +#~ msgstr "Destrancar" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..e4ef996 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,1166 @@ +# Brazilian Portuguese translation of GNOME Keyring. +# Copyright (C) 2004-2018 the GNOME Keyring authors. +# This file is distributed under the same license as the gnome-keyring package. +# Guilherme de S. Pastore , 2004-2005. +# Leonardo Ferreira Fontenelle , 2006, 2008, 2009. +# Vladimir Melo , 2007. +# Hugo Doria , 2007-2008. +# Daniel S. Koda , 2009, 2010. +# Michel Recondo , 2009. +# Fabrício Godoy , 2009. +# André Gondim , 2009. +# Felipe Vieira Borges , 2010. +# Rodrigo Padula de Oliveira , 2011. +# Gabriel Speckhahn , 2011. +# Enrico Nicoletto , 2008, 2013, 2014. +# Rafael Fontenelle , 2012-2014, 2017-2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-02 12:44-0200\n" +"Last-Translator: Rafael Fontenelle \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Virtaal 1.0.0-beta1\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Componente do domínio" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID do usuário" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Endereço de e-mail" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Data de nascimento" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Local de nascimento" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Sexo" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "País de origem" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "País de residência" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Nome completo" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Sobrenome" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Número de série" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "País" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Localidade" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Estado" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Rua" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organização" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Unidade organizacional" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Título" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Número de telefone" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Nome" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniciais" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Qualificador de geração" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Qualificador DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudônimo" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 com RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 com RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 com RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 com DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Curva elíptica" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 com ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 com ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 com ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 com ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 com ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Autenticação de servidor" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Autenticação de cliente" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Assinatura de código" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Proteção de e-mails" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Carimbo de data/hora" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Erro ao carregar o módulo PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Não foi possível inicializar o módulo PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Não foi possível inicializar os módulos PKCS#11 registrados: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "A codificação do URI é inválida." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "O URI não possui o esquema “pkcs11”." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "A sintaxe do URI é inválida." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "O número de versão do URI é inválido." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "A sessão foi fechada" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Nome" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Emitido por" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Válido até" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certificado" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Outro nome" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "End XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Endereço X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Nome do diretório" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Nome da parte EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Endereço IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID registrado" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Tipo de chave não é suportado para requisição de certificado" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "A chave não pode ser usada para assinar a requisição" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Chaveiro GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Chaveiro GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Chave PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID da chave" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "O processo do Gnupg saiu com o código %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "O processo do Gnupg foi finalizado com o sinal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "A operação foi cancelada" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Chave privada" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Chave pública" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Requisição de certificado" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Dados não reconhecidos ou sem suporte." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Não foi possível analisar dados inválidos ou corrompidos." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Os dados estão bloqueados" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Continuar" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Cancelar" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Insira sua senha de OpenSSH" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Atributos não reconhecidos ou não disponíveis para chave" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Não é possível criar chave pública" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Outro prompt já está em progresso" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "" +"Não foi possível encontrar um lugar para armazenar o certificado marcado" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Restrições básicas" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autoridade do certificado" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Sim" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Não" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Comp máx do caminho" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Ilimitado" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Usos estendidos da chave" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Fins permitidos" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identificador da chave do sujeito" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identificador da chave" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Assinatura digital" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Codificação da chave" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Codificação de dados" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Acordo de chaves" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Assinatura do certificado" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Assinatura da lista de revogações" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Uso da chave" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Usos" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Nomes alternativos do portador" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Ramal" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identificador" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Valor" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Não foi possível exportar o certificado." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identidade" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verificado por" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Expira" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Nome do portador" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Nome do emissor" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Certificado emitido" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Versão" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Não é válido antes de" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Não é válido após" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Impressões digitais do certificado" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informações da chave pública" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Assinatura" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportar certificado…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritmo da chave" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parâmetros da chave" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Tamanho da chave" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Impressão digital SHA1 da chave" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritmo da assinatura" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parâmetros da assinatura" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Crítico" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Requisição de certificado" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atributo" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tipo" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Desafio" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detalhes" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Não foi possível exibir “%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Não foi possível exibir o arquivo" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Motivo" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Não é possível exibir um arquivo desse tipo." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Criptografia" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Assinar" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certificar" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autenticar" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Desabilitada" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Desconhecido" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Inválido" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Desabilitado" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Revogado" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Expirado" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Confiança não definida" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Não confiada" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Superficialmente confiada" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Completamente confiado" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Definitivamente confiada" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "A informação nesta chave não foi verificada ainda" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Esta chave é inválida" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Esta chave foi desabilitada" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Esta chave já foi revogada" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Esta chave expirou" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Esta chave não é confiada" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Esta chave é superficialmente confiada" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Esta chave é completamente confiada" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Esta chave é definitivamente confiada" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID da chave" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmo" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Criada" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Expira" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Capacidades" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Detentor da confiança" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Nome" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Comentário" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atributo do usuário" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Tamanho" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Assinatura de um documento binário" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Assinatura de um documento texto canônico" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Assinatura autônoma" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Certificação genérica de chave" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Certificação pessoal da chave" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Certificação casual da chave" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Certificação positiva da chave" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Assinatura de vínculo com sub-chave" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Assinatura de vinculação da chave primária" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Assinatura direta na chave" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Assinatura de revogação de chave" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Assinatura de revogação de sub-chave" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Assinatura do revogação de certificação" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Assinatura de timestamp" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Assinatura de confirmação de terceiro" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Classe" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Localidade somente" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportável" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Chave de revogação" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Impressão digital" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Sub-chave pública" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Chave secreta" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Sub-chave secreta" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Iniciando…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Importação em progresso…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importado em: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importar em: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Não foi possível importar, pois não há importadores compatíveis" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nenhum dado para importar" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Chave" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Chave privada RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Chave privada DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Chave privada de curva elíptica" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Chave pública DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Chave pública de curva elíptica" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bits" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Força" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Impressões digitais" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Cancelar" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Escolhido automaticamente" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "O usuário cancelou a operação" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Para importar, por favor digite a senha." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Senha:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Desbloquear" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Rótulo:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Configurações de importação" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Confirmar:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Senhas não conferem." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Senha não pode estar vazia" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Prompt de acesso" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Destravar acesso a senhas e outros segredos" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Já existe um arquivo com este nome." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Deseja substituí-lo por um novo arquivo?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "Substitui_r" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "A operação foi cancelada." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exportar certificado" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Salvar" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Arquivos do certificado" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Arquivos PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Desbloquear este chaveiro automaticamente quando eu iniciar a sessão" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Bloquear este chaveiro quando eu encerrar minha sessão" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bloquear este chaveiro após" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bloquear este chaveiro se ocioso por" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minutos" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Desbloquear: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Senha" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"O conteúdo de “%s” está bloqueado. Para que o conteúdo possa ser " +"visualizado, digite a senha correta." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"O conteúdo está bloqueado. Para possibilitar a visualização do conteúdo, " +"digite a senha correta." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Visualizador de chaves e certificados GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Mostra a versão do aplicativo" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[arquivo…]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Exibe arquivos de certificado e chave" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Visualizador de certificados" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "A senha estava incorreta" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importado" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Falha ao importar" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importar" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Fechar" + +#~ msgctxt "Disabled" +#~ msgid "capability" +#~ msgstr "capacidade" + +#~ msgctxt "Disabled" +#~ msgid "ownertrust" +#~ msgstr "detentor da confiança" + +#~ msgid "Export Certificate..." +#~ msgstr "Exportar certificado..." + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Módulo PKCS#11 inválido: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Não foi possível configurar o módulo PKCS#11: %s" + +#~ msgid "Label" +#~ msgstr "Rótulo" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Desbloquear" diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000..7413fb9 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,1061 @@ +# translation of gnome-keyring.HEAD.ro.po to Română +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Mugurel Tudor , 2004. +# Mugurel Tudor , 2006. +# Adi Roiban https://launchpad.net/~adiroiban, 2008, 2009 +# Lucian Adrian Grijincu , 2010, 2011. +# Daniel Șerbănescu , 2010. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD.ro\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2011-03-14 13:06+0200\n" +"Last-Translator: Lucian Adrian Grijincu \n" +"Language-Team: Romanian Gnome Team \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2);;\n" +"X-Generator: Virtaal 0.6.1\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Component domeniu" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "ID utilizator" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "Adresă de email" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Data nașterii" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Locul nașterii" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Gen" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Naționalitate" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Țară de rezidență" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Nume comun" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Nume familie" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "Număr serial" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Țară" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Localitate" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Stat" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Stradă" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Organizație" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Departament organizație" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Titlu" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Număr de telefon" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Prenume" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Inițiale" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Caracteristică generare" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "Caracteristică DN" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonim" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 cu RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 cu RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 cu RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 cu DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +#, fuzzy +msgid "Server Authentication" +msgstr "Certificat server SSL" + +#: ../egg/egg-oid.c:108 +#, fuzzy +msgid "Client Authentication" +msgstr "Certificat client SSL" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, fuzzy, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "Nu s-a putut șterge fișierul: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Sesiunea este închisă" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +#, fuzzy +msgctxt "column" +msgid "Name" +msgstr "_Nume:" + +#: ../gcr/gcr-certificate.c:380 +#, fuzzy +msgctxt "column" +msgid "Issued By" +msgstr "Emis la" + +#. later +#: ../gcr/gcr-certificate.c:382 +#, fuzzy +msgctxt "column" +msgid "Expires" +msgstr "Expiră la" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Operația a fost anulată" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Deblocare certificat" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +#, fuzzy +msgid "Other Name" +msgstr "Nume emitent" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "Email" + +#: ../gcr/gcr-certificate-extensions.c:174 +#, fuzzy +msgid "DNS" +msgstr "DSA" + +#: ../gcr/gcr-certificate-extensions.c:182 +#, fuzzy +msgid "X400 Address" +msgstr "Adresă de email" + +#: ../gcr/gcr-certificate-extensions.c:189 +#, fuzzy +msgid "Directory Name" +msgstr "Nume subiect" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +#, fuzzy +msgid "IP Address" +msgstr "Adresă de email" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "Da" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "Nu" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +#, fuzzy +msgid "Subject Key Identifier" +msgstr "Identificator" + +#: ../gcr/gcr-certificate-renderer.c:174 +#, fuzzy +msgid "Key Identifier" +msgstr "Identificator" + +#: ../gcr/gcr-certificate-renderer.c:185 +#, fuzzy +msgid "Digital signature" +msgstr "Semnătură" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +#, fuzzy +msgid "Key agreement" +msgstr "Parametrii cheie" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Certificat" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +#, fuzzy +msgid "Subject Alternative Names" +msgstr "Nume subiect" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "Extensie" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "Identificator" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "Valoare" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "Critic" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "" +"Nu s-a putut găsi o locație în care să se stocheze certificatele fixate." + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "Identitate" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "Verificat de" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "Expiră la" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "Nume subiect" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "Nume emitent" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "Certificat emis" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "Versiune" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "Nu este valid înainte" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "Nu este valid după" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Amprente" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "Semnătură" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "Algoritm semnătură" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "Parametrii semnătură" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "Informații cheie publică" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "Algoritm cheie" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "Parametrii cheie" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "Dimensiune cheie" + +#: ../gcr/gcr-certificate-renderer.c:712 +#, fuzzy +msgid "Key SHA1 Fingerprint" +msgstr "Amprentă SHA1" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Cheie publică" + +#: ../gcr/gcr-display-view.c:319 +#, fuzzy +msgid "_Details" +msgstr "_Detalii:" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +#, fuzzy +msgid "Could not display file" +msgstr "Nu s-a putut șterge fișierul: %s" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Deblochează inelul de chei" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "Cheie PGP: %s" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +#, fuzzy +msgid "PGP Key" +msgstr "Cheie PGP: %s" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Operația a fost anulată" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Sign" +msgstr "Semnătură" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Certificat" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Certificat" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "Necunoscut" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +#, fuzzy +msgid "Expired" +msgstr "Expiră la" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Informațiile sunt sensibile și nu pot fi dezvăluite" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Sesiunea nu este validă" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "Modulul nu a fost inițializat" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Inelul de chei a fost deja deblocat." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Parola sau PIN-ul au expirat" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Cheia este de tip greșit" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "Algoritm" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "C_reează" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +#, fuzzy +msgid "Expiry" +msgstr "Expiră la" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +#, fuzzy +msgid "Name" +msgstr "_Nume:" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "Dimensiune" + +#: ../gcr/gcr-gnupg-renderer.c:509 +#, fuzzy +msgid "Signature of a binary document" +msgstr "Parametrii semnătură" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Standalone signature" +msgstr "Semnătură" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Deblocare certificat" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Signature directly on key" +msgstr "Parametrii semnătură" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "Localitate" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "Amprentă" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Cheie publică" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +#, fuzzy +msgid "Initializing..." +msgstr "Inițiale" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, fuzzy, c-format +msgid "Imported to: %s" +msgstr "Importă în:" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Importă în:" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "Nu se poate importa deoarece cheia este de tip greșit" + +#: ../gcr/gcr-import-button.c:165 +#, fuzzy +msgid "No data to import" +msgstr "Nici o locație disponibilă pentru importare" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "Cheie" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "Cheie privată RSA" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "Cheie privată DSA" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Cheie privată" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "Cheie publică DSA" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d bit" +msgstr[1] "%d biți" +msgstr[2] "%d de biți" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "Putere" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "Amprente" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "Date nerecunoscute sau nesuportate" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "Nu s-au putut analiza date nevalide sau nesuportate." + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "Datele sunt blocate" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "Deblochează automat la autentificare." + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Deblochează" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "Pentru a importa „%s”, trebuie deblocat" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "Parolă:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" +"Nu s-a putut găsi o locație în care să se stocheze certificatele fixate." + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "La autentificare deblochează automat acest inel de chei" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "Blochează acest inel de chei după" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "Blochează acest inel de chei după o lipsă de activitate de" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "Blochează acest inel de chei la ieșirea din sesiune" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minute" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Deblochează" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Deblochează" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "Parolă:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +#, fuzzy +msgid "GCR Certificate and Key Viewer" +msgstr "Mediu de stocare pentru certificate și chei" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Permiteți accesul aplicației la inelul de chei?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +#, fuzzy +msgid "- View certificate and key files" +msgstr "Mediu de stocare pentru certificate și chei" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Certificat" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Parola de deblocare nu a fost corectă" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Importă în:" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Operația a eșuat" + +#: ../gcr/gcr-viewer-window.c:103 +#, fuzzy +msgid "Import" +msgstr "Importă în:" + +#: ../gck/gck-uri.c:223 +#, fuzzy, c-format +msgid "The URI has invalid encoding." +msgstr "URI-ul are sintaxă nevalidă. Codificarea câmpului „%s” nu este validă." + +#: ../gck/gck-uri.c:227 +#, fuzzy +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI-ul nu are schema „pkcs11”." + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..92db1df --- /dev/null +++ b/po/ru.po @@ -0,0 +1,1139 @@ +# Copyright (C) 2004-2009, 2010 Free Software Foundation, Inc. +# +# Dmitry G. Mastrukov , 2004. +# Leonid Kanter , 2006. +# Nickolay V. Shmyrev , 2006. +# Yuri Kozlov , 2008. +# Lebedev Roman , 2008. +# der_FeniX , 2010. +# Yuri Kozlov , 2010, 2011. +# Stas Solovey , 2011. +# Yuri Myasoedov , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring trunk\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2014-07-05 04:58+0000\n" +"PO-Revision-Date: 2014-07-05 18:48+0400\n" +"Last-Translator: Yuri Myasoedov \n" +"Language-Team: русский \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.6.5\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Область имён" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Идентификатор пользователя" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Адрес эл. почты" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Дата рождения" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Место рождения" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Пол" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Гражданство" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Страна проживания" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Общее имя" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Фамилия" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Серийный номер" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Страна" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Местность" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Область" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Улица" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Организация" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Подразделение" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Название" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Номер телефона" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Имя" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Инициалы" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Отметка поколения" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Отметка различительного имени" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Псевдоним" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 с RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 с RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 с RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 с DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Эллиптическая кривая" + +#: ../egg/egg-oid.c:106 +#| msgid "SHA1 with DSA" +msgid "SHA1 with ECDSA" +msgstr "SHA1 с ECDSA" + +#: ../egg/egg-oid.c:107 +#| msgid "SHA1 with DSA" +msgid "SHA224 with ECDSA" +msgstr "SHA224 с ECDSA" + +#: ../egg/egg-oid.c:108 +#| msgid "SHA1 with DSA" +msgid "SHA256 with ECDSA" +msgstr "SHA256 с ECDSA" + +#: ../egg/egg-oid.c:109 +#| msgid "SHA1 with DSA" +msgid "SHA384 with ECDSA" +msgstr "SHA384 с ECDSA" + +#: ../egg/egg-oid.c:110 +#| msgid "SHA1 with DSA" +msgid "SHA512 with ECDSA" +msgstr "SHA512 с ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Аутентификация сервера" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Аутентификация клиента" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Подписывание кода" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Защита эл. почты" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Проставление отметки времени" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Ошибка при загрузке модуля PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Невозможно инициализировать модуль PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Невозможно инициализировать зарегистрированные модули PKCS#11: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Недопустимая кодировка URI." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "В URI отсутствует схема «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Недопустимый синтаксис URI." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Недопустимая версия URI." + +#: ../gcr/gcr-callback-output-stream.c:62 +#: ../gcr/gcr-callback-output-stream.c:79 +#, c-format +msgid "The stream was closed" +msgstr "Поток был закрыт" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Имя" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Выдан" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Истекает" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Сертификат" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Другое имя" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Электронная почта" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Адрес X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Название каталога" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Название части EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-адрес" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Зарегистрированный ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Неподдерживаемый тип ключа для запроса сертификата" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Ключ не может быть использован для подписи запроса" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Связка ключей GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Связка ключей GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Ключ PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Идентификатор ключа" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Процесс GnuPG завершился с кодом: %d" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Процесс GnuPG был прерван сигналом: %d" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2551 +#: ../gcr/gcr-parser.c:3157 ../gcr/gcr-system-prompt.c:924 +msgid "The operation was cancelled" +msgstr "Действие было отменено" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Секретный ключ" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Открытый ключ" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Запрос сертификата" + +#: ../gcr/gcr-parser.c:2554 +msgid "Unrecognized or unsupported data." +msgstr "Нераспознанные или неподдерживаемые данные." + +#: ../gcr/gcr-parser.c:2557 +msgid "Could not parse invalid or corrupted data." +msgstr "Не удалось разобрать неверные или повреждённые данные." + +#: ../gcr/gcr-parser.c:2560 +msgid "The data is locked" +msgstr "Данные заблокированы" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Продолжить" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Отменить" + +#: ../gcr/gcr-subject-public-key.c:407 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Нераспознанные или недоступные атрибуты для ключа" + +#: ../gcr/gcr-subject-public-key.c:493 ../gcr/gcr-subject-public-key.c:579 +msgid "Couldn't build public key" +msgstr "Не удалось создать открытый ключ" + +#: ../gcr/gcr-system-prompt.c:905 +msgid "Another prompt is already in progress" +msgstr "Приглашение ко вводу пароля уже запущено" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:366 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Не удалось найти место для хранения закреплённого сертификата" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Основные ограничения" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Удостоверяющий центр" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Да" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Нет" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Максимальная длина пути" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Неограниченный" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Расширенное использование ключа" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Допустимые цели" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Идентификатор ключа получателя" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Идентификатор ключа" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Цифровая подпись" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Шифрование ключа" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Данные шифрования" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Согласование ключа" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Подпись сертификата" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Аннулирование списка подписей" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Использование ключа" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Назначения" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Альтернативные имена получателя" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Расширение" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Идентификатор" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Значение" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "Не удалось экспортировать сертификат." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Подлинность" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Проверен" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Истекает" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Имя получателя" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Имя выдающего" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Выданный сертификат" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Версия" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Не действителен до" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Не действителен после" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Отпечатки сертификата" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Информация об открытом ключе" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Подпись" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Экспортировать сертификат…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Алгоритм ключа" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Параметры ключа" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Размер ключа" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Отпечаток SHA1 для ключа" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Алгоритм подписи" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Параметры подписи" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Критический" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Запрос сертификата" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Атрибут" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Тип" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:317 +msgid "_Details" +msgstr "_Подробности" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "Не удалось показать «%s»" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Не удалось показать файл" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Причина" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Не удалось показать файл этого типа." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Схема Эль-Гамаля" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Зашифровать" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Подписать" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Сертифицировать" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Аутентифицировать" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Отключено" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Неизвестно" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Неверный" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Отключено" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Отозванный" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Истёк" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Неопределённая надёжность" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Недоверенный" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Частично доверенный" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Полностью доверенный" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Исключительно доверенный" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Информация в этом ключе ещё не проверялась" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Этот ключ неверен" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Этот ключ отключён" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Этот ключ был отозван" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Срок действия этого ключа истёк" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Этому ключу нельзя доверять" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Этому ключу можно частично доверять" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Этому ключу можно полностью доверять" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Этому ключу можно безоговорочно доверять" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Идентификатор ключа" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Алгоритм" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Создан" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Истекает" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Возможности" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Доверенный владелец" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Имя" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Комментарий" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Атрибут пользователя" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Размер" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Подпись двоичного документа" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Подпись обычного текстового документа" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Изолированная подпись" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Общая сертификация ключа" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Персональная сертификация ключа" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Небрежная сертификация ключа" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Позитивная сертификация ключа" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Подпись связывания дополнительного ключа" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Подпись связывания основного ключа" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Подпись ключа" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Подпись аннулирования ключа" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Подпись аннулирования дополнительного ключа" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Подпись аннулирования сертификата" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Подпись метки времени" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Подтверждающая подпись третьих лиц" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Класс" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Только локальный" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Экспортируемый" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Аннулирование ключа" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Отпечаток" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Открытый подключ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Секретный ключ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Секретной подключ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Инициализация…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Выполняется импортирование…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Импортировано в: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Импортировать в: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Невозможно импортировать из-за отсутствия совместимых импортёров" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Нет данных для импортирования" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Ключ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Секретный ключ RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Секретный ключ DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Секретный ключ (эллиптическая криптография)" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Открытый ключ DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Открытый ключ (эллиптическая криптография)" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +#| msgid "%d bit" +#| msgid_plural "%d bits" +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u бит" +msgstr[1] "%u бита" +msgstr[2] "%u бит" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Надёжность" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Отпечатки" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:502 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Отменить" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:505 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Выбранный автоматически" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Пользователь отменил операцию" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Для импоритрования введите пароль." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:563 +msgid "Password:" +msgstr "Пароль:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Жетон:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Разблокирование" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Метка:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Параметры импортирования" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:580 +msgid "Confirm:" +msgstr "Подтверждение:" + +#: ../ui/gcr-prompt-dialog.c:648 +msgid "Passwords do not match." +msgstr "Пароли не совпадают." + +#: ../ui/gcr-prompt-dialog.c:655 +msgid "Password cannot be blank" +msgstr "Пароль не может быть пустым" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Получение доступа" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Открыть доступ к паролям и другим секретам" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Файл с таким именем уже существует." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Хотите заменить его новым файлом?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Заменить" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Действие было отменено." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Экспортировать сертификат" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Сохранить" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Файлы сертификата" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Файлы PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Автоматически разблокировать эту связку ключей после входа в систему" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Автоматически блокировать связку ключей после выхода из системы" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Блокировать данную связку ключей после" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Блокировать данную связку ключей, если простаивает в течении" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "мин" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Разблокировать: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Пароль" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Содержимое «%s» заблокировано. Чтобы просмотреть содержимое, введите пароль." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Содержимое заблокировано. Чтобы просмотреть содержимое, введите пароль." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Просмотрщик ключей и сертификатов GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Показать версию приложения" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[файл…]" + +#: ../ui/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "— показать файлы сертификата и ключа" + +#: ../ui/gcr-viewer-tool.c:118 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Просмотрщик сертификатов" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Пароль был неверен" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Импортирован" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Сбой импортирования" + +#: ../ui/gcr-viewer-window.c:107 +msgid "Import" +msgstr "Импортировать" + +#: ../ui/gcr-viewer-window.c:116 +msgid "_Close" +msgstr "_Закрыть" diff --git a/po/rw.po b/po/rw.po new file mode 100644 index 0000000..38a23e6 --- /dev/null +++ b/po/rw.po @@ -0,0 +1,1000 @@ +# translation of gnome-keyring to Kinyarwanda. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Steve Murphy , 2005 +# Steve performed initial rough translation from compendium built from translations provided by the following translators: +# Philibert Ndandali , 2005. +# Viateur MUGENZI , 2005. +# Noëlla Mupole , 2005. +# Carole Karema , 2005. +# JEAN BAPTISTE NGENDAHAYO , 2005. +# Augustin KIBERWA , 2005. +# Donatien NSENGIYUMVA , 2005.. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring 2.12\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2005-03-28 19:35-0700\n" +"Last-Translator: Steve Murphy \n" +"Language-Team: Kinyarwanda \n" +"Language: rw\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +msgid "GnuPG Keyring" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:126 +msgid "Password" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Porogaramu Kuri" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/si.po b/po/si.po new file mode 100644 index 0000000..5a6d2fe --- /dev/null +++ b/po/si.po @@ -0,0 +1,998 @@ +# translation of gnome-keyring.si.po to Sinhala +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Danishka Navin , 2007. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.si\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2007-05-29 15:53+0530\n" +"Last-Translator: Danishka Navin \n" +"Language-Team: Sinhala \n" +"Language: si\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Keyring අගුලු අරින්න" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "රහස්පදය: (__P)" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "Keyring අගුලු අරින්න" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "රහස්පදය: (__P)" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "යෙදුම් සඳහා keyring භාවිතය ඉඩ දෙන්නට?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..5e51b00 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,1231 @@ +# Slovak translation for gnome-keyring. +# Copyright (C) 2004, 2005, 2007, 2009, 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Marcel Telka , 2004, 2005. +# Peter Tuharsky , 2007. +# Mário Buči , 2009. +# Dušan Kazik , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-10-18 09:40+0000\n" +"PO-Revision-Date: 2017-01-19 22:07+0100\n" +"Last-Translator: Dušan Kazik \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" +"X-Generator: Poedit 1.8.11\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Komponent domény" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Idetifikátor používateľa" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Emailová adresa" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Dátum narodenia" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Miesto narodenia" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Pohlavie" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Štátna príslušnosť" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Krajina pobytu" + +# Toto je v niektorých prípadoch prekladané ako Názov domény - ja osobnem by som nevedel čo mám zadať do poľa Bežný názov +# PŠ: http://www.alvestrand.no/objectid/2.5.4.3.html - objekt môže byť aj osoba (väčšinou je to potom v tvare "Meno Priezvisko")... +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Bežný názov (CN)" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Priezvisko" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Sériové číslo" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Krajina" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Oblasť" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Štát" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Ulica" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizácia" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organizačná jednotka" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titul" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefónne číslo" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Krstné meno" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Iniciály" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Kvalifikátor generácie" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Kvalifikátor DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 s RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 s RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 s RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 s DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Eliptická krivka" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 s ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 s ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 s ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 s ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 s ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Overovanie totožnosti servera" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Overovanie totožnosti klienta" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Podpisovanie kódu" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Ochrana emailov" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Označovanie časovou značkou" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Chyba pri načítavaní modulu PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Nepodarilo sa inicializovať modul PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Nepodarilo sa inicializovať registrované moduly PKCS#11: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Identifikátor URI obsahuje neplatné kódovanie." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Identifikátor neobsahuje schému „pkcs11“." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Identifikátor URI obsahuje zlú syntax." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Identifikátor URI obsahuje nesprávne číslo verzie." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Tok údajov bol zatvorený" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Názov" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Vydal" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Vyprší" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certifikát" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Iný názov" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "Adresa XMPP" + +# DK: SRV = service record (SRV record) +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-mail" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Adresa X400" + +# MČ: tu som trochu mimo. Je to typu DNS, ale „dn“ evokuje LDAP. +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Názov adresára" + +# MČ: http://en.wikipedia.org/wiki/Electronic_data_interchange +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Názov poskytovateľa EDI Party" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Adresa IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrovaný ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nepodporovaný typ kľúča pre žiadosť o certifikát" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Kľúč sa nedá použiť na podpísanie požiadavky" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Zväzok kľúčov GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Zväzok kľúčov GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Kľúč PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID kľúča" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Proces Gnupg skončil s kódom: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Proces Gnupg bol prerušený signálom: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Operácia bola zrušená" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Súkromný kľúč" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Verejný kľúč" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Požiadavka na certifikát" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Nerozpoznané alebo nepodporované údaje." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Nepodarilo sa analyzovať neplatné alebo porušené údaje." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Údaj je uzamknutý" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Pokračovať" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Zrušiť" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Nerozpoznané alebo nedostupné atribúty pre kľúč" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Nepodarilo sa zostaviť verejný kľúč" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Už prebieha iná výzva" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Nepodarilo sa nájsť miesto na uloženie pripnutého certifikátu" + +# heading +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Základné obmedzenia" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Autorita certifikátu" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Áno" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nie" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maximálna dĺžka cesty" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Neobmedzená" + +# heading +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Rozšírené využitie kľúča" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Povolené účely" + +# heading +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identifikátor kľúča subjektu" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identifikátor kľúča" + +# usage_descriptions +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitálny podpis" + +# usage_descriptions +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Zašifrovanie kľúča" + +# usage_descriptions +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Zašifrovanie údajov" + +# usage_descriptions +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Prijatie kľúča" + +# usage_descriptions +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Podpis certifikátu" + +# usage_descriptions +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Podpis zoznamu odvolaní" + +# heading +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Využitie kľúča" + +# MČ: množné číslo? +# PM: aj ked hodnot moze byt viac myslím ze to takto moze zostat +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Využitie" + +# heading +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternatívne názvy subjektu" + +# heading +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Rozšírenie" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikátor" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Hodnota" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Nepodarilo sa exportovať certifikát." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identita" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Overil" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Vyprší" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Názov subjektu" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Názov vydavateľa" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Vydaný cerfikát" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Verzia" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Neplatný pred" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Neplatný po" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Odtlačky certifikátu" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Informácie o verejnom kľúči" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Podpis" + +# menu item +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportovať certifikát…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritmus kľúča" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametre kľúča" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Veľkosť kľúča" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Odtlačok kľúča SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritmus podpisu" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametre podpisu" + +# rozšírenie (áno/nie) +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritické" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Požiadavka na certifikát" + +# heading +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribút" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Typ" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Výzva" + +# expander label +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Podrobnosti" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Nepodarilo sa zobraziť „%s“" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Nepodarilo sa zobraziť súbor" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Príčina" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Nedá sa zobraziť súbor tohoto typu." + +# algoritmus +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +# Schopnosti +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Zašifrovať" + +# Schopnosti +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Podpísať" + +# Schopnosti +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certifikovať" + +# Schopnosti +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Overiť totožnosť" + +# Schopnosti +# DK: https://bugzilla.gnome.org/show_bug.cgi?id=707077 +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Zakázané" + +# PM: Sedí rod vo všetkých prípadoch? +# MČ: myslím, že nesedí, prvé je ku Capabilities, druhe ku OwnerTrust, ďalšie ku typu kľúča a posledné ku Algoritmu. +# Dôvera vlastníka +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Neznáme" + +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Neplatná" + +# Dôvera vlastníkovi +# DK: https://bugzilla.gnome.org/show_bug.cgi?id=707077 +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Zakázaná" + +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Odvolaná" + +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Vypršaná" + +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Nedefinovaná dôveryhodnosť" + +# MČ: doteraz bol rod ženský. Tu začína mužský. Prečo? +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nedôveryhodná" + +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Čiastočne dôveryhodná" + +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Plne dôveryhodná" + +# Dôvera vlastníkovi +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Výnimočne dôveryhodná" + +# message +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informácia v tomto kľúči ešte nebola overená" + +# message +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Tento kľúč je neplatný" + +# message +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Tento kľúč bol zakázaný" + +# message +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Tento kľúč bol odvolaný" + +# message +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Tento kľúč vypršal" + +# message +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Tento kľúč je nedôveryhodný" + +# message +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Tento kľúč je čiastočne dôveryhodný" + +# message +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Tento kľúč je plne dôveryhodný" + +# message +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Tento kľúč je výnimočne dôveryhodný" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID kľúča" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritmus" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Vytvorený" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Vyprší" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Schopnosti" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Dôvera vlastníkovi" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Meno" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Komentár" + +# heading +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atribút používateľa" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Veľkosť" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Podpis binárneho dokumentu" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Podpis kanonického textového dokumentu" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Samostatný podpis" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Všeobecná certifikácia kľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Osobná certifikácia kľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Príležitostná certifikácia kľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Pozitívna certifikácia kľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Podpis spojenia podkľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Podpis primárneho spojenia kľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Podpis priamo v kľúči" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Podpis pre odvolanie kľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Podpis pre odvolanie podkľúča" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Podpis pre odvolanie certifikácie" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Podpis časovej značky" + +# Trieda +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Podpis potvrdenia tretích strán" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Trieda" + +# Typ +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Iba lokálny" + +# Typ +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exportovateľný" + +# heading +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Kľúč pre odvolanie" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Odtlačok" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Verejný podkľúč" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Tajný kľúč" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Tajný podkľúč" + +# DK: https://bugzilla.gnome.org/show_bug.cgi?id=707078 +# spinner tooltip +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Inicializuje sa…" + +# DK: https://bugzilla.gnome.org/show_bug.cgi?id=707078 +# spinner tooltip +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Prebieha importovanie…" + +# spinner tooltip +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importované do: %s" + +# spinner tooltip +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importovať do: %s" + +# spinner tooltip +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" +"Nedá sa importovať, pretože nie sú dostupné žiadne kompatibilné nástroje na " +"importovanie" + +# spinner tooltip +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Žiadne údaje na importovanie" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Kľúč" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Súkromný kľúč RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Súkromný kľúč DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Kľúč súkromnej eliptickej krivky" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Verejný kľúč DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Kľúč verejnej eliptickej krivky" + +# Sila +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bitov" +msgstr[1] "%u bit" +msgstr[2] "%u bity" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Sila" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Odtlačky" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Zrušiť" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automaticky zvolený" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Používateľ zrušil operáciu" + +# GtkLabel label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Ak chcete vykonať importovanie, prosím, zadajte heslo." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Heslo:" + +# GtkLabel label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Token:" + +# GtkLabel label; button +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Odomknúť" + +# GtkLabel label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Označenie:" + +# GtkLabel label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importovať nastavenia" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Potvrdenie:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Heslá nie sú zhodné." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Heslo nemôže byť prázdne" + +# desktop entry name +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Výzva na prístup" + +# desktop entry comment +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Odomkne prístup k heslám a iným tajnostiam" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Súbor s týmto názvom už existuje." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Chcete ho nahradiť novým súborom?" + +# button +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Nahradiť" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operácia bola zrušená." + +# file chooser dialog title +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Export certifikátu" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Uložiť" + +# file filter +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Súbory certifikátu" + +# file filter +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Súbory PEM" + +# GtkRadioButton label +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Automaticky odomknúť tento zväzok kľúčov, keď sa prihlásim." + +# GtkRadioButton label +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Uzamknúť tento zväzok kľúčov, keď sa odhlásim." + +# GtkRadioButton label +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Uzamknúť tento zväzok kľúčov po" + +# GtkRadioButton label +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Uzamknúť tento zväzok kľúčov pri nečinnosti po" + +# PM: tu by sa hodil ten plural forms ale typujem že nam ho sem nebudú vedieť urobiť +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minútach" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Odomknúť: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Heslo" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Obsah „%s“ je uzamknutý. Ak chcete tento obsah zobraziť, zadajte správne " +"heslo." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Obsah je uzamknutý. Ak chcete tento obsah zobraziť, zadajte správne heslo." + +# PM: asi GCR - Prehliadač ... +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR - Prehliadač certifikátov a kľúčov" + +# cmd desc +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Zobrazí verziu aplikácie" + +# MČ: tu by trojbodka byť nemala, lebo sa to vypisuje do terminálu kde sú znaky rovnakej šírky. Tak nejako bola odpoveď v bugzille. +# DK: https://bugzilla.gnome.org/show_bug.cgi?id=707078 +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[súbor...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Zobrazí súbory certifikátov a kľúčov" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Prehliadač certifikátov" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Heslo bolo nesprávne" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importované" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importovanie zlyhalo" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importovať" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Zavrieť" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..4dcfb4c --- /dev/null +++ b/po/sl.po @@ -0,0 +1,1148 @@ +# Slovenian translations for gcr. +# Copyright (C) 2009 gnome-keyring COPYRIGHT HOLDER +# This file is distributed under the same license as the gcr package. +# +# Matic Žgur , 2006. +# Matej Urbančič , 2005–2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-05-05 14:00+0200\n" +"PO-Revision-Date: 2017-05-05 14:01+0200\n" +"Last-Translator: Matej Urbančič \n" +"Language-Team: Slovenian GNOME Translation Team \n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 2.0.1\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Enota domene" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Uporabniški ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Elektronski naslov" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Datum rojstva" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Kraj rojstva" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Spol" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Državljanstvo" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Država bivanja" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Splošno ime" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Priimek" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Zaporedna številka" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Država" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Krajevnost" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Okraj" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Ulica" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Ustanova" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organizacijska enota" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Naslov" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonska številka" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Rojstno ime" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Začetnici" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Red potomstva" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Določilo DN" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Psevdonim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 z RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 z RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 z RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 z DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Eliptična krivulja" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 z ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 z ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 z ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 z ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 z ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Overitev strežnika" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Overitve odjemalca" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Podpisovanje kode" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Zaščita elektronskega naslova" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Vstavljanje časovnega žiga" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Odkodirnika PKCS#11 ni mogoče naložiti: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Odkodirnika PKCS#11 ni mogoče začeti: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Vpisanih modulov PKCS#11 ni mogoče začeti: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Naslov URI je zapisan v neveljavnem kodnem zapisu." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Naslov URI je brez ustrezne sheme »pkcs11«." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Skladnja naslova URI je slaba." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Naslov URI vsebuje nepravilno vrednost različice." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Pretok je zaprt" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Ime" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Izdalno prek" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Preteče" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Potrdilo" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Drugo ime" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Elektronski naslov" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Naslov X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Ime mape" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Ime stranke EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "Naslov URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Naslov IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Vpisan ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nepodprta vrsta ključa za zahtevo datoteke potrdila" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Ključa ni mogoče uporabiti za podpis zahteve" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Zbirka ključev GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Zbirka ključev GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Ključ PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID ključa" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Opravilo Gnupg je končano z napako: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Opravilo Gnupg je nepričakovano končano s signalom: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Dejanje je preklicano." + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Osebni ključ" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Javni ključ" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Zahteva potrdila" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Neznani ali nepodprti podatki." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Ni mogoče razčleniti neveljavnih ali pokvarjenih podatkov." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Podatki so zaklenjeni" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Nadaljuj" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Prekliči" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Neprepoznani ali nerazpoložljivi atributi ključa" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Ni mogoče izgraditi javnega ključa" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Drug vnos je že v teku" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Ni mogoče najti mesta za shranjevanje uvoženih potrdil" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Splošne omejitve" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Pooblastitelj potrdila" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Da" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ne" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Največja dolžina poti" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Neomejeno" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Uporaba razširjenega ključa" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Dovoljena uporaba" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Javni ključ zadeve" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Določevalnik ključa" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitalni podpis" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Šifriranje ključa" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Šifriranje podatkov" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Dogovor o ključu" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Podpis potrdila" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Podpis seznama preklica" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Uporaba ključa potrdila" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Uporaba" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Duga imena predmeta" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Pripona" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Določilo" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Vrednost" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Ni mogoče izvoziti potrdila." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Istovetnost" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Overjeno preko" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Preteče" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Ime predmeta" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Ime izdajatelja" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Izdano potrdilo" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Različica" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Neveljaven pred" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Neveljaven po" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Prstni odtisi potrdila" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Podrobnosti javnega ključa" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Podpis" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Izvozi potrdilo ..." + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritem ključa" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Določila ključa" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Velikost ključa" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Prstni odtis SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritem podpisa" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Določila podpisa" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritično" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Zahteva potrdila" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Atribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Vrsta" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Izzovi" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Podrobnosti" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Ni mogoče prikazati »%s«" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Ni mogoče prikazati datoteke" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Vzrok" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Ni mogoče prikazati datoteke te vrste." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "ElGamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Šifriraj" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Podpiši" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Potrdi" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Overi" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Onemogočeno" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Neznano" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Neveljavno" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Onemogočeno" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Preklicano" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Pretečeno" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Nedoločeno zaupanje" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nevredni zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Pogojno vredni zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Vredni zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Popolnoma vredni zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Podrobnosti ključa še niso overjene" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Ključ ni veljaven" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Ključ je onemogočen" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Ključ je bil preklican" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Ključ je pretekel" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Ključ ni vreden zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Ta ključ je le pogojno vreden zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Ta ključ je vreden zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Ta ključ je vreden popolnega zaupanja" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID Ključa" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritem" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Ustvarjeno" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Poteče" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Zmožnosti" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Zaupanje lastniku" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Ime" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Opomba" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Atributi uporabnika" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Velikost" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Podpis dvojiškega dokumenta" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Podpis kanoničnega besedilnega dokumenta" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Samostojni podpis" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Splošno potrjevanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Osebno preverjanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Neobvezno preverjanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Pozitivno preverjanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Podpis vezave podključa" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Podpis vezave osnovnega ključa" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Podpis neposredno na ključu" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Podpis preklica ključa" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Podpis preklica podključa" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Podpis preklica potrdila" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Podpis časovnega žiga" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Podpis potrditve tretje strani" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Razred" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Samo krajevno" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Izvozljivo" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Preklicni ključ" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Prstni odtis" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Javni podključ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Skriti ključ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Skriti podključ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Začenjanje ..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Poteka uvažanje ..." + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Uvoženo v: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Uvozi v: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Uvoz ni mogoč, ker ni ustreznih uvoznikov" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Ni podatkov za uvoz" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Ključ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Osebni ključ RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Osebni ključ DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Zasebni ključ eliptične krožnice" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Javni ključ DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Javni ključ eliptične krožnice" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bitov" +msgstr[1] "%u bit" +msgstr[2] "%u bita" +msgstr[3] "%u biti" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Jakost" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Prstni odtisi" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Prekliči" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_V redu" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Samodejno izbrano" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Uporabnik je preklical opravilo." + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Za uvoz predmeta je treba vpisati geslo." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Geslo:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Žeton:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Odkleni" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Oznaka:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Nastavitve uvoza" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Potrditev:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Gesli se ne skladata." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Geslo ne more biti prazno" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Vnos za dostop" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Odklepanje dostopa do gesel in drugih skrivnih podatkov" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Datoteka s tem imenom že obstaja." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Ali jo želite zamenjati z novo datoteko?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Zamenjaj" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Dejanje je preklicano." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Izvozi potrdilo" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Shrani" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Datoteke potrdila" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Datoteke PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Ob prijavi samodejno odkleni zbirko ključev" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Samodejno zakleni zbirko ključev ob odjavi." + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Zakleni zbirko ključev po" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Zakleni zbirko ključev ob nedejavnosti" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minut" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Odkleni: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Geslo" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Vsebina »%s« je zaklenjena. Za ogled vsebine je treba vnesti pravilno geslo." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Vsebina je zaklenjena. Za ogled vsebine je treba vnesti pravilno geslo." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Potrdilo GCR in pregledovalnik datotek ključev" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Pokaži različico programa" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[datoteka ...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Pregeld potrdila in datotek ključev" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Pregledovalnik potrdil" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Geslo je napačno." + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Uvoženo" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Uvoz je spodletel" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Uvozi" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Zapri" + +#~ msgctxt "Disabled" +#~ msgid "capability" +#~ msgstr "Zmožnosti" + +#~ msgctxt "Disabled" +#~ msgid "ownertrust" +#~ msgstr "Zaupanje lastniku" + +#~ msgid "Export Certificate..." +#~ msgstr "Izvoz potrdila ..." + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Neveljavni odkodirnik PKCS#11: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Odkodirnika PKCS#11 ni mogoče nastaviti: %s" + +#~ msgid "Label" +#~ msgstr "Oznaka" diff --git a/po/sq.po b/po/sq.po new file mode 100644 index 0000000..c4936bf --- /dev/null +++ b/po/sq.po @@ -0,0 +1,1035 @@ +# Përkthimi i gnome-keyring në shqip. +# Copyright (C) 2004-2007, 2008 THE gnome-keyring'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-keyring package. +# +# Elian Myftiu , 2004-2007. +# Laurent Dhima , 2008. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2008-09-23 20:26+0200\n" +"Last-Translator: Laurent Dhima \n" +"Language-Team: albanian \n" +"Language: sq\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +#, fuzzy +msgid "Generation Qualifier" +msgstr "Operacioni dështoi" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, fuzzy, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "Modulët PKCS#11" + +#: ../gck/gck-module.c:369 +#, fuzzy, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "I pamundur eleminimi i file: %s" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, fuzzy, c-format +msgid "The stream was closed" +msgstr "Seanca është mbyllur" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "Çertifikata" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, fuzzy, c-format +msgid "The operation was cancelled." +msgstr "Operacioni u anullua" + +#: ../gcr/gcr-certificate-exporter.c:302 +#, fuzzy +msgid "Export certificate" +msgstr "Importo çertifikatën" + +#: ../gcr/gcr-certificate-exporter.c:314 +#, fuzzy +msgid "Certificate files" +msgstr "Çertifikata" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +#, fuzzy +msgid "Certificate Authority" +msgstr "Çertifikata" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +#, fuzzy +msgid "Certificate signature" +msgstr "Çertifikata" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +#, fuzzy +msgid "Couldn't export the certificate." +msgstr "Importo çertifikatën" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +#, fuzzy +msgid "Issued Certificate" +msgstr "Çertifikata" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +#, fuzzy +msgid "Certificate Fingerprints" +msgstr "Çertifikata" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +#, fuzzy +msgid "Public Key Info" +msgstr "Kyçi publik" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "Kyçi publik" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +#, fuzzy +msgid "Could not display file" +msgstr "I pamundur eleminimi i file: %s" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Zhblloko mbajtësin e çelsave" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "Operacioni u anullua" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +#, fuzzy +msgid "Certify" +msgstr "Çertifikata" + +#: ../gcr/gcr-gnupg-renderer.c:223 +#, fuzzy +msgid "Authenticate" +msgstr "Çertifikata" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +#, fuzzy +msgid "Unknown" +msgstr "Gabim i panjohur" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +#, fuzzy +msgid "The information in this key has not yet been verified" +msgstr "Informacioni është i ndjeshëm dhe nuk mund të zbulohet" + +#: ../gcr/gcr-gnupg-renderer.c:291 +#, fuzzy +msgid "This key is invalid" +msgstr "Seanca është e pavlefshme" + +#: ../gcr/gcr-gnupg-renderer.c:294 +#, fuzzy +msgid "This key has been disabled" +msgstr "Moduli nuk është nisur" + +#: ../gcr/gcr-gnupg-renderer.c:297 +#, fuzzy +msgid "This key has been revoked" +msgstr "Mbajtësi i çelsave është rregullisht i zhbllokuar." + +#: ../gcr/gcr-gnupg-renderer.c:300 +#, fuzzy +msgid "This key has expired" +msgstr "Fjalëkalimi ose PIN ka skaduar" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +#, fuzzy +msgid "This key is fully trusted" +msgstr "Kyçi është i një lloji të gabuar" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +#, fuzzy +msgid "Created" +msgstr "K_rijo" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +#, fuzzy +msgid "Generic certification of key" +msgstr "Zhblloko çertifikatën" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +#, fuzzy +msgid "Local only" +msgstr "_Pozicioni:" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +#, fuzzy +msgid "Public Subkey" +msgstr "Kyçi publik" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, fuzzy, c-format +msgid "Import to: %s" +msgstr "Importo" + +#: ../gcr/gcr-import-button.c:156 +#, fuzzy +msgid "Cannot import because there are no compatible importers" +msgstr "I pamundur importimi pasi kyçi është i një lloji të gabuar" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +#, fuzzy +msgid "Private RSA Key" +msgstr "Kyçi privat" + +#: ../gcr/gcr-key-renderer.c:283 +#, fuzzy +msgid "Private DSA Key" +msgstr "Kyçi privat" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "Kyçi privat" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +#, fuzzy +msgid "Public DSA Key" +msgstr "Kyçi publik" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +#, fuzzy +msgid "Unrecognized or unsupported data." +msgstr "File i panjohur apo i pasuportuar." + +#: ../gcr/gcr-parser.c:2183 +#, fuzzy +msgid "Could not parse invalid or corrupted data." +msgstr "I pamundur analizimi i file të pavlefshëm apo të dëmtuar." + +#: ../gcr/gcr-parser.c:2186 +#, fuzzy +msgid "The data is locked" +msgstr "Të dhënat nuk mund të bllokohen" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +#, fuzzy +msgid "Automatically chosen" +msgstr "Zhblloko automatikisht këtë element në hyrje." + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +#, fuzzy +msgid "Unlock" +msgstr "Zhblloko" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +#, fuzzy +msgid "Password:" +msgstr "_Fjalëkalimi:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +#, fuzzy +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Zhblloko automatikisht këtë mbajtës çelsash në hyrje." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +#, fuzzy +msgid "Lock this keyring when I log out" +msgstr "Zhblloko automatikisht këtë mbajtës çelsash në hyrje." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, fuzzy, c-format +msgid "Unlock: %s" +msgstr "Zhblloko" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +msgid "Unlock" +msgstr "Zhblloko" + +#: ../gcr/gcr-unlock-renderer.c:126 +#, fuzzy +msgid "Password" +msgstr "_Fjalëkalimi:" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Lejon hyrjen e aplikativit në mbajtësin e çelsave?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +#, fuzzy +msgid "Certificate Viewer" +msgstr "Çertifikata" + +#: ../gcr/gcr-viewer-widget.c:191 +#, fuzzy +msgid "The password was incorrect" +msgstr "Fjalëkalimi ose PIN nuk është korrekt" + +#: ../gcr/gcr-viewer-window.c:68 +#, fuzzy +msgid "Imported" +msgstr "Importo" + +#: ../gcr/gcr-viewer-window.c:72 +#, fuzzy +msgid "Import failed" +msgstr "Importo çertifikatën" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "Importo" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..7935602 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,1135 @@ +# Serbian translation of gnome-keyring +# Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2017. +# This file is distributed under the same license as the gnome-keyring package. +# Maintainer: Данило Шеган +# Reviewed on 2005-08-08 by: Игор Несторовић +# Translated on 2009-05-09 by: Бранко Кокановић +# Милош Поповић , 2010. +# Мирослав Николић , 2011—2017. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-03 07:30+0100\n" +"Last-Translator: Марко М. Костић \n" +"Language-Team: Serbian <(nothing)>\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" +"X-Generator: Poedit 2.0.6\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Компонента домена" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ИБ корисника" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Адреса е-поште" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Датум рођења" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Место рођења" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Пол" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Држављанство" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Држава пребивалишта" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Средње име" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Презиме" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Серијски број" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Држава" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Место" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Република" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Улица" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Организација" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Организациона јединица" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Звање" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Број телефона" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Име" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Иницијали" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Ознака генерације" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "ДН ознака" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Псеудоним" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "РСА" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "МД2 са РСА" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "МД5 са РСА" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "СХА1 са РСА" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "ДСА" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "СХА1 са ДСА" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Крива елипсе" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "СХА1 са ЕЦДСА" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "СХА224 са ЕЦДСА" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "СХА256 са ЕЦДСА" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "СХА384 са ЕЦДСА" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "СХА512 са ЕЦДСА" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Потврда идентитета сервера" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Потврда идентитета клијента" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Потписивање кода" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Заштита ел. поште" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Приказ датума и времена" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Грешка учитавања ПКЦС#11 модула: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Не могу да покренем ПКЦС#11 модул: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Не могу да покренем забележене ПКЦС#11 модуле: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Путања има неисправно кодирање." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Путања нема „pkcs11“ шему." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Путања има лошу синтаксу." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Путања има лош број издања." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Ток је затворен" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Назив" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Издавач" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Истиче" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Уверење" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Други назив" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "ХМПП адреса" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "ДНС СРВ" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Е-пошта" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "ДНС" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Х400 адреса" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Назив директоријума" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Назив ЕДИ стране" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "Путања" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "ИП адреса" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Регистрован ИБ" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Неподржана врста кључа за захтев уверења" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Кључ не може бити коришћен за потписивање захтева" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "ГнуПГ привезак кључева" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "ГнуПГ привезак кључева: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "ПГП кључ" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ИБ кључа" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Гнупг процес је изашао са кодом: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Гнупг процес је окончан сигналом: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Радња је отказана" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Приватни кључ" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Јавни кључ" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Захтев уверења" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Неппознати или неподржани подаци." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Не могу да обрадим неисправне или оштећене податке." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Подаци су закључани" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Настави" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Откажи" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Унесите вашу фразу за безбедну OpenSSH шкољку" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Непознате или недоступне особине кључа" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Не могу да изградим јавни кључ" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Други упит је већ у току" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Не могу да пронађем место да ускладиштим прикачено уверење" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Основна ограничења" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Издавач уверења" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Да" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Не" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Највећа дужина путање" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Неограничено" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Проширено коришћење кључа" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Дозвољене сврхе" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Идентификатор кључа субјекта" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Идентификатор кључа" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Дигитални потпис" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Замућивање кључа" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Замућивање података" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Сагласност кључа" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Потпис уверења" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Списак опозива потписа" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Коришћење кључа" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Употребе" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Други називи субјекта" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Проширење" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Идентификатор" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Вредност" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Не могу да извезем уверење." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Идентитет" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Оверен" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Истиче" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Назив предмета" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Име издаваоца" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Издато уверење" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Издање" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Не важи пре" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Не важи после" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Отисци уверења" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Подаци о јавном кључу" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Потпис" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Извези уверење…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Алгоритам кључа" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Параметри кључа" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Величина кључа" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "СХА1 отисак кључа" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Алгоритам потписа" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Параметри потписа" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Критично" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Захтев уверења" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Особина" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Врста" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Изазов" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Појединости" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Не могу да прикажем „%s“" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Не могу да прикажем датотеку" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Разлог" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Не могу да прикажем датотеку ове врсте." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Елгамал" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Шифруј" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Потпиши" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Провери" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Потврди идентитет" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Искључен" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Непознат" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Неисправан" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Искључен" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Повучен" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Истекао" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Неодређено поверење" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Неповерљив" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Површно поверљив" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Потпуно поверљив" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Безусловно поверљив" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Податак из овог кључа још увек није оверен" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Овај кључ је неисправан" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Овај кључ је искључен" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Овај кључ је опозван" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Овај кључ је истекао" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Овај кључ је неповерљив" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Овај кључ је површно поверљив" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Овај кључ је потпуно поверљив" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Овај кључ је безусловно поверљив" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ИБ кључа" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Алгоритам" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Направљен" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Истиче" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Могућности" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Поузданост власника" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Назив" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Напомена" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Особине корисника" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Величина" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Потпис бинарног документа" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Потпис каноничног текстуалног документа" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Самостојећи потпис" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Опште оверавање кључа" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Особено оверавање кључа" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Повремено оверавање кључа" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Позитивно оверавање кључа" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Потпис повезивања поткључа" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Потпис повезивања основног кључа" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Потпис непосредно на кључ" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Потпис за повлачење кључа" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Потпис за повлачење поткључа" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Потпис повлачења уверења" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Потпис временске ознаке" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Потпис потврђивања трећих лица" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Разред" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Само месно" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Извозив" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Кључ повлачења" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Отисак" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Јавни поткључ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Тајни кључ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Тајни поткључ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Покрећем…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Увоз је у току…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Увежен у: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Увези у: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Не могу да увезем јер је нема сагласних увозника" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Нема података за увоз" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Кључ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Приватни РСА кључ" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Приватни ДСА кључ" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Лични кључ криве елипсе" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Јавни ДСА кључ" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Јавни кључ криве елипсе" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u бит" +msgstr[1] "%u бита" +msgstr[2] "%u бита" +msgstr[3] "један бит" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Јачина" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Отисци" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "СХА1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "СХА256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Откажи" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "У _реду" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Самостално изабран" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Корисник је отказао радњу" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Да бисте увезли, унесите лозинку." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Лозинка:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Израз:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Откључај" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Натпис:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Увези поставке" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Потврди:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Лозинке се не подударају." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Лозинка не може бити празна" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Упит приступа" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Откључајте приступ лозинкама и другим тајнама" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Већ постоји датотека са овим називом." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Да ли желите да је замените новом датотеком?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Замени" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Операција је отказана." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Извези уверење" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Сачувај" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Датотеке уверења" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "ПЕМ датотеке" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Сам откључај овај привезак кад год се пријавим" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Закључај овај привезак када се одјавим" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Закључај овај привезак након" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Закључај овај привезак ако је неактиван" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "минута" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Откључај: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Лозинка" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Садржаји „%s“ су закључани. Да бисте видели садржај, унесите исправну " +"лозинку." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Садржаји су закључани. Да бисте видели садржаје, унесите исправну лозинку." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Прегледач ГЦР уверења и кључева" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Приказује издање програма" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[датотека...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "— Прегледајте датотеке уверења и кључева" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Прегледач уверења" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Лозинка није исправна" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Увезен" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Увоз није успео" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Увези" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Затвори" diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..3b4d9d5 --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,1135 @@ +# Serbian translation of gnome-keyring +# Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2017. +# This file is distributed under the same license as the gnome-keyring package. +# Maintainer: Danilo Šegan +# Reviewed on 2005-08-08 by: Igor Nestorović +# Translated on 2009-05-09 by: Branko Kokanović +# Miloš Popović , 2010. +# Miroslav Nikolić , 2011—2017. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 17:22+0000\n" +"PO-Revision-Date: 2018-03-03 07:30+0100\n" +"Last-Translator: Marko M. Kostić \n" +"Language-Team: Serbian <(nothing)>\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" +"X-Generator: Poedit 2.0.6\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Komponenta domena" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "IB korisnika" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Adresa e-pošte" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Datum rođenja" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Mesto rođenja" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Pol" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Državljanstvo" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Država prebivališta" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Srednje ime" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Prezime" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serijski broj" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Država" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Mesto" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Republika" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Ulica" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organizacija" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Organizaciona jedinica" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Zvanje" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Broj telefona" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Ime" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Inicijali" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Oznaka generacije" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN oznaka" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonim" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 sa RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 sa RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 sa RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 sa DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Kriva elipse" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 sa ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 sa ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 sa ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 sa ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 sa ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Potvrda identiteta servera" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Potvrda identiteta klijenta" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Potpisivanje koda" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Zaštita el. pošte" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Prikaz datuma i vremena" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Greška učitavanja PKCS#11 modula: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Ne mogu da pokrenem PKCS#11 modul: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Ne mogu da pokrenem zabeležene PKCS#11 module: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "Putanja ima neispravno kodiranje." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "Putanja nema „pkcs11“ šemu." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "Putanja ima lošu sintaksu." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "Putanja ima loš broj izdanja." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Tok je zatvoren" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Naziv" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Izdavač" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Ističe" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Uverenje" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Drugi naziv" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "HMPP adresa" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-pošta" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "H400 adresa" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Naziv direktorijuma" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Naziv EDI strane" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "Putanja" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP adresa" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrovan IB" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Nepodržana vrsta ključa za zahtev uverenja" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Ključ ne može biti korišćen za potpisivanje zahteva" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG privezak ključeva" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG privezak ključeva: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP ključ" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "IB ključa" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg proces je izašao sa kodom: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg proces je okončan signalom: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Radnja je otkazana" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privatni ključ" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Javni ključ" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Zahtev uverenja" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Neppoznati ili nepodržani podaci." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Ne mogu da obradim neispravne ili oštećene podatke." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Podaci su zaključani" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Nastavi" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Otkaži" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Unesite vašu frazu za bezbednu OpenSSH školjku" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Nepoznate ili nedostupne osobine ključa" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Ne mogu da izgradim javni ključ" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Drugi upit je već u toku" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Ne mogu da pronađem mesto da uskladištim prikačeno uverenje" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Osnovna ograničenja" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Izdavač uverenja" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Da" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Ne" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Najveća dužina putanje" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Neograničeno" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Prošireno korišćenje ključa" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Dozvoljene svrhe" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identifikator ključa subjekta" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Identifikator ključa" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digitalni potpis" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Zamućivanje ključa" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Zamućivanje podataka" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Saglasnost ključa" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Potpis uverenja" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Spisak opoziva potpisa" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Korišćenje ključa" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Upotrebe" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Drugi nazivi subjekta" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Proširenje" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifikator" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Vrednost" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Ne mogu da izvezem uverenje." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitet" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Overen" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Ističe" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Naziv predmeta" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Ime izdavaoca" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Izdato uverenje" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Izdanje" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Ne važi pre" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Ne važi posle" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Otisci uverenja" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Podaci o javnom ključu" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Potpis" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Izvezi uverenje…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Algoritam ključa" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Parametri ključa" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Veličina ključa" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 otisak ključa" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Algoritam potpisa" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Parametri potpisa" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritično" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Zahtev uverenja" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Osobina" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Vrsta" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Izazov" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Pojedinosti" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Ne mogu da prikažem „%s“" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Ne mogu da prikažem datoteku" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Razlog" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Ne mogu da prikažem datoteku ove vrste." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Šifruj" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Potpiši" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Proveri" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Potvrdi identitet" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Isključen" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Nepoznat" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Neispravan" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Isključen" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Povučen" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Istekao" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Neodređeno poverenje" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Nepoverljiv" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Površno poverljiv" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Potpuno poverljiv" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Bezuslovno poverljiv" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Podatak iz ovog ključa još uvek nije overen" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Ovaj ključ je neispravan" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Ovaj ključ je isključen" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Ovaj ključ je opozvan" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Ovaj ključ je istekao" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Ovaj ključ je nepoverljiv" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Ovaj ključ je površno poverljiv" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Ovaj ključ je potpuno poverljiv" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Ovaj ključ je bezuslovno poverljiv" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "IB ključa" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritam" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Napravljen" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Ističe" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Mogućnosti" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Pouzdanost vlasnika" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Naziv" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Napomena" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Osobine korisnika" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Veličina" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Potpis binarnog dokumenta" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Potpis kanoničnog tekstualnog dokumenta" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Samostojeći potpis" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Opšte overavanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Osobeno overavanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Povremeno overavanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Pozitivno overavanje ključa" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Potpis povezivanja potključa" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Potpis povezivanja osnovnog ključa" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Potpis neposredno na ključ" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Potpis za povlačenje ključa" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Potpis za povlačenje potključa" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Potpis povlačenja uverenja" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Potpis vremenske oznake" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Potpis potvrđivanja trećih lica" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Razred" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Samo mesno" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Izvoziv" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Ključ povlačenja" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Otisak" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Javni potključ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Tajni ključ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Tajni potključ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Pokrećem…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Uvoz je u toku…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Uvežen u: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Uvezi u: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Ne mogu da uvezem jer je nema saglasnih uvoznika" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Nema podataka za uvoz" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Ključ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privatni RSA ključ" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privatni DSA ključ" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Lični ključ krive elipse" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Javni DSA ključ" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Javni ključ krive elipse" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bita" +msgstr[2] "%u bita" +msgstr[3] "jedan bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Jačina" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Otisci" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Otkaži" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "U _redu" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Samostalno izabran" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Korisnik je otkazao radnju" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Da biste uvezli, unesite lozinku." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Lozinka:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Izraz:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Otključaj" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Natpis:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Uvezi postavke" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Potvrdi:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Lozinke se ne podudaraju." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Lozinka ne može biti prazna" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Upit pristupa" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Otključajte pristup lozinkama i drugim tajnama" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Već postoji datoteka sa ovim nazivom." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Da li želite da je zamenite novom datotekom?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Zameni" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Operacija je otkazana." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Izvezi uverenje" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Sačuvaj" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Datoteke uverenja" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM datoteke" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Sam otključaj ovaj privezak kad god se prijavim" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Zaključaj ovaj privezak kada se odjavim" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Zaključaj ovaj privezak nakon" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Zaključaj ovaj privezak ako je neaktivan" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minuta" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Otključaj: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Lozinka" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Sadržaji „%s“ su zaključani. Da biste videli sadržaj, unesite ispravnu " +"lozinku." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Sadržaji su zaključani. Da biste videli sadržaje, unesite ispravnu lozinku." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Pregledač GCR uverenja i ključeva" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Prikazuje izdanje programa" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[datoteka...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "— Pregledajte datoteke uverenja i ključeva" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Pregledač uverenja" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Lozinka nije ispravna" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Uvezen" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Uvoz nije uspeo" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Uvezi" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Zatvori" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..807c7aa --- /dev/null +++ b/po/sv.po @@ -0,0 +1,1130 @@ +# Swedish messages for gnome-keyring. +# Copyright © 2003-2018 Free Software Foundation, Inc. +# Christian Rose , 2003, 2004. +# Daniel Nylander , 2006, 2007, 2008, 2009, 2010, 2011, 2012. +# Sebastian Rasmussen , 2015. +# Anders Jonsson , 2016, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2018-03-02 13:46+0000\n" +"PO-Revision-Date: 2018-03-05 00:42+0100\n" +"Last-Translator: Anders Jonsson \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Domänkomponent" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Användar-id" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-postadress" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Födelsedag" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Födelseort" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Kön" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Nationalitet" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Bostadsland" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Common Name" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Förnamn" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Serienummer" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Land" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Lokalitet" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Län" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Gata" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Organisation" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Avdelning" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Titel" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefonnummer" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Tilltalsnamn" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Initialer" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Genereringskvalificerare" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN-kvalificerare" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 med RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 med RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 med RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 med DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptisk kurva" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 med ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 med ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 med ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 med ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 med ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Serverautentisering" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Klientautentisering" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Kodsignering" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-postskydd" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Tidsstämpel" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Fel vid inläsning av PKCS#11-modul: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "Kunde inte initiera PKCS#11-modul: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Kunde inte initiera registrerade PKCS#11-moduler: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI:n har en ogiltig kodning." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI:n saknar ”pkcs11”-schemat." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI:n har felaktig syntax." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI:n har ett felaktigt versionsnummer." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Strömmen stängdes" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Namn" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Utfärdat av" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Går ut" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Certifikat" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Annat namn" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-post" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400-adress" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Katalognamn" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI Party Name" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP-adress" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Registrerat ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Stöd för nyckeltyp saknas för certifikatbegäran" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Nyckeln kan inte användas för att signera begäran" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG-nyckelring" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG-nyckelring: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP-nyckel" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Nyckel-id" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg-processen avslutades med kod: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg-processen terminerades med signal: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 +#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Åtgärden avbröts" + +#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Privat nyckel" + +#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Publik nyckel" + +#: ../gcr/gcr-parser.c:353 +msgid "Certificate Request" +msgstr "Certifikatbegäran" + +#: ../gcr/gcr-parser.c:2595 +msgid "Unrecognized or unsupported data." +msgstr "Data är okänt eller stöds inte." + +#: ../gcr/gcr-parser.c:2598 +msgid "Could not parse invalid or corrupted data." +msgstr "Kunde inte tolka ogiltigt eller skadat data." + +#: ../gcr/gcr-parser.c:2601 +msgid "The data is locked" +msgstr "Data är låst" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Fortsätt" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Avbryt" + +#: ../gcr/gcr-ssh-askpass.c:198 +msgid "Enter your OpenSSH passphrase" +msgstr "Ange din OpenSSH-lösenfras" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Okänt eller otillgängligt attribut för nyckel" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "Kunde inte bygga publik nyckel" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "En annan inmatning pågår redan" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Kunde inte hitta en plats att lagra de nålade certifikaten i" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Användningsområde" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Certifikatutfärdare" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Ja" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Nej" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Maximal sökvägslängd" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Obegränsad" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Utökad nyckelanvändning" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Tillåtna syften" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Identifierare för ämnesnyckel" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Nyckelidentifierare" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Digital signatur" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Nyckelkryptering" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Datakryptering" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Nyckelanvändning" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Certifikatsignatur" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Signatur för spärrlista" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Nyckelanvändning" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Användningsområden" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Alternativa ämnesnamn" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Utökning" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Identifierare" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Värde" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "Kunde inte exportera certifikatet." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Identitet" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Verifierat av" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Går ut" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Ämnesnamn" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Utfärdarens namn" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Utfärdat certifikat" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Version" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Inte giltigt före" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Inte giltigt efter" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Certifikatets fingeravtryck" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Information om publik nyckel" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Signatur" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Exportera certifikat…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Nyckelalgoritm" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Nyckelparametrar" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Nyckelstorlek" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Nyckelns SHA1-fingeravtryck" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Signaturalgoritm" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Signaturparametrar" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritiskt" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Certifikatbegäran" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Attribut" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Typ" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Utmaning" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Detaljer" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "Kunde inte visa ”%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Kunde inte visa filen" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Anledning" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Kan inte visa en fil av denna typ." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Kryptera" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Signera" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Certifiera" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Autentisera" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Inaktiverad" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Okänd" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Ogiltigt" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Inaktiverad" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Spärrat" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Utgånget" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Odefinierad tillit" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Opålitlig" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Marginellt pålitlig" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Fullständigt pålitlig" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Förbehållslöst pålitlig" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Informationen i denna nyckel har ännu inte verifierats" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Denna nyckel är ogiltig" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Denna nyckel har inaktiverats" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Denna nyckel har spärrats" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Denna nyckel har gått ut" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Denna nyckel är opålitlig" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Denna nyckel är marginellt pålitlig" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Denna nyckel är fullständigt pålitlig" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Denna nyckel är förbehållslöst pålitlig" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Nyckel-ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritm" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Skapad" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Går ut" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Förmågor" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Ägartillit" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Namn" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Kommentar" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Användarattribut" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Storlek" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Signatur av binärt dokument" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Signatur av ett kanoniskt textdokument" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Fristående signatur" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Generell certifiering av nyckel" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Persona-certifiering av nyckel" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Tillfällig verifiering av nyckel" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Säker verifiering av nyckel" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Bindningssignatur för undernyckel" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Bindningssignatur för primärnyckel" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Signatur direkt på nyckel" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Nyckelspärrsignatur" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Undernyckelsspärrsignatur" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Certifikatsspärrsignatur" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Tidsstämpelsignatur" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Bekräftande signatur från tredjepart" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Klass" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Endast lokal" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Exporterbar" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Spärrnyckel" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Fingeravtryck" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Publik undernyckel" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Hemlig nyckel" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Hemlig undernyckel" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Initierar…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Import pågår…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Importerades till: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Importera till: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Kan inte importera därför att det inte finns kompatibla importerare" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Inget data att importera" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Nyckel" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Privat RSA-nyckel" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Privat DSA-nyckel" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Privat elliptisk kurvnyckel" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Publik DSA-nyckel" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Publik elliptisk kurvnyckel" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" +msgstr[1] "%u bitar" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Styrka" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Fingeravtryck" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Avbryt" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_OK" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Automatiskt vald" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Användaren avbröt åtgärden" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "För att importera, mata in lösenordet." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Lösenord:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Symbol:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Lås upp" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etikett:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Importinställningar" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Bekräfta:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Lösenorden stämmer inte överens." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Lösenordet får inte vara blankt" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Åtkomstbegäran" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Lås upp tillgång till lösenord och andra hemligheter" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "En fil med samma namn finns redan." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Vill du ersätta den med en ny fil?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Ersätt" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Åtgärden avbröts." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Exportera certifikat" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Spara" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Certifikatfiler" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM-filer" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Lås automatiskt upp den här nyckelringen när jag är inloggad" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Lås denna nyckelring när jag loggar ut" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Lås denna nyckelring efter" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Lås denna nyckelring om inaktiv i" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "minuter" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Lås upp: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Lösenord" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Innehållet för ”%s” är låst. Ange det korrekta lösenordet för att visa " +"innehållet." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" +"Innehållet är låst. Ange det korrekta lösenordet för att visa innehållet." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR Certifikat- och nyckelvisare" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Visa programmets version" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[fil…]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Visa certifikat och nyckelfiler" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Certifikatvisare" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Lösenordet var felaktigt" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Importerad" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Importen misslyckades" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Importera" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "_Stäng" diff --git a/po/ta.po b/po/ta.po new file mode 100644 index 0000000..98da92d --- /dev/null +++ b/po/ta.po @@ -0,0 +1,1088 @@ +# translation of gnome-keyring.HEAD.ta.po to Tamil +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER. +# +# Jayaradha N , 2004. +# Felix , 2006. +# Dr.T.Vasudevan , 2007, 2008, 2009, 2010, 2011, 2012. +# I. Felix , 2009. +# Dr,T,Vasudevan , 2010, 2011. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.HEAD.ta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-04 21:15+0530\n" +"PO-Revision-Date: 2012-09-05 10:14+0530\n" +"Last-Translator: Dr.T.Vasudevan \n" +"Language-Team: American English \n" +"Language: ta\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\\n" +"\n" +"\n" +"\n" +"X-Generator: Lokalize 1.1\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "டொமைன் கூறு" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:409 +#: ../gcr/gcr-gnupg-renderer.c:578 +msgid "User ID" +msgstr "பயனர் ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "மின்னஞ்சல் முகவரி" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "பிறந்த நாள்" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "பிறந்த இடம்" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "பாலினம்" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "நாட்டின் குடியுரிமை" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "வசிக்கிற நாடு" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "பொதுவான பெயர்" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "புனைப்பெயர்" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:557 +msgid "Serial Number" +msgstr "வரிசை எண்" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "நாடு" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "இடம்" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "மாவட்டம்" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "தெரு" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "நிறுவனம்" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "நிறுவனத்தின் அலகு" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "தலைப்பு" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "தொலைபேசி எண்" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "கொடுக்கப்பட்ட பெயர்" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "முதல்எழுத்துக்கள்" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "தலைமுறை தகுதியாளர்" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN தகுதியாளர்" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:200 +#: ../gcr/gcr-key-renderer.c:429 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 உடன் RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 உடன் RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 உடன் RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:204 +#: ../gcr/gcr-key-renderer.c:431 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 உடன் DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "சேவையக உறுதி செய்தல்" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "சார்ந்தோன் உறுதி செய்தல்" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "நிரற்றொடர் கையொப்பம்" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "மின்னஞ்சல் பாதுகாப்பு" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "நேர முத்திரை" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "பிகேசிஎச்(PKCS)#11 ஐ ஏற்றும்போது பிழை: %s" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "பிகேசிஎச்(PKCS)#11 நிரல்கூறு செல்லுபடியாகாதது: %s" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "பிகேசிஎச்(PKCS)#11 நிரல்கூறு ஐ அமைக்க முடியவில்லை: %s" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "பிகேசிஎச்(PKCS)#11 நிரல்கூறு ஐ துவக்க முடியவில்லை: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "பதிவு செய்த பிகேசிஎச்(registered PKCS)#11 நிரல்கூறு ஐ துவக்க முடியவில்லை: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "யூஆர் ஐ க்கு செல்லுபடியாகாத குறியாக்கம் உள்ளது" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "யூஆர்ஐ ´pkcs11´ திட்டத்தை கொண்டிருக்கவில்லை." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "யூஆர்ஐ க்கு மோசமான வழிமுறைத் தொடரமைப்பு உள்ளது" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "யூஆர்ஐ க்கு மோசமான பதிப்பு எண் உள்ளது" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "ஓடை மூடப்பட்டது" + +#. later +#. later +#: ../gcr/gcr-certificate.c:308 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "பெயர்" + +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Issued By" +msgstr "வழங்கியவர்" + +#. later +#: ../gcr/gcr-certificate.c:312 +msgctxt "column" +msgid "Expires" +msgstr "காலாவதியானது " + +#: ../gcr/gcr-certificate.c:1133 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:102 ../gcr/gcr-parser.c:322 +msgid "Certificate" +msgstr "சான்றிதழ்" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" +"இந்த பெயருடன் ஒரு கோப்பு இருப்பில் உள்ளது.\n" +"\n" +"புதிய கோப்பால் அதை நீக்க வேண்டுமா?" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "மாற்று (_R)" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "செயல் ரத்து செய்யப்பட்டது." + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "சான்றிதழ் ஏற்றுமதி செய்க" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "சான்றிதழ் கோப்புகள்" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "PEM கோப்புகள்" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "வேறு பெயர்" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "எக்ஸ்எம்பிபி முகவரி" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "டிஎன்எஸ் எஸ்ஆர்வி" + +#: ../gcr/gcr-certificate-extensions.c:204 ../gcr/gcr-gnupg-renderer.c:422 +#: ../gcr/gcr-gnupg-renderer.c:704 +msgid "Email" +msgstr "மின்னஞ்சல்" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "X400 முகவரி" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "அடைவின் பெயர்" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "ஈடிஐ நபரின் பெயர் " + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "யூஆர்ஐ" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "IP முகவரி" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "பதிவு செய்த ஐடி" + +#: ../gcr/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "அடிப்படை கட்டுப்பாடுகள்" + +#: ../gcr/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "சான்றிதழ் ஆணையம்" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "Yes" +msgstr "ஆம்" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "No" +msgstr "இல்லை" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "அதிக பட்ச நீளம்" + +#: ../gcr/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "வரையில்லாதது" + +#: ../gcr/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "நீட்டித்த விசை பயன்பாடு" + +#: ../gcr/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "அனுமதித்த நோக்கங்கள்" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "பொருள் விசை அடையாளம் காட்டி" + +#: ../gcr/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "விசை அடையாளம் காட்டி" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "மின்னெண் கையொப்பம்" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "விசை குறியாக்கம்" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "தரவு குறியாக்கம்" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "விசை ஒத்திசைவு" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "சான்றிதழ் கையொப்பம்" + +#: ../gcr/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "திருப்பிப்பெற்ற பட்டியல் கையொப்பம்" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "விசை பயன்பாடு" + +#: ../gcr/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "பயன்பாடுகள்" + +#: ../gcr/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "பொருளின் மாற்று பெயர்கள்" + +#: ../gcr/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "நீட்சி" + +#: ../gcr/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "அடையாளம் காட்டுபவர்" + +#: ../gcr/gcr-certificate-renderer.c:269 +#: ../gcr/gcr-certificate-request-renderer.c:272 +#: ../gcr/gcr-gnupg-renderer.c:413 ../gcr/gcr-gnupg-renderer.c:430 +msgid "Value" +msgstr "மதிப்பு" + +#: ../gcr/gcr-certificate-renderer.c:294 +msgid "Couldn't export the certificate." +msgstr "சான்றிதழ் ஏற்றுமதி செய்ய முடியவில்லை " + +#: ../gcr/gcr-certificate-renderer.c:519 +#: ../gcr/gcr-certificate-request-renderer.c:313 +msgid "Identity" +msgstr "அடையாளம் " + +#: ../gcr/gcr-certificate-renderer.c:523 +msgid "Verified by" +msgstr "உறுதிப்படுத்தியது " + +#: ../gcr/gcr-certificate-renderer.c:530 ../gcr/gcr-gnupg-renderer.c:718 +msgid "Expires" +msgstr "காலாவதி தேதி" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:537 +#: ../gcr/gcr-certificate-request-renderer.c:319 +msgid "Subject Name" +msgstr "பொருளின் பெயர்" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:542 +msgid "Issuer Name" +msgstr "வழங்குபவரின் பெயர்" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:547 +msgid "Issued Certificate" +msgstr "தரப்பட்ட சான்றிதழ்" + +#: ../gcr/gcr-certificate-renderer.c:552 +#: ../gcr/gcr-certificate-request-renderer.c:330 +msgid "Version" +msgstr "பதிப்பு" + +#: ../gcr/gcr-certificate-renderer.c:566 +msgid "Not Valid Before" +msgstr "இதற்கு முன் செல்லுபடியாகாது" + +#: ../gcr/gcr-certificate-renderer.c:571 +msgid "Not Valid After" +msgstr "அதற்கு பின் செல்லுபடியாகாது" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:576 +msgid "Certificate Fingerprints" +msgstr "சான்றிதழ் கைரேகைகள்" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:582 +#: ../gcr/gcr-certificate-request-renderer.c:333 +#: ../gcr/gcr-certificate-request-renderer.c:379 +msgid "Public Key Info" +msgstr "பொது விசை தகவல்" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:597 ../gcr/gcr-certificate-renderer.c:918 +#: ../gcr/gcr-certificate-request-renderer.c:349 +#: ../gcr/gcr-certificate-request-renderer.c:386 +#: ../gcr/gcr-gnupg-renderer.c:559 +msgid "Signature" +msgstr "கையொப்பம்" + +#: ../gcr/gcr-certificate-renderer.c:864 +msgid "Key Algorithm" +msgstr "விசை கணிமுறை" + +#: ../gcr/gcr-certificate-renderer.c:869 +msgid "Key Parameters" +msgstr "விசை பாராமீட்டர்கள்" + +#: ../gcr/gcr-certificate-renderer.c:877 ../gcr/gcr-gnupg-renderer.c:352 +msgid "Key Size" +msgstr "விசை அளவு" + +#: ../gcr/gcr-certificate-renderer.c:885 +msgid "Key SHA1 Fingerprint" +msgstr "விசை SHA1 கைரேகை" + +#: ../gcr/gcr-certificate-renderer.c:890 ../gcr/gcr-gnupg-renderer.c:737 +#: ../gcr/gcr-key-renderer.c:414 ../gcr/gcr-parser.c:325 +msgid "Public Key" +msgstr "பொது விசை" + +#: ../gcr/gcr-certificate-renderer.c:907 +msgid "Signature Algorithm" +msgstr "கையொப்ப கணிமுறை" + +#: ../gcr/gcr-certificate-renderer.c:911 +msgid "Signature Parameters" +msgstr "கையொப்ப பாராமீட்டர்கள்" + +#: ../gcr/gcr-certificate-renderer.c:960 +msgid "Critical" +msgstr "அவசரம்" + +#: ../gcr/gcr-certificate-request.c:418 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "சான்றிதழ் வேண்டுதலுக்கு ஆதரவில்லாத விசை வகை" + +#: ../gcr/gcr-certificate-request.c:505 ../gcr/gcr-certificate-request.c:590 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "வேண்டுதலை கையொப்பமிட இந்த விசையை பயன்படுத்த முடியாது" + +#. The certificate request type +#: ../gcr/gcr-certificate-request-renderer.c:95 +#: ../gcr/gcr-certificate-request-renderer.c:308 +#: ../gcr/gcr-certificate-request-renderer.c:323 +#: ../gcr/gcr-certificate-request-renderer.c:366 +#: ../gcr/gcr-certificate-request-renderer.c:371 +msgid "Certificate request" +msgstr "சான்றிதழ் வேண்டுதல்" + +#: ../gcr/gcr-certificate-request-renderer.c:261 +msgid "Attribute" +msgstr "பண்புக்கூறு" + +#: ../gcr/gcr-certificate-request-renderer.c:265 +#: ../gcr/gcr-certificate-request-renderer.c:324 +#: ../gcr/gcr-certificate-request-renderer.c:372 +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:592 +msgid "Type" +msgstr "வகை" + +#: ../gcr/gcr-certificate-request-renderer.c:376 +msgid "Challenge" +msgstr "சவால்" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "விவரங்கள் (_D)" + +#: ../gcr/gcr-failure-renderer.c:160 +#, c-format +msgid "Could not display '%s'" +msgstr "'%s' ஐ காட்ட முடியவில்லை'" + +#: ../gcr/gcr-failure-renderer.c:162 +msgid "Could not display file" +msgstr "கோப்பினை காட்ட முடியவில்லை" + +#: ../gcr/gcr-failure-renderer.c:167 +msgid "Reason" +msgstr "காரணம்" + +#: ../gcr/gcr-failure-renderer.c:217 +#, c-format +msgid "Cannot display a file of this type." +msgstr "இந்த வகை கோப்பை காட்ட இயலாது." + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "க்னுபிஜி விசை வளையம்" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "க்னுபிஜி விசைவளையம்: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:328 +msgid "PGP Key" +msgstr "PGP விசை" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "விசை ஐடி" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "ஜிஎன்யுபிஜி செயல் இந்த கோட் உடன் வெளியேறியது: %d" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "ஜிஎன்யுபிஜி செயல் சமிக்ஞையால் முடிக்கப்பட்டது: %d" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2424 +#: ../gcr/gcr-parser.c:2917 +msgid "The operation was cancelled" +msgstr "செயல் ரத்து செய்யப்பட்டது." + +#: ../gcr/gcr-gnupg-renderer.c:202 +msgid "Elgamal" +msgstr "எல்காமல்" + +#: ../gcr/gcr-gnupg-renderer.c:215 +msgid "Encrypt" +msgstr "குறிமுறையாக்கு" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Sign" +msgstr "கையொப்பமிடு" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Certify" +msgstr "சான்றிதழ் கொடு" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Authenticate" +msgstr "உறுதிப்படுத்து" + +#: ../gcr/gcr-gnupg-renderer.c:223 ../gcr/gcr-gnupg-renderer.c:258 +msgid "Disabled" +msgstr "முடக்கப்பட்டது" + +#: ../gcr/gcr-gnupg-renderer.c:254 ../gcr/gcr-gnupg-renderer.c:413 +#: ../gcr/gcr-key-renderer.c:433 ../gcr/gcr-key-renderer.c:438 +msgid "Unknown" +msgstr "தெரியாத" + +#: ../gcr/gcr-gnupg-renderer.c:256 +msgid "Invalid" +msgstr "செல்லுபடியாகாதது" + +#: ../gcr/gcr-gnupg-renderer.c:260 +msgid "Revoked" +msgstr "திரும்பப்பெறப்பட்டது" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Expired" +msgstr "காலாவதியாயிற்று" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Undefined trust" +msgstr "நம்பகம் உறுதியில்லை" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Distrusted" +msgstr "நம்பகமில்லாதது" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Marginally trusted" +msgstr "விளிம்பு நிலை நம்பகம்" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Fully trusted" +msgstr "முழுக்க நம்பக்கூடியது" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Ultimately trusted" +msgstr "உச்ச நம்பகம் உள்ளது." + +#: ../gcr/gcr-gnupg-renderer.c:286 +msgid "The information in this key has not yet been verified" +msgstr "இந்த விசையில் உள்ள தகவலின் உண்மை இன்னும் ஆராயப்படவில்லை" + +#: ../gcr/gcr-gnupg-renderer.c:289 +msgid "This key is invalid" +msgstr "இந்த விசை செல்லுபடியாகாதது" + +#: ../gcr/gcr-gnupg-renderer.c:292 +msgid "This key has been disabled" +msgstr "இந்த விசை செயலிழக்கபட்டது" + +#: ../gcr/gcr-gnupg-renderer.c:295 +msgid "This key has been revoked" +msgstr "இந்த விசை ஏற்கெனவே திரும்பிப் பெறப்பட்டு விட்டது." + +#: ../gcr/gcr-gnupg-renderer.c:298 +msgid "This key has expired" +msgstr "விசை காலாவதியாகிவிட்டது" + +#: ../gcr/gcr-gnupg-renderer.c:303 +msgid "This key is distrusted" +msgstr "இந்த விசை நம்பகத்தன்மை இல்லாதது" + +#: ../gcr/gcr-gnupg-renderer.c:306 +msgid "This key is marginally trusted" +msgstr "இந்த விசையின் நம்பகத்தன்மை விளிம்பில் உள்ளது" + +#: ../gcr/gcr-gnupg-renderer.c:309 +msgid "This key is fully trusted" +msgstr "இந்த விசை முழுக்க நம்பகமானது" + +#: ../gcr/gcr-gnupg-renderer.c:312 +msgid "This key is ultimately trusted" +msgstr "இந்த விசை உச்சமாக நம்பப்படுகிறது" + +#: ../gcr/gcr-gnupg-renderer.c:337 ../gcr/gcr-gnupg-renderer.c:563 +msgid "Key ID" +msgstr "ஊவிசை ஐடி" + +#: ../gcr/gcr-gnupg-renderer.c:345 ../gcr/gcr-gnupg-renderer.c:571 +#: ../gcr/gcr-gnupg-renderer.c:618 ../gcr/gcr-key-renderer.c:434 +msgid "Algorithm" +msgstr "அல்கரிதம்" + +#: ../gcr/gcr-gnupg-renderer.c:360 ../gcr/gcr-gnupg-renderer.c:437 +#: ../gcr/gcr-gnupg-renderer.c:480 +msgid "Created" +msgstr "ஊஉருவாக்கப்பட்டது" + +#: ../gcr/gcr-gnupg-renderer.c:369 ../gcr/gcr-gnupg-renderer.c:446 +#: ../gcr/gcr-gnupg-renderer.c:489 +msgid "Expiry" +msgstr "காலாவதி " + +#: ../gcr/gcr-gnupg-renderer.c:378 +msgid "Capabilities" +msgstr "இயலுமை" + +#: ../gcr/gcr-gnupg-renderer.c:391 +msgid "Owner trust" +msgstr "சொந்தக்காரர் நம்பிக்கை" + +#: ../gcr/gcr-gnupg-renderer.c:419 +msgid "Name" +msgstr "பெயர்" + +#: ../gcr/gcr-gnupg-renderer.c:425 ../gcr/gcr-gnupg-renderer.c:707 +msgid "Comment" +msgstr "குறிப்பு" + +#: ../gcr/gcr-gnupg-renderer.c:465 +msgid "User Attribute" +msgstr "பயனர் பண்புக்கூறு" + +#: ../gcr/gcr-gnupg-renderer.c:472 ../gcr/gcr-key-renderer.c:441 +msgid "Size" +msgstr "அளவு" + +#: ../gcr/gcr-gnupg-renderer.c:507 +msgid "Signature of a binary document" +msgstr "இரும ஆவணத்தின் கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a canonical text document" +msgstr "கனானிகல் உரை ஆவணத்தின் கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Standalone signature" +msgstr "தனித்து நிற்கும் கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Generic certification of key" +msgstr "விசையின் பாரம்பரிய சான்றிதழ்" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Persona certification of key" +msgstr "விசைக்கு சான்றிதழ் தரும் நபர்" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Casual certification of key" +msgstr "விசையின் திட்டமிடாத சான்றிதழ் அளிப்பு" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Positive certification of key" +msgstr "விசையின் உண்மை சான்றிதழ் அளிப்பு" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Subkey binding signature" +msgstr "துணைவிசை பந்த கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Primary key binding signature" +msgstr "முதன்மை விசை பந்த கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Signature directly on key" +msgstr "விசை மீதான நேரடி கையொப்பம் " + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Key revocation signature" +msgstr "விசை திருப்பிப்பெறும் கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Subkey revocation signature" +msgstr "துணைவிசை திருப்பிப்பெறும் கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Certification revocation signature" +msgstr "சான்றிதழ் திருப்பிப்பெறும் கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Timestamp signature" +msgstr "நேரமுத்திரை கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Third-party confirmation signature" +msgstr "மூன்றாமவர் உறுதிப்படுத்தல் கையொப்பம்" + +#: ../gcr/gcr-gnupg-renderer.c:588 ../gcr/gcr-gnupg-renderer.c:596 +msgid "Class" +msgstr "வகுப்பு" + +#: ../gcr/gcr-gnupg-renderer.c:590 +msgid "Local only" +msgstr "உள்ளமை மட்டும்" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Exportable" +msgstr "ஏற்றுமதி செய்யக்கூடிய" + +#: ../gcr/gcr-gnupg-renderer.c:610 +msgid "Revocation Key" +msgstr "திருப்பிப்பெற்ற விசை" + +#: ../gcr/gcr-gnupg-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:648 +#: ../gcr/gcr-gnupg-renderer.c:650 +msgid "Fingerprint" +msgstr "கைரேகை" + +#: ../gcr/gcr-gnupg-renderer.c:739 +msgid "Public Subkey" +msgstr "பொது துணைவிசை" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Secret Key" +msgstr "ரகசிய விசை" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Subkey" +msgstr "ரகசிய துணை விசை" + +#: ../gcr/gcr-import-button.c:111 +msgid "Initializing..." +msgstr "துவக்குகிறது..." + +#: ../gcr/gcr-import-button.c:119 +msgid "Import is in progress..." +msgstr "இறக்குமதி செயலில் உள்ளது..." + +#: ../gcr/gcr-import-button.c:126 +#, c-format +msgid "Imported to: %s" +msgstr "இதில் இறக்குமதி செய்யப்பட்டது:%s" + +#: ../gcr/gcr-import-button.c:146 +#, c-format +msgid "Import to: %s" +msgstr "இதில் இறக்குமதி செய்:%s" + +#: ../gcr/gcr-import-button.c:159 +msgid "Cannot import because there are no compatible importers" +msgstr "இசைவான இறக்குமதியாளர் இல்லை. ஆகையால் இறக்குமதி செய்ய இயலாது " + +#: ../gcr/gcr-import-button.c:168 +msgid "No data to import" +msgstr "இறக்க தரவு எதுவும் இல்லை" + +#: ../gcr/gcr-key-renderer.c:89 +msgid "Key" +msgstr "விசை" + +#: ../gcr/gcr-key-renderer.c:403 +msgid "Private RSA Key" +msgstr "அந்தரங்க ஆர்எஸ்ஏ விசை" + +#: ../gcr/gcr-key-renderer.c:405 +msgid "Private DSA Key" +msgstr "அந்தரங்க டிஎஸ்ஏ விசை" + +#: ../gcr/gcr-key-renderer.c:407 ../gcr/gcr-parser.c:319 +msgid "Private Key" +msgstr "அந்தரங்க விசை" + +#: ../gcr/gcr-key-renderer.c:410 ../gcr/gcr-key-renderer.c:412 +msgid "Public DSA Key" +msgstr "பொது டிஎஸ்ஏ விசை" + +#: ../gcr/gcr-key-renderer.c:421 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d பிட்" +msgstr[1] "%d பிட்கள்" + +#: ../gcr/gcr-key-renderer.c:422 +msgid "Strength" +msgstr "பலம்" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:445 +msgid "Fingerprints" +msgstr "கைரேகைகள்" + +#: ../gcr/gcr-key-renderer.c:449 +msgid "SHA1" +msgstr "எஸ்ஹெச்ஏ1" + +#: ../gcr/gcr-key-renderer.c:454 +msgid "SHA256" +msgstr "எஸ்ஹெச்ஏ256" + +#: ../gcr/gcr-parser.c:331 +msgid "Certificate Request" +msgstr "சான்றிதழ் வேண்டுதல்" + +#: ../gcr/gcr-parser.c:2427 +msgid "Unrecognized or unsupported data." +msgstr "இனம் காணாத அல்லது ஆதரவு இல்லா தரவு." + +#: ../gcr/gcr-parser.c:2430 +msgid "Could not parse invalid or corrupted data." +msgstr "பகுக்க செல்லுபடியாகாத அல்லது சிதைந்த தரவு." + +#: ../gcr/gcr-parser.c:2433 +msgid "The data is locked" +msgstr "தரவு பூட்டப்பட்டுள்ளது" + +#: ../gcr/gcr-pkcs11-import-dialog.c:187 +msgid "Automatically chosen" +msgstr "தானியங்கியாக தேர்ந்தெடுத்தது" + +#: ../gcr/gcr-pkcs11-import-dialog.c:271 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "பயனர் செயலை ரத்து செய்தாஅர்" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "அமைப்புகளை இறக்குமதி செய்" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "In order to import, please enter the password." +msgstr "இறக்குமதிக்கு கடவுச்சொல்லை இடுக" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Label" +msgstr "விளக்கச்சீட்டு" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label:" +msgstr "விளக்கச்சீட்டு:" + +#. The password label +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 ../gcr/gcr-prompt-dialog.c:559 +msgid "Password:" +msgstr "கடவுச்சொல்:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Token:" +msgstr "டோகன்:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 ../gcr/gcr-unlock-renderer.c:71 +#: ../gcr/gcr-unlock-renderer.c:128 +msgid "Unlock" +msgstr "பூட்டை திற" + +#: ../gcr/gcr-prompt.c:218 +msgid "Continue" +msgstr "தொடரவும்" + +#: ../gcr/gcr-prompt.c:227 +msgid "Cancel" +msgstr "ரத்து செய்" + +#. The confirm label +#: ../gcr/gcr-prompt-dialog.c:576 +msgid "Confirm:" +msgstr "உறுதியாக்கம்:" + +#: ../gcr/gcr-prompt-dialog.c:643 +msgid "Passwords do not match." +msgstr "கடவுச்சொற்கள் பொருந்தவில்லை" + +#: ../gcr/gcr-prompt-dialog.c:650 +msgid "Password cannot be blank" +msgstr "கடவுச்சொல் வெறுமையாக இருக்க முடியாது" + +#: ../gcr/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "அணுகல் தூண்டல்" + +#: ../gcr/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "கடவுச்சொற்களுக்கும் மற்ற ரகசியங்களுக்கும் அணுகலை பூட்டு திற" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "விசைக்கு அடையாளமில்லாத அல்லது கிடைக்காத பண்புகள்" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "பொது விசையை உருவாக்கமுடியவில்லை" + +#: ../gcr/gcr-system-prompt.c:749 +msgid "Another prompt is already in progress" +msgstr "இன்னொரு தூண்டல் செயலில் உள்ளது" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "பிணைக்கப்பட்ட சான்றிதழ்களை சேமிக்க ஒரு இடத்தை கண்டுபிடிக்க முடியவில்லை" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "நான் உள்நுழையும்போது தானியங்கியாக இந்த விசை வளையத்தை பூட்டு திறக்கவும்." + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "இவ்வளவு நேரம் கழிந்த பின் விசை வளையத்தை பூட்டவும்" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "இவ்வளவு நேரம் சும்மாயிருப்பின் விசை வளையத்தை பூட்டவும்" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "நான் வெளி செல்லும்போது இந்த விசை வளையத்தை பூட்டவும்." + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "நிமிடங்கள்" + +#: ../gcr/gcr-unlock-renderer.c:69 +#, c-format +msgid "Unlock: %s" +msgstr "பூட்டை திற:%s" + +#: ../gcr/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "கடவுச்சொல்" + +#: ../gcr/gcr-unlock-renderer.c:278 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "'%s' இன் உள்ளடக்கங்கள் பூட்டப்பட்டன. அவற்றை காண சரியான கடவுச்சொல்லை உள்ளிடவும்." + +#: ../gcr/gcr-unlock-renderer.c:281 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "உள்ளடக்கங்கள் பூட்டப்பட்டன. அவற்றை காண சரியான கடவுச்சொல்லை உள்ளிடவும்." + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "சிஜிஆர் சான்றிதழ்/விசை காட்டி" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "இப்பயன்பாட்டின் பதிப்பைக் காட்டு" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[file...]" + +#: ../gcr/gcr-viewer-tool.c:103 +msgid "- View certificate and key files" +msgstr "-சான்றிதழ் மற்றும் விசை கோப்புகள் ஐ காண்" + +#: ../gcr/gcr-viewer-tool.c:117 ../gcr/gcr-viewer-widget.c:635 +msgid "Certificate Viewer" +msgstr "சான்றிதழ் காட்டி" + +#: ../gcr/gcr-viewer-widget.c:203 +msgid "The password was incorrect" +msgstr "கடவுச்சொல் தவறானது." + +#: ../gcr/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "இறக்குமதி செய்யப்பட்டது" + +#: ../gcr/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "இறக்க முடியவில்லை" + +#: ../gcr/gcr-viewer-window.c:108 +msgid "Import" +msgstr "இறக்குமதி செய்" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "பூட்டை திற" diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..e8f0bc1 --- /dev/null +++ b/po/te.po @@ -0,0 +1,1102 @@ +# translation of gnome-keyring.master.te.po to Telugu +# Telugu translation of gnome-keyring. +# Copyright (C) 2011 Gnome Contributors +# This file is distributed under the same license as the gnome-keyring package. +# +# Bharat Kumar , 2007. +# Krishna Babu K , 2009. +# Praveen Illa , 2011, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring.master.te\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2012-09-20 06:45+0000\n" +"PO-Revision-Date: 2012-09-24 10:48+0530\n" +"Last-Translator: Praveen Illa \n" +"Language-Team: తెలుగు \n" +"Language: te\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "డొమైన్ మూలకం" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:409 +#: ../gcr/gcr-gnupg-renderer.c:578 +msgid "User ID" +msgstr "వాడుకరి ఐడి" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "ఈమెయిల్ చిరునామా" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "పుట్టిన రోజు" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "పుట్టిన స్థలము" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "లింగము" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "పౌరసత్వం వున్న దేశము" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "నివసిస్తున్న దేశము" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "సాధారణ పేరు" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "ఇంటిపేరు" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:557 +msgid "Serial Number" +msgstr "సీరియల్ నంబర్" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "దేశము" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "ప్రాంతీయత" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "రాష్ట్రము" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "వీధి" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "సంస్థ" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "సంస్థాపరమైన ప్రమాణము" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "శీర్షిక" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "టెలిఫోన్ నంబరు" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "ఇచ్చిన పేరు" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "మొదలు" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "తరం తెలుపునది" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN తెలుపునది" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Pseudonym" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:200 +#: ../gcr/gcr-key-renderer.c:429 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "RSA తో MD2" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "RSA తో MD5" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "RSA తో SHA1" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:204 +#: ../gcr/gcr-key-renderer.c:431 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "DSA తో SHA1" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "సేవకం ధృవీకరణ" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "క్లయింటు ధృవీకరణ" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "కోడ్ సైనింగ్" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "ఈమెయిల్ రక్షణ" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "సమయ ముద్రణ" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 పర్వికాన్ని ఎక్కించుటలో దోషం: %s" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "చెల్లని PKCS#11 పర్వికం: %s" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "PKCS#11 పర్వికాన్ని అమర్చలేకపోయింది: %s" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "PKCS#11 పర్వికాన్ని ఆరంభించలేకపోతుంది: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "నమోదయిన PKCS#11 పర్వికాన్ని ఆరంభించుటలో దోషం: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI చెల్లని ఎన్కోడింగు కలిగివుంది." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI 'pkcs11' పథకాన్ని కలిగిలేదు." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI తప్పుడు వాక్యనిర్మాణాన్ని కలిగివుంది." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI చెడ్డ రూపాంతర సంఖ్యను కలిగివుంది." + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "ప్రవాహం మూసివేయబడింది" + +#. later +#. later +#: ../gcr/gcr-certificate.c:308 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "పేరు" + +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Issued By" +msgstr "జారీచేసినవారు" + +#. later +#: ../gcr/gcr-certificate.c:312 +msgctxt "column" +msgid "Expires" +msgstr "కాలంచెల్లేది" + +#: ../gcr/gcr-certificate.c:1133 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:102 ../gcr/gcr-parser.c:322 +msgid "Certificate" +msgstr "ధృవీకరణపత్రం" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" +"ఈ పేరుతో ఇదివరకే ఒక ఫైల్ ఉన్నది.\n" +"\n" +"దీనిని ఒక కొత్త ఫైలుతో పునఃస్థాపించాలనుకుంటున్నారా?" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "పునఃస్థాపించు (_R)" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "ఆపరేషన్ రద్దుచేయబడింది." + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "ధృవీకరణపత్రాన్ని ఎగుమతిచేయి" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "ధృవీకరణ ఫైళ్ళు" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "PEM ఫైళ్ళు" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "ఇతర పేరు" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:204 ../gcr/gcr-gnupg-renderer.c:422 +#: ../gcr/gcr-gnupg-renderer.c:704 +msgid "Email" +msgstr "ఈమెయిల్" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "X400 చిరునామా" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "సంచయం పేరు" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "EDI పార్టీ పేరు" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "ఐపీ చిరునామా" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "నమోదుచేసిన ఐడి" + +#: ../gcr/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "ప్రాథమిక నిరోధాలు" + +#: ../gcr/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "ధృవీకరణపత్రం నియంత్రణసంస్థ" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "Yes" +msgstr "అవును" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "No" +msgstr "కాదు" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "గరిష్ట పథం పొడవు" + +#: ../gcr/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "అపరిమితం" + +#: ../gcr/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "పొడిగించినబడిన కీ వాడుక" + +#: ../gcr/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "అనుమతించదగిన ప్రయోజనాలు" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "విషయ కీ గుర్తింపరి" + +#: ../gcr/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "కీ గుర్తింపరి" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "డిజిటల్ సంతకము" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "కీ ఎన్‌సైఫెర్మెంట్" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "డేటా ఎన్‌సైఫెర్మెంట్" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "కీ ఒప్పందం" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "ధృవీకరణపత్రం సంతకం" + +#: ../gcr/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "ఉపసంహరణ జాబితా సంతకం" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "కీ వాడుక" + +#: ../gcr/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "వాడుకలు" + +#: ../gcr/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "విషయం ప్రత్యామ్నాయ పేర్లు" + +#: ../gcr/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "పొడిగింపు" + +#: ../gcr/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "గుర్తింపకరి" + +#: ../gcr/gcr-certificate-renderer.c:269 +#: ../gcr/gcr-certificate-request-renderer.c:272 +#: ../gcr/gcr-gnupg-renderer.c:413 ../gcr/gcr-gnupg-renderer.c:430 +msgid "Value" +msgstr "విలువ" + +#: ../gcr/gcr-certificate-renderer.c:294 +msgid "Couldn't export the certificate." +msgstr "ధృవీకరణపత్రాన్ని ఎగుమతి చేయలేకపోతుంది." + +#: ../gcr/gcr-certificate-renderer.c:519 +#: ../gcr/gcr-certificate-request-renderer.c:313 +msgid "Identity" +msgstr "గుర్తింపు" + +#: ../gcr/gcr-certificate-renderer.c:523 +msgid "Verified by" +msgstr "ధృవీకరించినవారు" + +#: ../gcr/gcr-certificate-renderer.c:530 ../gcr/gcr-gnupg-renderer.c:718 +msgid "Expires" +msgstr "కాలంచెల్లేది" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:537 +#: ../gcr/gcr-certificate-request-renderer.c:319 +msgid "Subject Name" +msgstr "విషయం పేరు" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:542 +msgid "Issuer Name" +msgstr "ఇచ్చువాని పేరు" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:547 +msgid "Issued Certificate" +msgstr "ఇచ్చిన ధృవీకరణపత్రం" + +#: ../gcr/gcr-certificate-renderer.c:552 +#: ../gcr/gcr-certificate-request-renderer.c:330 +msgid "Version" +msgstr "రూపాంతరం" + +#: ../gcr/gcr-certificate-renderer.c:566 +msgid "Not Valid Before" +msgstr "ఇంతకు మునుపు చెల్లునదికాదు" + +#: ../gcr/gcr-certificate-renderer.c:571 +msgid "Not Valid After" +msgstr "తర్వాత చెల్లునది కాదు" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:576 +msgid "Certificate Fingerprints" +msgstr "ధృవీకరణపత్రం వేలిముద్రలు" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:582 +#: ../gcr/gcr-certificate-request-renderer.c:333 +#: ../gcr/gcr-certificate-request-renderer.c:379 +msgid "Public Key Info" +msgstr "పబ్లిక్ కీ సమాచారము" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:597 ../gcr/gcr-certificate-renderer.c:918 +#: ../gcr/gcr-certificate-request-renderer.c:349 +#: ../gcr/gcr-certificate-request-renderer.c:386 +#: ../gcr/gcr-gnupg-renderer.c:559 +msgid "Signature" +msgstr "సంతకము" + +#: ../gcr/gcr-certificate-renderer.c:864 +msgid "Key Algorithm" +msgstr "కీ అల్గారిథమ్" + +#: ../gcr/gcr-certificate-renderer.c:869 +msgid "Key Parameters" +msgstr "కీ పారామితులు" + +#: ../gcr/gcr-certificate-renderer.c:877 ../gcr/gcr-gnupg-renderer.c:352 +msgid "Key Size" +msgstr "కీ పరిమాణం" + +#: ../gcr/gcr-certificate-renderer.c:885 +msgid "Key SHA1 Fingerprint" +msgstr "కీ SHA1 వేలిముద్ర" + +#: ../gcr/gcr-certificate-renderer.c:890 ../gcr/gcr-gnupg-renderer.c:737 +#: ../gcr/gcr-key-renderer.c:414 ../gcr/gcr-parser.c:325 +msgid "Public Key" +msgstr "బహిరంగ కీ" + +#: ../gcr/gcr-certificate-renderer.c:907 +msgid "Signature Algorithm" +msgstr "సంతకపు అల్గారిథమ్" + +#: ../gcr/gcr-certificate-renderer.c:911 +msgid "Signature Parameters" +msgstr "సంతకం పారామితులు" + +#: ../gcr/gcr-certificate-renderer.c:960 +msgid "Critical" +msgstr "క్లిష్టమైనది" + +#: ../gcr/gcr-certificate-request.c:418 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:505 ../gcr/gcr-certificate-request.c:590 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "" + +#. The certificate request type +#: ../gcr/gcr-certificate-request-renderer.c:95 +#: ../gcr/gcr-certificate-request-renderer.c:308 +#: ../gcr/gcr-certificate-request-renderer.c:323 +#: ../gcr/gcr-certificate-request-renderer.c:366 +#: ../gcr/gcr-certificate-request-renderer.c:371 +msgid "Certificate request" +msgstr "యోగ్యతాపత్రం అభ్యర్థన" + +#: ../gcr/gcr-certificate-request-renderer.c:261 +msgid "Attribute" +msgstr "" + +#: ../gcr/gcr-certificate-request-renderer.c:265 +#: ../gcr/gcr-certificate-request-renderer.c:324 +#: ../gcr/gcr-certificate-request-renderer.c:372 +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:592 +msgid "Type" +msgstr "రకం" + +#: ../gcr/gcr-certificate-request-renderer.c:376 +msgid "Challenge" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "వివరాలు (_D)" + +#: ../gcr/gcr-failure-renderer.c:160 +#, c-format +msgid "Could not display '%s'" +msgstr "'%s' ప్రదర్శించబడదు" + +#: ../gcr/gcr-failure-renderer.c:162 +msgid "Could not display file" +msgstr "ఫైలును ప్రదర్శించుట వీలుకాదు" + +#: ../gcr/gcr-failure-renderer.c:167 +msgid "Reason" +msgstr "కారణం" + +#: ../gcr/gcr-failure-renderer.c:217 +#, c-format +msgid "Cannot display a file of this type." +msgstr "ఈ రకపు ఫైలు ప్రదర్శించబడదు." + +#: ../gcr/gcr-gnupg-importer.c:96 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "కీరింగును తెరవండి" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, fuzzy, c-format +msgid "GnuPG Keyring: %s" +msgstr "PGP కీ: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:328 +msgid "PGP Key" +msgstr "PGP కీ" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "కీ ఐడి" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg ప్రక్రియి ఈ కోడ్‌తో నిష్క్రమించింది: %d" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg ప్రక్రియి ఈ సిగ్నల్‌తో నిష్క్రమించింది: %d" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2424 +#: ../gcr/gcr-parser.c:2917 +msgid "The operation was cancelled" +msgstr "ఆపరేషన్ రద్దుచేయబడింది" + +#: ../gcr/gcr-gnupg-renderer.c:202 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:215 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +#, fuzzy +msgid "Sign" +msgstr "సంతకము" + +#: ../gcr/gcr-gnupg-renderer.c:219 +#, fuzzy +msgid "Certify" +msgstr "ధృవీకరణపత్రం" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Authenticate" +msgstr "ధృవీకరించు" + +#: ../gcr/gcr-gnupg-renderer.c:223 ../gcr/gcr-gnupg-renderer.c:258 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:254 ../gcr/gcr-gnupg-renderer.c:413 +#: ../gcr/gcr-key-renderer.c:433 ../gcr/gcr-key-renderer.c:438 +msgid "Unknown" +msgstr "తెలియదు" + +#: ../gcr/gcr-gnupg-renderer.c:256 +msgid "Invalid" +msgstr "చెల్లదు" + +#: ../gcr/gcr-gnupg-renderer.c:260 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +#, fuzzy +msgid "Expired" +msgstr "కాలంచెల్లేది" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:286 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:289 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:292 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:295 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:298 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:303 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:306 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:309 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:312 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:337 ../gcr/gcr-gnupg-renderer.c:563 +#, fuzzy +msgid "Key ID" +msgstr "కీ ఐడి" + +#: ../gcr/gcr-gnupg-renderer.c:345 ../gcr/gcr-gnupg-renderer.c:571 +#: ../gcr/gcr-gnupg-renderer.c:618 ../gcr/gcr-key-renderer.c:434 +msgid "Algorithm" +msgstr "అల్గారిథమ్" + +#: ../gcr/gcr-gnupg-renderer.c:360 ../gcr/gcr-gnupg-renderer.c:437 +#: ../gcr/gcr-gnupg-renderer.c:480 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:369 ../gcr/gcr-gnupg-renderer.c:446 +#: ../gcr/gcr-gnupg-renderer.c:489 +msgid "Expiry" +msgstr "కాలంచెల్లేది" + +#: ../gcr/gcr-gnupg-renderer.c:378 +msgid "Capabilities" +msgstr "సామర్థ్యాలు" + +#: ../gcr/gcr-gnupg-renderer.c:391 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:419 +msgid "Name" +msgstr "పేరు" + +#: ../gcr/gcr-gnupg-renderer.c:425 ../gcr/gcr-gnupg-renderer.c:707 +msgid "Comment" +msgstr "వ్యాఖ్య" + +#: ../gcr/gcr-gnupg-renderer.c:465 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:472 ../gcr/gcr-key-renderer.c:441 +msgid "Size" +msgstr "పరిమాణం" + +#: ../gcr/gcr-gnupg-renderer.c:507 +#, fuzzy +msgid "Signature of a binary document" +msgstr "సంతకం పారామితులు" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +#, fuzzy +msgid "Standalone signature" +msgstr "డిజిటల్ సంతకము" + +#: ../gcr/gcr-gnupg-renderer.c:513 +#, fuzzy +msgid "Generic certification of key" +msgstr "ధృవీకరణపత్నాన్ని అన్‌లాక్ చేయి" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +#, fuzzy +msgid "Signature directly on key" +msgstr "సంతకం పారామితులు" + +#: ../gcr/gcr-gnupg-renderer.c:527 +#, fuzzy +msgid "Key revocation signature" +msgstr "ఉపసంహరణ జాబితా సంతకం" + +#: ../gcr/gcr-gnupg-renderer.c:529 +#, fuzzy +msgid "Subkey revocation signature" +msgstr "ఉపసంహరణ జాబితా సంతకం" + +#: ../gcr/gcr-gnupg-renderer.c:531 +#, fuzzy +msgid "Certification revocation signature" +msgstr "ధృవీకరణపత్రం సంతకం" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Timestamp signature" +msgstr "కాలముద్ర సంతకము" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:588 ../gcr/gcr-gnupg-renderer.c:596 +msgid "Class" +msgstr "తరగతి" + +#: ../gcr/gcr-gnupg-renderer.c:590 +msgid "Local only" +msgstr "స్థానికం మాత్రమే" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:610 +#, fuzzy +msgid "Revocation Key" +msgstr "ఉపసంహరణ జాబితా సంతకం" + +#: ../gcr/gcr-gnupg-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:648 +#: ../gcr/gcr-gnupg-renderer.c:650 +msgid "Fingerprint" +msgstr "వేలిముద్ర" + +#: ../gcr/gcr-gnupg-renderer.c:739 +msgid "Public Subkey" +msgstr "బహిరంగ ఉపమీట" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Secret Key" +msgstr "రహస్య మీట" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:111 +msgid "Initializing..." +msgstr "మొదలుపెడుతోంది..." + +#: ../gcr/gcr-import-button.c:119 +msgid "Import is in progress..." +msgstr "దిగుమతి జరుగుతోంది..." + +#: ../gcr/gcr-import-button.c:126 +#, c-format +msgid "Imported to: %s" +msgstr "దీనికి దిగమతిచేయి: %s" + +#: ../gcr/gcr-import-button.c:146 +#, c-format +msgid "Import to: %s" +msgstr "దీనికి దిగమతిచేయి: %s" + +#: ../gcr/gcr-import-button.c:159 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:168 +#, fuzzy +msgid "No data to import" +msgstr "దీనికి దిగుమతి చేయుటకు ఏ స్థానము లభ్యతలో లేదు" + +#: ../gcr/gcr-key-renderer.c:89 +msgid "Key" +msgstr "కీ" + +#: ../gcr/gcr-key-renderer.c:403 +msgid "Private RSA Key" +msgstr "వ్యక్తిగత RSA కీ" + +#: ../gcr/gcr-key-renderer.c:405 +msgid "Private DSA Key" +msgstr "వ్యక్తిగత DSA కీ" + +#: ../gcr/gcr-key-renderer.c:407 ../gcr/gcr-parser.c:319 +msgid "Private Key" +msgstr "వ్యక్తిగత కీ" + +#: ../gcr/gcr-key-renderer.c:410 ../gcr/gcr-key-renderer.c:412 +msgid "Public DSA Key" +msgstr "బహిరంగ DSA కీ" + +#: ../gcr/gcr-key-renderer.c:421 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d బిట్" +msgstr[1] "%d బిట్లు" + +#: ../gcr/gcr-key-renderer.c:422 +msgid "Strength" +msgstr "ధృడత్వం" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:445 +msgid "Fingerprints" +msgstr "వేలిముద్రలు" + +#: ../gcr/gcr-key-renderer.c:449 +msgid "SHA1" +msgstr "SHA1" + +#: ../gcr/gcr-key-renderer.c:454 +msgid "SHA256" +msgstr "SHA256" + +#: ../gcr/gcr-parser.c:331 +#, fuzzy +msgid "Certificate Request" +msgstr "ధృవీకరణ ఫైళ్ళు" + +#: ../gcr/gcr-parser.c:2427 +msgid "Unrecognized or unsupported data." +msgstr "గుర్తించబడని లేదా సహకరించబడని డేటా." + +#: ../gcr/gcr-parser.c:2430 +msgid "Could not parse invalid or corrupted data." +msgstr "సరికాని లేదా పాడైన డేటాను పార్శ్ చేయలేకపోయింది" + +#: ../gcr/gcr-parser.c:2433 +msgid "The data is locked" +msgstr "డేటా లాక్ చేయబడింది" + +#: ../gcr/gcr-pkcs11-import-dialog.c:187 +msgid "Automatically chosen" +msgstr "స్వయంగా ఎంచుకోబడింది" + +#: ../gcr/gcr-pkcs11-import-dialog.c:271 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +#, fuzzy +msgid "In order to import, please enter the password." +msgstr "'%s' దిగుమతి చేయుటకు, అది అన్‌లాక్ చేయబడాలి" + +#. The password label +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 ../gcr/gcr-prompt-dialog.c:559 +msgid "Password:" +msgstr "సంకేతపదం:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "నామాంకం" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 ../gcr/gcr-unlock-renderer.c:71 +#: ../gcr/gcr-unlock-renderer.c:128 +msgid "Unlock" +msgstr "తాళంతీయి" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Label:" +msgstr "నామాంకం:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Import settings" +msgstr "దిగుమతి అమరికలు" + +#: ../gcr/gcr-prompt.c:218 +msgid "Continue" +msgstr "కొనసాగించు" + +#: ../gcr/gcr-prompt.c:227 +msgid "Cancel" +msgstr "రద్దుచేయి" + +#. The confirm label +#: ../gcr/gcr-prompt-dialog.c:576 +msgid "Confirm:" +msgstr "నిర్థారించు:" + +#: ../gcr/gcr-prompt-dialog.c:643 +msgid "Passwords do not match." +msgstr "" + +#: ../gcr/gcr-prompt-dialog.c:650 +msgid "Password cannot be blank" +msgstr "" + +#: ../gcr/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "" + +#: ../gcr/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "" + +#: ../gcr/gcr-system-prompt.c:749 +msgid "Another prompt is already in progress" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "గుర్తింపు ధృవీకరణపత్రమును నిల్వవుంచుటకు స్థానమును కనుగొనలేకపోతుంది" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "నేను లాగిన్ అయినప్పుడు స్వయంచాలకంగా ఈ కీరింగ్‌ను అన్‌లాక్ చేయి" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "నేను నిష్క్రమించినపుడు కీరింగును లాక్ చేయి" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "ఇంత సమయం తరువాత కీరింగును లాక్ చేయి" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "ఇంత సమయం వాడుకలో లేకుంటే కీరింగును లాక్ చేయి" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "నిమిషాలు" + +#: ../gcr/gcr-unlock-renderer.c:69 +#, c-format +msgid "Unlock: %s" +msgstr "అన్‌లాక్: %s" + +#: ../gcr/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "సంకేతపదం" + +#: ../gcr/gcr-unlock-renderer.c:278 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "'%s' యొక్క అంశాలు తాళంవేయబడివున్నాయి. అంశాలను చూడాలంటే, సరైన సంకేతపదాన్ని ప్రవేశపెట్టండి." + +#: ../gcr/gcr-unlock-renderer.c:281 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "అంశాలు తాళంవేయబడివున్నాయి. అంశాలను చూడాలంటే, సరైన సంకేతపదాన్ని ప్రవేశపెట్టండి." + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR ధృవీకరణపత్రం మరియు కీ వీక్షకం" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "అనువర్తనం యొక్క రూపాంతరాన్ని చూపించు" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[file...]" + +#: ../gcr/gcr-viewer-tool.c:103 +msgid "- View certificate and key files" +msgstr "- ధృవీకరణపత్రం మరియు కీ ఫైళ్ళను చూడు" + +#: ../gcr/gcr-viewer-tool.c:117 ../gcr/gcr-viewer-widget.c:635 +msgid "Certificate Viewer" +msgstr "ధృవీకరణపత్ర వీక్షకం" + +#: ../gcr/gcr-viewer-widget.c:203 +msgid "The password was incorrect" +msgstr "సంకేతపదము తప్పు" + +#: ../gcr/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "దిగమతించబడింది" + +#: ../gcr/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "దిగుమతి విఫలమైంది" + +#: ../gcr/gcr-viewer-window.c:108 +msgid "Import" +msgstr "దిగమతించు" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "అన్‌లాక్" diff --git a/po/tg.po b/po/tg.po new file mode 100644 index 0000000..03eb094 --- /dev/null +++ b/po/tg.po @@ -0,0 +1,1072 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Victor Ibragimov , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: Tajik Gnome\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2013-03-18 07:18+0000\n" +"PO-Revision-Date: 2013-01-19 18:39+0500\n" +"Last-Translator: Victor Ibragimov \n" +"Language-Team: \n" +"Language: tg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.5.4\n" +"X-Poedit-Bookmarks: -1,240,-1,-1,-1,-1,-1,-1,-1,-1\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../ui/gcr-gnupg-renderer.c:410 +#: ../ui/gcr-gnupg-renderer.c:579 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "Суроғаи почтаи электронӣ" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Ҷинс" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Номи оддӣ" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Насаб" + +#: ../egg/egg-oid.c:69 ../ui/gcr-certificate-renderer.c:556 +msgid "Serial Number" +msgstr "Рақами силсилавӣ" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Кишвар" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Маҳалли ҷойгиршавӣ" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Ноҳия" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Кӯча" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Ташкилот" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Унвон" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Рақами телефон" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Ному насаб" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../ui/gcr-gnupg-renderer.c:201 +#: ../ui/gcr-key-renderer.c:430 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../ui/gcr-gnupg-renderer.c:205 +#: ../ui/gcr-key-renderer.c:432 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:306 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "Ном" + +#: ../gcr/gcr-certificate.c:308 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Expires" +msgstr "Мӯҳлат" + +#: ../gcr/gcr-certificate.c:1131 ../gcr/gcr-parser.c:320 +#: ../ui/gcr-certificate-renderer.c:103 ../ui/gcr-certificate-exporter.c:469 +msgid "Certificate" +msgstr "Гувоҳинома" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 ../ui/gcr-gnupg-renderer.c:423 +#: ../ui/gcr-gnupg-renderer.c:705 +msgid "Email" +msgstr "Почтаи электронӣ" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "Суроғаи URI" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "Суроғаи IP" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:416 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "" + +#: ../gcr/gcr-certificate-request.c:503 ../gcr/gcr-certificate-request.c:588 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-parser.c:326 +#: ../ui/gcr-gnupg-renderer.c:89 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:874 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:928 ../gcr/gcr-parser.c:2422 +#: ../gcr/gcr-parser.c:2915 ../gcr/gcr-system-prompt.c:901 +msgid "The operation was cancelled" +msgstr "Амалиёт бекор шудааст." + +#: ../gcr/gcr-parser.c:317 ../ui/gcr-key-renderer.c:408 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-parser.c:323 ../ui/gcr-certificate-renderer.c:889 +#: ../ui/gcr-gnupg-renderer.c:738 ../ui/gcr-key-renderer.c:415 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-parser.c:329 +msgid "Certificate Request" +msgstr "" + +#: ../gcr/gcr-parser.c:2425 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2428 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2431 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-prompt.c:227 +msgid "Continue" +msgstr "Идома додан" + +#: ../gcr/gcr-prompt.c:236 +msgid "Cancel" +msgstr "Бекор кардан" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "" + +#: ../gcr/gcr-system-prompt.c:882 +msgid "Another prompt is already in progress" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:118 +msgid "Basic Constraints" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:120 +msgid "Certificate Authority" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:960 +msgid "Yes" +msgstr "Ҳа" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:960 +msgid "No" +msgstr "Не" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Max Path Length" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:125 +msgid "Unlimited" +msgstr "Бе маҳдудият" + +#: ../ui/gcr-certificate-renderer.c:144 +msgid "Extended Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:155 +msgid "Allowed Purposes" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Subject Key Identifier" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:176 +msgid "Key Identifier" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Digital signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Key encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Data encipherment" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Key agreement" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Certificate signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:192 +msgid "Revocation list signature" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Key Usage" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:218 +msgid "Usages" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:238 +msgid "Subject Alternative Names" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:265 +msgid "Extension" +msgstr "Пасванд" + +#: ../ui/gcr-certificate-renderer.c:269 +msgid "Identifier" +msgstr "Муайянкунанда" + +#: ../ui/gcr-certificate-renderer.c:270 +#: ../ui/gcr-certificate-request-renderer.c:271 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-gnupg-renderer.c:431 +msgid "Value" +msgstr "Қимат" + +#: ../ui/gcr-certificate-renderer.c:295 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:518 +#: ../ui/gcr-certificate-request-renderer.c:312 +msgid "Identity" +msgstr "Шахсият" + +#: ../ui/gcr-certificate-renderer.c:522 +msgid "Verified by" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:529 ../ui/gcr-gnupg-renderer.c:719 +msgid "Expires" +msgstr "Мӯҳлат" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:536 +#: ../ui/gcr-certificate-request-renderer.c:318 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:541 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:546 +msgid "Issued Certificate" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:551 +#: ../ui/gcr-certificate-request-renderer.c:329 +msgid "Version" +msgstr "Версия" + +#: ../ui/gcr-certificate-renderer.c:565 +msgid "Not Valid Before" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:570 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:575 +msgid "Certificate Fingerprints" +msgstr "" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:581 +#: ../ui/gcr-certificate-request-renderer.c:332 +#: ../ui/gcr-certificate-request-renderer.c:378 +msgid "Public Key Info" +msgstr "" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:596 ../ui/gcr-certificate-renderer.c:917 +#: ../ui/gcr-certificate-request-renderer.c:348 +#: ../ui/gcr-certificate-request-renderer.c:385 ../ui/gcr-gnupg-renderer.c:560 +msgid "Signature" +msgstr "Имзо" + +#: ../ui/gcr-certificate-renderer.c:863 +msgid "Key Algorithm" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:868 +msgid "Key Parameters" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:876 ../ui/gcr-gnupg-renderer.c:353 +msgid "Key Size" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:884 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:906 +msgid "Signature Algorithm" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:910 +msgid "Signature Parameters" +msgstr "" + +#: ../ui/gcr-certificate-renderer.c:959 +msgid "Critical" +msgstr "Танқидӣ" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:96 +#: ../ui/gcr-certificate-request-renderer.c:307 +#: ../ui/gcr-certificate-request-renderer.c:322 +#: ../ui/gcr-certificate-request-renderer.c:365 +#: ../ui/gcr-certificate-request-renderer.c:370 +msgid "Certificate request" +msgstr "" + +#: ../ui/gcr-certificate-request-renderer.c:260 +msgid "Attribute" +msgstr "" + +#: ../ui/gcr-certificate-request-renderer.c:264 +#: ../ui/gcr-certificate-request-renderer.c:323 +#: ../ui/gcr-certificate-request-renderer.c:371 ../ui/gcr-gnupg-renderer.c:591 +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Type" +msgstr "Навъ" + +#: ../ui/gcr-certificate-request-renderer.c:375 +msgid "Challenge" +msgstr "" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Тафсилот" + +#: ../ui/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../ui/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../ui/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "Сабаб" + +#: ../ui/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:203 +msgid "Elgamal" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Encrypt" +msgstr "Рамз гузоштан" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Sign" +msgstr "Имзо кардан" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Certify" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgid "Authenticate" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:224 ../ui/gcr-gnupg-renderer.c:259 +msgid "Disabled" +msgstr "Ғайрифаъол" + +#: ../ui/gcr-gnupg-renderer.c:255 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-key-renderer.c:434 ../ui/gcr-key-renderer.c:439 +msgid "Unknown" +msgstr "Номаълум" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgid "Invalid" +msgstr "Беэътимод" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Revoked" +msgstr "Бекоршуда" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Expired" +msgstr "Аз мӯҳлат гузашта" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Undefined trust" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Distrusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Marginally trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Fully trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:273 +msgid "Ultimately trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:287 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:290 +msgid "This key is invalid" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:293 +msgid "This key has been disabled" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:296 +msgid "This key has been revoked" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:299 +msgid "This key has expired" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:304 +msgid "This key is distrusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:307 +msgid "This key is marginally trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:310 +msgid "This key is fully trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:313 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:338 ../ui/gcr-gnupg-renderer.c:564 +msgid "Key ID" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:346 ../ui/gcr-gnupg-renderer.c:572 +#: ../ui/gcr-gnupg-renderer.c:619 ../ui/gcr-key-renderer.c:435 +msgid "Algorithm" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:361 ../ui/gcr-gnupg-renderer.c:438 +#: ../ui/gcr-gnupg-renderer.c:481 +msgid "Created" +msgstr "Эҷодшуда" + +#: ../ui/gcr-gnupg-renderer.c:370 ../ui/gcr-gnupg-renderer.c:447 +#: ../ui/gcr-gnupg-renderer.c:490 +msgid "Expiry" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:379 +msgid "Capabilities" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:392 +msgid "Owner trust" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:420 +msgid "Name" +msgstr "Ном" + +#: ../ui/gcr-gnupg-renderer.c:426 ../ui/gcr-gnupg-renderer.c:708 +msgid "Comment" +msgstr "Шарҳ" + +#: ../ui/gcr-gnupg-renderer.c:466 +msgid "User Attribute" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:473 ../ui/gcr-key-renderer.c:442 +msgid "Size" +msgstr "Андоза" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a binary document" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Standalone signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Generic certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Persona certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Casual certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Positive certification of key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Subkey binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Primary key binding signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Signature directly on key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Key revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Subkey revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Certification revocation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Timestamp signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:536 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:589 ../ui/gcr-gnupg-renderer.c:597 +msgid "Class" +msgstr "Синф" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Local only" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Exportable" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:611 +msgid "Revocation Key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:625 ../ui/gcr-gnupg-renderer.c:649 +#: ../ui/gcr-gnupg-renderer.c:651 +msgid "Fingerprint" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Public Subkey" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Key" +msgstr "" + +#: ../ui/gcr-gnupg-renderer.c:744 +msgid "Secret Subkey" +msgstr "" + +#: ../ui/gcr-import-button.c:112 +msgid "Initializing..." +msgstr "Омодасозӣ..." + +#: ../ui/gcr-import-button.c:120 +msgid "Import is in progress..." +msgstr "" + +#: ../ui/gcr-import-button.c:127 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../ui/gcr-import-button.c:147 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../ui/gcr-import-button.c:160 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../ui/gcr-import-button.c:169 +msgid "No data to import" +msgstr "" + +#: ../ui/gcr-key-renderer.c:90 +msgid "Key" +msgstr "Калид" + +#: ../ui/gcr-key-renderer.c:404 +msgid "Private RSA Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:406 +msgid "Private DSA Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:411 ../ui/gcr-key-renderer.c:413 +msgid "Public DSA Key" +msgstr "" + +#: ../ui/gcr-key-renderer.c:422 +#, fuzzy, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "32 бит" +msgstr[1] "" + +#: ../ui/gcr-key-renderer.c:423 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:446 +msgid "Fingerprints" +msgstr "" + +#: ../ui/gcr-key-renderer.c:450 +msgid "SHA1" +msgstr "" + +#: ../ui/gcr-key-renderer.c:455 +msgid "SHA256" +msgstr "" + +#: ../ui/gcr-pkcs11-import-dialog.c:188 +msgid "Automatically chosen" +msgstr "" + +#: ../ui/gcr-pkcs11-import-dialog.c:272 +#: ../ui/gcr-pkcs11-import-interaction.c:154 +#: ../ui/gcr-pkcs11-import-interaction.c:172 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:564 +msgid "Password:" +msgstr "Парол:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:72 +#: ../ui/gcr-unlock-renderer.c:127 +msgid "Unlock" +msgstr "Кушодан" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Барчасб:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:581 +msgid "Confirm:" +msgstr "Тасдиқ кардан:" + +#: ../ui/gcr-prompt-dialog.c:649 +msgid "Passwords do not match." +msgstr "Паролҳо мувофиқат намекунанд." + +#: ../ui/gcr-prompt-dialog.c:656 +msgid "Password cannot be blank" +msgstr "" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "A file already exists with this name." +msgstr "" + +#: ../ui/gcr-certificate-exporter.c:227 +msgid "Do you want to replace it with a new file?" +msgstr "" + +#: ../ui/gcr-certificate-exporter.c:233 +msgid "_Replace" +msgstr "_Ҷойгузин кардан" + +#: ../ui/gcr-certificate-exporter.c:264 +#, c-format +msgid "The operation was cancelled." +msgstr "Амалиёт бекор шудааст." + +#: ../ui/gcr-certificate-exporter.c:308 +msgid "Export certificate" +msgstr "" + +#: ../ui/gcr-certificate-exporter.c:320 +msgid "Certificate files" +msgstr "" + +#: ../ui/gcr-certificate-exporter.c:331 +msgid "PEM files" +msgstr "" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "дақиқа" + +#: ../ui/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "Кушодан: %s" + +#: ../ui/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "Парол" + +#: ../ui/gcr-unlock-renderer.c:277 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../ui/gcr-unlock-renderer.c:280 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../ui/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../ui/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "" + +#: ../ui/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[файл...]" + +#: ../ui/gcr-viewer-tool.c:105 +msgid "- View certificate and key files" +msgstr "" + +#: ../ui/gcr-viewer-tool.c:119 ../ui/gcr-viewer-widget.c:638 +msgid "Certificate Viewer" +msgstr "" + +#: ../ui/gcr-viewer-widget.c:204 +msgid "The password was incorrect" +msgstr "" + +#: ../ui/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "" + +#: ../ui/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "" + +#: ../ui/gcr-viewer-window.c:108 +msgid "Import" +msgstr "Воридот" diff --git a/po/th.po b/po/th.po new file mode 100644 index 0000000..c6a079c --- /dev/null +++ b/po/th.po @@ -0,0 +1,1132 @@ +# Thai translation for gnome-keyring. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Paisa Seeluangsawat , 2004. +# Theppitak Karoonboonyanan , 2005-2012. +# Akom Chotiphantawanon , 2013-2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2014-05-11 16:53+0000\n" +"PO-Revision-Date: 2014-06-19 15:48+0700\n" +"Last-Translator: Akom Chotiphantawanon \n" +"Language-Team: Thai \n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "องค์ประกอบโดเมน" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "ID ผู้ใช้" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "ที่อยู่อีเมล" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "วันเกิด" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "สถานที่เกิด" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "เพศ" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "สัญชาติ" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "ประเทศที่พำนัก" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "ชื่อสามัญ" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "นามสกุล" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "หมายเลขลำดับ" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "ประเทศ" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "ย่านที่อยู่" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "รัฐ" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "ถนน" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "องค์กร" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "หน่วยงานในองค์กร" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "ตำแหน่ง" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "หมายเลขโทรศัพท์" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "ชื่อ" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "ชื่อย่อ" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "คำระบุรุ่น" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN Qualifier" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "นามปากกา" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 โดยใช้ RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 โดยใช้ RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 โดยใช้ RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 โดยใช้ DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "เส้นโค้งเชิงวงรี" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 โดยใช้ ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 โดยใช้ ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 โดยใช้ ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 โดยใช้ ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 โดยใช้ ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "การยืนยันตัวบุคคลของแม่ข่าย" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "การยืนยันตัวบุคคลของลูกข่าย" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "การเซ็นกำกับโค้ด" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "การปกป้องอีเมล" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "การลงเวลา" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "เกิดข้อผิดพลาดขณะโหลดมอดูล PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "ไม่สามารถตั้งค่าเริ่มต้นมอดูล PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "ไม่สามารถตั้งค่าเริ่มต้นมอดูล PKCS#11 ที่ลงทะเบียนไว้: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "รหัสของ URI ไม่ถูกต้อง" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI ไม่ได้เป็นชนิด 'pkcs11'" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI มีรูปแบบที่ผิดไวยากรณ์" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI มีเลขรุ่นที่ใช้การไม่ได้" + +#: ../gcr/gcr-callback-output-stream.c:62 +#: ../gcr/gcr-callback-output-stream.c:79 +#, c-format +msgid "The stream was closed" +msgstr "สตรีมถูกปิดไปแล้ว" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "ชื่อ" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "ออกให้โดย" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "หมดอายุ" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "ใบรับรอง" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "ชื่ออื่น" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "ที่อยู่ XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "อีเมล" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "ที่อยู่ X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "ชื่อสารบบ" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "ชื่อภาคี EDI" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "ที่อยู่ไอพี" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID ที่ลงทะเบียนไว้" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "ไม่รองรับกุญแจชนิดนี้สำหรับคำร้องขอใบรับรอง" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "กุญแจนี้ไม่สามารถใช้เซ็นกำกับใบคำร้องได้" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "พวงกุญแจ GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "พวงกุญแจ GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "กุญแจ PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID กุญแจ" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "โพรเซส gnupg จบการทำงานด้วยรหัส: %d" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "โพรเซส gnupg จบการทำงานโดยสัญญาณ: %d" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2551 +#: ../gcr/gcr-parser.c:3157 ../gcr/gcr-system-prompt.c:924 +msgid "The operation was cancelled" +msgstr "การกระทำถูกยกเลิก" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "กุญแจส่วนตัว" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "กุญแจสาธารณะ" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "คำร้องขอใบรับรอง" + +#: ../gcr/gcr-parser.c:2554 +msgid "Unrecognized or unsupported data." +msgstr "ข้อมูลที่ไม่รู้จักหรือไม่รองรับ" + +#: ../gcr/gcr-parser.c:2557 +msgid "Could not parse invalid or corrupted data." +msgstr "ไม่สามารถแจงข้อมูลที่ผิดรูปแบบหรือเสียหาย" + +#: ../gcr/gcr-parser.c:2560 +msgid "The data is locked" +msgstr "ข้อมูลถูกล็อคอยู่" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "ทำต่อไป" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "ยกเลิก" + +#: ../gcr/gcr-subject-public-key.c:407 +msgid "Unrecognized or unavailable attributes for key" +msgstr "ไม่รู้จักหรือไม่มีแอตทริบิวต์สำหรับกุญแจ" + +#: ../gcr/gcr-subject-public-key.c:493 ../gcr/gcr-subject-public-key.c:579 +msgid "Couldn't build public key" +msgstr "ไม่สามารถสร้างกุญแจสาธารณะ" + +#: ../gcr/gcr-system-prompt.c:905 +msgid "Another prompt is already in progress" +msgstr "มีกล่องคำถามอื่นอยู่ระหว่างดำเนินการ" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:366 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "ไม่สามารถหาแหล่งที่จะเก็บใบรับรองที่ปักหมุดไว้" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "ข้อบังคับพื้นฐาน" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "องค์กรออกใบรับรอง" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "ใช่" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "ไม่" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "ความยาวพาธสูงสุด" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "ไม่จำกัด" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "การใช้งานกุญแจเพิ่มเติม" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "การใช้งานที่อนุญาต" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "ตัวระบุกุญแจของผู้รับการรับรอง" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "ตัวระบุกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "ลายเซ็นดิจิทัล" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "การเข้ารหัสลับกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "การเข้ารหัสลับข้อมูล" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "การตกลงเห็นพ้องของกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "ลายเซ็นกำกับใบรับรอง" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "ลายเซ็นกำกับรายการเพิกถอน" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "การใช้งานกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "การใช้งาน" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "ชื่ออื่นของผู้รับการรับรอง" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "ส่วนขยาย" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "ตัวระบุ" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "ค่า" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "ไม่สามารถส่งออกใบรับรอง" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "ชื่อ" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "ตรวจสอบโดย" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "หมดอายุ" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "ชื่อผู้รับการรับรอง" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "ชื่อผู้ออกให้" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "ใบรับรองที่ออก" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "รุ่น" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "ห้ามใช้ก่อน" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "ห้ามใช้หลัง" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "ลายนิ้วมือของใบรับรอง" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "ข้อมูลกุญแจสาธารณะ" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "ลายเซ็น" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "ส่งออกใบรับรอง…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "อัลกอริทึมของกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "พารามิเตอร์สำหรับกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "ขนาดกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "ลายนิ้วมือ SHA1 ของกุญแจ" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "อัลกอริทึมของลายเซ็น" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "พารามิเตอร์สำหรับลายเซ็น" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "วิกฤติ" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "คำร้องขอใบรับรอง" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "แอตทริบิวต์" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "ชนิด" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "คำท้า" + +#: ../ui/gcr-display-view.c:317 +msgid "_Details" +msgstr "_รายละเอียด" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "ไม่สามารถแสดง '%s'" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "ไม่สามารถแสดงแฟ้ม" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "เหตุผล" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "ไม่สามารถแสดงแฟ้มชนิดนี้" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "เข้ารหัสลับ" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "เซ็นกำกับ" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "รับรอง" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "ยืนยันตัวบุคคล" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "ปิดใช้งาน" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "ไม่ทราบ" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "ใช้ไม่ได้" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "ปิดใช้งาน" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "เพิกถอนแล้ว" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "หมดอายุ" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "ไม่กำหนดความเชื่อถือ" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "ไม่เชื่อถือ" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "เชื่อถือก้ำกึ่ง" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "เชื่อถือเต็มที่" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "เชื่อถือเต็มพิกัด" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "ข้อมูลในกุญแจนี้ยังไม่ผ่านการตรวจสอบ" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "กุญแจนี้ข้อมูลไม่ถูกต้อง" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "กุญแจนี้ถูกปิดใช้งาน" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "กุญแจนี้ถูกเพิกถอนแล้ว" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "กุญแจนี้หมดอายุแล้ว" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "กุญแจนี้ไม่ได้รับความเชื่อถือ" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "กุญแจนี้ได้รับความเชื่อถือแบบก้ำกึ่ง" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "กุญแจนี้ได้รับความเชื่อถือเต็มที่" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "กุญแจนี้ได้รับความเชื่อถือเต็มพิกัด" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID กุญแจ" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "อัลกอริทึม" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "วันสร้าง" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "วันหมดอายุ" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "การใช้งาน" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "ความน่าเชื่อถือของเจ้าของ" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "ชื่อ" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "หมายเหตุ" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "แอตทริบิวต์ของผู้ใช้" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "ขนาด" + +# Reference for signature classes: RFC4880 +# https://www.ietf.org/rfc/rfc4880.txt +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "ลายเซ็นของเอกสารไบนารี" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "ลายเซ็นของเอกสารข้อความตามแบบบัญญัติ" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "ลายเซ็น standalone" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "ใบรับรองทั่วไปของกุญแจ" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "ใบรับรองกุญแจตามที่เจ้าตัวแสดง" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "ใบรับรองกุญแจตามการตรวจสอบเล็กน้อย" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "ใบรับรองกุญแจแบบเชื่อถือ" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "ลายเซ็นพ่วงกุญแจย่อย" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "ลายเซ็นพ่วงกุญแจหลัก" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "ลายเซ็นบนกุญแจโดยตรง" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "ลายเซ็นเพิกถอนกุญแจ" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "ลายเซ็นเพิกถอนกุญแจย่อย" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "ลายเซ็นเพิกถอนใบรับรอง" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "ลายเซ็นกำกับการลงเวลา" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "ลายเซ็นยืนยันโดยบุคคลที่สาม" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "คลาส" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "ใช้ในเครื่องเท่านั้น" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "ส่งออกได้" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "กุญแจสำหรับเพิกถอน" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "ลายนิ้วมือ" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "กุญแจย่อยสาธารณะ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "กุญแจลับ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "กุญแจย่อยลับ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "กำลังตั้งค่าเริ่มต้น…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "กำลังนำเข้า…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "นำเข้าแล้วที่: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "นำเข้าสู่: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "ไม่สามารถนำเข้าเพราะไม่มีเครื่องมือนำเข้าที่เข้ากันได้" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "ไม่มีข้อมูลให้นำเข้า" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "กุญแจ" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "กุญแจ RSA ส่วนตัว" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "กุญแจ DSA ส่วนตัว" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "กุญแจเส้นโค้งเชิงวงรีส่วนตัว" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "กุญแจ DSA สาธารณะ" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "กุญแจเส้นโค้งเชิงวงรีสาธารณะ" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u บิต" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "ความแน่นหนา" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "ลายนิ้วมือ" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:502 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_ยกเลิก" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:505 +msgid "_OK" +msgstr "_ตกลง" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "เลือกโดยอัตโนมัติ" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "ผู้ใช้ยกเลิกปฏิบัติการ" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "เพื่อจะนำเข้า กรุณาป้อนรหัสผ่าน" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:563 +msgid "Password:" +msgstr "รหัสผ่าน:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "โทเคน:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "ปลดล็อค" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "ฉลาก:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "ตั้งค่าการนำเข้า" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:580 +msgid "Confirm:" +msgstr "ยืนยัน:" + +#: ../ui/gcr-prompt-dialog.c:648 +msgid "Passwords do not match." +msgstr "รหัสผ่านไม่ตรงกัน" + +#: ../ui/gcr-prompt-dialog.c:655 +msgid "Password cannot be blank" +msgstr "รหัสผ่านว่างเปล่าไม่ได้" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "คำถามก่อนเข้าถึง" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "ปลดล็อคการเข้าถึงรหัสผ่านและรหัสลับอื่นๆ" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "มีแฟ้มชื่อนี้อยู่ก่อนแล้ว" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "คุณต้องการเขียนทับหรือไม่?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "เขียน_ทับ" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "การกระทำถูกยกเลิก" + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "ส่งออกใบรับรอง" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_บันทึก" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "แฟ้มใบรับรอง" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "แฟ้ม PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "ปลดล็อคพวงกุญแจนี้โดยอัตโนมัติทุกครั้งที่ฉันเข้าระบบ" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "ล็อคพวงกุญแจนี้เมื่อออกจากระบบ" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "ล็อคพวงกุญแจนี้เมื่อเวลาผ่านไป" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "ล็อคพวงกุญแจนี้ถ้าเครื่องไม่มีการใช้งานเป็นเวลา" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "นาที" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "ปลดล็อค: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "รหัสผ่าน" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "เนื้อหาของ '%s' ถูกล็อคอยู่ หากต้องการดูเนื้อหา กรุณาป้อนรหัสผ่านที่ถูกต้อง" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "เนื้อหาถูกล็อคอยู่ หากต้องการดูเนื้อหา กรุณาป้อนรหัสผ่านที่ถูกต้อง" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "เครื่องมือแสดงใบรับรองและกุญแจของ GCR" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "แสดงรุ่นของโปรแกรม" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[แฟ้ม...]" + +#: ../ui/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "- ดูแฟ้มใบรับรองและกุญแจ" + +#: ../ui/gcr-viewer-tool.c:118 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "เครื่องมือแสดงใบรับรอง" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "รหัสผ่านไม่ถูกต้อง" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "นำเข้าแล้ว" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "นำเข้าไม่สำเร็จ" + +#: ../ui/gcr-viewer-window.c:107 +msgid "Import" +msgstr "นำเข้า" + +#: ../ui/gcr-viewer-window.c:116 +msgid "_Close" +msgstr "ปิ_ด" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "มอดูล PKCS#11 ไม่ถูกต้อง: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "ไม่สามารถตั้งค่ามอดูล PKCS#11: %s" + +#~ msgid "Label" +#~ msgstr "ฉลาก" diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..118c356 --- /dev/null +++ b/po/tr.po @@ -0,0 +1,1151 @@ +# Turkish translation of gnome-keyring. +# Copyright (C) 2004 THE gnome-keyring'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-keyring package. +# +# +# Gorkem Cetin , 2004. +# Görkem Çetin , 2004. +# Serdar CICEK , 2008. +# Baris Cicek , 2008, 2009. +# Necdet Yücel , 2015. +# Simge Sezgin , 2015. +# Muhammet Kara , 2011, 2014, 2015. +# Emin Tufan Çetin , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-02-22 19:17+0000\n" +"PO-Revision-Date: 2017-09-06 09:31+0300\n" +"Last-Translator: Emin Tufan Çetin \n" +"Language-Team: Türkçe \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Gtranslator 2.91.7\n" +"X-POOTLE-MTIME: 1420669651.000000\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Alan Bileşeni" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Kullanıcı Kimliği" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "E-posta Adresi" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Doğum Tarihi" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Doğum Yeri" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Cinsiyet" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Vatandaşlık Ülkesi" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Yerleşim Ülkesi" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Ortak Ad" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Soyadı" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Seri Numarası" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Ülke" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Yöre" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Eyalet" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Sokak" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Kurum" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Kurum Birimi" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Başlık" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Telefon Numarası" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Verilen Ad" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Başharfleri" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Üretim Belirteci" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN Belirteci" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Takma ad" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "RSA ile MD2" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "RSA ile MD5" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "RSA ile SHA1" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "DSA ile SHA1" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Eliptik Eğri" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "ECDSA ile SHA1" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "ECDSA ile SHA224" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "ECDSA ile SHA256" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "ECDSA ile SHA384" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "ECDSA ile SHA512" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Sunucu Kimlik Denetimi" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "İstemci Kimlik Denetimi" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Kod İmzalama" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "E-posta Koruma" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Zaman Damgalama" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 modulü yüklemede hata: %s" + +#: ../gck/gck-module.c:358 +#, c-format +#| msgid "Couldn't initialize PKCS#11 module: %s" +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "PKCS#11 modülü başlatılamadı: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +#| msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "Kayıtlı PKCS#11 modülleri başlatılamadı: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI geçersiz kodlamaya sahip." + +#: ../gck/gck-uri.c:228 +#| msgid "The URI does not have the 'pkcs11' scheme." +msgid "The URI does not have the “pkcs11” scheme." +msgstr "URI, “pkcs11” şemasına sahip değil." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI kötü sözdizimine sahip." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI kötü bir sürüm numarasına sahip." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Akış kapatıldı" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Ad" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Sertifika Veren" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Bitiş Tarihi" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Sertifika" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Diğer Ad" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Adresi" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS Sunucu" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "E-posta" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 Adresi" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Dizin Adı" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI Birim Adı" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP Adresi" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "Kayıtlı Kimlik" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Sertifika isteği için desteklenmeyen anahtar türü" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Anahtar isteği imzalamak için kullanılabilir değildir" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG Anahtarlığı" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG Anahtarlığı: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP Anahtarı" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "Anahtar Kimliği" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg süreci şu kod ile sonuçlandı: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg süreci sinyal ile sonlandırıldı: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "İşlem iptal edildi" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Özel Anahtar" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Genel Anahtar" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Sertifika İsteği" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Tanınmayan veya desteklenmeyen veri." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "Geçersiz veya bozuk veri çözümlenemedi." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Veri kilitli" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Devam et" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "İptal" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Anahtar için kullanılamaz ya da onaylanmamış öznitelikler" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +#| msgid "Couldn't build public key" +msgid "Couldn’t build public key" +msgstr "Genel anahtar oluşturulamadı" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Başka istek zaten devam ediyor" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +#| msgid "Couldn't find a place to store the pinned certificate" +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "Tutturulmuş sertifikayı saklamak için bir konum bulunamadı" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Temel Kısıtlar" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Sertifika Yetkilisi" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Evet" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Hayır" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Azami Yol Uzunluğu" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Sınırsız" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Uzatılmış Anahtar Kullanımı" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "İzin Verilen Amaçlar" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Konu Anahtar Tanımlayıcısı" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Anahtar Tanımlayıcı" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Sayısal imza" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Anahtar şifreleme" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Veri şifreleme" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Anahtar anlaşması" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Sertifika imzası" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "İptal Listesi İmzası" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Anahtar Kullanımı" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Kullanımlar" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Konu Diğer Adları" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Uzantı" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Tanımlayıcı" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Değer" + +#: ../ui/gcr-certificate-renderer.c:287 +#| msgid "Couldn't export the certificate." +msgid "Couldn’t export the certificate." +msgstr "Sertifika dışa aktarılamadı." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Kimlik" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Doğrulayan" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Bitiş Tarihi" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Konu Adı" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Veren Adı" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Verilen Sertifika" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Sürüm" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Öncesi Geçerli Değil" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Sonrası Geçerli Değil" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Sertifika Parmakizleri" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Genel Anahtar Bilgisi" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "İmza" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Sertifikayı Dışarı Aktar…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Anahtar Algoritması" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Anahtar Parametreleri" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Anahtar Boyutu" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Anahtar SHA1 Parmakizi" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "İmza Algoritması" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "İmza Parametreleri" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Kritik" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Sertifika talebi" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Öznitelik" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Tür" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Kimlik Sorma" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "_Ayrıntılar" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +#| msgid "Could not display '%s'" +msgid "Could not display “%s”" +msgstr "“%s” gösterilemedi" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Dosya gösterilemedi" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Sebep" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Bu tür bir dosya gösteril emiyor." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Şifrele" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "İmzala" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Onayla" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Kimlik Doğrula" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Devre Dışı" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Bilinmeyen" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Geçersiz" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Devre Dışı" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Feshedilmiş" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Süresi Dolmuş" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Tanımsız güven" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Güvenilmez" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Kısmi güvenilir" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Tam güvenilir" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Sınırsız güvenilir" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Bu anahtardaki bilgi henüz doğrulanmamıştır" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Anahtar geçersiz" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Anahtar devre dışı bırakıldı" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Anahtar iptal edildi" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Bu anahtarın süresi doldu" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Bu anahtar güvenilir anahtar değildir" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Bu anahtar kısmi güvenilir anahtardır" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Bu anahtar tam güvenilir anahtardır" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Bu anahtar sınırsız güvenilir anahtardır" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "Anahtar Kimliği" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Algoritma" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Oluşturuldu" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Bitiş" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Yetenekler" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Sahip güvenilirliği" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Ad" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Yorum" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Kullanıcı Özniteliği" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Boyut" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "İkili bir belgenin imzası" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Standart metin belgesi imzası" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Bağımsız imza" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Genel anahtar sertifikası" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Kişisel anahtar sertifikası" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Anahtar için rastgele sertifika" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Olumlu anahtar belgelendirme" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Alt anahtar bağlama imzası" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Birincil anahtar bağlama imzası" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Anahtar üzerindeki doğrudan imza" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Anahtar iptal imzası" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Alt Anahtar iptal imzası" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Sertifika iptal imzası" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Zaman damgası imzası" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Üçüncü parti onaylama imzası" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Sınıf" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Yalnızca yerel" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Dışarı aktarılabilir" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "İptal Anahtarı" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Parmak izi" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Açık Alt Anahtar" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Gizli Anahtar" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Gizli Alt Anahtar" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Başlatılıyor…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "İçe aktarma işlemi devam ediyor…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "İçine aktarıldı: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "İçeri aktar: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "" +"İçeri aktarma işlemi uyumlu içeri aktarıcı olmadığından dolayı yapılamıyor" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "İçeri aktarılacak veri yok" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Anahtar" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "RSA Gizli Anahtarı" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "DSA Gizli Anahtarı" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Özel Eliptik Eğri Anahtarı" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "DSA Genel Anahtarı" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Genel Eliptik Eğri Anahtarı" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Güç" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Parmak izleri" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "_Vazgeç" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "_Tamam" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Kendiliğinden seçilmiş" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Kullanıcı işlemi iptal etti" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Lütfen içeri aktarmak için parola girin." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Parola:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "İşaret:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Kilidini kaldır" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Etiket:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "İçeri Aktarma ayarları" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Onayla:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Parolalar eşleşmiyor." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Parola boş bırakılamaz" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Erişim Ekranı" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Parolalar ve diğer gizli bilgiler için erişim kilidini kaldır" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Bu adda bir dosya zaten var." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Yeni bir dosya ile değiştirmek istiyor musunuz?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Değiştir" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "İşlem iptal edildi." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Sertifikayı Dışa Aktar" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Kaydet" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Sertifika dosyaları" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM dosyaları" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +#| msgid "Automatically unlock this keyring whenever I'm logged in" +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "Her oturum açtığımda, bu anahtarlığın kilidini kendiliğinden kaldır" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Oturumu kapattığımda bu anahtarlığı kilitle" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Bu anahtarlığı şu kadar sonra kilitle" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Bu anahtarlığı şu kadar süre boştaysa kilitle" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "dakika" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Kilidi kaldır: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Parola" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +#| msgid "" +#| "The contents of '%s' are locked. In order to view the contents, enter the " +#| "correct password." +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"“%s” içeriği kilitlendi. İçeriği görüntülemek için doğru parolayı girin." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "İçerikler kilitlendi. İçeriği görüntülemek için doğru parolayı girin." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR Sertifika ve Anahtar Görüntüleyici" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Uygulamanın sürümünü göster" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[dosya...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Sertifika ve anahtar dosyaların görüntüle" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Sertifika Görüntüleyici" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Parola hatalı" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "İçe aktarıldı" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "İçe aktarma başarısız oldu" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "İçe Aktar" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "Kapa_t" + +#, fuzzy +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Dosya silinemedi: %s" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Kilidini kaldır" diff --git a/po/ug.po b/po/ug.po new file mode 100644 index 0000000..bb74235 --- /dev/null +++ b/po/ug.po @@ -0,0 +1,1074 @@ +# Uyghur translation for gnome-keyring. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Gheyret Kenji,2010. +# Sahran , 2010. +# Zeper , 2010. +# Oghlan Temkin ,2011 +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2013-02-22 13:04+0000\n" +"PO-Revision-Date: 2013-03-07 20:34+0900\n" +"Last-Translator: Gheyret Kenji \n" +"Language-Team: Uyghur Computer Science Association \n" +"Language: ug\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "دائىرە دېتالى" + +#: ../egg/egg-oid.c:43 ../ui/gcr-gnupg-renderer.c:410 +#: ../ui/gcr-gnupg-renderer.c:579 +msgid "User ID" +msgstr "ئىشلەتكۈچى ID" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "ئېلخەت ئادرېسلىرى" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "تۇغۇلغان ۋاقتى" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "تۇغۇلغان ئورنى" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "جىنسى" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "دۆلەت تەۋەلىكى" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "تۇرۇۋاتقان دۆلىتى" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "ئادەتتىكى ئات" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "تەگات" + +#: ../egg/egg-oid.c:69 ../ui/gcr-certificate-renderer.c:556 +msgid "Serial Number" +msgstr "تەرتىپ نومۇرى" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "دۆلەت" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "ئورۇن" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "ھالەت" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "كوچا" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "ئورگان" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "ئىدارىسى" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "ماۋزۇ" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "تېلېفون نومۇرى" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "بېرىلگەن ئاتى" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "قىسقارتىلمىسى" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "مەشغۇلات چەكلىگۈچى" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "DN چەكلىگۈچى" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "تەخەللۇسى" + +#: ../egg/egg-oid.c:98 ../ui/gcr-gnupg-renderer.c:201 +#: ../ui/gcr-key-renderer.c:430 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 بىلەن شىفىرلانغانRSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 بىلەن شىفىرلانغانRSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 بىلەن شىفىرلانغانRSA" + +#: ../egg/egg-oid.c:103 ../ui/gcr-gnupg-renderer.c:205 +#: ../ui/gcr-key-renderer.c:432 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 بىلەن شىفىرلانغانDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "مۇلازىمېتىر ئىسپاتنامىسى" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "خېرىدار ئىسپاتنامىسى‏" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "كود ئىمزاسى" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "ئېلخەت قوغداش" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "ۋاقىت تامغىسى" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "PKCS#11 بۆلىكىنى ئوقۇشتا خاتالىق كۆرۈلدى: %s" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "ئىناۋەتسىز PKCS#11 بۆلىكى: %s" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "PKCS#11 بۆلىكىنى ئورناتقىلى بولمىدى: %s" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "PKCS#11 بۆلىكىنى دەسلەپلەشتۈرۈشكە بولمىدى: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "خەتلىتىلگەن PKCS#11 بۆلىكىنى دەسلەپلەشتۈرۈشكە بولمىدى: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "مەزكۇر URI نىڭ كودلىنىشى ئىناۋەتسىز." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "مەزكۇر URI نىڭ ‹pkcs11› لايىھىسى يوق." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "مەزكۇر URI نىڭ گرامماتىكىسى توغرا ئەمەس." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "مەزكۇر URI نىڭ نەشر نومۇرى توغرا ئەمەس." + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "مەزكۇر ئېقىم يېپىلغان" + +#. later +#. later +#: ../gcr/gcr-certificate.c:306 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "ئاتى" + +#: ../gcr/gcr-certificate.c:308 +msgctxt "column" +msgid "Issued By" +msgstr "تارقاتقۇچى" + +#. later +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Expires" +msgstr "ۋاقتى ئۆتتى" + +#: ../gcr/gcr-certificate.c:1131 ../gcr/gcr-parser.c:320 +#: ../ui/gcr-certificate-renderer.c:103 ../ui/gcr-certificate-exporter.c:469 +msgid "Certificate" +msgstr "گۇۋاھنامە" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "باشقا ئاتلار" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:204 ../ui/gcr-gnupg-renderer.c:423 +#: ../ui/gcr-gnupg-renderer.c:705 +msgid "Email" +msgstr "ئېلخەت" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "X400 ئادرېسى" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "مۇندەرىجە ئاتى" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "EDI باشقا ئاتى" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "‍IP ئادرېس:" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "خەتلەتكەن كىملىكى" + +#: ../gcr/gcr-certificate-request.c:416 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "گۇۋاھنامە ئىلتىماسىنىڭ ئاچقۇچ تىپىنى قوللىمايدۇ" + +#: ../gcr/gcr-certificate-request.c:503 ../gcr/gcr-certificate-request.c:588 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "ئىلتىماسقا ئىمزا قويۇشتا بۇ ئاچقۇچنى ئىشلەتكىلى بولمايدۇ" + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "GnuPG ئاچقۇچ ھالقىسى" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG ئاچقۇچ ھالقىسى: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-parser.c:326 +#: ../ui/gcr-gnupg-renderer.c:89 +msgid "PGP Key" +msgstr "PGP ئاچقۇچ" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "ئاچقۇچ كىملىكى" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg ئىجراسى ئاخىرلاشتى، ئاخىرلىشىش كودى: %d" + +#: ../gcr/gcr-gnupg-process.c:874 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg ئىجراسى توختىدى، توختاش كودى: %d" + +#: ../gcr/gcr-gnupg-process.c:928 ../gcr/gcr-parser.c:2422 +#: ../gcr/gcr-parser.c:2915 ../gcr/gcr-system-prompt.c:902 +msgid "The operation was cancelled" +msgstr "مەشغۇلاتتىن ۋاز كەچتى" + +#: ../gcr/gcr-parser.c:317 ../ui/gcr-key-renderer.c:408 +msgid "Private Key" +msgstr "مەخپىي ئاچقۇچ" + +#: ../gcr/gcr-parser.c:323 ../ui/gcr-certificate-renderer.c:889 +#: ../ui/gcr-gnupg-renderer.c:738 ../ui/gcr-key-renderer.c:415 +msgid "Public Key" +msgstr "ئاممىۋى شىفىرلىق ئاچقۇچ" + +#: ../gcr/gcr-parser.c:329 +msgid "Certificate Request" +msgstr "گۇۋاھنامە ئىلتىماسى" + +#: ../gcr/gcr-parser.c:2425 +msgid "Unrecognized or unsupported data." +msgstr "تونۇتۇلمىغان ياكى قوللىمايدىغان تەپسىلات" + +#: ../gcr/gcr-parser.c:2428 +msgid "Could not parse invalid or corrupted data." +msgstr "ئىناۋەتسىز ياكى بۇزۇلغان سانلىق-مەلۇماتنى تەھلىل قىلالمىدى." + +#: ../gcr/gcr-parser.c:2431 +msgid "The data is locked" +msgstr "مەلۇمات قۇلۇپلاقلىق" + +#: ../gcr/gcr-prompt.c:227 +msgid "Continue" +msgstr "داۋاملاشتۇر" + +#: ../gcr/gcr-prompt.c:236 +msgid "Cancel" +msgstr "ئەمەلدىن قالدۇر" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "ئاچقۇچنىڭ خاسلىقى نامەلۇم ياكى ئىشلەتكىلى بولمايدۇ" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "ئاممىۋى ئاچقۇچ ھاسىللىغىلى بولمىدى" + +#: ../gcr/gcr-system-prompt.c:883 +msgid "Another prompt is already in progress" +msgstr "باشقا بىر كۆرسەتمە كۆرسىتىلىۋاتىدۇ" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "قادالغان گۇۋاھنامىنى ساقلايدىغان ئورۇننى تاپالمىدى" + +#: ../ui/gcr-certificate-renderer.c:118 +msgid "Basic Constraints" +msgstr "ئاساسىي چەكلىمىلەر" + +#: ../ui/gcr-certificate-renderer.c:120 +msgid "Certificate Authority" +msgstr "گۇۋاھنامە ئىجازىتى" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:960 +msgid "Yes" +msgstr "ھەئە" + +#: ../ui/gcr-certificate-renderer.c:121 ../ui/gcr-certificate-renderer.c:960 +msgid "No" +msgstr "ياق" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Max Path Length" +msgstr "يولنىڭ ئەڭ چوڭ ئۇزۇنلۇقى" + +#: ../ui/gcr-certificate-renderer.c:125 +msgid "Unlimited" +msgstr "چەكسىز" + +#: ../ui/gcr-certificate-renderer.c:144 +msgid "Extended Key Usage" +msgstr "كېڭەيتىلمە شىفىرلىق ئاچقۇچ دائىرىسى" + +#: ../ui/gcr-certificate-renderer.c:155 +msgid "Allowed Purposes" +msgstr "ئىجازەت بېرىلگەن ئىشلىتىش ئورۇنلىرى" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Subject Key Identifier" +msgstr "باش تېما ئاچقۇچ كىملىكى" + +#: ../ui/gcr-certificate-renderer.c:176 +msgid "Key Identifier" +msgstr "ئاچقۇچ كىملىكى" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Digital signature" +msgstr "رەقەملىك ئىمزا" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Key encipherment" +msgstr "ئاچقۇچ شىفىرى" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Data encipherment" +msgstr "سانلىق-مەلۇمات شىفىرى" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Key agreement" +msgstr "ئاچقۇچ كېلىشىمى" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Certificate signature" +msgstr "گۇۋاھنامە ئىمزاسى" + +#: ../ui/gcr-certificate-renderer.c:192 +msgid "Revocation list signature" +msgstr "ئىناۋەتسىز تىزىمنىڭ ئىمزاسى" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Key Usage" +msgstr "ئاچقۇچنىڭ ئىشلىتىلىشى" + +#: ../ui/gcr-certificate-renderer.c:218 +msgid "Usages" +msgstr "ئىشلىتىشى" + +#: ../ui/gcr-certificate-renderer.c:238 +msgid "Subject Alternative Names" +msgstr "تېمىنىڭ زاپاس ئاتى" + +#: ../ui/gcr-certificate-renderer.c:265 +msgid "Extension" +msgstr "كېڭەيتىلمە" + +#: ../ui/gcr-certificate-renderer.c:269 +msgid "Identifier" +msgstr "بەلگە" + +#: ../ui/gcr-certificate-renderer.c:270 +#: ../ui/gcr-certificate-request-renderer.c:271 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-gnupg-renderer.c:431 +msgid "Value" +msgstr "قىممەت" + +#: ../ui/gcr-certificate-renderer.c:295 +msgid "Couldn't export the certificate." +msgstr "گۇۋاھنامىنى ئېكسپورت قىلغىلى بولمىدى" + +#: ../ui/gcr-certificate-renderer.c:518 +#: ../ui/gcr-certificate-request-renderer.c:312 +msgid "Identity" +msgstr "سالاھىيەت" + +#: ../ui/gcr-certificate-renderer.c:522 +msgid "Verified by" +msgstr "دەلىللىگۈچى" + +#: ../ui/gcr-certificate-renderer.c:529 ../ui/gcr-gnupg-renderer.c:719 +msgid "Expires" +msgstr "ۋاقتى ئۆتتى" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:536 +#: ../ui/gcr-certificate-request-renderer.c:318 +msgid "Subject Name" +msgstr "تېما ئاتى" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:541 +msgid "Issuer Name" +msgstr "تارقاتقۇچى ئاتى" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:546 +msgid "Issued Certificate" +msgstr "تارقاتقان گۇۋاھنامە" + +#: ../ui/gcr-certificate-renderer.c:551 +#: ../ui/gcr-certificate-request-renderer.c:329 +msgid "Version" +msgstr "نەشرى" + +#: ../ui/gcr-certificate-renderer.c:565 +msgid "Not Valid Before" +msgstr "بۇندىن بۇرۇن ئىناۋەتسىز" + +#: ../ui/gcr-certificate-renderer.c:570 +msgid "Not Valid After" +msgstr "بۇندىن كېيىن ئىناۋەتسىز" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:575 +msgid "Certificate Fingerprints" +msgstr "گۇۋاھنامە بارماق ئىزى" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:581 +#: ../ui/gcr-certificate-request-renderer.c:332 +#: ../ui/gcr-certificate-request-renderer.c:378 +msgid "Public Key Info" +msgstr "ئاممىۋى ئاچقۇچ ئۇچۇرى" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:596 ../ui/gcr-certificate-renderer.c:917 +#: ../ui/gcr-certificate-request-renderer.c:348 +#: ../ui/gcr-certificate-request-renderer.c:385 ../ui/gcr-gnupg-renderer.c:560 +msgid "Signature" +msgstr "ئىمزا" + +#: ../ui/gcr-certificate-renderer.c:863 +msgid "Key Algorithm" +msgstr "ئاچقۇچ ئالگورىزىمى" + +#: ../ui/gcr-certificate-renderer.c:868 +msgid "Key Parameters" +msgstr "شىفىرلىق ئاچقۇچ پارامېتىرى" + +#: ../ui/gcr-certificate-renderer.c:876 ../ui/gcr-gnupg-renderer.c:353 +msgid "Key Size" +msgstr "شىفىرلىق ئاچقۇچ چوڭلۇقى" + +#: ../ui/gcr-certificate-renderer.c:884 +msgid "Key SHA1 Fingerprint" +msgstr "SHA1 ئاچقۇچىنىڭ بارماق ئىزى" + +#: ../ui/gcr-certificate-renderer.c:906 +msgid "Signature Algorithm" +msgstr "ئىمزا ئالگورىزىمى" + +#: ../ui/gcr-certificate-renderer.c:910 +msgid "Signature Parameters" +msgstr "ئىمزا پارامېتىرى" + +#: ../ui/gcr-certificate-renderer.c:959 +msgid "Critical" +msgstr "ئاچقۇچلۇق" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:96 +#: ../ui/gcr-certificate-request-renderer.c:307 +#: ../ui/gcr-certificate-request-renderer.c:322 +#: ../ui/gcr-certificate-request-renderer.c:365 +#: ../ui/gcr-certificate-request-renderer.c:370 +msgid "Certificate request" +msgstr "گۇۋاھنامە ئىلتىماسى" + +#: ../ui/gcr-certificate-request-renderer.c:260 +msgid "Attribute" +msgstr "خاسلىق" + +#: ../ui/gcr-certificate-request-renderer.c:264 +#: ../ui/gcr-certificate-request-renderer.c:323 +#: ../ui/gcr-certificate-request-renderer.c:371 ../ui/gcr-gnupg-renderer.c:591 +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Type" +msgstr "تىپى" + +#: ../ui/gcr-certificate-request-renderer.c:375 +msgid "Challenge" +msgstr "تەۋەككۈل قىل" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "تەپسىلاتلار(_D)" + +#: ../ui/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "‹%s› نى كۆرسەتكىلى بولمىدى" + +#: ../ui/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "ھۆججەتنى كۆرسەتكىلى بولمىدى" + +#: ../ui/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "سەۋەب" + +#: ../ui/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "بۇ تىپتىكى ھۆججەتنى كۆرسەتكىلى بولمايدۇ" + +#: ../ui/gcr-gnupg-renderer.c:203 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Encrypt" +msgstr "شىفىر" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Sign" +msgstr "ئىمزا" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Certify" +msgstr "ئىسپاتلاش" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgid "Authenticate" +msgstr "كىملىك دەلىللەش" + +#: ../ui/gcr-gnupg-renderer.c:224 ../ui/gcr-gnupg-renderer.c:259 +msgid "Disabled" +msgstr "ئىناۋەتسىز قىلىنغان" + +#: ../ui/gcr-gnupg-renderer.c:255 ../ui/gcr-gnupg-renderer.c:414 +#: ../ui/gcr-key-renderer.c:434 ../ui/gcr-key-renderer.c:439 +msgid "Unknown" +msgstr "نامەلۇم" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgid "Invalid" +msgstr "ئىناۋەتسىز" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Revoked" +msgstr "بىكار قىلىنغان" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Expired" +msgstr "ۋاقتى ئوتكەن" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Undefined trust" +msgstr "ئېنىق بولمىغان ئىشەنچ" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Distrusted" +msgstr "گۇمانلىق" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Marginally trusted" +msgstr "ئازراق ئىشەنچلىك" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Fully trusted" +msgstr "تولۇق ئىشەنچلىك" + +#: ../ui/gcr-gnupg-renderer.c:273 +msgid "Ultimately trusted" +msgstr "ئاخىرغىچە ئىشەنچلىك" + +#: ../ui/gcr-gnupg-renderer.c:287 +msgid "The information in this key has not yet been verified" +msgstr "مەزكۇر ئاچقۇچتىكى ئۇچۇرلار تېخى تەكشۈرۈلمىگەن" + +#: ../ui/gcr-gnupg-renderer.c:290 +msgid "This key is invalid" +msgstr "مەزكۇر ئاچقۇچ ئىناۋەتسىز" + +#: ../ui/gcr-gnupg-renderer.c:293 +msgid "This key has been disabled" +msgstr "مەزكۇر ئاچقۇچ ئىناۋەتسىز قىلىنغان" + +#: ../ui/gcr-gnupg-renderer.c:296 +msgid "This key has been revoked" +msgstr "مەزكۇر ئاچقۇچ بىكار قىلىنغان" + +#: ../ui/gcr-gnupg-renderer.c:299 +msgid "This key has expired" +msgstr "مەزكۇر ئاچقۇچنىڭ ۋاقتى ئوتكەن" + +#: ../ui/gcr-gnupg-renderer.c:304 +msgid "This key is distrusted" +msgstr "مەزكۇر ئاچقۇچ گۇمانلىق" + +#: ../ui/gcr-gnupg-renderer.c:307 +msgid "This key is marginally trusted" +msgstr "مەزكۇر ئاچقۇچ ئازراق ئىشەنچلىك" + +#: ../ui/gcr-gnupg-renderer.c:310 +msgid "This key is fully trusted" +msgstr "مەزكۇر ئاچقۇچ تولۇق ئىشەنچلىك" + +#: ../ui/gcr-gnupg-renderer.c:313 +msgid "This key is ultimately trusted" +msgstr "مەزكۇر ئاچقۇچ ئاخىرغىچە ئىشەنچلىك" + +#: ../ui/gcr-gnupg-renderer.c:338 ../ui/gcr-gnupg-renderer.c:564 +msgid "Key ID" +msgstr "ئاچقۇچ كىملىكى" + +#: ../ui/gcr-gnupg-renderer.c:346 ../ui/gcr-gnupg-renderer.c:572 +#: ../ui/gcr-gnupg-renderer.c:619 ../ui/gcr-key-renderer.c:435 +msgid "Algorithm" +msgstr "ئالگورىزىم" + +#: ../ui/gcr-gnupg-renderer.c:361 ../ui/gcr-gnupg-renderer.c:438 +#: ../ui/gcr-gnupg-renderer.c:481 +msgid "Created" +msgstr "قۇرغان ۋاقتى" + +#: ../ui/gcr-gnupg-renderer.c:370 ../ui/gcr-gnupg-renderer.c:447 +#: ../ui/gcr-gnupg-renderer.c:490 +msgid "Expiry" +msgstr "ئىناۋەتلىك ۋاقتى" + +#: ../ui/gcr-gnupg-renderer.c:379 +msgid "Capabilities" +msgstr "ئىقتىدارى" + +#: ../ui/gcr-gnupg-renderer.c:392 +msgid "Owner trust" +msgstr "ئىگىسىنىڭ ئىشەنچى" + +#: ../ui/gcr-gnupg-renderer.c:420 +msgid "Name" +msgstr "ئاتى" + +#: ../ui/gcr-gnupg-renderer.c:426 ../ui/gcr-gnupg-renderer.c:708 +msgid "Comment" +msgstr "ئىزاھات" + +#: ../ui/gcr-gnupg-renderer.c:466 +msgid "User Attribute" +msgstr "ئىشلەتكۈچى خاسلىقى" + +#: ../ui/gcr-gnupg-renderer.c:473 ../ui/gcr-key-renderer.c:442 +msgid "Size" +msgstr "چوڭلۇقى" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a binary document" +msgstr "ئىككىلىك پۈتۈكنىڭ ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Signature of a canonical text document" +msgstr "كانونىكال(canonical) تېكىست پۈتۈكىنىڭ ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Standalone signature" +msgstr "تەنھا ئىمزا" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Generic certification of key" +msgstr "ئاچقۇچنىڭ ئادەتتىكى گۇۋاھنامىسى" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Persona certification of key" +msgstr "ئاچقۇچنىڭ Persona گۇۋاھنامىسى" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Casual certification of key" +msgstr "ئاچقۇچنىڭ ۋاقىتلىق گۇۋاھنامىسى" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Positive certification of key" +msgstr "ئاچقۇچنىڭ ئىشەنچلىك گۇۋاھنامىسى" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Subkey binding signature" +msgstr "تارماق ئاچقۇچنىڭ باغلاش ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Primary key binding signature" +msgstr "ئاساسىي ئاچقۇچنىڭ باغلاش ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Signature directly on key" +msgstr "ئاچقۇچقا بىۋاسىتە قويۇش" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Key revocation signature" +msgstr "ئاچقۇچنى بىكار قىلىش ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Subkey revocation signature" +msgstr "تاماق ئاچقۇچنى بىكار قىلىش ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Certification revocation signature" +msgstr "گۇۋاھنامىنى بىكار قىلىش ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Timestamp signature" +msgstr "ۋاقىت-چېسلا ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:536 +msgid "Third-party confirmation signature" +msgstr "ئۈچىنچى تەرەپ تەھقىقلەش ئىمزاسى" + +#: ../ui/gcr-gnupg-renderer.c:589 ../ui/gcr-gnupg-renderer.c:597 +msgid "Class" +msgstr "تىپ" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Local only" +msgstr "يەرلىكلا" + +#: ../ui/gcr-gnupg-renderer.c:593 +msgid "Exportable" +msgstr "چىقارغىلى بولىدۇ" + +#: ../ui/gcr-gnupg-renderer.c:611 +msgid "Revocation Key" +msgstr "بىكار قىلىش ئاچقۇچى" + +#: ../ui/gcr-gnupg-renderer.c:625 ../ui/gcr-gnupg-renderer.c:649 +#: ../ui/gcr-gnupg-renderer.c:651 +msgid "Fingerprint" +msgstr "بارماق ئىزى" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Public Subkey" +msgstr "ئاممىۋى تارماق ئاچقۇچ" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Key" +msgstr "مەخپىي ئاچقۇچ" + +#: ../ui/gcr-gnupg-renderer.c:744 +msgid "Secret Subkey" +msgstr "مەخپىي تارماق ئاچقۇچ" + +#: ../ui/gcr-import-button.c:112 +msgid "Initializing..." +msgstr "دەسلەپلەشتۈرۈۋاتىدۇ…" + +#: ../ui/gcr-import-button.c:120 +msgid "Import is in progress..." +msgstr "ئىمپورت قىلىنىۋاتىدۇ…" + +#: ../ui/gcr-import-button.c:127 +#, c-format +msgid "Imported to: %s" +msgstr "بۇنىڭغا ئىمپورت قىلىندى: %s" + +#: ../ui/gcr-import-button.c:147 +#, c-format +msgid "Import to: %s" +msgstr "بۇنىڭغا ئىمپورت قىلىنىدۇ: %s" + +#: ../ui/gcr-import-button.c:160 +msgid "Cannot import because there are no compatible importers" +msgstr "ماس كېلىدىغان ئىمپورت قىلغۇچ بولمىغاچقا ئىمپورت قىلغىلى بولمىدى" + +#: ../ui/gcr-import-button.c:169 +msgid "No data to import" +msgstr "ئىمپورت قىلىدىغان سانلىق-مەلۇمات يوق" + +#: ../ui/gcr-key-renderer.c:90 +msgid "Key" +msgstr "ئاچقۇچ" + +#: ../ui/gcr-key-renderer.c:404 +msgid "Private RSA Key" +msgstr "RSA شەخسىي ئاچقۇچى" + +#: ../ui/gcr-key-renderer.c:406 +msgid "Private DSA Key" +msgstr "DSA شەخسىي ئاچقۇچى" + +#: ../ui/gcr-key-renderer.c:411 ../ui/gcr-key-renderer.c:413 +msgid "Public DSA Key" +msgstr "DSA ئاممىۋى ئاچقۇچ" + +#: ../ui/gcr-key-renderer.c:422 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d بىت" + +#: ../ui/gcr-key-renderer.c:423 +msgid "Strength" +msgstr "كۈچلۈكلۈك" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:446 +msgid "Fingerprints" +msgstr "بارماق ئىزلىرى" + +#: ../ui/gcr-key-renderer.c:450 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:455 +msgid "SHA256" +msgstr "SHA256" + +#: ../ui/gcr-pkcs11-import-dialog.c:188 +msgid "Automatically chosen" +msgstr "ئاپتوماتىك تاللانغان" + +#: ../ui/gcr-pkcs11-import-dialog.c:272 +#: ../ui/gcr-pkcs11-import-interaction.c:154 +#: ../ui/gcr-pkcs11-import-interaction.c:172 +#, c-format +msgid "The user cancelled the operation" +msgstr "ئىشلەتكۈچى مەشغۇلاتنى ئەمەلدىن قالدۇردى" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "ئىمپورت قىلىش ئۈچۈن ئىم كىرگۈزۈڭ:" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:564 +msgid "Password:" +msgstr "ئىم:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "ماياق:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:72 +#: ../ui/gcr-unlock-renderer.c:127 +msgid "Unlock" +msgstr "قۇلۇپسىزلا" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "ئەن:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "ئىمپورت قىلىش تەڭشەكلىرى" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:581 +msgid "Confirm:" +msgstr "جەزملەش:" + +#: ../ui/gcr-prompt-dialog.c:649 +msgid "Passwords do not match." +msgstr "ئىم ماس كەلمىدى." + +#: ../ui/gcr-prompt-dialog.c:656 +msgid "Password cannot be blank" +msgstr "ئىم قۇرۇق بولسا بولمايدۇ" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "زىيارەت كۆرسەتمىسى" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "ئىم ۋە باشقا مەخپىيەتلىكلەرنى زىيارەت قىلىش ئۈچۈن قۇلۇپسىزلا" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "A file already exists with this name." +msgstr "بۇنداق ئاتتىكى ھۆججەت مەۋجۇت." + +#: ../ui/gcr-certificate-exporter.c:227 +msgid "Do you want to replace it with a new file?" +msgstr "ئۇنى يېڭى ھۆججەت بىلەن ئالماشتۇرسۇنمۇ؟" + +#: ../ui/gcr-certificate-exporter.c:233 +msgid "_Replace" +msgstr "ئالماشتۇر(_R)" + +#: ../ui/gcr-certificate-exporter.c:264 +#, c-format +msgid "The operation was cancelled." +msgstr "مەشغۇلاتتىن ۋاز كەچتى." + +#: ../ui/gcr-certificate-exporter.c:308 +msgid "Export certificate" +msgstr "گۇۋاھنامىنى ئېكسپورت قىلىش" + +#: ../ui/gcr-certificate-exporter.c:320 +msgid "Certificate files" +msgstr "گۇۋاھنامە ھۆججەتلىرى" + +#: ../ui/gcr-certificate-exporter.c:331 +msgid "PEM files" +msgstr "PEM ھۆججەتلىرى" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "تىزىمغا كىرگەن ۋاقتىمدا بۇ ئاچقۇچ ھالقىسى ھەمىشە قۇلۇپسىزلانسۇن" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "تىزىمدىن چىققان ۋاقىتتا ئاچقۇچ ھالقىسىنى قۇلۇپلا" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "بۇ ئاچقۇچ ھالقىسىنى قۇلۇپلا" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "بوش قالغان ۋاقىتتا ئاچقۇچ ھالقىسىنى قۇلۇپلا" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "مىنۇت" + +#: ../ui/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "قۇلۇپسىزلا: %s" + +#: ../ui/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "ئىم" + +#: ../ui/gcr-unlock-renderer.c:277 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "‹%s› نىڭ مەزمۇنى قۇلۇپلانغان. مەزمۇننى كۆرۈش ئۈچۈن توغرا بولغان ئىمنى كىرگۈزۈڭ." + +#: ../ui/gcr-unlock-renderer.c:280 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "مەزكۇر مەزمۇن قۇلۇپلانغان. مەزمۇننى كۆرۈش ئۈچۈن توغرا بولغان ئىمنى كىرگۈزۈڭ." + +#: ../ui/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR گۇۋاھنامە ۋە ئاچقۇچ كۆرگۈ" + +#: ../ui/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "پروگراممىنىڭ نەشرىنى كۆرسەت" + +#: ../ui/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[ھۆججەت…]" + +#: ../ui/gcr-viewer-tool.c:105 +msgid "- View certificate and key files" +msgstr "- گۇۋاھنامە ۋە ئاچقۇچ ھۆججىتىنى كۆرۈش" + +#: ../ui/gcr-viewer-tool.c:119 ../ui/gcr-viewer-widget.c:638 +msgid "Certificate Viewer" +msgstr "گۇۋاھنامە كۆرگۈ" + +#: ../ui/gcr-viewer-widget.c:204 +msgid "The password was incorrect" +msgstr "ئىم توغرا ئەمەس" + +#: ../ui/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "ئەكىردى" + +#: ../ui/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "ئىمپورت قىلىش مەغلۇپ بولدى" + +#: ../ui/gcr-viewer-window.c:108 +msgid "Import" +msgstr "ئىمپورت قىل" + +#~ msgid "Unlock" +#~ msgstr "قۇلۇپ ئاچ" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..5bb5e6a --- /dev/null +++ b/po/uk.po @@ -0,0 +1,1085 @@ +# Ukrainian translation for gnome-keyring +# Copyright (C) 2003 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Maxim Dzumanenko , 2004-2008 +# Korostil Daniel , 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-07 21:59+0300\n" +"PO-Revision-Date: 2012-09-11 07:08-0700\n" +"Last-Translator: Daniel \n" +"Language-Team: translation@linux.org.ua\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Virtaal 0.7.0\n" +"X-Project-Style: gnome\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "Область назв" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:409 +#: ../gcr/gcr-gnupg-renderer.c:578 +msgid "User ID" +msgstr "Ідентифікатор користувача" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "Електронна адреса" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "Дата народження" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "Місце народження" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "Стать" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "Громадянство" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "Країна проживання" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "Звичайне ім'я" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "Прізвище" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:557 +msgid "Serial Number" +msgstr "Серійний номер" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "Країна" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "Місцевість" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "Область" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "Вулиця" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "Організація" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "Підрозділ" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "Назва" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "Номер телефону" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "Ім'я" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "Ініціали" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "Позначка покоління" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "Позначка розрізнюваного мені" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "Псевдонім" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:200 +#: ../gcr/gcr-key-renderer.c:429 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "MD2 з ключем RSA" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "MD5 з ключем RSA" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "SHA1 з ключем RSA" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:204 +#: ../gcr/gcr-key-renderer.c:431 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "SHA1 з ключем DSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "Автентифікація сервера" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "Автентифікація клієнта" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "Підписування коду" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "Захист пошти" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "Часове штампування" + +#: ../gck/gck-module.c:352 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Помилка завантаження модуля PKCS#11: %s" + +#: ../gck/gck-module.c:359 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "Неправильний модуль PKCS#11: %s" + +#: ../gck/gck-module.c:368 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "Неможливо налаштувати PKCS#11: %s" + +#: ../gck/gck-module.c:384 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Неможливо запустити модуль PKCS#11: %s" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Неможливо запустити зареєстровані модулі PKCS#11: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI має неправильне кодування." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI не має схеми «pkcs11»." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI має незграбний синтаксис." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI має поганий номер версії." + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "Потік закрито" + +#. later +#. later +#: ../gcr/gcr-certificate.c:308 ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Name" +msgstr "Назва" + +#: ../gcr/gcr-certificate.c:310 +msgctxt "column" +msgid "Issued By" +msgstr "Виданий" + +#. later +#: ../gcr/gcr-certificate.c:312 +msgctxt "column" +msgid "Expires" +msgstr "Строк" + +#: ../gcr/gcr-certificate.c:1133 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:102 ../gcr/gcr-parser.c:322 +msgid "Certificate" +msgstr "Сертифікат" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" +"Файл з такою назвою вже існує.\n" +"\n" +"Замінити його новим файлом?" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "_Замінити" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "Операцію скасовано." + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "Експортувати сертифікат" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "Файли сертифікатів" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "Файли PEM" + +#: ../gcr/gcr-certificate-extensions.c:178 +msgid "Other Name" +msgstr "Інші назви" + +#: ../gcr/gcr-certificate-extensions.c:188 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:192 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:204 ../gcr/gcr-gnupg-renderer.c:422 +#: ../gcr/gcr-gnupg-renderer.c:704 +msgid "Email" +msgstr "Пошта" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "X400 Address" +msgstr "Адреса X400" + +#: ../gcr/gcr-certificate-extensions.c:227 +msgid "Directory Name" +msgstr "Назва каталогу" + +#: ../gcr/gcr-certificate-extensions.c:235 +msgid "EDI Party Name" +msgstr "Часткова назва EDI" + +#: ../gcr/gcr-certificate-extensions.c:242 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:250 +msgid "IP Address" +msgstr "Адреса IP" + +#: ../gcr/gcr-certificate-extensions.c:258 +msgid "Registered ID" +msgstr "Зареєстрований ID" + +#: ../gcr/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Основні обмеження" + +#: ../gcr/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Видавець сертифіката" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "Yes" +msgstr "Так" + +#: ../gcr/gcr-certificate-renderer.c:120 ../gcr/gcr-certificate-renderer.c:961 +msgid "No" +msgstr "Ні" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Максимальна довжина шляху" + +#: ../gcr/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Необмежено" + +#: ../gcr/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Розширене використання ключа" + +#: ../gcr/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Дозволені цілі" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Ідентифікатор ключа теми" + +#: ../gcr/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Ідентифікатор ключа" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Цифровий підпис" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Шифрування ключа" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Шифрування даних" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Договір ключа" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Підпис сертифіката" + +#: ../gcr/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Анулювання підпису списку" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Використання ключа" + +#: ../gcr/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Використання" + +#: ../gcr/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Альтернативні назви тем" + +#: ../gcr/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Розширення" + +#: ../gcr/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Ідентифікатор" + +#: ../gcr/gcr-certificate-renderer.c:269 +#: ../gcr/gcr-certificate-request-renderer.c:272 +#: ../gcr/gcr-gnupg-renderer.c:413 ../gcr/gcr-gnupg-renderer.c:430 +msgid "Value" +msgstr "Значення" + +#: ../gcr/gcr-certificate-renderer.c:294 +msgid "Couldn't export the certificate." +msgstr "Неможливо експортувати сертифікат." + +#: ../gcr/gcr-certificate-renderer.c:519 +#: ../gcr/gcr-certificate-request-renderer.c:313 +msgid "Identity" +msgstr "Профіль" + +#: ../gcr/gcr-certificate-renderer.c:523 +msgid "Verified by" +msgstr "Перевірено" + +#: ../gcr/gcr-certificate-renderer.c:530 ../gcr/gcr-gnupg-renderer.c:718 +msgid "Expires" +msgstr "Строк дії" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:537 +#: ../gcr/gcr-certificate-request-renderer.c:319 +msgid "Subject Name" +msgstr "Ім'я отримувача" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:542 +msgid "Issuer Name" +msgstr "Ім'я видавця" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:547 +msgid "Issued Certificate" +msgstr "Виданий сертифікат" + +#: ../gcr/gcr-certificate-renderer.c:552 +#: ../gcr/gcr-certificate-request-renderer.c:330 +msgid "Version" +msgstr "Версія" + +#: ../gcr/gcr-certificate-renderer.c:566 +msgid "Not Valid Before" +msgstr "Не дійсний до" + +#: ../gcr/gcr-certificate-renderer.c:571 +msgid "Not Valid After" +msgstr "Не дійсний після" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:576 +msgid "Certificate Fingerprints" +msgstr "Відбитки сертифікатів" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:582 +#: ../gcr/gcr-certificate-request-renderer.c:333 +#: ../gcr/gcr-certificate-request-renderer.c:379 +msgid "Public Key Info" +msgstr "Інформація про відкритий ключ" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:597 ../gcr/gcr-certificate-renderer.c:918 +#: ../gcr/gcr-certificate-request-renderer.c:349 +#: ../gcr/gcr-certificate-request-renderer.c:386 +#: ../gcr/gcr-gnupg-renderer.c:559 +msgid "Signature" +msgstr "Підпис" + +#: ../gcr/gcr-certificate-renderer.c:864 +msgid "Key Algorithm" +msgstr "Алгоритм ключа" + +#: ../gcr/gcr-certificate-renderer.c:869 +msgid "Key Parameters" +msgstr "Параметри ключа" + +#: ../gcr/gcr-certificate-renderer.c:877 ../gcr/gcr-gnupg-renderer.c:352 +msgid "Key Size" +msgstr "Розмір ключа" + +#: ../gcr/gcr-certificate-renderer.c:885 +msgid "Key SHA1 Fingerprint" +msgstr "Відбиток ключа SHA1" + +#: ../gcr/gcr-certificate-renderer.c:890 ../gcr/gcr-gnupg-renderer.c:737 +#: ../gcr/gcr-key-renderer.c:414 ../gcr/gcr-parser.c:325 +msgid "Public Key" +msgstr "Публічний ключ" + +#: ../gcr/gcr-certificate-renderer.c:907 +msgid "Signature Algorithm" +msgstr "Алгоритм підпису" + +#: ../gcr/gcr-certificate-renderer.c:911 +msgid "Signature Parameters" +msgstr "Параметри підпису" + +#: ../gcr/gcr-certificate-renderer.c:960 +msgid "Critical" +msgstr "Критичний" + +#: ../gcr/gcr-certificate-request.c:418 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Непідтримуваний тип ключа для запиту сертифіката" + +#: ../gcr/gcr-certificate-request.c:505 ../gcr/gcr-certificate-request.c:590 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Ключ неможливо використати для підписання запиту" + +#. The certificate request type +#: ../gcr/gcr-certificate-request-renderer.c:95 +#: ../gcr/gcr-certificate-request-renderer.c:308 +#: ../gcr/gcr-certificate-request-renderer.c:323 +#: ../gcr/gcr-certificate-request-renderer.c:366 +#: ../gcr/gcr-certificate-request-renderer.c:371 +msgid "Certificate request" +msgstr "Запит сертифіката" + +#: ../gcr/gcr-certificate-request-renderer.c:261 +msgid "Attribute" +msgstr "Атрибут" + +#: ../gcr/gcr-certificate-request-renderer.c:265 +#: ../gcr/gcr-certificate-request-renderer.c:324 +#: ../gcr/gcr-certificate-request-renderer.c:372 +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:592 +msgid "Type" +msgstr "Тип" + +#: ../gcr/gcr-certificate-request-renderer.c:376 +msgid "Challenge" +msgstr "Випробування" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "П_одробиці" + +#: ../gcr/gcr-failure-renderer.c:160 +#, c-format +msgid "Could not display '%s'" +msgstr "Неможливо показати «%s»" + +#: ../gcr/gcr-failure-renderer.c:162 +msgid "Could not display file" +msgstr "Неможливо показати файл" + +#: ../gcr/gcr-failure-renderer.c:167 +msgid "Reason" +msgstr "Причина" + +#: ../gcr/gcr-failure-renderer.c:217 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Неможливо показати файл цього типу." + +#: ../gcr/gcr-gnupg-importer.c:96 +msgid "GnuPG Keyring" +msgstr "Сховище ключів GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:98 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Сховище ключів GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:145 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:328 +msgid "PGP Key" +msgstr "Ключ PGP" + +#: ../gcr/gcr-gnupg-key.c:434 +msgctxt "column" +msgid "Key ID" +msgstr "Ідентифікатор ключа" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Процес Gnupg покинуто з кодом: %d" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Процес Gnupg завершено зі сигналом: %d" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2424 +#: ../gcr/gcr-parser.c:2917 +msgid "The operation was cancelled" +msgstr "Операцію скасовано" + +#: ../gcr/gcr-gnupg-renderer.c:202 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../gcr/gcr-gnupg-renderer.c:215 +msgid "Encrypt" +msgstr "Зашифрувати" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Sign" +msgstr "Підписати" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Certify" +msgstr "Сертифікувати" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Authenticate" +msgstr "Автентифікувати" + +#: ../gcr/gcr-gnupg-renderer.c:223 ../gcr/gcr-gnupg-renderer.c:258 +msgid "Disabled" +msgstr "Вимкнено" + +#: ../gcr/gcr-gnupg-renderer.c:254 ../gcr/gcr-gnupg-renderer.c:413 +#: ../gcr/gcr-key-renderer.c:433 ../gcr/gcr-key-renderer.c:438 +msgid "Unknown" +msgstr "Невідомо" + +#: ../gcr/gcr-gnupg-renderer.c:256 +msgid "Invalid" +msgstr "Неправильно" + +#: ../gcr/gcr-gnupg-renderer.c:260 +msgid "Revoked" +msgstr "Відкликано" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Expired" +msgstr "Вичерпано" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Undefined trust" +msgstr "Невизначена довіра" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Distrusted" +msgstr "Сумнівна довіра" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Marginally trusted" +msgstr "Неповну довіра" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Fully trusted" +msgstr "Повну довіра" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Ultimately trusted" +msgstr "Безмежна довіра" + +#: ../gcr/gcr-gnupg-renderer.c:286 +msgid "The information in this key has not yet been verified" +msgstr "Інформацію в цьому ключі ще не перевірено" + +#: ../gcr/gcr-gnupg-renderer.c:289 +msgid "This key is invalid" +msgstr "Цей ключ неправильний" + +#: ../gcr/gcr-gnupg-renderer.c:292 +msgid "This key has been disabled" +msgstr "Цей ключ вимкнено" + +#: ../gcr/gcr-gnupg-renderer.c:295 +msgid "This key has been revoked" +msgstr "Цей ключ відкинуто" + +#: ../gcr/gcr-gnupg-renderer.c:298 +msgid "This key has expired" +msgstr "Цей ключ вичерпано" + +#: ../gcr/gcr-gnupg-renderer.c:303 +msgid "This key is distrusted" +msgstr "Цей ключ є підозрілим" + +#: ../gcr/gcr-gnupg-renderer.c:306 +msgid "This key is marginally trusted" +msgstr "Цей ключ частково довірений" + +#: ../gcr/gcr-gnupg-renderer.c:309 +msgid "This key is fully trusted" +msgstr "Цей ключ повністю довірений" + +#: ../gcr/gcr-gnupg-renderer.c:312 +msgid "This key is ultimately trusted" +msgstr "Цей ключ однозначно довірено" + +#: ../gcr/gcr-gnupg-renderer.c:337 ../gcr/gcr-gnupg-renderer.c:563 +msgid "Key ID" +msgstr "Ідентифікатор ключа" + +#: ../gcr/gcr-gnupg-renderer.c:345 ../gcr/gcr-gnupg-renderer.c:571 +#: ../gcr/gcr-gnupg-renderer.c:618 ../gcr/gcr-key-renderer.c:434 +msgid "Algorithm" +msgstr "Алгоритм" + +#: ../gcr/gcr-gnupg-renderer.c:360 ../gcr/gcr-gnupg-renderer.c:437 +#: ../gcr/gcr-gnupg-renderer.c:480 +msgid "Created" +msgstr "Створено" + +#: ../gcr/gcr-gnupg-renderer.c:369 ../gcr/gcr-gnupg-renderer.c:446 +#: ../gcr/gcr-gnupg-renderer.c:489 +msgid "Expiry" +msgstr "Строк" + +#: ../gcr/gcr-gnupg-renderer.c:378 +msgid "Capabilities" +msgstr "Можливості" + +#: ../gcr/gcr-gnupg-renderer.c:391 +msgid "Owner trust" +msgstr "Довіра до власника" + +#: ../gcr/gcr-gnupg-renderer.c:419 +msgid "Name" +msgstr "Назва" + +#: ../gcr/gcr-gnupg-renderer.c:425 ../gcr/gcr-gnupg-renderer.c:707 +msgid "Comment" +msgstr "Коментар" + +#: ../gcr/gcr-gnupg-renderer.c:465 +msgid "User Attribute" +msgstr "Атрибут користувача" + +#: ../gcr/gcr-gnupg-renderer.c:472 ../gcr/gcr-key-renderer.c:441 +msgid "Size" +msgstr "Розмір" + +#: ../gcr/gcr-gnupg-renderer.c:507 +msgid "Signature of a binary document" +msgstr "Підпис бінарного документа" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a canonical text document" +msgstr "Підпис текстового документа" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Standalone signature" +msgstr "Самостійний підпис" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Generic certification of key" +msgstr "Загальний сертифікат ключа" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Persona certification of key" +msgstr "Особистий сертифікат ключа" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Casual certification of key" +msgstr "Нерегулярний сертифікат ключ" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Positive certification of key" +msgstr "Певний сертифікат ключа" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Subkey binding signature" +msgstr "Підпис в'язки підключа" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Primary key binding signature" +msgstr "Основний підпис в'язки ключа " + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Signature directly on key" +msgstr "Підпис прямо на ключі" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Key revocation signature" +msgstr "Анулювальний підпис ключа" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Subkey revocation signature" +msgstr "Анулювальний підпис підключа" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Certification revocation signature" +msgstr "Анулювальний підпис сертифіката" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Timestamp signature" +msgstr "Підпис часового штампу" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Third-party confirmation signature" +msgstr "Підпис підтвердження третьою стороною" + +#: ../gcr/gcr-gnupg-renderer.c:588 ../gcr/gcr-gnupg-renderer.c:596 +msgid "Class" +msgstr "Клас" + +#: ../gcr/gcr-gnupg-renderer.c:590 +msgid "Local only" +msgstr "Лише локальні" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Exportable" +msgstr "Експортні " + +#: ../gcr/gcr-gnupg-renderer.c:610 +msgid "Revocation Key" +msgstr "Анулювальний ключ" + +#: ../gcr/gcr-gnupg-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:648 +#: ../gcr/gcr-gnupg-renderer.c:650 +msgid "Fingerprint" +msgstr "Відбитки" + +#: ../gcr/gcr-gnupg-renderer.c:739 +msgid "Public Subkey" +msgstr "Відкритий підключ" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Secret Key" +msgstr "Таємний ключ" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Subkey" +msgstr "Таємний підключ" + +#: ../gcr/gcr-import-button.c:111 +msgid "Initializing..." +msgstr "Започаткування…" + +#: ../gcr/gcr-import-button.c:119 +msgid "Import is in progress..." +msgstr "Імпортування триває…" + +#: ../gcr/gcr-import-button.c:126 +#, c-format +msgid "Imported to: %s" +msgstr "Імпортовано у: %s" + +#: ../gcr/gcr-import-button.c:146 +#, c-format +msgid "Import to: %s" +msgstr "Імпортувати у: %s" + +#: ../gcr/gcr-import-button.c:159 +msgid "Cannot import because there are no compatible importers" +msgstr "Неможливо імпортувати, бо немає сумісного імпортера" + +#: ../gcr/gcr-import-button.c:168 +msgid "No data to import" +msgstr "Немає даних для імпортування" + +#: ../gcr/gcr-key-renderer.c:89 +msgid "Key" +msgstr "Ключ" + +#: ../gcr/gcr-key-renderer.c:403 +msgid "Private RSA Key" +msgstr "Закритий ключ RSA" + +#: ../gcr/gcr-key-renderer.c:405 +msgid "Private DSA Key" +msgstr "Закритий ключ DSA" + +#: ../gcr/gcr-key-renderer.c:407 ../gcr/gcr-parser.c:319 +msgid "Private Key" +msgstr "Закритий ключ" + +#: ../gcr/gcr-key-renderer.c:410 ../gcr/gcr-key-renderer.c:412 +msgid "Public DSA Key" +msgstr "Відкритий ключ DSA" + +#: ../gcr/gcr-key-renderer.c:421 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "%d біт" +msgstr[1] "%d біти" +msgstr[2] "%d бітів" + +#: ../gcr/gcr-key-renderer.c:422 +msgid "Strength" +msgstr "Міцність" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:445 +msgid "Fingerprints" +msgstr "Відбитки" + +#: ../gcr/gcr-key-renderer.c:449 +msgid "SHA1" +msgstr "SHA1" + +#: ../gcr/gcr-key-renderer.c:454 +msgid "SHA256" +msgstr "SHA256" + +#: ../gcr/gcr-parser.c:331 +msgid "Certificate Request" +msgstr "Запит сертифіката" + +#: ../gcr/gcr-parser.c:2427 +msgid "Unrecognized or unsupported data." +msgstr "Нерозпізнані чи непідтримувані дані." + +#: ../gcr/gcr-parser.c:2430 +msgid "Could not parse invalid or corrupted data." +msgstr "Не вдалось розібрати некоректні чи пошкоджені дані." + +#: ../gcr/gcr-parser.c:2433 +msgid "The data is locked" +msgstr "Дані заблоковано" + +#: ../gcr/gcr-pkcs11-import-dialog.c:187 +msgid "Automatically chosen" +msgstr "Автоматично вибрати" + +#: ../gcr/gcr-pkcs11-import-dialog.c:271 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "Користувач скасував операцію" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Введіть пароль, щоб імпортувати." + +#. The password label +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 ../gcr/gcr-prompt-dialog.c:559 +msgid "Password:" +msgstr "Пароль:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Ознака:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "Мітка" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 ../gcr/gcr-unlock-renderer.c:71 +#: ../gcr/gcr-unlock-renderer.c:128 +msgid "Unlock" +msgstr "Розблокувати" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Label:" +msgstr "Мітка:" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Import settings" +msgstr "Імпортувати параметри" + +#: ../gcr/gcr-prompt.c:218 +msgid "Continue" +msgstr "Продовжити" + +#: ../gcr/gcr-prompt.c:227 +msgid "Cancel" +msgstr "Скасувати" + +#. The confirm label +#: ../gcr/gcr-prompt-dialog.c:576 +msgid "Confirm:" +msgstr "Підтвердження:" + +#: ../gcr/gcr-prompt-dialog.c:643 +msgid "Passwords do not match." +msgstr "Паролі не збігаються." + +#: ../gcr/gcr-prompt-dialog.c:650 +msgid "Password cannot be blank" +msgstr "Пароль не може бути порожнім" + +#: ../gcr/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Спроба доступитись" + +#: ../gcr/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Заблокувати доступ до паролів й інших таємниць" + +#: ../gcr/gcr-subject-public-key.c:345 +msgid "Unrecognized or unavailable attributes for key" +msgstr "Нерозпізнані або недоступні атрибути для ключа" + +#: ../gcr/gcr-subject-public-key.c:429 ../gcr/gcr-subject-public-key.c:515 +msgid "Couldn't build public key" +msgstr "Неможливо зібрати відкритий ключ" + +#: ../gcr/gcr-system-prompt.c:749 +msgid "Another prompt is already in progress" +msgstr "Уже триває інакша спроба " + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:370 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Неможливо знайти місце для збереження утриманих сертифікатів" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Автоматично розблоковувати цю в'язку ключів після входу у сеанс" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Автоматично блокувати в'язку ключів при завершенні сеансу" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Блокувати в'язку ключів після" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Блокувати в'язку при простої" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "хвилин" + +#: ../gcr/gcr-unlock-renderer.c:69 +#, c-format +msgid "Unlock: %s" +msgstr "Розблокувати: %s" + +#: ../gcr/gcr-unlock-renderer.c:125 +msgid "Password" +msgstr "Пароль" + +#: ../gcr/gcr-unlock-renderer.c:278 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" +"Вміст «%s» заблоковано. Введіть правильний пароль, щоб переглянути вміст." + +#: ../gcr/gcr-unlock-renderer.c:281 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Вміст заблоковано. Введіть правильний пароль, щоб переглянути вміст." + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "Переглядач сертифікатів GCR і ключів" + +#: ../gcr/gcr-viewer-tool.c:48 +msgid "Show the application's version" +msgstr "Показати версію програми" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "[файл…]" + +#: ../gcr/gcr-viewer-tool.c:103 +msgid "- View certificate and key files" +msgstr "— Переглянути файли сертифікатів і ключів" + +#: ../gcr/gcr-viewer-tool.c:117 ../gcr/gcr-viewer-widget.c:635 +msgid "Certificate Viewer" +msgstr "Переглядач сертифікатів" + +#: ../gcr/gcr-viewer-widget.c:203 +msgid "The password was incorrect" +msgstr "Пароль неправильний" + +#: ../gcr/gcr-viewer-window.c:76 +msgid "Imported" +msgstr "Імпортовано" + +#: ../gcr/gcr-viewer-window.c:80 +msgid "Import failed" +msgstr "Не вдалось імпортувати" + +#: ../gcr/gcr-viewer-window.c:108 +msgid "Import" +msgstr "Імпортувати" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Розблокувати" diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..867a962 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,1135 @@ +# Vietnamese translation of GNOME Keyring. +# Copyright © 2016 GNOME i18n Project for Vietnamese. +# Nguyễn Thái Ngọc Duy , 2004,2008,2011-2012. +# Clytie Siddall , 2005-2010. +# Trần Ngọc Quân , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: gcr master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-01-19 18:34+0000\n" +"PO-Revision-Date: 2016-01-20 14:03+0700\n" +"Last-Translator: Trần Ngọc Quân \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "Thành phần Miền" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "Mã số người dùng" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "Thư điện tử" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "Ngày sinh" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "Nơi sinh" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "Giới tính" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "Quốc tịch" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "Quốc gia ở" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "Tên thường gọi" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "Họ" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "Số thứ tự" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "Quốc gia" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "Vùng" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "Tỉnh" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "Đường" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "Tổ chức" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "Đơn vị tổ chức" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "Tuổi tác" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "Số điện thoại" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "Tên hay gọi" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "Tên viết tắt" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "Thế hệ dè dặt" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "Tên miền dè dặt" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "Biệt hiệu" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 với mã hóa RSA" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 với mã hóa RSA" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 với mã hóa RSA" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 với mã hóa DSA" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "Elliptic Curve" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 với mã hóa ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 với mã hóa ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 với mã hóa ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 với mã hóa ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 với mã hóa ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "Xác thực máy chủ" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "Xác thực máy khách" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "Ký mã" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "Bảo vệ thư" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "Tem thời gian" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "Lỗi tải mô-đun PKCS#11: %s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "Không thể khởi tạo mô-đun PKCS#11: %s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "Không thể khởi tạo mô-đun PKCS#11 đã đăng ký: %s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI chứa mã hóa không hợp lệ." + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "URI không có “pkcs11”." + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI sai cú pháp." + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI có số phiên bản sai." + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "Luồng bị đóng" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "Tên" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "Cấp bởi" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "Hết hạn" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "Chứng nhận" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "Tên khác" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "ĐC XMPP" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "Địa chỉ thư" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "Địa chỉ X400" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "Tên thư mục" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "Tên EDI Party" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "Địa chỉ IP" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "ID đăng ký" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "Loại khóa không hỗ trợ cho yêu cầu chứng nhận" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "Không thể dùng khóa này để ký yêu cầu" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "Vòng khóa GnuPG" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "Vòng khóa GnuPG: %s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "Khóa PGP" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "ID khóa" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Tiến trình gpupg kết thúc với mã: %d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Tiến trình gpupg bị kết thúc bằng tín hiệu: %d" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "Thao tác bị hủy" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "Khóa cá nhân" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "Khóa công khai" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "Yêu cầu chứng nhận" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "Dữ liệu không được nhận ra hay không được hỗ trợ." + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "" +"Không thể phân tích cú pháp của dữ liệu không hợp lệ hay dữ liệu bị hỏng." + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "Dữ liệu bị khóa" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "Tiếp tục" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "Thôi" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "các thuộc tính cho khóa không nhận ra hoặc không sẵn có" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "Không thể tạo khóa công khai" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "Một câu hỏi khác đang chờ" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "Không tìm thấy vị trí lưu chứng nhận/khóa được nhập." + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "Ràng buộc cơ bản" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "Có quyền chứng nhận" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "Có" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "Không" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "Chiều dài đường dẫn tối đa" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "Không giới hạn" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "Cách dùng khóa mở rộng" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "Mục đích cho phép" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "Định danh khóa chủ thể" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "Định danh khóa" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "Chữ ký điện tử" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "Mật mã hóa khóa" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "Mật mã hóa dữ liệu" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "Thỏa thuận khóa" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "Chữ ký chứng nhận" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "Chữ ký danh mục thu hồi" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "Cách dùng khóa" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "Cách dùng" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "Tên chủ thể thay thế" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "Phần mở rộng" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "Định danh" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "Giá trị" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "Không thể xuất chứng nhận." + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "Định danh" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "Kiểm chứng bởi" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "Hết hạn" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "Tên chủ thể" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "Tên nhà cấp" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "Chứng nhận đã cấp" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "Phiên bản" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "Không hợp lệ trước" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "Không hợp lệ sau" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "Vân tay chứng nhận" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "Thông tin khóa công khai" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "Chữ ký" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "Xuất chứng nhận…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "Thuật toán khóa" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "Tham số khóa" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "Cỡ khóa" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "Vân tay khóa SHA1" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "Thuật toán chữ ký" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "Tham số chữ ký" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "Tới hạn" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "Yêu cầu chứng nhận" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "Thuộc tính" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "Loại" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Thử thách" + +#: ../ui/gcr-display-view.c:316 +msgid "_Details" +msgstr "Ch_i tiết" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "Không thể hiển thị “%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "Không thể hiện tập tin" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "Lý do" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "Không thể hiện tập tin loại này." + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "Mã hóa" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "Ký" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "Chứng nhận" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "Xác thực" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "Bị tắt" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "Không biết" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "Không hợp lệ" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "Đã tắt" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "Thu hồi" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "Hết hạn" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "Không xác định" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "Không tin cậy" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "Có thể tin cậy" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "Tin cậy hoàn toàn" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "Tin cậy tuyệt đối" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "Thông tin trong khóa này chưa được xác minh" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "Khóa này không hợp lệ" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "Khóa này bị vô hiệu hóa" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "Khóa này bị thu hồi" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "Khóa này đã hết hạn" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "Khóa không được tin cập" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "Khóa này được tin cậy một phần" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "Khóa này được tin cậy hoàn toàn" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "Khóa này được tin cậy tuyệt đối" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "ID khóa" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "Thuật toán" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "Lúc tạo" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "Hết hạn" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "Khả năng" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "Tín nhiệm của chủ sở hữu" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "Tên" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "Ghi chú" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "Thuộc tính người dùng" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "Cỡ" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "Chữ ký tài liệu nhị phân" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "Chữ ký văn bản thô" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "Chữ ký độc lập" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "Chứng nhận chung của khóa" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "Chứng nhận cá nhân của khóa" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "Chứng nhận thường ngày của khóa" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "Chứng nhận xác thực của khóa" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "Chữ ký ràng buộc khóa phụ" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "Chữ ký ràng buộc khóa chính" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "Ký trực tiếp trên khóa" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "Chữ ký thu hồi khóa" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "Chữ ký thu hồi khóa phụ" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "Chữ ký thu hồi chứng nhận" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "Chữ ký tem thời gian" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "Chữ ký xác nhận bên thứ ba" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "Lớp" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "Chỉ nội bộ" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "Có thể xuất" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "Khóa thu hồi" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "Vân tay" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "Khóa công khai phụ" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "Khóa mật" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "Khóa mật phụ" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "Đang khởi tạo…" + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "Đang nhập…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "Nhập vào: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "Nhập vào: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "Không thể nhập vào bởi vì không có cái gì tương thích cả" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "Không có dữ liệu để nhập" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "Khóa" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "Khóa cá nhân RSA" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "Khóa cá nhân DSA" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "Khóa riêng Elliptic Curve" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "Khóa công khai DSA" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "Khóa công khai Elliptic Curve" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u bit" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "Độ mạnh" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "Vân tay" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "T_hôi" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "Đượ_c" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "Tự động chọn" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "Người dùng hủy thao tác này" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "Để nhập, vui lòng nhập mật mã." + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "Mật khẩu:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "Thẻ bài:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "Mở khóa" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "Nhãn:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "Cài đặt nhập" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "Xác nhận:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "Mật khẩu không khớp." + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "Phải có mật khẩu" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "Nhắc truy cập" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "Mở khóa để truy cập mật khẩu và các bí mật khác" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "Một tập tin tên đó đã có rồi." + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "Bạn có muốn thay thế nó bằng tập tin mới không?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "_Thay thế" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "Thao tác bị hủy." + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "Xuất chứng nhận" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "_Lưu" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "Tập tin chứng nhận" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "Tập tin PEM" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "Tự động gỡ khóa vòng khóa này khi nào tôi đã đăng nhập" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "Khóa vòng khóa này khi tôi đang xuất" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "Khóa vòng khóa này sau" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "Khóa vòng khóa này nếu vẫn nghỉ sau" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "phút" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "Mở khóa: %s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "Mật khẩu" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "Nội dung của “%s” đang bị khóa. Nhập mật mã để xem." + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "Nội dung đang bị khóa. Nhập mật mã để xem." + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "Ứng dụng GCR xem khóa và chứng nhận" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "Hiện phiên bản ứng dụng" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[tập tin…]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- Xem chứng nhận và khóa" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "Trình xem chứng nhận" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "Mật khẩu không đúng" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "Đã nhập" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "Nhập thất bại" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "Nhập" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "Đón_g" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "Môđun PKCS#11 không hợp lệ: %s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "Không thể thiết lập môđun PKCS#11: %s" + +#~ msgid "Label" +#~ msgstr "Nhãn" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "Mở khóa" diff --git a/po/xh.po b/po/xh.po new file mode 100644 index 0000000..3dd8595 --- /dev/null +++ b/po/xh.po @@ -0,0 +1,995 @@ +# Xhosa translation of gnome-keyring +# Copyright (C) 2005 Canonical Ltd. +# This file is distributed under the same license as the gnome-keyring package. +# Translation by Canonical Ltd with thanks to +# Translation World CC in South Africa, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-06 11:51+0200\n" +"PO-Revision-Date: 2005-02-22 20:36+0200\n" +"Last-Translator: Canonical Ltd \n" +"Language-Team: Xhosa \n" +"Language: xh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../egg/egg-oid.c:41 +msgid "Domain Component" +msgstr "" + +#: ../egg/egg-oid.c:43 ../gcr/gcr-gnupg-renderer.c:411 +#: ../gcr/gcr-gnupg-renderer.c:580 +msgid "User ID" +msgstr "" + +#: ../egg/egg-oid.c:46 +msgid "Email Address" +msgstr "" + +#: ../egg/egg-oid.c:54 +msgid "Date of Birth" +msgstr "" + +#: ../egg/egg-oid.c:56 +msgid "Place of Birth" +msgstr "" + +#: ../egg/egg-oid.c:58 +msgid "Gender" +msgstr "" + +#: ../egg/egg-oid.c:60 +msgid "Country of Citizenship" +msgstr "" + +#: ../egg/egg-oid.c:62 +msgid "Country of Residence" +msgstr "" + +#: ../egg/egg-oid.c:65 +msgid "Common Name" +msgstr "" + +#: ../egg/egg-oid.c:67 +msgid "Surname" +msgstr "" + +#: ../egg/egg-oid.c:69 ../gcr/gcr-certificate-renderer.c:652 +msgid "Serial Number" +msgstr "" + +#: ../egg/egg-oid.c:71 +msgid "Country" +msgstr "" + +#: ../egg/egg-oid.c:73 +msgid "Locality" +msgstr "" + +#: ../egg/egg-oid.c:75 +msgid "State" +msgstr "" + +#: ../egg/egg-oid.c:77 +msgid "Street" +msgstr "" + +#: ../egg/egg-oid.c:79 +msgid "Organization" +msgstr "" + +#: ../egg/egg-oid.c:81 +msgid "Organizational Unit" +msgstr "" + +#: ../egg/egg-oid.c:83 +msgid "Title" +msgstr "" + +#: ../egg/egg-oid.c:85 +msgid "Telephone Number" +msgstr "" + +#: ../egg/egg-oid.c:87 +msgid "Given Name" +msgstr "" + +#: ../egg/egg-oid.c:89 +msgid "Initials" +msgstr "" + +#: ../egg/egg-oid.c:91 +msgid "Generation Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:93 +msgid "DN Qualifier" +msgstr "" + +#: ../egg/egg-oid.c:95 +msgid "Pseudonym" +msgstr "" + +#: ../egg/egg-oid.c:98 ../gcr/gcr-gnupg-renderer.c:202 +#: ../gcr/gcr-key-renderer.c:308 +msgid "RSA" +msgstr "" + +#: ../egg/egg-oid.c:99 +msgid "MD2 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:100 +msgid "MD5 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:101 +msgid "SHA1 with RSA" +msgstr "" + +#: ../egg/egg-oid.c:103 ../gcr/gcr-gnupg-renderer.c:206 +#: ../gcr/gcr-key-renderer.c:310 +msgid "DSA" +msgstr "" + +#: ../egg/egg-oid.c:104 +msgid "SHA1 with DSA" +msgstr "" + +#. Extended Key Usages +#: ../egg/egg-oid.c:107 +msgid "Server Authentication" +msgstr "" + +#: ../egg/egg-oid.c:108 +msgid "Client Authentication" +msgstr "" + +#: ../egg/egg-oid.c:109 +msgid "Code Signing" +msgstr "" + +#: ../egg/egg-oid.c:110 +msgid "Email Protection" +msgstr "" + +#: ../egg/egg-oid.c:111 +msgid "Time Stamping" +msgstr "" + +#: ../gck/gck-module.c:353 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:360 +#, c-format +msgid "Invalid PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:369 +#, c-format +msgid "Couldn't setup PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-module.c:385 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "" + +#: ../gck/gck-modules.c:67 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "" + +#: ../gcr/gcr-callback-output-stream.c:64 +#: ../gcr/gcr-callback-output-stream.c:81 +#, c-format +msgid "The stream was closed" +msgstr "" + +#. later +#. later +#: ../gcr/gcr-certificate.c:378 ../gcr/gcr-gnupg-key.c:521 +msgctxt "column" +msgid "Name" +msgstr "" + +#: ../gcr/gcr-certificate.c:380 +msgctxt "column" +msgid "Issued By" +msgstr "" + +#. later +#: ../gcr/gcr-certificate.c:382 +msgctxt "column" +msgid "Expires" +msgstr "" + +#: ../gcr/gcr-certificate.c:1067 ../gcr/gcr-certificate-exporter.c:463 +#: ../gcr/gcr-certificate-renderer.c:101 ../gcr/gcr-parser.c:316 +msgid "Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:225 +msgid "" +"A file already exists with this name.\n" +"\n" +"Do you want to replace it with a new file?" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:228 +msgid "_Replace" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:258 +#, c-format +msgid "The operation was cancelled." +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:302 +msgid "Export certificate" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:314 +msgid "Certificate files" +msgstr "" + +#: ../gcr/gcr-certificate-exporter.c:325 +msgid "PEM files" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:141 +msgid "Other Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:150 +msgid "XMPP Addr" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:154 +msgid "DNS SRV" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:166 ../gcr/gcr-gnupg-renderer.c:424 +#: ../gcr/gcr-gnupg-renderer.c:706 +msgid "Email" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:174 +msgid "DNS" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:182 +msgid "X400 Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:189 +msgid "Directory Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:197 +msgid "EDI Party Name" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:204 +msgid "URI" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:212 +msgid "IP Address" +msgstr "" + +#: ../gcr/gcr-certificate-extensions.c:220 +msgid "Registered ID" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:116 +msgid "Basic Constraints" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:118 +msgid "Certificate Authority" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "Yes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:119 ../gcr/gcr-certificate-renderer.c:314 +msgid "No" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:122 +msgid "Max Path Length" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:123 +msgid "Unlimited" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:142 +msgid "Extended Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:153 +msgid "Allowed Purposes" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:173 +msgid "Subject Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:174 +msgid "Key Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:185 +msgid "Digital signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:186 +msgid "Key encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:187 +msgid "Data encipherment" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:188 +msgid "Key agreement" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:189 +msgid "Certificate signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:190 +msgid "Revocation list signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:215 +msgid "Key Usage" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:216 +msgid "Usages" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:236 +msgid "Subject Alternative Names" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:261 +msgid "Extension" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:265 +msgid "Identifier" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:266 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-gnupg-renderer.c:432 +msgid "Value" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:313 +msgid "Critical" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:386 +msgid "Couldn't export the certificate." +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:613 +msgid "Identity" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:617 +msgid "Verified by" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:624 ../gcr/gcr-gnupg-renderer.c:720 +msgid "Expires" +msgstr "" + +#. The subject +#: ../gcr/gcr-certificate-renderer.c:634 +msgid "Subject Name" +msgstr "" + +#. The Issuer +#: ../gcr/gcr-certificate-renderer.c:638 +msgid "Issuer Name" +msgstr "" + +#. The Issued Parameters +#: ../gcr/gcr-certificate-renderer.c:642 +msgid "Issued Certificate" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:647 +msgid "Version" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:658 +msgid "Not Valid Before" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:663 +msgid "Not Valid After" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-certificate-renderer.c:668 +msgid "Certificate Fingerprints" +msgstr "" + +#. Signature +#: ../gcr/gcr-certificate-renderer.c:674 ../gcr/gcr-certificate-renderer.c:686 +#: ../gcr/gcr-gnupg-renderer.c:561 +msgid "Signature" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:678 +msgid "Signature Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:682 +msgid "Signature Parameters" +msgstr "" + +#. Public Key Info +#: ../gcr/gcr-certificate-renderer.c:690 +msgid "Public Key Info" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:695 +msgid "Key Algorithm" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:700 +msgid "Key Parameters" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:705 ../gcr/gcr-gnupg-renderer.c:354 +msgid "Key Size" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:712 +msgid "Key SHA1 Fingerprint" +msgstr "" + +#: ../gcr/gcr-certificate-renderer.c:718 ../gcr/gcr-gnupg-renderer.c:739 +#: ../gcr/gcr-key-renderer.c:292 ../gcr/gcr-parser.c:319 +msgid "Public Key" +msgstr "" + +#: ../gcr/gcr-display-view.c:319 +msgid "_Details" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:161 +#, c-format +msgid "Could not display '%s'" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:163 +msgid "Could not display file" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:168 +msgid "Reason" +msgstr "" + +#: ../gcr/gcr-failure-renderer.c:218 +#, c-format +msgid "Cannot display a file of this type." +msgstr "" + +#: ../gcr/gcr-gnupg-importer.c:93 +#, fuzzy +msgid "GnuPG Keyring" +msgstr "Vula Umsesane wesitshixo" + +#: ../gcr/gcr-gnupg-importer.c:95 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:234 ../gcr/gcr-gnupg-renderer.c:88 +#: ../gcr/gcr-parser.c:322 +msgid "PGP Key" +msgstr "" + +#: ../gcr/gcr-gnupg-key.c:523 +msgctxt "column" +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:860 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:867 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "" + +#: ../gcr/gcr-gnupg-process.c:921 ../gcr/gcr-parser.c:2177 +#: ../gcr/gcr-parser.c:2681 +msgid "The operation was cancelled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:204 +msgid "Elgamal" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:217 +msgid "Encrypt" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:219 +msgid "Sign" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:221 +msgid "Certify" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:223 +msgid "Authenticate" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:225 ../gcr/gcr-gnupg-renderer.c:260 +msgid "Disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:256 ../gcr/gcr-gnupg-renderer.c:415 +#: ../gcr/gcr-key-renderer.c:312 ../gcr/gcr-key-renderer.c:317 +msgid "Unknown" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:258 +msgid "Invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:262 +msgid "Revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:264 +msgid "Expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:266 +msgid "Undefined trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:268 +msgid "Distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:270 +msgid "Marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:272 +msgid "Fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:274 +msgid "Ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:288 +msgid "The information in this key has not yet been verified" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:291 +msgid "This key is invalid" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:294 +msgid "This key has been disabled" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:297 +msgid "This key has been revoked" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:300 +msgid "This key has expired" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:305 +msgid "This key is distrusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:308 +msgid "This key is marginally trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:311 +msgid "This key is fully trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:314 +msgid "This key is ultimately trusted" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:339 ../gcr/gcr-gnupg-renderer.c:565 +msgid "Key ID" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:347 ../gcr/gcr-gnupg-renderer.c:573 +#: ../gcr/gcr-gnupg-renderer.c:620 ../gcr/gcr-key-renderer.c:313 +msgid "Algorithm" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:362 ../gcr/gcr-gnupg-renderer.c:439 +#: ../gcr/gcr-gnupg-renderer.c:482 +msgid "Created" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:371 ../gcr/gcr-gnupg-renderer.c:448 +#: ../gcr/gcr-gnupg-renderer.c:491 +msgid "Expiry" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:380 +msgid "Capabilities" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:393 +msgid "Owner trust" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:421 +msgid "Name" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:427 ../gcr/gcr-gnupg-renderer.c:709 +msgid "Comment" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:467 +msgid "User Attribute" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:474 ../gcr/gcr-key-renderer.c:320 +msgid "Size" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:509 +msgid "Signature of a binary document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:511 +msgid "Signature of a canonical text document" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:513 +msgid "Standalone signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:515 +msgid "Generic certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:517 +msgid "Persona certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:519 +msgid "Casual certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:521 +msgid "Positive certification of key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:523 +msgid "Subkey binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:525 +msgid "Primary key binding signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:527 +msgid "Signature directly on key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:529 +msgid "Key revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:531 +msgid "Subkey revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:533 +msgid "Certification revocation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:535 +msgid "Timestamp signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:537 +msgid "Third-party confirmation signature" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:590 ../gcr/gcr-gnupg-renderer.c:598 +msgid "Class" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 ../gcr/gcr-gnupg-renderer.c:594 +msgid "Type" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:592 +msgid "Local only" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:594 +msgid "Exportable" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:612 +msgid "Revocation Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:626 ../gcr/gcr-gnupg-renderer.c:650 +#: ../gcr/gcr-gnupg-renderer.c:652 +msgid "Fingerprint" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:741 +msgid "Public Subkey" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:743 +msgid "Secret Key" +msgstr "" + +#: ../gcr/gcr-gnupg-renderer.c:745 +msgid "Secret Subkey" +msgstr "" + +#: ../gcr/gcr-import-button.c:108 +msgid "Initializing..." +msgstr "" + +#: ../gcr/gcr-import-button.c:116 +msgid "Import is in progress..." +msgstr "" + +#: ../gcr/gcr-import-button.c:123 +#, c-format +msgid "Imported to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:143 +#, c-format +msgid "Import to: %s" +msgstr "" + +#: ../gcr/gcr-import-button.c:156 +msgid "Cannot import because there are no compatible importers" +msgstr "" + +#: ../gcr/gcr-import-button.c:165 +msgid "No data to import" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:82 +msgid "Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:281 +msgid "Private RSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:283 +msgid "Private DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:285 ../gcr/gcr-parser.c:313 +msgid "Private Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:288 ../gcr/gcr-key-renderer.c:290 +msgid "Public DSA Key" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:299 +#, c-format +msgid "%d bit" +msgid_plural "%d bits" +msgstr[0] "" +msgstr[1] "" + +#: ../gcr/gcr-key-renderer.c:300 +msgid "Strength" +msgstr "" + +#. Fingerprints +#: ../gcr/gcr-key-renderer.c:324 +msgid "Fingerprints" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:329 +msgid "SHA1" +msgstr "" + +#: ../gcr/gcr-key-renderer.c:335 +msgid "SHA256" +msgstr "" + +#: ../gcr/gcr-parser.c:2180 +msgid "Unrecognized or unsupported data." +msgstr "" + +#: ../gcr/gcr-parser.c:2183 +msgid "Could not parse invalid or corrupted data." +msgstr "" + +#: ../gcr/gcr-parser.c:2186 +msgid "The data is locked" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:186 +msgid "Automatically chosen" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.c:270 +#: ../gcr/gcr-pkcs11-import-interaction.c:153 +#: ../gcr/gcr-pkcs11-import-interaction.c:171 +#, c-format +msgid "The user cancelled the operation" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:1 +msgid "Import settings" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:2 +msgid "Unlock" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:3 +msgid "In order to import, please enter the password." +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:4 +msgid "Label" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Password:" +msgstr "" + +#: ../gcr/gcr-pkcs11-import-dialog.ui.h:7 +msgid "Token:" +msgstr "" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:376 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring after" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring if idle for" +msgstr "" + +#: ../gcr/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring when I log out" +msgstr "" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../gcr/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:70 +#, c-format +msgid "Unlock: %s" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:72 ../gcr/gcr-unlock-renderer.c:129 +#, fuzzy +msgid "Unlock" +msgstr "Vula Umsesane wesitshixo" + +#: ../gcr/gcr-unlock-renderer.c:126 +msgid "Password" +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:279 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "" + +#: ../gcr/gcr-unlock-renderer.c:282 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:41 +msgid "GCR Certificate and Key Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:48 +#, fuzzy +msgid "Show the application's version" +msgstr "Uvumela ufikelelo lwenkqubo ukuya kumsesane wesitshixo?" + +#: ../gcr/gcr-viewer-tool.c:50 +msgid "[file...]" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "" + +#: ../gcr/gcr-viewer-tool.c:118 +msgid "Certificate Viewer" +msgstr "" + +#: ../gcr/gcr-viewer-widget.c:191 +msgid "The password was incorrect" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:68 +msgid "Imported" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:72 +msgid "Import failed" +msgstr "" + +#: ../gcr/gcr-viewer-window.c:103 +msgid "Import" +msgstr "" + +#: ../gck/gck-uri.c:223 +#, c-format +msgid "The URI has invalid encoding." +msgstr "" + +#: ../gck/gck-uri.c:227 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "" + +#: ../gck/gck-uri.c:231 +msgid "The URI has bad syntax." +msgstr "" + +#: ../gck/gck-uri.c:235 +msgid "The URI has a bad version number." +msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..d9be627 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,1147 @@ +# Chinese (China) translation of gnome-keyring ui. +# gnome-keyring 的简体中文翻译. +# Copyright (C) 2003-2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-keyring package. +# Neo Willis , 2003. +# QA and Edited by Funda Wang , 2004 +# Wang Jian , 2005. +# YangZhang , 2008 +# 甘露(Gan Lu) , 2009 +# Eleanor Chen , 2010 +# Tao Wang , 2010 +# Dean Lee . +# Wei Li , 2011. +# Aron Xu , 2010, 2011. +# Wylmer Wang , 2011, 2012. +# Cheng Lu , 2012. +# YunQiang Su , 2011, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2016-10-18 16:34+0000\n" +"PO-Revision-Date: 2017-01-21 15:28+0800\n" +"Last-Translator: Mandy Wang \n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.8.11\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "域组件" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "用户 ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "电子邮箱地址" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "生日" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "出生地" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "性别" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "国籍" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "定居国" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "常用名" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "姓" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "序列号" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "国家" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "位置" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "州/省" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "街道" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "组织" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "单位" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "头衔" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "电话号码" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "名" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "首字母" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "操作限定人" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN 限定人" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "笔名" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "使用 MD2 算法的 RSA 密钥对" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "使用 MD5 算法的 RSA 密钥对" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "使用 SHA1 算法的 RSA 密钥对" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "使用 SHA1 算法的 DSA 密钥对" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "椭圆曲线" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "使用 SHA1 算法的 ECDSA 密钥对" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "使用 SHA224 算法的 ECDSA 密钥对" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "使用 SHA256 算法的 ECDSA 密钥对" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "使用 SHA384 算法的 ECDSA 密钥对" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "使用 SHA512 算法的 ECDSA 密钥对" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "服务器认证" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "客户端认证" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "代码签署" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "邮件防护" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "时间戳" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "加载 PKCS#11 模块失败:%s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "无法初始化 PKCS#11 模块:%s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "无法初始化注册的 PKCS#11 模块:%s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "该 URI 的编码无效。" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "该 URI 没有“pkcs11”结构。" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "URI 语法错误。" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "URI 版本号错误。" + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "会话已关闭" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "名称" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "颁发者" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "过期" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "证书" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "其他名称" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP 地址" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "电子邮件" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 地址" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "目录名" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI 方的名称" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP 地址" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "注册的 ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "不支持证书请求的密钥类型" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "该密钥无法用于签署请求" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG 密钥环" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG 密钥环:%s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP 密钥" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "密钥 ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg 进程退出,退出代码为:%d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg 进程由 %d 信号中止" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "操作已取消" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "私钥" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "公钥" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "证书请求" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "无法识别或不支持的数据。" + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "无法解析非法的或已损坏的数据。" + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "数据已被锁定" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "继续" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "取消" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "无法识别或不可用的密钥属性" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn't build public key" +msgstr "无法创建公开密钥" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "另一个提示正在进行中" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "没有找到可以用来来保存个人身份证明的位置。" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "基本约束" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "证书授权" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "是" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "否" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "最大路径长度" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "无限制" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "延长密钥使用" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "允许的用途" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "主体密钥标识" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "密钥标识" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "数字签名" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "密钥加密" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "数据加密" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "密钥协议" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "证书签名" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "作废列表签名" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "密钥使用" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "使用" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "主体备用名称" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "扩展" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "识别标志" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "值" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "不能导出证书。" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "身份" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "认证机构" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "过期" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "主体名" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "颁发者名称" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "颁发的证书" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "版本" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "在此之前无效" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "在此之后无效" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "证书指纹" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "公开密钥信息" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "签名" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "导出证书..." + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "密钥算法" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "密钥参数" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "密钥大小" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "密钥 SHA1 指纹" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "签名算法" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "签名参数" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "关键" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "证书请求" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "属性" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "类型" + +# Challenge/Response认证 +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "挑战" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "详细信息(_D)" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "无法显示“%s”" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "无法显示文件" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "原因" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "无法显示此类型的文件。" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "加密" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "签名" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "证书" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "认证" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "已禁用" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "未知" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "无效" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "已禁用" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "作废" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "过期" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "未定义的信任" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "不信任" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "最低程度信任" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "完全信任" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "最高程度信任" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "此密钥中的信息尚未核实" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "此密钥无效" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "此密钥已禁用" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "此密钥已作废" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "此密钥已经过期" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "此密钥不受信任" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "此密钥是最低程度信任" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "此密钥是完全信任" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "此密钥是最高程度信任" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "密钥 ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "算法" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "创建" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "过期" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "权限" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "所有者信任" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "名称" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "评论" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "用户属性" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "长度" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "二进制文档的签名" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "标准文本文档的签名" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "独立签名" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "密钥通用认证" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "密钥角色认证" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "密钥临时认证" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "密钥可靠认证" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "子密钥绑定签名" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "主密钥绑定签名" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "直接在密钥上签名" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "密钥作废签名" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "子密钥作废签名" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "证书作废签名" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "时间戳签名" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "第三方确认签名" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "类别" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "仅本地" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "可导出的" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "作废密钥" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "指纹" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "公开子密钥" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "私有密钥" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "私有子密钥" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "初始化..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "正在进行导入..." + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "导入到: %s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "导入: %s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "无法导入,因为没有兼容的导入方" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "无可导入数据" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "密钥" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "RSA 私钥" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "DSA 私钥" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "椭圆曲线私钥" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "DSA 公钥" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "椭圆曲线公钥" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u 位" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "强度" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "指纹" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "取消(_C)" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "确定(_O)" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "自动选择" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "用户已取消操作" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "要导入,请输入密码。" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "密码:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "令牌:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "解锁" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "标签:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "导入设置" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "确认:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "密码不匹配。" + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "密码不能为空" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "访问提示" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "解锁密码和其他私密内容的访问权限" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "同名的文件已经存在。" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "您想用新文件替换它吗?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "替换(_R)" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "操作已取消。" + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "导出证书" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "保存(_S)" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "证书文件" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM 文件" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "当我登录时自动解锁此密钥环。" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "在我注销时锁住此密钥环" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "之后锁住此密钥环" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "锁定该密钥环于空闲" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "分钟" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "解锁:%s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "密码" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "“%s”的内容已锁定。要查看其内容,请输入正确的密码。" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "内容已锁定。要查看内容,请输入正确的密码。" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR 证书和密钥查看器" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "显示应用程序版本" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[文件...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- 查看证书和密钥文件" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "证书查看器" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "密码错误" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "已导入" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "导入失败" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "导入" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "关闭(_C)" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "无效的 PKCS#11 模块:%s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "无法设置 PKCS#11 模块:%s" + +#~ msgid "Label" +#~ msgstr "标签" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "解锁" diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..c4e27d0 --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,1139 @@ +# Chinese (Hong Kong) translation of gnome-keyring. +# Copyright (C) 2004-06 Free Software Foundation, Inc. +# Woodman Tuen , 2004-2006 +# Chao-Hsiung Liao , 2008, 2010. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring 3.1.91\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2014-08-20 16:54+0000\n" +"PO-Revision-Date: 2014-08-21 17:01+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (Hong Kong) \n" +"Language: zh_HK\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.6.5\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "網域元件" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "使用者 ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "電子郵件位址" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "生日" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "出生地" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "性別" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "哪個國家公民" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "居住國" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "普通名稱" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "姓" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "序號" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "國家" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "所在地" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "州" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "街" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "組織" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "組織部門" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "職稱" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "電話號碼" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "名字" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "縮寫" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "世代辨識符號" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN 辨識符號" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "筆名" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 附 RSA 加密" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 附 RSA 加密" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 附 RSA 加密" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA 加密" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 附 DSA 加密" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "橢圓曲線" + +#: ../egg/egg-oid.c:106 +#| msgid "SHA1 with DSA" +msgid "SHA1 with ECDSA" +msgstr "SHA1 附 ECDSA" + +#: ../egg/egg-oid.c:107 +#| msgid "SHA1 with DSA" +msgid "SHA224 with ECDSA" +msgstr "SHA224 附 ECDSA" + +#: ../egg/egg-oid.c:108 +#| msgid "SHA1 with DSA" +msgid "SHA256 with ECDSA" +msgstr "SHA256 附 ECDSA" + +#: ../egg/egg-oid.c:109 +#| msgid "SHA1 with DSA" +msgid "SHA384 with ECDSA" +msgstr "SHA384 附 ECDSA" + +#: ../egg/egg-oid.c:110 +#| msgid "SHA1 with DSA" +msgid "SHA512 with ECDSA" +msgstr "SHA512 附 ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "伺服器核對" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "客戶端核對" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "代碼簽署" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "電子郵件保護" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "時刻戳記" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "載入 PKCS#11 模組時發生錯誤:%s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn't initialize PKCS#11 module: %s" +msgstr "無法初始化 PKCS#11 模組:%s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn't initialize registered PKCS#11 modules: %s" +msgstr "無法初始化註冊的 PKCS#11 模組:%s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI 有無效的編碼。" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the 'pkcs11' scheme." +msgstr "這個 URI 沒有「pkcs11」scheme。" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "這個 URI 的語法錯誤。" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "這個 URI 有錯誤的版本號碼。" + +#: ../gcr/gcr-callback-output-stream.c:62 +#: ../gcr/gcr-callback-output-stream.c:79 +#, c-format +msgid "The stream was closed" +msgstr "串流已經關閉" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "名稱" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "發照者" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "到期" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "證書" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "其他名稱" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "電子郵件" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 位址" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "目錄名稱" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI 方名稱" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP 位址" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "已註冊 ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "證書要求不支援的密碼匙類型" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "這個全鑰不能用來簽署這個要求" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG 密碼匙圈" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG 密碼匙圈:%s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP 密碼匙" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "密碼匙 ID" + +#: ../gcr/gcr-gnupg-process.c:866 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg 程序不正常結束。錯誤碼:%d" + +#: ../gcr/gcr-gnupg-process.c:873 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg 程序被信號 %d 中止。" + +#: ../gcr/gcr-gnupg-process.c:927 ../gcr/gcr-parser.c:2551 +#: ../gcr/gcr-parser.c:3157 ../gcr/gcr-system-prompt.c:924 +msgid "The operation was cancelled" +msgstr "該操作已取消" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "私人密碼匙" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "公開密碼匙" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "證書要求" + +#: ../gcr/gcr-parser.c:2554 +msgid "Unrecognized or unsupported data." +msgstr "無法辨識或不支援的資料。" + +#: ../gcr/gcr-parser.c:2557 +msgid "Could not parse invalid or corrupted data." +msgstr "無法解析無效或損毀的資料。" + +#: ../gcr/gcr-parser.c:2560 +msgid "The data is locked" +msgstr "資料已被鎖定" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "繼續" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "取消" + +#: ../gcr/gcr-subject-public-key.c:407 +msgid "Unrecognized or unavailable attributes for key" +msgstr "密碼匙有未辨識或無法使用的屬性" + +#: ../gcr/gcr-subject-public-key.c:493 ../gcr/gcr-subject-public-key.c:579 +msgid "Couldn't build public key" +msgstr "無法建立公開密碼匙" + +#: ../gcr/gcr-system-prompt.c:905 +msgid "Another prompt is already in progress" +msgstr "另一個提示已在進行中" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:366 +#, c-format +msgid "Couldn't find a place to store the pinned certificate" +msgstr "找不到位置來儲存匯入的證書" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "基本限制" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "核證機關" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "是" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "否" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "最大路徑長度" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "無限制" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "延伸密碼匙用法" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "允許的用途" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "主旨密碼匙識別碼" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "密碼匙識別碼" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "數碼簽署" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "密碼匙加密" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "資料加密" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "密碼匙協議" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "證書簽署" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "撤銷清單簽署" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "密碼匙用法" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "用法" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "主旨替代名稱" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "延伸" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "識別碼" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "數值" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn't export the certificate." +msgstr "無法匯出這個證書。" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "身分" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "檢驗者" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "到期" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "主旨名稱" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "發照者名稱" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "已簽發的證書" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "版本" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "在此之前無效" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "在此之後無效" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "證書數碼指紋" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "公開密碼匙資訊" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "簽署" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "匯出證書…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "密碼匙演算法" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "密碼匙參數" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "密碼匙大小" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "密碼匙 SHA1 數碼指紋" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "證書簽署演算法" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "簽署參數" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "重要" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "證書要求" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "屬性" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "類型" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:317 +msgid "_Details" +msgstr "詳細資料(_D)" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display '%s'" +msgstr "無法顯示「%s」" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "無法顯示檔案" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "原因" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "不能顯示這個類型的檔案" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "加密" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "簽署" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "檢驗" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "核對" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "已停用" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "不明" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "無效的" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "已停用" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "已撤銷" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "已過期" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "未定義的信任" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "不被信任" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "最低限度信任" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "完整信任" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "絕對信任" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "這個密碼匙中的資訊尚未被驗證" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "這個密碼匙是無效的" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "這個密碼匙已停用" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "這個密碼匙已被撤銷" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "這個密碼匙已經過期" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "這個密碼匙不被信任" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "這個密碼匙是最低限度信任的" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "這個密碼匙是完整信任的" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "這個密碼匙是絕對信任的" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "密碼匙 ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "演算法" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "建立" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "到期日" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "能力" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "擁有者的信任度" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "名稱" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "註解" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "使用者屬性" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "大小" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "二元檔文件的簽署" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "標準文字文件的簽署" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "單獨的簽署" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "密碼匙的一般證書" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "密碼匙的個人證書" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "密碼匙的臨時證書" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "密碼匙的實際證書" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "子密碼匙綁定的簽署" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "主密碼匙綁定的簽署" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "直接在密碼匙上簽署" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "密碼匙撤銷簽署" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "子密碼匙撤銷簽署" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "證書撤銷簽署" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "時間戳記簽署" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "第三方確認簽署" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "類別" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "僅限本地端" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "可匯出" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "撤銷密碼匙" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "數碼指紋" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "公開子密碼匙" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "密碼匙" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "子密碼匙" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "正在初始化..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "正在進行匯入…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "已匯入到:%s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "匯入到:%s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "不能匯入,因為沒有兼容的匯入程式" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "沒有資料可匯入" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "密碼匙" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "RSA 私人密碼匙" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "DSA 私人密碼匙" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "私密橢圓曲線密碼匙" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "DSA 公開密碼匙" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "公開橢圓曲線密碼匙" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +#| msgid "%d bit" +#| msgid_plural "%d bits" +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u 位元" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "強度" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "數碼指紋" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:502 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "取消(_C)" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:505 +msgid "_OK" +msgstr "確定(_O)" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "自動選擇" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "使用者已取消的操作" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "為了匯入,請輸入密碼。" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:563 +msgid "Password:" +msgstr "密碼:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "智慧卡:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "解鎖" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "標籤:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "匯入設定值" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:580 +msgid "Confirm:" +msgstr "確認:" + +#: ../ui/gcr-prompt-dialog.c:648 +msgid "Passwords do not match." +msgstr "密碼不相符。" + +#: ../ui/gcr-prompt-dialog.c:655 +msgid "Password cannot be blank" +msgstr "密碼不能空白" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "存取提示" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "解除對密碼和其他保密的存取鎖定" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "同樣名稱的另一個檔案已經存在。" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "是否要以新的檔案取代它?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "取代(_R)" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "操作已被取消。" + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "匯出證書" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "儲存(_S)" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "證書檔案" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM 檔案" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I'm logged in" +msgstr "當我登入時自動解鎖密碼匙圈" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "當我登出時自動鎖定密碼匙圈" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "鎖定這個密碼匙圈於" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "鎖定這個密碼匙圈於閒置" + +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "分鐘" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "解鎖:%s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "密碼" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of '%s' are locked. In order to view the contents, enter the " +"correct password." +msgstr "「%s」的內容已鎖定。為了檢視內容,請輸入正確的密碼。" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "內容已鎖定。為了檢視內容,請輸入正確的密碼。" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR 證書與密碼匙檢視器" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "顯示應用程式的版本" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[檔案...]" + +#: ../ui/gcr-viewer-tool.c:104 +msgid "- View certificate and key files" +msgstr "- 檢視證書與密碼匙檔案" + +#: ../ui/gcr-viewer-tool.c:118 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "證書檢視器" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "密碼是不正確的" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "已匯入" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "匯入失敗" + +#: ../ui/gcr-viewer-window.c:107 +msgid "Import" +msgstr "匯入" + +#: ../ui/gcr-viewer-window.c:116 +msgid "_Close" +msgstr "關閉(_C)" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "無效的 PKCS#11 模組:%s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "無法設定 PKCS#11 模組:%s" + +#~ msgid "Label" +#~ msgstr "標籤" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "解鎖" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..cf92360 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,1132 @@ +# Chinese (Taiwan) translation of gnome-keyring. +# Copyright (C) 2004-06 Free Software Foundation, Inc. +# Woodman Tuen , 2004-2006 +# Chao-Hsiung Liao , 2008, 2010. +msgid "" +msgstr "" +"Project-Id-Version: gnome-keyring 3.1.91\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"keyring&keywords=I18N+L10N&component=gcr\n" +"POT-Creation-Date: 2017-02-22 19:17+0000\n" +"PO-Revision-Date: 2017-02-28 12:20+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (traditional)\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.8.11\n" + +#: ../egg/egg-oid.c:40 +msgid "Domain Component" +msgstr "網域元件" + +#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 +#: ../ui/gcr-gnupg-renderer.c:577 +msgid "User ID" +msgstr "使用者 ID" + +#: ../egg/egg-oid.c:45 +msgid "Email Address" +msgstr "電子郵件位址" + +#: ../egg/egg-oid.c:53 +msgid "Date of Birth" +msgstr "生日" + +#: ../egg/egg-oid.c:55 +msgid "Place of Birth" +msgstr "出生地" + +#: ../egg/egg-oid.c:57 +msgid "Gender" +msgstr "性別" + +#: ../egg/egg-oid.c:59 +msgid "Country of Citizenship" +msgstr "哪個國家公民" + +#: ../egg/egg-oid.c:61 +msgid "Country of Residence" +msgstr "居住國" + +#: ../egg/egg-oid.c:64 +msgid "Common Name" +msgstr "普通名稱" + +#: ../egg/egg-oid.c:66 +msgid "Surname" +msgstr "姓" + +#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +msgid "Serial Number" +msgstr "序號" + +#: ../egg/egg-oid.c:70 +msgid "Country" +msgstr "國家" + +#: ../egg/egg-oid.c:72 +msgid "Locality" +msgstr "所在地" + +#: ../egg/egg-oid.c:74 +msgid "State" +msgstr "州" + +#: ../egg/egg-oid.c:76 +msgid "Street" +msgstr "街" + +#: ../egg/egg-oid.c:78 +msgid "Organization" +msgstr "組織" + +#: ../egg/egg-oid.c:80 +msgid "Organizational Unit" +msgstr "組織部門" + +#: ../egg/egg-oid.c:82 +msgid "Title" +msgstr "職稱" + +#: ../egg/egg-oid.c:84 +msgid "Telephone Number" +msgstr "電話號碼" + +#: ../egg/egg-oid.c:86 +msgid "Given Name" +msgstr "名字" + +#: ../egg/egg-oid.c:88 +msgid "Initials" +msgstr "縮寫" + +#: ../egg/egg-oid.c:90 +msgid "Generation Qualifier" +msgstr "世代辨識符號" + +#: ../egg/egg-oid.c:92 +msgid "DN Qualifier" +msgstr "DN 辨識符號" + +#: ../egg/egg-oid.c:94 +msgid "Pseudonym" +msgstr "筆名" + +#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 +#: ../ui/gcr-key-renderer.c:385 +msgid "RSA" +msgstr "RSA" + +#: ../egg/egg-oid.c:98 +msgid "MD2 with RSA" +msgstr "MD2 附 RSA 加密" + +#: ../egg/egg-oid.c:99 +msgid "MD5 with RSA" +msgstr "MD5 附 RSA 加密" + +#: ../egg/egg-oid.c:100 +msgid "SHA1 with RSA" +msgstr "SHA1 附 RSA 加密" + +#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 +#: ../ui/gcr-key-renderer.c:387 +msgid "DSA" +msgstr "DSA 加密" + +#: ../egg/egg-oid.c:103 +msgid "SHA1 with DSA" +msgstr "SHA1 附 DSA 加密" + +#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +msgid "Elliptic Curve" +msgstr "橢圓曲線" + +#: ../egg/egg-oid.c:106 +msgid "SHA1 with ECDSA" +msgstr "SHA1 附 ECDSA" + +#: ../egg/egg-oid.c:107 +msgid "SHA224 with ECDSA" +msgstr "SHA224 附 ECDSA" + +#: ../egg/egg-oid.c:108 +msgid "SHA256 with ECDSA" +msgstr "SHA256 附 ECDSA" + +#: ../egg/egg-oid.c:109 +msgid "SHA384 with ECDSA" +msgstr "SHA384 附 ECDSA" + +#: ../egg/egg-oid.c:110 +msgid "SHA512 with ECDSA" +msgstr "SHA512 附 ECDSA" + +#. Extended Key Usages +#: ../egg/egg-oid.c:113 +msgid "Server Authentication" +msgstr "伺服器核對" + +#: ../egg/egg-oid.c:114 +msgid "Client Authentication" +msgstr "客戶端核對" + +#: ../egg/egg-oid.c:115 +msgid "Code Signing" +msgstr "代碼簽署" + +#: ../egg/egg-oid.c:116 +msgid "Email Protection" +msgstr "電子郵件保護" + +#: ../egg/egg-oid.c:117 +msgid "Time Stamping" +msgstr "時刻戳記" + +#: ../gck/gck-module.c:344 +#, c-format +msgid "Error loading PKCS#11 module: %s" +msgstr "載入 PKCS#11 模組時發生錯誤:%s" + +#: ../gck/gck-module.c:358 +#, c-format +msgid "Couldn’t initialize PKCS#11 module: %s" +msgstr "無法初始化 PKCS#11 模組:%s" + +#: ../gck/gck-modules.c:62 +#, c-format +msgid "Couldn’t initialize registered PKCS#11 modules: %s" +msgstr "無法初始化註冊的 PKCS#11 模組:%s" + +#: ../gck/gck-uri.c:224 +#, c-format +msgid "The URI has invalid encoding." +msgstr "URI 有無效的編碼。" + +#: ../gck/gck-uri.c:228 +msgid "The URI does not have the “pkcs11” scheme." +msgstr "這個 URI 沒有「pkcs11」scheme。" + +#: ../gck/gck-uri.c:232 +msgid "The URI has bad syntax." +msgstr "這個 URI 的語法錯誤。" + +#: ../gck/gck-uri.c:236 +msgid "The URI has a bad version number." +msgstr "這個 URI 有錯誤的版本號碼。" + +#: ../gcr/gcr-callback-output-stream.c:60 +#: ../gcr/gcr-callback-output-stream.c:77 +#, c-format +msgid "The stream was closed" +msgstr "串流已經關閉" + +#. later +#. later +#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +msgctxt "column" +msgid "Name" +msgstr "名稱" + +#: ../gcr/gcr-certificate.c:352 +msgctxt "column" +msgid "Issued By" +msgstr "發照者" + +#. later +#: ../gcr/gcr-certificate.c:354 +msgctxt "column" +msgid "Expires" +msgstr "到期" + +#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 +#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +msgid "Certificate" +msgstr "憑證" + +#: ../gcr/gcr-certificate-extensions.c:177 +msgid "Other Name" +msgstr "其他名稱" + +#: ../gcr/gcr-certificate-extensions.c:187 +msgid "XMPP Addr" +msgstr "XMPP Addr" + +#: ../gcr/gcr-certificate-extensions.c:191 +msgid "DNS SRV" +msgstr "DNS SRV" + +#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 +#: ../ui/gcr-gnupg-renderer.c:703 +msgid "Email" +msgstr "電子郵件" + +#: ../gcr/gcr-certificate-extensions.c:211 +msgid "DNS" +msgstr "DNS" + +#: ../gcr/gcr-certificate-extensions.c:219 +msgid "X400 Address" +msgstr "X400 位址" + +#: ../gcr/gcr-certificate-extensions.c:226 +msgid "Directory Name" +msgstr "目錄名稱" + +#: ../gcr/gcr-certificate-extensions.c:234 +msgid "EDI Party Name" +msgstr "EDI 方名稱" + +#: ../gcr/gcr-certificate-extensions.c:241 +msgid "URI" +msgstr "URI" + +#: ../gcr/gcr-certificate-extensions.c:249 +msgid "IP Address" +msgstr "IP 位址" + +#: ../gcr/gcr-certificate-extensions.c:257 +msgid "Registered ID" +msgstr "已註冊 ID" + +#: ../gcr/gcr-certificate-request.c:415 +#, c-format +msgid "Unsupported key type for certificate request" +msgstr "憑證要求不支援的金鑰類型" + +#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 +#, c-format +msgid "The key cannot be used to sign the request" +msgstr "這個全鑰不能用來簽署這個要求" + +#: ../gcr/gcr-gnupg-importer.c:94 +msgid "GnuPG Keyring" +msgstr "GnuPG 鑰匙圈" + +#: ../gcr/gcr-gnupg-importer.c:96 +#, c-format +msgid "GnuPG Keyring: %s" +msgstr "GnuPG 鑰匙圈:%s" + +#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 +#: ../ui/gcr-gnupg-renderer.c:87 +msgid "PGP Key" +msgstr "PGP 金鑰" + +#: ../gcr/gcr-gnupg-key.c:432 +msgctxt "column" +msgid "Key ID" +msgstr "金鑰 ID" + +#: ../gcr/gcr-gnupg-process.c:864 +#, c-format +msgid "Gnupg process exited with code: %d" +msgstr "Gnupg 程序不正常結束。錯誤碼:%d" + +#: ../gcr/gcr-gnupg-process.c:871 +#, c-format +msgid "Gnupg process was terminated with signal: %d" +msgstr "Gnupg 程序被信號 %d 中止。" + +#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 +#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +msgid "The operation was cancelled" +msgstr "該操作已取消" + +#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +msgid "Private Key" +msgstr "私鑰" + +#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 +#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +msgid "Public Key" +msgstr "公鑰" + +#: ../gcr/gcr-parser.c:334 +msgid "Certificate Request" +msgstr "憑證要求" + +#: ../gcr/gcr-parser.c:2557 +msgid "Unrecognized or unsupported data." +msgstr "無法辨識或不支援的資料。" + +#: ../gcr/gcr-parser.c:2560 +msgid "Could not parse invalid or corrupted data." +msgstr "無法解析無效或損毀的資料。" + +#: ../gcr/gcr-parser.c:2563 +msgid "The data is locked" +msgstr "資料已被鎖定" + +#: ../gcr/gcr-prompt.c:225 +msgid "Continue" +msgstr "繼續" + +#: ../gcr/gcr-prompt.c:234 +msgid "Cancel" +msgstr "取消" + +#: ../gcr/gcr-subject-public-key.c:405 +msgid "Unrecognized or unavailable attributes for key" +msgstr "金鑰有未辨識或無法使用的屬性" + +#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +msgid "Couldn’t build public key" +msgstr "無法建立公鑰" + +#: ../gcr/gcr-system-prompt.c:911 +msgid "Another prompt is already in progress" +msgstr "另一個提示已在進行中" + +#. Translators: A pinned certificate is an exception which +#. trusts a given certificate explicitly for a purpose and +#. communication with a certain peer. +#: ../gcr/gcr-trust.c:364 +#, c-format +msgid "Couldn’t find a place to store the pinned certificate" +msgstr "找不到位置來儲存匯入的憑證" + +#: ../ui/gcr-certificate-renderer.c:117 +msgid "Basic Constraints" +msgstr "基本限制" + +#: ../ui/gcr-certificate-renderer.c:119 +msgid "Certificate Authority" +msgstr "憑證管理中心" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "Yes" +msgstr "是" + +#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +msgid "No" +msgstr "否" + +#: ../ui/gcr-certificate-renderer.c:123 +msgid "Max Path Length" +msgstr "最大路徑長度" + +#: ../ui/gcr-certificate-renderer.c:124 +msgid "Unlimited" +msgstr "無限制" + +#: ../ui/gcr-certificate-renderer.c:143 +msgid "Extended Key Usage" +msgstr "延伸金鑰用法" + +#: ../ui/gcr-certificate-renderer.c:154 +msgid "Allowed Purposes" +msgstr "允許的用途" + +#: ../ui/gcr-certificate-renderer.c:174 +msgid "Subject Key Identifier" +msgstr "主旨金鑰識別碼" + +#: ../ui/gcr-certificate-renderer.c:175 +msgid "Key Identifier" +msgstr "金鑰識別碼" + +#: ../ui/gcr-certificate-renderer.c:186 +msgid "Digital signature" +msgstr "數位簽章" + +#: ../ui/gcr-certificate-renderer.c:187 +msgid "Key encipherment" +msgstr "金鑰加密" + +#: ../ui/gcr-certificate-renderer.c:188 +msgid "Data encipherment" +msgstr "資料加密" + +#: ../ui/gcr-certificate-renderer.c:189 +msgid "Key agreement" +msgstr "金鑰協議" + +#: ../ui/gcr-certificate-renderer.c:190 +msgid "Certificate signature" +msgstr "憑證簽章" + +#: ../ui/gcr-certificate-renderer.c:191 +msgid "Revocation list signature" +msgstr "撤銷清單簽章" + +#: ../ui/gcr-certificate-renderer.c:216 +msgid "Key Usage" +msgstr "金鑰用法" + +#: ../ui/gcr-certificate-renderer.c:217 +msgid "Usages" +msgstr "用法" + +#: ../ui/gcr-certificate-renderer.c:237 +msgid "Subject Alternative Names" +msgstr "主旨替代名稱" + +#: ../ui/gcr-certificate-renderer.c:264 +msgid "Extension" +msgstr "延伸" + +#: ../ui/gcr-certificate-renderer.c:268 +msgid "Identifier" +msgstr "識別碼" + +#: ../ui/gcr-certificate-renderer.c:269 +#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-gnupg-renderer.c:429 +msgid "Value" +msgstr "數值" + +#: ../ui/gcr-certificate-renderer.c:287 +msgid "Couldn’t export the certificate." +msgstr "無法匯出這個憑證。" + +#: ../ui/gcr-certificate-renderer.c:521 +#: ../ui/gcr-certificate-request-renderer.c:310 +msgid "Identity" +msgstr "身分" + +#: ../ui/gcr-certificate-renderer.c:525 +msgid "Verified by" +msgstr "檢驗者" + +#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +msgid "Expires" +msgstr "到期" + +#. The subject +#: ../ui/gcr-certificate-renderer.c:539 +#: ../ui/gcr-certificate-request-renderer.c:316 +msgid "Subject Name" +msgstr "主旨名稱" + +#. The Issuer +#: ../ui/gcr-certificate-renderer.c:544 +msgid "Issuer Name" +msgstr "發照者名稱" + +#. The Issued Parameters +#: ../ui/gcr-certificate-renderer.c:549 +msgid "Issued Certificate" +msgstr "已簽發的憑證" + +#: ../ui/gcr-certificate-renderer.c:554 +#: ../ui/gcr-certificate-request-renderer.c:327 +msgid "Version" +msgstr "版本" + +#: ../ui/gcr-certificate-renderer.c:568 +msgid "Not Valid Before" +msgstr "在此之前無效" + +#: ../ui/gcr-certificate-renderer.c:573 +msgid "Not Valid After" +msgstr "在此之後無效" + +#. Fingerprints +#: ../ui/gcr-certificate-renderer.c:578 +msgid "Certificate Fingerprints" +msgstr "憑證數位指紋" + +#. Public Key Info +#: ../ui/gcr-certificate-renderer.c:584 +#: ../ui/gcr-certificate-request-renderer.c:330 +#: ../ui/gcr-certificate-request-renderer.c:376 +msgid "Public Key Info" +msgstr "公鑰資訊" + +#. Signature +#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 +#: ../ui/gcr-certificate-request-renderer.c:346 +#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +msgid "Signature" +msgstr "簽章" + +#: ../ui/gcr-certificate-renderer.c:616 +msgid "Export Certificate…" +msgstr "匯出憑證…" + +#: ../ui/gcr-certificate-renderer.c:855 +msgid "Key Algorithm" +msgstr "金鑰演算法" + +#: ../ui/gcr-certificate-renderer.c:860 +msgid "Key Parameters" +msgstr "金鑰參數" + +#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +msgid "Key Size" +msgstr "金鑰大小" + +#: ../ui/gcr-certificate-renderer.c:876 +msgid "Key SHA1 Fingerprint" +msgstr "金鑰 SHA1 數位指紋" + +#: ../ui/gcr-certificate-renderer.c:898 +msgid "Signature Algorithm" +msgstr "憑證簽章演算法" + +#: ../ui/gcr-certificate-renderer.c:902 +msgid "Signature Parameters" +msgstr "簽章參數" + +#: ../ui/gcr-certificate-renderer.c:951 +msgid "Critical" +msgstr "重要" + +#. The certificate request type +#: ../ui/gcr-certificate-request-renderer.c:94 +#: ../ui/gcr-certificate-request-renderer.c:305 +#: ../ui/gcr-certificate-request-renderer.c:320 +#: ../ui/gcr-certificate-request-renderer.c:363 +#: ../ui/gcr-certificate-request-renderer.c:368 +msgid "Certificate request" +msgstr "憑證要求" + +#: ../ui/gcr-certificate-request-renderer.c:258 +msgid "Attribute" +msgstr "屬性" + +#: ../ui/gcr-certificate-request-renderer.c:262 +#: ../ui/gcr-certificate-request-renderer.c:321 +#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Type" +msgstr "類型" + +#: ../ui/gcr-certificate-request-renderer.c:373 +msgid "Challenge" +msgstr "Challenge" + +#: ../ui/gcr-display-view.c:319 +msgid "_Details" +msgstr "詳細資料(_D)" + +#: ../ui/gcr-failure-renderer.c:159 +#, c-format +msgid "Could not display “%s”" +msgstr "無法顯示「%s」" + +#: ../ui/gcr-failure-renderer.c:161 +msgid "Could not display file" +msgstr "無法顯示檔案" + +#: ../ui/gcr-failure-renderer.c:166 +msgid "Reason" +msgstr "原因" + +#: ../ui/gcr-failure-renderer.c:216 +#, c-format +msgid "Cannot display a file of this type." +msgstr "不能顯示這個類型的檔案" + +#: ../ui/gcr-gnupg-renderer.c:201 +msgid "Elgamal" +msgstr "Elgamal" + +#: ../ui/gcr-gnupg-renderer.c:214 +msgid "Encrypt" +msgstr "加密" + +#: ../ui/gcr-gnupg-renderer.c:216 +msgid "Sign" +msgstr "簽署" + +#: ../ui/gcr-gnupg-renderer.c:218 +msgid "Certify" +msgstr "檢驗" + +#: ../ui/gcr-gnupg-renderer.c:220 +msgid "Authenticate" +msgstr "核對" + +#: ../ui/gcr-gnupg-renderer.c:222 +msgctxt "capability" +msgid "Disabled" +msgstr "已停用" + +#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 +#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +msgid "Unknown" +msgstr "不明" + +#: ../ui/gcr-gnupg-renderer.c:255 +msgid "Invalid" +msgstr "無效的" + +#: ../ui/gcr-gnupg-renderer.c:257 +msgctxt "ownertrust" +msgid "Disabled" +msgstr "已停用" + +#: ../ui/gcr-gnupg-renderer.c:259 +msgid "Revoked" +msgstr "已撤銷" + +#: ../ui/gcr-gnupg-renderer.c:261 +msgid "Expired" +msgstr "已過期" + +#: ../ui/gcr-gnupg-renderer.c:263 +msgid "Undefined trust" +msgstr "未定義的信任" + +#: ../ui/gcr-gnupg-renderer.c:265 +msgid "Distrusted" +msgstr "不被信任" + +#: ../ui/gcr-gnupg-renderer.c:267 +msgid "Marginally trusted" +msgstr "最低限度信任" + +#: ../ui/gcr-gnupg-renderer.c:269 +msgid "Fully trusted" +msgstr "完整信任" + +#: ../ui/gcr-gnupg-renderer.c:271 +msgid "Ultimately trusted" +msgstr "絕對信任" + +#: ../ui/gcr-gnupg-renderer.c:285 +msgid "The information in this key has not yet been verified" +msgstr "這個金鑰中的資訊尚未被驗證" + +#: ../ui/gcr-gnupg-renderer.c:288 +msgid "This key is invalid" +msgstr "這個金鑰是無效的" + +#: ../ui/gcr-gnupg-renderer.c:291 +msgid "This key has been disabled" +msgstr "這個金鑰已停用" + +#: ../ui/gcr-gnupg-renderer.c:294 +msgid "This key has been revoked" +msgstr "這個金鑰已被撤銷" + +#: ../ui/gcr-gnupg-renderer.c:297 +msgid "This key has expired" +msgstr "這個金鑰已經過期" + +#: ../ui/gcr-gnupg-renderer.c:302 +msgid "This key is distrusted" +msgstr "這個金鑰不被信任" + +#: ../ui/gcr-gnupg-renderer.c:305 +msgid "This key is marginally trusted" +msgstr "這個金鑰是最低限度信任的" + +#: ../ui/gcr-gnupg-renderer.c:308 +msgid "This key is fully trusted" +msgstr "這個金鑰是完整信任的" + +#: ../ui/gcr-gnupg-renderer.c:311 +msgid "This key is ultimately trusted" +msgstr "這個金鑰是絕對信任的" + +#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +msgid "Key ID" +msgstr "金鑰 ID" + +#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 +#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +msgid "Algorithm" +msgstr "演算法" + +#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 +#: ../ui/gcr-gnupg-renderer.c:479 +msgid "Created" +msgstr "建立" + +#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 +#: ../ui/gcr-gnupg-renderer.c:488 +msgid "Expiry" +msgstr "到期日" + +#: ../ui/gcr-gnupg-renderer.c:377 +msgid "Capabilities" +msgstr "能力" + +#: ../ui/gcr-gnupg-renderer.c:390 +msgid "Owner trust" +msgstr "擁有者的信任度" + +#: ../ui/gcr-gnupg-renderer.c:418 +msgid "Name" +msgstr "名稱" + +#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +msgid "Comment" +msgstr "註解" + +#: ../ui/gcr-gnupg-renderer.c:464 +msgid "User Attribute" +msgstr "使用者屬性" + +#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +msgid "Size" +msgstr "大小" + +#: ../ui/gcr-gnupg-renderer.c:506 +msgid "Signature of a binary document" +msgstr "二元檔文件的簽名" + +#: ../ui/gcr-gnupg-renderer.c:508 +msgid "Signature of a canonical text document" +msgstr "標準文字文件的簽名" + +#: ../ui/gcr-gnupg-renderer.c:510 +msgid "Standalone signature" +msgstr "單獨的簽名" + +#: ../ui/gcr-gnupg-renderer.c:512 +msgid "Generic certification of key" +msgstr "金鑰的一般憑證" + +#: ../ui/gcr-gnupg-renderer.c:514 +msgid "Persona certification of key" +msgstr "金鑰的個人憑證" + +#: ../ui/gcr-gnupg-renderer.c:516 +msgid "Casual certification of key" +msgstr "金鑰的臨時憑證" + +#: ../ui/gcr-gnupg-renderer.c:518 +msgid "Positive certification of key" +msgstr "金鑰的實際憑證" + +#: ../ui/gcr-gnupg-renderer.c:520 +msgid "Subkey binding signature" +msgstr "子金鑰綁定的簽名" + +#: ../ui/gcr-gnupg-renderer.c:522 +msgid "Primary key binding signature" +msgstr "主金鑰綁定的簽名" + +#: ../ui/gcr-gnupg-renderer.c:524 +msgid "Signature directly on key" +msgstr "直接在金鑰上簽署" + +#: ../ui/gcr-gnupg-renderer.c:526 +msgid "Key revocation signature" +msgstr "金鑰撤銷簽章" + +#: ../ui/gcr-gnupg-renderer.c:528 +msgid "Subkey revocation signature" +msgstr "子金鑰撤銷簽章" + +#: ../ui/gcr-gnupg-renderer.c:530 +msgid "Certification revocation signature" +msgstr "憑證撤銷簽章" + +#: ../ui/gcr-gnupg-renderer.c:532 +msgid "Timestamp signature" +msgstr "時間戳記簽名" + +#: ../ui/gcr-gnupg-renderer.c:534 +msgid "Third-party confirmation signature" +msgstr "第三方確認簽名" + +#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +msgid "Class" +msgstr "類別" + +#: ../ui/gcr-gnupg-renderer.c:589 +msgid "Local only" +msgstr "僅限本地端" + +#: ../ui/gcr-gnupg-renderer.c:591 +msgid "Exportable" +msgstr "可匯出" + +#: ../ui/gcr-gnupg-renderer.c:609 +msgid "Revocation Key" +msgstr "撤銷金鑰" + +#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 +#: ../ui/gcr-gnupg-renderer.c:649 +msgid "Fingerprint" +msgstr "數位指紋" + +#: ../ui/gcr-gnupg-renderer.c:738 +msgid "Public Subkey" +msgstr "公開子金鑰" + +#: ../ui/gcr-gnupg-renderer.c:740 +msgid "Secret Key" +msgstr "密鑰" + +#: ../ui/gcr-gnupg-renderer.c:742 +msgid "Secret Subkey" +msgstr "子密鑰" + +#: ../ui/gcr-import-button.c:116 +msgid "Initializing…" +msgstr "正在初始化..." + +#: ../ui/gcr-import-button.c:124 +msgid "Import is in progress…" +msgstr "正在進行匯入…" + +#: ../ui/gcr-import-button.c:131 +#, c-format +msgid "Imported to: %s" +msgstr "已匯入到:%s" + +#: ../ui/gcr-import-button.c:151 +#, c-format +msgid "Import to: %s" +msgstr "匯入到:%s" + +#: ../ui/gcr-import-button.c:164 +msgid "Cannot import because there are no compatible importers" +msgstr "不能匯入,因為沒有相容的匯入程式" + +#: ../ui/gcr-import-button.c:173 +msgid "No data to import" +msgstr "沒有資料可匯入" + +#: ../ui/gcr-key-renderer.c:88 +msgid "Key" +msgstr "金鑰" + +#: ../ui/gcr-key-renderer.c:355 +msgid "Private RSA Key" +msgstr "RSA 私鑰" + +#: ../ui/gcr-key-renderer.c:357 +msgid "Private DSA Key" +msgstr "DSA 私鑰" + +#: ../ui/gcr-key-renderer.c:359 +msgid "Private Elliptic Curve Key" +msgstr "私密橢圓曲線金鑰" + +#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +msgid "Public DSA Key" +msgstr "DSA 公鑰" + +#: ../ui/gcr-key-renderer.c:368 +msgid "Public Elliptic Curve Key" +msgstr "公開橢圓曲線金鑰" + +#: ../ui/gcr-key-renderer.c:377 +#, c-format +msgid "%u bit" +msgid_plural "%u bits" +msgstr[0] "%u 位元" + +#: ../ui/gcr-key-renderer.c:378 +msgid "Strength" +msgstr "強度" + +#. Fingerprints +#: ../ui/gcr-key-renderer.c:402 +msgid "Fingerprints" +msgstr "數位指紋" + +#: ../ui/gcr-key-renderer.c:406 +msgid "SHA1" +msgstr "SHA1" + +#: ../ui/gcr-key-renderer.c:411 +msgid "SHA256" +msgstr "SHA256" + +#. Add our various buttons +#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 +#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +msgid "_Cancel" +msgstr "取消(_C)" + +#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +msgid "_OK" +msgstr "確定(_O)" + +#: ../ui/gcr-pkcs11-import-dialog.c:189 +msgid "Automatically chosen" +msgstr "自動選擇" + +#: ../ui/gcr-pkcs11-import-dialog.c:273 +#: ../ui/gcr-pkcs11-import-interaction.c:152 +#: ../ui/gcr-pkcs11-import-interaction.c:170 +#, c-format +msgid "The user cancelled the operation" +msgstr "使用者已取消的操作" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +msgid "In order to import, please enter the password." +msgstr "為了匯入,請輸入密碼。" + +#. The password label +#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +msgid "Password:" +msgstr "密碼:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +msgid "Token:" +msgstr "智慧卡:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 +#: ../ui/gcr-unlock-renderer.c:124 +msgid "Unlock" +msgstr "解鎖" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +msgid "Label:" +msgstr "標籤:" + +#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +msgid "Import settings" +msgstr "匯入設定值" + +#. The confirm label +#: ../ui/gcr-prompt-dialog.c:578 +msgid "Confirm:" +msgstr "確認:" + +#: ../ui/gcr-prompt-dialog.c:646 +msgid "Passwords do not match." +msgstr "密碼不相符。" + +#: ../ui/gcr-prompt-dialog.c:653 +msgid "Password cannot be blank" +msgstr "密碼不能空白" + +#: ../ui/gcr-prompter.desktop.in.in.h:1 +msgid "Access Prompt" +msgstr "存取提示" + +#: ../ui/gcr-prompter.desktop.in.in.h:2 +msgid "Unlock access to passwords and other secrets" +msgstr "解除對密碼和其他保密的存取鎖定" + +#: ../ui/gcr-certificate-exporter.c:225 +msgid "A file already exists with this name." +msgstr "同樣名稱的另一個檔案已經存在。" + +#: ../ui/gcr-certificate-exporter.c:226 +msgid "Do you want to replace it with a new file?" +msgstr "是否要以新的檔案取代它?" + +#: ../ui/gcr-certificate-exporter.c:229 +msgid "_Replace" +msgstr "取代(_R)" + +#: ../ui/gcr-certificate-exporter.c:259 +#, c-format +msgid "The operation was cancelled." +msgstr "操作已被取消。" + +#: ../ui/gcr-certificate-exporter.c:303 +msgid "Export certificate" +msgstr "匯出憑證" + +#: ../ui/gcr-certificate-exporter.c:306 +msgid "_Save" +msgstr "儲存(_S)" + +#: ../ui/gcr-certificate-exporter.c:315 +msgid "Certificate files" +msgstr "憑證檔案" + +#: ../ui/gcr-certificate-exporter.c:326 +msgid "PEM files" +msgstr "PEM 檔案" + +#: ../ui/gcr-unlock-options-widget.ui.h:1 +msgid "Automatically unlock this keyring whenever I’m logged in" +msgstr "當我登入時自動解鎖鑰匙圈" + +#: ../ui/gcr-unlock-options-widget.ui.h:2 +msgid "Lock this keyring when I log out" +msgstr "當我登出時自動鎖定鑰匙圈" + +#: ../ui/gcr-unlock-options-widget.ui.h:3 +msgid "Lock this keyring after" +msgstr "鎖定這個鑰匙圈於" + +#: ../ui/gcr-unlock-options-widget.ui.h:4 +msgid "Lock this keyring if idle for" +msgstr "鎖定這個鑰匙圈於閒置" + +#. Translators: The +#: ../ui/gcr-unlock-options-widget.ui.h:6 +msgid "minutes" +msgstr "分鐘" + +#: ../ui/gcr-unlock-renderer.c:67 +#, c-format +msgid "Unlock: %s" +msgstr "解鎖:%s" + +#: ../ui/gcr-unlock-renderer.c:122 +msgid "Password" +msgstr "密碼" + +#: ../ui/gcr-unlock-renderer.c:274 +#, c-format +msgid "" +"The contents of “%s” are locked. In order to view the contents, enter the " +"correct password." +msgstr "「%s」的內容已鎖定。為了檢視內容,請輸入正確的密碼。" + +#: ../ui/gcr-unlock-renderer.c:277 +msgid "" +"The contents are locked. In order to view the contents, enter the correct " +"password." +msgstr "內容已鎖定。為了檢視內容,請輸入正確的密碼。" + +#: ../ui/gcr-viewer-tool.c:40 +msgid "GCR Certificate and Key Viewer" +msgstr "GCR 憑證與金鑰檢視器" + +#: ../ui/gcr-viewer-tool.c:47 +msgid "Show the application's version" +msgstr "顯示應用程式的版本" + +#: ../ui/gcr-viewer-tool.c:49 +msgid "[file...]" +msgstr "[檔案...]" + +#: ../ui/gcr-viewer-tool.c:100 +msgid "- View certificate and key files" +msgstr "- 檢視憑證與金鑰檔案" + +#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +msgid "Certificate Viewer" +msgstr "憑證檢視器" + +#: ../ui/gcr-viewer-widget.c:202 +msgid "The password was incorrect" +msgstr "密碼是不正確的" + +#: ../ui/gcr-viewer-window.c:75 +msgid "Imported" +msgstr "已匯入" + +#: ../ui/gcr-viewer-window.c:79 +msgid "Import failed" +msgstr "匯入失敗" + +#: ../ui/gcr-viewer-window.c:106 +msgid "Import" +msgstr "匯入" + +#: ../ui/gcr-viewer-window.c:115 +msgid "_Close" +msgstr "關閉(_C)" + +#~ msgid "Invalid PKCS#11 module: %s" +#~ msgstr "無效的 PKCS#11 模組:%s" + +#~ msgid "Couldn't setup PKCS#11 module: %s" +#~ msgstr "無法設定 PKCS#11 模組:%s" + +#~ msgid "Label" +#~ msgstr "標籤" + +#, fuzzy +#~ msgid "Unlock" +#~ msgstr "解鎖" diff --git a/schema/Makefile.am b/schema/Makefile.am new file mode 100644 index 0000000..0344bb1 --- /dev/null +++ b/schema/Makefile.am @@ -0,0 +1,18 @@ + +gsettings_SCHEMAS = \ + schema/org.gnome.crypto.pgp.gschema.xml + +@GSETTINGS_RULES@ + +convert_DATA = \ + schema/org.gnome.crypto.pgp.convert \ + schema/org.gnome.crypto.pgp_keyservers.convert + +convertdir = \ + $(datarootdir)/GConf/gsettings + +EXTRA_DIST += \ + $(convert_DATA) \ + $(gsettings_SCHEMAS) \ + $(gsettings_SCHEMAS:.xml=.valid) \ + $(NULL) diff --git a/schema/org.gnome.crypto.pgp.convert b/schema/org.gnome.crypto.pgp.convert new file mode 100644 index 0000000..86387d5 --- /dev/null +++ b/schema/org.gnome.crypto.pgp.convert @@ -0,0 +1,6 @@ +[org.gnome.crypto.pgp] +default-key = /desktop/pgp/default_key +ascii-armor = /desktop/pgp/ascii_armor +sort-recipients-by = /desktop/pgp/recipients/sort_by +encrypt-to-self = /desktop/pgp/encrypt_to_self +last-signer = /desktop/pgp/last_signer_openpgp diff --git a/schema/org.gnome.crypto.pgp.gschema.valid b/schema/org.gnome.crypto.pgp.gschema.valid new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/schema/org.gnome.crypto.pgp.gschema.valid diff --git a/schema/org.gnome.crypto.pgp.gschema.xml b/schema/org.gnome.crypto.pgp.gschema.xml new file mode 100644 index 0000000..08c9d40 --- /dev/null +++ b/schema/org.gnome.crypto.pgp.gschema.xml @@ -0,0 +1,34 @@ + + + + '' + Default PGP Key + This specifies the ID of the default PGP key to use for certain operations, mainly signing. + + + true + ASCII Armor + When encrypting or signing PGP files whether to use ASCII armor encoding. + + + 'name' + The column to sort the recipients + Specify the column to sort the recipients window by. Columns are: 'name' and 'id'. Put a '-' in front of the column name to sort in descending order. + + + true + Whether to always encrypt to default key + If set to true, then the default key will always be added to an encryption recipients list. + + + '' + Last key used to sign a message. + The ID of the last secret key used to sign a message. + + + ['hkp://pool.sks-keyservers.net', 'ldap://keyserver.pgp.com'] + PGP key servers + A list of key server URIs to search for remote PGP keys. A display name can be included, by appending a space and then the name. + + + diff --git a/schema/org.gnome.crypto.pgp_keyservers.convert b/schema/org.gnome.crypto.pgp_keyservers.convert new file mode 100644 index 0000000..24bbbdd --- /dev/null +++ b/schema/org.gnome.crypto.pgp_keyservers.convert @@ -0,0 +1,2 @@ +[org.gnome.crypto.pgp] +keyservers = /desktop/pgp/keyservers/all_keyservers diff --git a/ui/GcrUi-3.metadata b/ui/GcrUi-3.metadata new file mode 100644 index 0000000..85cb51a --- /dev/null +++ b/ui/GcrUi-3.metadata @@ -0,0 +1,5 @@ +// Metadata file for Vala API generation. +// See https://live.gnome.org/Vala/UpstreamGuide for more information + +CertificateRenderer + .label skip=true \ No newline at end of file diff --git a/ui/Makefile.am b/ui/Makefile.am new file mode 100644 index 0000000..2d2cfcd --- /dev/null +++ b/ui/Makefile.am @@ -0,0 +1,348 @@ + +ui_incdir = $(includedir)/gcr-@GCR_MAJOR@/ui + +check-ui-symbols: gcr-ui-expected.abi gcr-ui-actual.abi + $(AM_V_GEN) diff -U0 --ignore-blank-lines gcr-ui-expected.abi gcr-ui-actual.abi || \ + (echo "check-symbols: Symbols have CHANGED. Fix gcr-ui.symbols"; exit 1) + +ui_BUILT_SOURCES = \ + ui/gcr-enum-types.c ui/gcr-enum-types.h \ + ui/gcr-resources.c ui/gcr-resources.h + +BUILT_SOURCES += \ + $(ui_BUILT_SOURCES) + +libgcr_ui_@GCR_MAJOR@_la_CFLAGS = \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DGCR_API_SUBJECT_TO_CHANGE \ + -DP11_KIT_API_SUBJECT_TO_CHANGE \ + -DG_LOG_DOMAIN=\"Gcr\" \ + -DGCR_COMPILATION \ + $(P11_KIT_CFLAGS) \ + $(GTK_CFLAGS) + +libgcr_ui_@GCR_MAJOR@_la_LDFLAGS = \ + -version-info $(GCR_LT_RELEASE) \ + -no-undefined \ + -export-symbols-regex '^_gcr_.*|^gcr_.*|^SECMEM_.*' + +libgcr_ui_@GCR_MAJOR@_la_LIBADD = \ + libegg.la \ + libgcr-base-$(GCR_MAJOR).la \ + libgck-@GCK_MAJOR@.la \ + $(GLIB_LIBS) \ + $(LIBGCRYPT_LIBS) \ + $(P11_KIT_LIBS) \ + $(GTK_LIBS) \ + $(NULL) + +# libgcr-3.so (and friends) symlink to libgcr-ui-3.so for compatibility raisons +install-exec-hook: + $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so + $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so.@GCR_CURRENT@ + $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so.@GCR_CURRENT@.0.0 + +lib_LTLIBRARIES += \ + libgcr-ui-@GCR_MAJOR@.la + +ui_HEADER_FILES = \ + ui/gcr-ui.h \ + ui/gcr-certificate-basics-widget.h \ + ui/gcr-certificate-details-widget.h \ + ui/gcr-certificate-renderer.h \ + ui/gcr-certificate-widget.h \ + ui/gcr-collection-model.h \ + ui/gcr-combo-selector.h \ + ui/gcr-deprecated.h \ + ui/gcr-failure-renderer.h \ + ui/gcr-key-renderer.h \ + ui/gcr-key-widget.h \ + ui/gcr-import-button.h \ + ui/gcr-list-selector.h \ + ui/gcr-prompt-dialog.h \ + ui/gcr-renderer.h \ + ui/gcr-secure-entry-buffer.h \ + ui/gcr-tree-selector.h \ + ui/gcr-unlock-options-widget.h \ + ui/gcr-viewer.h \ + ui/gcr-viewer-widget.h + +ui_inc_HEADERS = \ + $(ui_HEADER_FILES) \ + ui/gcr-enum-types.h + +ui_PUBLIC_FILES = \ + ui/gcr-certificate-renderer.c ui/gcr-certificate-renderer.h \ + ui/gcr-certificate-widget.c ui/gcr-certificate-widget.h \ + ui/gcr-collection-model.c ui/gcr-collection-model.h \ + ui/gcr-combo-selector.c ui/gcr-combo-selector.h \ + ui/gcr-failure-renderer.c ui/gcr-failure-renderer.h \ + ui/gcr-key-renderer.c ui/gcr-key-renderer.h \ + ui/gcr-key-widget.c ui/gcr-key-widget.h \ + ui/gcr-import-button.c ui/gcr-import-button.h \ + ui/gcr-list-selector.c ui/gcr-list-selector.h \ + ui/gcr-prompt-dialog.c ui/gcr-prompt-dialog.h \ + ui/gcr-renderer.c ui/gcr-renderer.h \ + ui/gcr-secure-entry-buffer.c ui/gcr-secure-entry-buffer.h \ + ui/gcr-tree-selector.c ui/gcr-tree-selector.h \ + ui/gcr-unlock-options-widget.c ui/gcr-unlock-options-widget.h \ + ui/gcr-viewer.c ui/gcr-viewer.h \ + ui/gcr-viewer-widget.c ui/gcr-viewer-widget.h \ + ui/gcr-ui.h \ + $(NULL) + +ui_PRIVATE_FILES = \ + ui/eggimagemenuitem.c ui/eggimagemenuitem.h \ + ui/gcr-certificate-basics-widget.c ui/gcr-certificate-basics-widget.h \ + ui/gcr-certificate-details-widget.c ui/gcr-certificate-details-widget.h \ + ui/gcr-certificate-exporter.c ui/gcr-certificate-exporter.h \ + ui/gcr-certificate-renderer-private.h \ + ui/gcr-certificate-request-renderer.c ui/gcr-certificate-request-renderer.h \ + ui/gcr-deprecated.h \ + ui/gcr-dialog-util.c ui/gcr-dialog-util.h \ + ui/gcr-display-scrolled.c ui/gcr-display-scrolled.h \ + ui/gcr-display-view.c ui/gcr-display-view.h \ + ui/gcr-gnupg-renderer.c ui/gcr-gnupg-renderer.h \ + ui/gcr-list-selector-private.h \ + ui/gcr-live-search.c ui/gcr-live-search.h \ + ui/gcr-pkcs11-import-dialog.c ui/gcr-pkcs11-import-dialog.h \ + ui/gcr-pkcs11-import-interaction.c ui/gcr-pkcs11-import-interaction.h \ + ui/gcr-unlock-renderer.c ui/gcr-unlock-renderer.h \ + ui/gcr-viewer-window.c ui/gcr-viewer-window.h \ + $(NULL) + +libgcr_ui_@GCR_MAJOR@_la_SOURCES = \ + $(ui_PUBLIC_FILES) \ + $(ui_PRIVATE_FILES) \ + $(NULL) + +nodist_libgcr_ui_@GCR_MAJOR@_la_SOURCES = \ + $(ui_BUILT_SOURCES) + +ui/gcr-enum-types.h: $(ENUM_TEMPLATE_H) $(ui_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +ui/gcr-enum-types.c: $(ENUM_TEMPLATE_C) $(ui_HEADER_FILES) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ + +ui_RESOURCES = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/ui --generate-dependencies $(srcdir)/ui/gcr.gresource.xml) + +ui/gcr-resources.h: ui/gcr.gresource.xml + $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/ui --generate-header --internal + +ui/gcr-resources.c: ui/gcr.gresource.xml $(ui_RESOURCES) + $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/ui --generate-source --internal + +gcr-ui-$(GCR_MAJOR).pc: ui/gcr-ui.pc + $(AM_V_GEN) cp ui/gcr-ui.pc gcr-ui-$(GCR_MAJOR).pc +gcr-$(GCR_MAJOR).pc: ui/gcr.pc + $(AM_V_GEN) cp ui/gcr.pc gcr-$(GCR_MAJOR).pc + +if HAVE_INTROSPECTION + +INTROSPECTION_GIRS += GcrUi-@GCR_MAJOR@.gir + +GcrUi-@GCR_MAJOR@.gir: libgcr-ui-@GCR_MAJOR@.la Gcr-@GCR_MAJOR@.gir + +GcrUi_@GCR_MAJOR@_gir_PACKAGES = gtk+-3.0 p11-kit-1 +GcrUi_@GCR_MAJOR@_gir_EXPORT_PACKAGES = gcr-ui-@GCR_MAJOR@ +GcrUi_@GCR_MAJOR@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gtk-3.0 +GcrUi_@GCR_MAJOR@_gir_LIBS = libgcr-base-@GCR_MAJOR@.la libgcr-ui-@GCR_MAJOR@.la +GcrUi_@GCR_MAJOR@_gir_CFLAGS = -I$(srcdir) -I$(builddir) -DGCR_COMPILATION -DGCR_API_SUBJECT_TO_CHANGE +GcrUi_@GCR_MAJOR@_gir_FILES = $(ui_PUBLIC_FILES) +GcrUi_@GCR_MAJOR@_gir_SCANNERFLAGS = \ + --add-include-path=$(builddir)/gck \ + --add-include-path=$(builddir)/gcr \ + --include-uninstalled=Gck-@GCK_MAJOR@.gir \ + --include-uninstalled=Gcr-@GCR_MAJOR@.gir \ + --c-include "ui/gcr-ui.h" \ + --identifier-prefix Gcr --symbol-prefix gcr + +gir_DATA += GcrUi-@GCR_MAJOR@.gir + +if ENABLE_VAPIGEN + +gcr-ui-@GCR_MAJOR@.vapi: GcrUi-@GCR_MAJOR@.gir ui/GcrUi-@GCR_MAJOR@.metadata gcr-ui-@GCR_MAJOR@.deps gck-@GCK_MAJOR@.vapi gcr-@GCR_MAJOR@.vapi + +VAPIGEN_VAPIS += gcr-ui-@GCR_MAJOR@.vapi + +gcr_ui_@GCR_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 gck-@GCK_MAJOR@ gcr-@GCR_MAJOR@ gtk+-3.0 +gcr_ui_@GCR_MAJOR@_vapi_METADATADIRS = $(srcdir)/ui +gcr_ui_@GCR_MAJOR@_vapi_VAPIDIRS = $(builddir) +gcr_ui_@GCR_MAJOR@_vapi_GIRDIRS = $(builddir) +gcr_ui_@GCR_MAJOR@_vapi_FILES = GcrUi-@GCR_MAJOR@.gir + +gcr-ui-$(GCR_MAJOR).deps: Makefile.am + $(AM_V_GEN) echo $(gcr_ui_@GCR_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ + +EXTRA_DIST += \ + ui/GcrUi-@GCR_MAJOR@.metadata + +endif # ENABLE_VAPIGEN + +endif # HAVE_INTROSPECTION + +pkgconfig_DATA += \ + gcr-$(GCR_MAJOR).pc \ + gcr-ui-$(GCR_MAJOR).pc + +gcr-ui-expected.abi: ui/gcr-ui.symbols + $(AM_V_GEN) cpp -P $< | sort > $@ + +desktopdir = $(datadir)/applications +desktop_in_in_files = ui/gcr-viewer.desktop.in.in ui/gcr-prompter.desktop.in.in +desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in) +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) + +bin_PROGRAMS = gcr-viewer + +gcr_viewer_SOURCES = \ + ui/gcr-viewer-tool.c + +gcr_viewer_CFLAGS = \ + $(P11_KIT_CFLAGS) \ + $(GTK_CFLAGS) \ + -DGCR_API_SUBJECT_TO_CHANGE + +gcr_viewer_LDADD = \ + libgcr-ui-$(GCR_MAJOR).la \ + libgcr-base-$(GCR_MAJOR).la \ + libgck-@GCK_MAJOR@.la \ + $(GLIB_LIBS) \ + $(GTK_LIBS) + +libexec_PROGRAMS += gcr-prompter + +gcr_prompter_SOURCES = \ + ui/gcr-prompter-tool.c + +gcr_prompter_CFLAGS = \ + -DGCR_API_SUBJECT_TO_CHANGE \ + $(P11_KIT_CFLAGS) \ + $(GTK_CFLAGS) + +gcr_prompter_LDADD = \ + libgcr-ui-$(GCR_MAJOR).la \ + libgcr-base-$(GCR_MAJOR).la \ + libgck-@GCK_MAJOR@.la \ + $(GTK_LIBS) + +EXTRA_DIST += \ + ui/gcr.pc.in \ + ui/gcr-ui.pc.in \ + ui/gcr-ui.symbols \ + ui/gcr.gresource.xml \ + $(desktop_in_in_files) \ + $(ui_RESOURCES) \ + $(mime_DATA) \ + ui/fixtures + +CLEANFILES += \ + $(desktop_DATA) \ + gcr-ui-actual.abi \ + gcr-ui-expected.abi \ + $(desktop_in_files) \ + $(NULL) + +# The new mime system +mimedir = $(datadir)/mime/packages +mime_DATA = ui/gcr-crypto-types.xml + +if WITH_UPDATE_MIME + +update_mime_database_cmd = update-mime-database $(datadir)/mime/ + +install-data-hook: update_mime_database +uninstall-hook: update_mime_database + +update_mime_database: + @-if test -z "$(DESTDIR)"; then \ + echo "Updating MIME database."; \ + $(update_mime_database_cmd); \ + else \ + echo "*** MIME database not updated. After (un)install, run this:"; \ + echo "*** $(update_mime_database_cmd)"; \ + fi + +endif # WITH_UPDATE_MIME + +gcr-ui-actual.abi: .libs/libgcr-ui-@GCR_MAJOR@.so + $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ + cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end|_gcr_)' | sort > $@ + +ui_CFLAGS = \ + -DGCR_API_SUBJECT_TO_CHANGE \ + -DGCK_API_SUBJECT_TO_CHANGE \ + -DGCR_COMPILATION \ + $(LIBGCRYPT_CFLAGS) \ + $(P11_KIT_CFLAGS) \ + $(GTK_CFLAGS) + +ui_LIBS = \ + libgcr-ui-@GCR_MAJOR@.la \ + libgcr-base-@GCR_MAJOR@.la \ + libegg.la \ + libgck-testable.la \ + $(LIBGCRYPT_LIBS) \ + $(P11_KIT_LIBS) \ + $(GTK_LIBS) + +# ------------------------------------------------------------------ + +noinst_PROGRAMS += \ + frob-certificate \ + frob-combo-selector \ + frob-gnupg-selector \ + frob-import-button \ + frob-key \ + frob-tree-selector \ + frob-prompt \ + frob-request \ + frob-system-prompt \ + frob-unlock \ + frob-unlock-options + +frob_certificate_SOURCES = ui/frob-certificate.c +frob_certificate_CFLAGS = $(ui_CFLAGS) +frob_certificate_LDADD = $(ui_LIBS) + +frob_combo_selector_SOURCES = ui/frob-combo-selector.c +frob_combo_selector_CFLAGS = $(ui_CFLAGS) +frob_combo_selector_LDADD = $(ui_LIBS) + +frob_gnupg_selector_SOURCES = ui/frob-gnupg-selector.c +frob_gnupg_selector_CFLAGS = $(ui_CFLAGS) +frob_gnupg_selector_LDADD = $(ui_LIBS) + +frob_import_button_SOURCES = ui/frob-import-button.c +frob_import_button_CFLAGS = $(ui_CFLAGS) +frob_import_button_LDADD = $(ui_LIBS) + +frob_key_SOURCES = ui/frob-key.c +frob_key_CFLAGS = $(ui_CFLAGS) +frob_key_LDADD = $(ui_LIBS) + +frob_prompt_SOURCES = ui/frob-prompt.c +frob_prompt_CFLAGS = $(ui_CFLAGS) +frob_prompt_LDADD = $(ui_LIBS) + +frob_request_SOURCES = ui/frob-request.c +frob_request_CFLAGS = $(ui_CFLAGS) +frob_request_LDADD = $(ui_LIBS) + +frob_system_prompt_SOURCES = ui/frob-system-prompt.c +frob_system_prompt_CFLAGS = $(ui_CFLAGS) +frob_system_prompt_LDADD = $(ui_LIBS) + +frob_tree_selector_SOURCES = ui/frob-tree-selector.c +frob_tree_selector_CFLAGS = $(ui_CFLAGS) +frob_tree_selector_LDADD = $(ui_LIBS) + +frob_unlock_SOURCES = \ + ui/frob-unlock.c ui/gcr-viewer-window.c +frob_unlock_CFLAGS = $(ui_CFLAGS) +frob_unlock_LDADD = $(ui_LIBS) + +frob_unlock_options_SOURCES = ui/frob-unlock-options.c +frob_unlock_options_CFLAGS = $(ui_CFLAGS) +frob_unlock_options_LDADD = $(ui_LIBS) diff --git a/ui/eggimagemenuitem.c b/ui/eggimagemenuitem.c new file mode 100644 index 0000000..6b165c5 --- /dev/null +++ b/ui/eggimagemenuitem.c @@ -0,0 +1,736 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2001 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +/* + * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained + * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub + * Gcr wants to use image menu items in button drop downs using the device icons + * (for the import button). So just copy it here with the stock and activatable + * sutff removed + */ + +/* + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "config.h" + +#include "eggimagemenuitem.h" + +struct _EggImageMenuItemPrivate +{ + GtkWidget *image; + + gchar *label; + guint always_show_image : 1; + guint16 toggle_size; +}; + +enum { + PROP_0, + PROP_IMAGE, + PROP_ALWAYS_SHOW_IMAGE +}; + +static void egg_image_menu_item_destroy (GtkWidget *widget); +static void egg_image_menu_item_get_preferred_width (GtkWidget *widget, + gint *minimum, + gint *natural); +static void egg_image_menu_item_get_preferred_height (GtkWidget *widget, + gint *minimum, + gint *natural); +static void egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget, + gint width, + gint *minimum, + gint *natural); +static void egg_image_menu_item_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); +static void egg_image_menu_item_map (GtkWidget *widget); +static void egg_image_menu_item_remove (GtkContainer *container, + GtkWidget *child); +static void egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item, + gint *requisition); +static void egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item, + gint allocation); +static void egg_image_menu_item_set_label (GtkMenuItem *menu_item, + const gchar *label); +static const gchar * egg_image_menu_item_get_label (GtkMenuItem *menu_item); + +static void egg_image_menu_item_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data); + +static void egg_image_menu_item_finalize (GObject *object); +static void egg_image_menu_item_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void egg_image_menu_item_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void egg_image_menu_item_screen_changed (GtkWidget *widget, + GdkScreen *previous_screen); + +static void egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item); + +G_DEFINE_TYPE (EggImageMenuItem, egg_image_menu_item, GTK_TYPE_MENU_ITEM); + +static void +egg_image_menu_item_class_init (EggImageMenuItemClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass*) klass; + GtkMenuItemClass *menu_item_class = (GtkMenuItemClass*) klass; + GtkContainerClass *container_class = (GtkContainerClass*) klass; + + widget_class->destroy = egg_image_menu_item_destroy; + widget_class->screen_changed = egg_image_menu_item_screen_changed; + widget_class->get_preferred_width = egg_image_menu_item_get_preferred_width; + widget_class->get_preferred_height = egg_image_menu_item_get_preferred_height; + widget_class->get_preferred_height_for_width = egg_image_menu_item_get_preferred_height_for_width; + widget_class->size_allocate = egg_image_menu_item_size_allocate; + widget_class->map = egg_image_menu_item_map; + + container_class->forall = egg_image_menu_item_forall; + container_class->remove = egg_image_menu_item_remove; + + menu_item_class->toggle_size_request = egg_image_menu_item_toggle_size_request; + menu_item_class->toggle_size_allocate = egg_image_menu_item_toggle_size_allocate; + menu_item_class->set_label = egg_image_menu_item_set_label; + menu_item_class->get_label = egg_image_menu_item_get_label; + + gobject_class->finalize = egg_image_menu_item_finalize; + gobject_class->set_property = egg_image_menu_item_set_property; + gobject_class->get_property = egg_image_menu_item_get_property; + + g_object_class_install_property (gobject_class, + PROP_IMAGE, + g_param_spec_object ("image", + "Image widget", + "Child widget to appear next to the menu text", + GTK_TYPE_WIDGET, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_ALWAYS_SHOW_IMAGE, + g_param_spec_boolean ("always-show-image", + "Always show image", + "Whether the image will always be shown", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT)); + + g_type_class_add_private (gobject_class, sizeof (EggImageMenuItemPrivate)); +} + +static void +egg_image_menu_item_init (EggImageMenuItem *image_menu_item) +{ + EggImageMenuItemPrivate *priv; + + image_menu_item->priv = G_TYPE_INSTANCE_GET_PRIVATE (image_menu_item, EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemPrivate); + priv = image_menu_item->priv; + + priv->image = NULL; + priv->label = NULL; +} + +static void +egg_image_menu_item_finalize (GObject *object) +{ + EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (object)->priv; + + g_free (priv->label); + priv->label = NULL; + + G_OBJECT_CLASS (egg_image_menu_item_parent_class)->finalize (object); +} + +static void +egg_image_menu_item_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object); + + switch (prop_id) + { + case PROP_IMAGE: + egg_image_menu_item_set_image (image_menu_item, (GtkWidget *) g_value_get_object (value)); + break; + case PROP_ALWAYS_SHOW_IMAGE: + egg_image_menu_item_set_always_show_image (image_menu_item, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +egg_image_menu_item_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object); + + switch (prop_id) + { + case PROP_IMAGE: + g_value_set_object (value, egg_image_menu_item_get_image (image_menu_item)); + break; + case PROP_ALWAYS_SHOW_IMAGE: + g_value_set_boolean (value, egg_image_menu_item_get_always_show_image (image_menu_item)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +show_image (EggImageMenuItem *image_menu_item) +{ + EggImageMenuItemPrivate *priv = image_menu_item->priv; + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (image_menu_item)); + gboolean show; + + if (priv->always_show_image) + show = TRUE; + else + g_object_get (settings, "gtk-menu-images", &show, NULL); + + return show; +} + +static void +egg_image_menu_item_map (GtkWidget *widget) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + + GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->map (widget); + + if (priv->image) + g_object_set (priv->image, + "visible", show_image (image_menu_item), + NULL); +} + +static void +egg_image_menu_item_destroy (GtkWidget *widget) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + + if (priv->image) + gtk_container_remove (GTK_CONTAINER (image_menu_item), + priv->image); + + GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->destroy (widget); +} + +static void +egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item, + gint *requisition) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + GtkPackDirection pack_dir; + GtkWidget *parent; + GtkWidget *widget = GTK_WIDGET (menu_item); + + parent = gtk_widget_get_parent (widget); + + if (GTK_IS_MENU_BAR (parent)) + pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); + else + pack_dir = GTK_PACK_DIRECTION_LTR; + + *requisition = 0; + + if (priv->image && gtk_widget_get_visible (priv->image)) + { + GtkRequisition image_requisition; + guint toggle_spacing; + + gtk_widget_get_preferred_size (priv->image, &image_requisition, NULL); + + gtk_widget_style_get (GTK_WIDGET (menu_item), + "toggle-spacing", &toggle_spacing, + NULL); + + if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL) + { + if (image_requisition.width > 0) + *requisition = image_requisition.width + toggle_spacing; + } + else + { + if (image_requisition.height > 0) + *requisition = image_requisition.height + toggle_spacing; + } + } +} + +static void +egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item, + gint allocation) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item); + image_menu_item->priv->toggle_size = allocation; + GTK_MENU_ITEM_CLASS (egg_image_menu_item_parent_class)->toggle_size_allocate (menu_item, allocation); +} + +static void +egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item) +{ + EggImageMenuItemPrivate *priv = image_menu_item->priv; + + GTK_MENU_ITEM_CLASS + (egg_image_menu_item_parent_class)->set_label (GTK_MENU_ITEM (image_menu_item), priv->label); +} + +static void +egg_image_menu_item_set_label (GtkMenuItem *menu_item, + const gchar *label) +{ + EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv; + + if (priv->label != label) + { + g_free (priv->label); + priv->label = g_strdup (label); + + egg_image_menu_item_recalculate (EGG_IMAGE_MENU_ITEM (menu_item)); + + g_object_notify (G_OBJECT (menu_item), "label"); + + } +} + +static const gchar * +egg_image_menu_item_get_label (GtkMenuItem *menu_item) +{ + EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv; + + return priv->label; +} + +static void +egg_image_menu_item_get_preferred_width (GtkWidget *widget, + gint *minimum, + gint *natural) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + GtkPackDirection pack_dir; + GtkWidget *parent; + + parent = gtk_widget_get_parent (widget); + + if (GTK_IS_MENU_BAR (parent)) + pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); + else + pack_dir = GTK_PACK_DIRECTION_LTR; + + GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_width (widget, minimum, natural); + + if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) && + priv->image && + gtk_widget_get_visible (priv->image)) + { + gint child_minimum, child_natural; + + gtk_widget_get_preferred_width (priv->image, &child_minimum, &child_natural); + + *minimum = MAX (*minimum, child_minimum); + *natural = MAX (*natural, child_natural); + } +} + +static void +egg_image_menu_item_get_preferred_height (GtkWidget *widget, + gint *minimum, + gint *natural) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + gint child_height = 0; + GtkPackDirection pack_dir; + GtkWidget *parent; + + parent = gtk_widget_get_parent (widget); + + if (GTK_IS_MENU_BAR (parent)) + pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); + else + pack_dir = GTK_PACK_DIRECTION_LTR; + + if (priv->image && gtk_widget_get_visible (priv->image)) + { + GtkRequisition child_requisition; + + gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL); + + child_height = child_requisition.height; + } + + GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_height (widget, minimum, natural); + + if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR) + { + *minimum = MAX (*minimum, child_height); + *natural = MAX (*natural, child_height); + } +} + +static void +egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget, + gint width, + gint *minimum, + gint *natural) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + gint child_height = 0; + GtkPackDirection pack_dir; + GtkWidget *parent; + + parent = gtk_widget_get_parent (widget); + + if (GTK_IS_MENU_BAR (parent)) + pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); + else + pack_dir = GTK_PACK_DIRECTION_LTR; + + if (priv->image && gtk_widget_get_visible (priv->image)) + { + GtkRequisition child_requisition; + + gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL); + + child_height = child_requisition.height; + } + + GTK_WIDGET_CLASS + (egg_image_menu_item_parent_class)->get_preferred_height_for_width (widget, width, minimum, natural); + + if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR) + { + *minimum = MAX (*minimum, child_height); + *natural = MAX (*natural, child_height); + } +} + + +static void +egg_image_menu_item_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + GtkAllocation widget_allocation; + GtkPackDirection pack_dir; + GtkWidget *parent; + + parent = gtk_widget_get_parent (widget); + + if (GTK_IS_MENU_BAR (parent)) + pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); + else + pack_dir = GTK_PACK_DIRECTION_LTR; + + GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->size_allocate (widget, allocation); + + if (priv->image && gtk_widget_get_visible (priv->image)) + { + gint x, y, offset; + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding; + GtkRequisition child_requisition; + GtkAllocation child_allocation; + guint horizontal_padding, toggle_spacing; + gint toggle_size; + + toggle_size = priv->toggle_size; + gtk_widget_style_get (widget, + "horizontal-padding", &horizontal_padding, + "toggle-spacing", &toggle_spacing, + NULL); + + /* Man this is lame hardcoding action, but I can't + * come up with a solution that's really better. + */ + + gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL); + + gtk_widget_get_allocation (widget, &widget_allocation); + + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_padding (context, state, &padding); + offset = gtk_container_get_border_width (GTK_CONTAINER (image_menu_item)); + + if (pack_dir == GTK_PACK_DIRECTION_LTR || + pack_dir == GTK_PACK_DIRECTION_RTL) + { + if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) == + (pack_dir == GTK_PACK_DIRECTION_LTR)) + x = offset + horizontal_padding + padding.left + + (toggle_size - toggle_spacing - child_requisition.width) / 2; + else + x = widget_allocation.width - offset - horizontal_padding - padding.right - + toggle_size + toggle_spacing + + (toggle_size - toggle_spacing - child_requisition.width) / 2; + + y = (widget_allocation.height - child_requisition.height) / 2; + } + else + { + if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) == + (pack_dir == GTK_PACK_DIRECTION_TTB)) + y = offset + horizontal_padding + padding.top + + (toggle_size - toggle_spacing - child_requisition.height) / 2; + else + y = widget_allocation.height - offset - horizontal_padding - padding.bottom - + toggle_size + toggle_spacing + + (toggle_size - toggle_spacing - child_requisition.height) / 2; + + x = (widget_allocation.width - child_requisition.width) / 2; + } + + child_allocation.width = child_requisition.width; + child_allocation.height = child_requisition.height; + child_allocation.x = widget_allocation.x + MAX (x, 0); + child_allocation.y = widget_allocation.y + MAX (y, 0); + + gtk_widget_size_allocate (priv->image, &child_allocation); + } +} + +static void +egg_image_menu_item_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + + GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->forall (container, + include_internals, + callback, + callback_data); + + if (include_internals && priv->image) + (* callback) (priv->image, callback_data); +} + +GtkWidget* +egg_image_menu_item_new (void) +{ + return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, NULL); +} + +GtkWidget* +egg_image_menu_item_new_with_label (const gchar *label) +{ + return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, + "label", label, + NULL); +} + +GtkWidget* +egg_image_menu_item_new_with_mnemonic (const gchar *label) +{ + return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, + "use-underline", TRUE, + "label", label, + NULL); +} + +void +egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item, + gboolean always_show) +{ + EggImageMenuItemPrivate *priv; + + g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item)); + + priv = image_menu_item->priv; + + if (priv->always_show_image != always_show) + { + priv->always_show_image = always_show; + + if (priv->image) + { + if (show_image (image_menu_item)) + gtk_widget_show (priv->image); + else + gtk_widget_hide (priv->image); + } + + g_object_notify (G_OBJECT (image_menu_item), "always-show-image"); + } +} + +gboolean +egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item) +{ + g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), FALSE); + + return image_menu_item->priv->always_show_image; +} + +void +egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item, + GtkWidget *image) +{ + EggImageMenuItemPrivate *priv; + + g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item)); + + priv = image_menu_item->priv; + + if (image == priv->image) + return; + + if (priv->image) + gtk_container_remove (GTK_CONTAINER (image_menu_item), + priv->image); + + priv->image = image; + + if (image == NULL) + return; + + gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item)); + g_object_set (image, + "visible", show_image (image_menu_item), + "no-show-all", TRUE, + NULL); + + g_object_notify (G_OBJECT (image_menu_item), "image"); +} + +GtkWidget* +egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item) +{ + g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), NULL); + + return image_menu_item->priv->image; +} + +static void +egg_image_menu_item_remove (GtkContainer *container, + GtkWidget *child) +{ + EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container); + EggImageMenuItemPrivate *priv = image_menu_item->priv; + + if (child == priv->image) + { + gboolean widget_was_visible; + + widget_was_visible = gtk_widget_get_visible (child); + + gtk_widget_unparent (child); + priv->image = NULL; + + if (widget_was_visible && + gtk_widget_get_visible (GTK_WIDGET (container))) + gtk_widget_queue_resize (GTK_WIDGET (container)); + + g_object_notify (G_OBJECT (image_menu_item), "image"); + } + else + { + GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->remove (container, child); + } +} + +static void +show_image_change_notify (EggImageMenuItem *image_menu_item) +{ + EggImageMenuItemPrivate *priv = image_menu_item->priv; + + if (priv->image) + { + if (show_image (image_menu_item)) + gtk_widget_show (priv->image); + else + gtk_widget_hide (priv->image); + } +} + +static void +traverse_container (GtkWidget *widget, + gpointer data) +{ + if (EGG_IS_IMAGE_MENU_ITEM (widget)) + show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget)); + else if (GTK_IS_CONTAINER (widget)) + gtk_container_forall (GTK_CONTAINER (widget), traverse_container, NULL); +} + +static void +egg_image_menu_item_setting_changed (GtkSettings *settings) +{ + GList *list, *l; + + list = gtk_window_list_toplevels (); + + for (l = list; l; l = l->next) + gtk_container_forall (GTK_CONTAINER (l->data), + traverse_container, NULL); + + g_list_free (list); +} + +static void +egg_image_menu_item_screen_changed (GtkWidget *widget, + GdkScreen *previous_screen) +{ + GtkSettings *settings; + gulong show_image_connection; + + if (!gtk_widget_has_screen (widget)) + return; + + settings = gtk_widget_get_settings (widget); + + show_image_connection = + g_signal_handler_find (settings, G_SIGNAL_MATCH_FUNC, 0, 0, + NULL, egg_image_menu_item_setting_changed, NULL); + + if (show_image_connection) + return; + + g_signal_connect (settings, "notify::gtk-menu-images", + G_CALLBACK (egg_image_menu_item_setting_changed), NULL); + + show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget)); +} diff --git a/ui/eggimagemenuitem.h b/ui/eggimagemenuitem.h new file mode 100644 index 0000000..28d26ff --- /dev/null +++ b/ui/eggimagemenuitem.h @@ -0,0 +1,78 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +/* + * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained + * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub + * Gcr wants to use image menu items in button drop downs using the device icons + * (for the import button). So just copy it here with the stock and activatable + * sutff removed + */ + +/* + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __EGG_IMAGE_MENUITEM_H__ +#define __EGG_IMAGE_MENUITEM_H__ + +#include + +G_BEGIN_DECLS + +#define EGG_TYPE_IMAGE_MENU_ITEM (egg_image_menu_item_get_type ()) +#define EGG_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItem)) +#define EGG_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass)) +#define EGG_IS_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_IMAGE_MENU_ITEM)) +#define EGG_IS_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_IMAGE_MENU_ITEM)) +#define EGG_IMAGE_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass)) + + +typedef struct _EggImageMenuItem EggImageMenuItem; +typedef struct _EggImageMenuItemPrivate EggImageMenuItemPrivate; +typedef struct _EggImageMenuItemClass EggImageMenuItemClass; + +struct _EggImageMenuItem +{ + GtkMenuItem menu_item; + + /*< private >*/ + EggImageMenuItemPrivate *priv; +}; + +struct _EggImageMenuItemClass +{ + GtkMenuItemClass parent_class; +}; + +GType egg_image_menu_item_get_type (void) G_GNUC_CONST; +GtkWidget* egg_image_menu_item_new (void); +GtkWidget* egg_image_menu_item_new_with_label (const gchar *label); +GtkWidget* egg_image_menu_item_new_with_mnemonic (const gchar *label); +void egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item, + gboolean always_show); +gboolean egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item); +void egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item, + GtkWidget *image); +GtkWidget* egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item); + +G_END_DECLS + +#endif /* __EGG_IMAGE_MENUITEM_H__ */ diff --git a/ui/fixtures/ca-certificates.crt b/ui/fixtures/ca-certificates.crt new file mode 100644 index 0000000..c30335f --- /dev/null +++ b/ui/fixtures/ca-certificates.crt @@ -0,0 +1,2560 @@ +-----BEGIN CERTIFICATE----- +MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx +EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h +bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy +YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp +Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy +MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG +A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt +YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD +VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA +isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj +Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 +QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt +bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR +yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID +AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 +cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f +BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj +cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 +U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl +YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos +SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ +t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u +mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb +K+9A46sd33oqK8n8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF +BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz +aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC +QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry +dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw +CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x +FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS +b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC +AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK +pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV +6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc +OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV +jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 +cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C +AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k +qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT +ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg +TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm +/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx +fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ +TzFxiNmIf1Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC +VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB +bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw +MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB +T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg +SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI +zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt +fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs +trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr +5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc +LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ +XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM +eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 +CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf +WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT +LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz +vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw +X7A5KGgOc90lmt4S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC +VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB +bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw +MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB +T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg +SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs +RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs +i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg +/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ +2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 +ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X ++Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml +J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo +Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ +Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex +MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 +cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF +ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY +vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ +drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la +5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks +mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 +O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD +062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 +xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL +Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 +dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h +bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B +ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 +c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 +k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 +ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 +B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez +eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 +aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB +3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 +xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv +cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ +KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R +xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT +K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 +n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx +REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O +hgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw +HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze +xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI +gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O +M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc +sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 +mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG +9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU +tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx +IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 +MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 +tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL +/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV +g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 +tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe +Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF +MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ +A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c ++OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 +P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX +C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R +s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 +BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf +d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB +jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG +A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu +G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj +PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY +GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 +NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx +My3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v +dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT +AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg +VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek +n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk +IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z +sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t +UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R ++Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES +a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 +lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw +ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh +bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh +lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 +5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF +Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA +wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw +dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l +cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X +DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp +Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa +xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl +GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n +BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx +VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE +mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu +JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 +9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA +A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM +IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI +dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j +8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l +cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X +DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp +Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN +t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ +DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x +uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE +18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr +kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD +bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX +uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu +Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 +W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 +ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn +AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL +M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf +tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR +Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R ++FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr ++CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM +nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt +d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI +WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ +ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y +3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz +2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG +EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 +MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx +MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV +BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ +QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h +Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR +QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP +wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 +pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT +Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC +AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud +EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA +A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT +I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ +oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 +G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYT +AlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl +cnR1bSBDQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJ +BgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNV +BAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AM6xwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYV +M42sLQnFdvkrOYCJ5JdLkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/Ox +LjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE +7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/KUz/iDsaW +VhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu +/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESS +bLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQaTOs9qmdvLdTN +/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvgGrZg +FCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqT +E5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYV +IZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFB +IENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIz +MTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENB +IExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSO +vkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wk +wLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfH +dr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf04 +9vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULi +mAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3m +NWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W +8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwu +Y29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG +9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHC +v8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdV +CYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAV +GI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to +51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2Vj +dXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4 +MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIg +TWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2Rv +IENBIExpbWl0ZWQxJDAiBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2 +aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBxM4KK0HDr +c4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP9nQ95IDC ++DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8 +j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWC +iIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtG +Cd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz6YiO/O1R65Nx +Tq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4EFgQU +PNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNo +dHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiF +Gv45jN5bBAS0VPmjZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXG +De+X3EyrEeFryzHRbPtIgKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsF +Vy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfU +a7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6s +Cx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1 +c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0y +ODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVy +IE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9k +byBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNl +cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhT +WvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh73TkVvFVI +xO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9 +C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/ +oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW1O24zG71++IsWL1/ +T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7kUlcsutT6vif +R4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1UdDgQW +BBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2 +hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2Vy +dmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdT +mw7pSqBYaWcOrp32pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+C +l5EfKNsYEYwq5GWDVxISjBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/g +hhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVF +wL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOj +GM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG +EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw +DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw +MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy +ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB +AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR +EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth +zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 +dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E +YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg +U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx +MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 +pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV +HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 +DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA +sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 +w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp +MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM +YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv +LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx +ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE +CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp +Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx +FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp +Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U +q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF +koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh +TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd +lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn +7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ +LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV +WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX +8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 +6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT +F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG +EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw +DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 +MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy +ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB +AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB +w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e +ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd +55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E +YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg +U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw +OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s +NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV +HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 +DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb +dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih +w6ID +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp +MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM +YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv +LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy +MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE +CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp +Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx +FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp +Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 +ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 +/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 +MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih +YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv +bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog +WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 +HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV +6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 +PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 +sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB +X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT +HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 +c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy +MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 +Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y +cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp +ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU +rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB +3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y +NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E +gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw +PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 +Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD +AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW +BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA +O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L +a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l +TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf +Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz +dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF +bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg +aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg +MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l +dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G +CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw +tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK +wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI +XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD +AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu +dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy +MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 +IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw +NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc +/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV +HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq +hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv +yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp +bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ +bIkz8OwVDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf +MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT +HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 +c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy +MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 +Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y +cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg +RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 +QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC +DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj +/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP +KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd +enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB +0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ +FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh +fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU +KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho +wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 ++z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 +6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE +BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 +cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs +aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp +bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa +MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV +BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw +LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 +cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL +ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv +x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV +iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 +iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw +ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff +SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE +CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 +cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD +VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D +bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx +MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW +/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG +A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ +OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU +ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE +PHayXOw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE +BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 +cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE +AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 +dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh +Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow +OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 +VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN +iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk +mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT +MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY +pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs +aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM +aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo +dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi +gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE +FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 +B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn +CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx +xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 +rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG +EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 +cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 +MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx +LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 +eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R +FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO +/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv +K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp +MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt +MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw +HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w +GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB +AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u +FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 +aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 +MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT +E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl +IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy +td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR +OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC +AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w +HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o +oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf +2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa +z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 +pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 +aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN +MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh +eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu +ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe +k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 +/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW +HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG +SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 +MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq +R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm +JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 +tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr +tWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm +YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 +MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg +U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et +MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF +7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD +pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM +HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp +MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT +ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw +HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w +GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB +AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt +y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw +FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy +dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg +R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 +MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD +VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT +GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 +ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn +ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F +LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 +46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq +81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d +XIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw +FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy +dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw +CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD +ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K +DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw +KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID +AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD ++fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv +U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e +6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz +dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE +AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH +CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC +GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 +csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj +Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe +JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB +o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 +qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq +hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe +R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV +Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot +2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX +xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL +MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV +BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 +ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw +FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw +GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR +4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc +71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 +bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK +OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW +ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ +UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC +AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd +PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT +2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD +NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg +Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx +MTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFowggESMQswCQYDVQQGEwJFUzES +MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV +BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp +BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs +BgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5 +BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJ +ZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzc +uh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb +adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp +bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg +Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg +Q0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN +AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH +AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt +YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmlj +YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt +FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3Js +MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +dm9jYXRpb25DTEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgB +hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p +cHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UxLmNybDAvBggrBgEFBQcB +AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1ur +xUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTG +Kbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9U +kE6tsSU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx +MTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFowggESMQswCQYDVQQGEwJFUzES +MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV +BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp +BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs +BgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49N +zjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBx +RiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLn +ev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj +mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp +bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg +Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg +Q0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN +AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH +AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt +YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmlj +YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt +FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3Js +MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +dm9jYXRpb25DTEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgB +hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p +cHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UzLmNybDAvBggrBgEFBQcB +AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc +4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1 +/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkO +E7LFRVA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN +MDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG +A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr +MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv +MC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2md +d81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1 +e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/ +2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 +3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC +YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu +dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz +QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT +IENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI +KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE +BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBD +ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB +hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB +U0VBMS5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmV2b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAW +Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRt +bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBo +dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINm +yq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV +7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N4 +1lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN +MDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG +A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr +MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv +MC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uG +BiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4 +Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2 +YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 +2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC +YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu +dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz +QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT +IENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI +KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE +BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBD +ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB +hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB +U0VBMy5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmV2b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAW +Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRt +bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBo +dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB +/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF +8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/ +RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlw +cy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEyMjcwMDUzNThaMIIBHDELMAkG +A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs +b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl +cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw +OTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVkIENBcyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1h +aWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQg +vJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB +hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQT +y2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8w +HQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC +AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQG +EwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx +LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu +bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0 +NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p +cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRk +MGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggr +BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK +KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBz +QG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglg +hkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3 +Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5p +cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYt +aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/ +MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +bmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYo +aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCg +LoYsaHR0cDovL3d3d2JhY2suaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNBQy5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hA +K+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3Jag +vPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjM +Wb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIw +EAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE +ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVz +MRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBz +QG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1ow +gaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcT +CUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UE +CxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEe +MBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3 +PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU +3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzh +PvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lYJN7GO9HgQmm4 +7mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2/iU9 +4aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58 +GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu +aXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1MTIyNzAxMTAxOFowggEeMQsw +CQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJj +ZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZp +Y2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEIt +NjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBUaW1lc3RhbXBp +bmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lw +c0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLju +VqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 +Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6 +KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAw +ggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC +AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkG +A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs +b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl +cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw +OTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5n +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA +bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsG +A1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF +BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGC +NwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5l +czBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwW +Gmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFo +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcu +Y3JsMEUGCWCGSAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAy +L3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUW +M2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu +Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9wb2xpY3lUaW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAz +hjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBp +bmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9p +cHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYB +BQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEA +ZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWha +sl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I3pGW7hdb +rqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG +EwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNa +Fw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9W +YWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1 +lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+D +isPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj18 +2d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Sp +x2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZ +yH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkop +igPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYI +KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFk +aXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlh +bmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBw +YXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRp +ZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmlj +YXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMu +Ym0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYw +gaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3Wdv +OXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10 +buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe +/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6 +isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQ +NiOKSnQ2+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f +NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM +MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 +t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b +e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu +PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx +NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY +rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt +bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME +GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N +AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy +HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 +am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B +qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 +MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 +RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E +0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J +6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq +s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD +uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw +YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW +gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 +/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V +EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g +EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq +aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk +llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK +UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0 +eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMw +OTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1 +c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RD +QTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8 +V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpx +xpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmz +iX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6 +tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819 +uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/L +TX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZ +aNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq +/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94 +nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNn +PaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfci +oU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG +STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENB +MB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMC +RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue ++H887dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mX +y47vPxVnqIJyY1MPQYx9EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNY +wBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JF +hfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF6452F/NM8Ec +yonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW +1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB +/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuXZfsSZ9gqXLar +5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxVyhbM +p6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2 +nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2y +Ix4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG +STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENB +MB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMC +RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE ++hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gX +GM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQ +TiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwK +noG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1 +P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURr +BGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB +/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXL +rNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCd +jdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr4 +50kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkeja +nZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJOTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQD +Ex1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIz +NDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVT +dGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRl +cmxhbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAmNK1URF6gaYUmHFtvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rF +DBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02PjLwYdjeFnejKScfST5gTCaI+ +Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGcaC1Hoi6Ce +UJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7l +r7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4Zl +kuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGO +MAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDwwOgYIKwYBBQUH +AgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9vdC1w +b2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg +0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVF +IGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0 +C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBp +IzlWYGeQiy52OfsRiJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYV +wSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT +AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD +VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 +b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB +MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe +Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE +RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE +ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y +a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp +MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk +qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO +gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 +zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w +DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W +LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR +T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac +ASZ4smZHcFFk +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT +AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD +VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 +b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB +MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe +Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE +RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE +ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y +a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp +MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ +GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn +v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA +o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w +DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 +iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC +GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS +CdS7kjXvD9s0 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQG +EwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50 +ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTda +MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNV +BAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4Nr +XceO+YQwzho7+vvOi20jxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaq +HF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5 +Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc5IogCSEW +Vmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8n +mHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwID +AQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBY +oFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0w +GwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JMMTAr +BgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8w +HQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKs +LtB9KOy282A4aW8+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7T +mHnaCB4Mb7j4Fifvwm899qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE +64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQ +V0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQG +EwJESzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0w +MzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQww +CgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSj +hFuHnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8 +z3sM8W9Hpg1DTeLpHTk0zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJH +hNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvViGjaXbXqzRowwYCDdlCqT9HU +3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBdedObaE+3p +Hx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTw +tyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYB +BQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBvc2l0b3J5MIGd +BggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBmcmEg +ZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEG +A1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERD +MRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0Q +BCQwIoAPMjAwMzAyMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0j +BBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4S +GSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDAN +BgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBu +o7E4A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjND +fZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8Aqt +FxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoBmbgGglGBTvH1tJFUuSN6 +AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1AoLbrIyi +gfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2Lq +L19iUw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl +cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp +Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow +gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV +BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm +BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV +BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ +cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK +P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ +fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j +kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB +gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 +B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl +cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m +cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz +NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx +EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp +bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG +SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N +j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef +QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY +x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC +neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr +5PjRzneigQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl +cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy +ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 +NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw +EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n +MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw +IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 +DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 +7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j +Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq +W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx +eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 +KzGJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl +IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 +OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ +BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg +Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 +DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI +NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL +lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN +9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ +a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU +Qg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl +IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG +A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw +ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ +VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz +QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I +/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC +6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX +TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD +TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni +TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls +bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj +YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw +MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT +BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x +HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 +WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR +5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 +X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK +0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 +zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ +SdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF +ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU +Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 +ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT +AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT +RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz +dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh +dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV +hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb +GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ +NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 +xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv +/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i +gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf +8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 +LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh +i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq +f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf +hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP +NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ +FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis +H8SE +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUF +ADCBkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVU +TiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2 +MzBaMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNh +bHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMS +VVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+O +GQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrr +U0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrL +Z9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykqlXvY8qdOD1R8 +oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv33i+ +Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4Gr +MIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v +Y3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUE +IzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHc +rpY6CiM+iVnJowftGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuM +FrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1 ++XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdO +jtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jF +VkwPDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUF +ADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVU +Ti1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAe +Fw05OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJV +UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93 +d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGll +bnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxq +mNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqk +kqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+us +obNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNp +saguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZU +Ot4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJ +hkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEF +BQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rk +MPxTbyUkxsrt4jFcKw7u7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK +2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/ +bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJR +warVNZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf +6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQ +jvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUF +ADCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVU +Ti1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5 +MTgxOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH +Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 +b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNV +BAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZ +FvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6N +q9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEH +OG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNdoI6yqqr2jmmI +BsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjfPe58 +BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhb +AgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWG +M2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3 +YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0o +XnWO6y1n7k57K9cM//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjA +bPLPSbtNk28GpgoiskliCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59 +Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4f +Fm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchq +J/kniCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0q +UZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUF +ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVU +Ti1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4 +NDAzNlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y +azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQD +ExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r55 +96Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc +/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2 +yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+pKvEHDHd17bR +5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7RwvC +bNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEA +AaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0 +cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNy +bDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXF +wfNfLEzIR1pp6ujwNTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T +7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85 +dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U ++CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCA +GKCGhU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2o +Ps0AH8g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw +8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m ++FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN +dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V +YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so +gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc +65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ +b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn +wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 +OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ +oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE +CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 +noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B +9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg +1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM +P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P +/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj +t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq +0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 +Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c +PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr +bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i +P/68DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR +ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j +Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh +JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P +oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh +v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ +BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf +xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM +DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 +SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV +OBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC57V56Ondfzl86UvzNZPdxtW9qlsZZklWUXS9bLsER +6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQDalbBgyzhb1upVFAkSsYuekyh +WzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4S8co5GYjhFHvRreT2IEz +y+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF +BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud +EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMX +fH8C6dX3i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4 +KY2kpXeH9fErJq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z +6k/BEVmXarIrE7HarZehs7GgIFvKMquNzxPwHynD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL +Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM +JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE +erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC +JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob +K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg +MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 +Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV +BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g +LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g +VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla +MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 +BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf +rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z +Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN +BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ +7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x +RnInjBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE +CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg +VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG +A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx +NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg +SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE +CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 +c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 +1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT +2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT +AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ +HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC +YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh +ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE +p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B +MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab +5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX +p/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAy +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDQymMxYX9ENHwFfQs9apDLeUt3Cj9LxyPlwGItfpx+ +PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDiWr3I3bR45qVCkwhnAcAgTddc +9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ/wtVqxXd+5rBuR10DbKM +RF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF +BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud +EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUE +nPMmm+M5bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1Vs +WJsswrQ0LHozQsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+ +It3jl6jhvCJDwt1N2/aBnpIUnjkPE1TegtjAXjSN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL +Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q +RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In +zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a +/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM +EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw +TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk +uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM +XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX +wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV +j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U +bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo +1KpYoJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 +R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo +vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg +TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V +k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ +OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my +/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA +Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S +GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb +o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh +/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDx5AgOg7t140jluNum8Lmr6Txix141W9ACVBHYydFW +uXZLuat65s269gwE1n7WsAplrE454/H3LaMlOe+wi8++2wxdbnD0B81w9zrA +PjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4KC8/BdsEIb/hRWb+PLeC +7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCTBCBggr +BgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVyaXNp +Z24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw +KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJ +BgNVHRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNj +wKke8tCLMzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJU +LBMK03cjzzf8Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnE +KMLL/J6oia5bPY4S6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 +8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK +QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX +xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI +L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt +ImRPT8qAkbYp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl +S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC +KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc +VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL +MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD +Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr +IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK +vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP +QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP +mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr +9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu +MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE +BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD +VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb +MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O +LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs +iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC +sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw +4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr +l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 +g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEF +BQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5 +LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4x +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6 +Ly93d3cudmVyaXNpZ24uY29tL1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJl +IFNlcnZlciBPQ1NQIFJlc3BvbmRlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8oXiMM+6f9L452psPTUepjyDoS0S9 +zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSuzOLDB4Nqo3IQASdiIqY1Jjkt +ns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnXOZXYHTWewr2zXcEMSx8C +AwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYDVQQDEwhPQ1NQIDEt +NDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlzaWduLmNvbS9S +U0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwkwQgYI +KwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZlcmlz +aWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB +MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEw +CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBT +ZpxJky4xoAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+ +TtvOzLqGuBjOsRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8Y +dZqfFzP9qSa44+LewqjEWop/mNYHBmvMVp6GcM7U7w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF +ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww +OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 +OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh +dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD +EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 +fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ +RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB +CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG +A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz +Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 +cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG +CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp +c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 +DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn +Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n +tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC +VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h +bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN +MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN +MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl +cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ +DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ +XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl +Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm +7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa +xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e +QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO +qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG +SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp +NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL +axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt +Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 +ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF +ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz +YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT +E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 +MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE +CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa +BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh +28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 +rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 +q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF +Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 +lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC +AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht +cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI +xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ +hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG +A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 +aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx +BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh +dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW +HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R +9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 +fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f +HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm +iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg +B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB +/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR +MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl +IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k +YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj +YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 +eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT +VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj +dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 +dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww +HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 +w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B +AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z +dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 +beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ +XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d +UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py +05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG +EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg +Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy +MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV +BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow +GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 +SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 +o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V +cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k +bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 +tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC +AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB +TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp +YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz +IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 +ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u +IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl +VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t +L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU +ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD +VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub +2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir +ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax +6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl +pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE +/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA +AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH +0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG +EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG +A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 +aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx +BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh +dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 +Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw +ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV +m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb +hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu +6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX +LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g +BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH +AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u +ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 +YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj +aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 +cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl +eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t +L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD +AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl +ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS +VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx +MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa +j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV +HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq +hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 +ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 +Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 +KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi +aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep +9w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF +ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS +b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w +bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 +IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt +ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw +CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK +Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU +vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL +O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe +rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 +S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV +HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD +kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v +cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj +cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo +ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv +bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l +bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu +IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 +d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s +MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN +GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF +BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 +3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt +NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 +UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM +m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y +mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw +OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu +ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h +gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K +5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy +9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE +gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 +eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs +YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp +aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp +dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb +sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB +FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W ++sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 +uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf +tXncwKJrMiE3lvgOOBITRzcahirLer4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa +Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g +eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND +IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu +QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui +me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm +RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ +OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G +O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF +BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI +KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh +c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw +HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX +hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV +Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw +6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF +6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e +Pr3WHV1wA7EY6oT4zBx+2gT9XBTB +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE +ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE +AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT +aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl +KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX +GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj +93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ +P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow +ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g +ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN +W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB +IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB +ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA +ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb +MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv +J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW +pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J +HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln +bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo +VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs +Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI +iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD +VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 +oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey +LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF +BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi +UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg +T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 +b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS +C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw +CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt +iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M +eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 +iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp +ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv +hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg +U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN +MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G +A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD +ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts +YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO +4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF +KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL +/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw +EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 +dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh +My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB +BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g +IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 +IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 +dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM +GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ +MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq +bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ +xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU +upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk +GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug +5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma +M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ +HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW +Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 +JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x +W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE +82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx +UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan +ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 +2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV +tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue +Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA +iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE +OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db +w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC +3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM +ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 +7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG +dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF +JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz +1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw +OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu +ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks +ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX +REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D +CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU +YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP +l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 +MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz +dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg +Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg +Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt +L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN +AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI +cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 +CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW +ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB +KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX +DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 +IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg +U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd +uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v +LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c +ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w +bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM +MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH +AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr +YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC +ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf +MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO +Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB +vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGFTCCBX6gAwIBAgIBEDANBgkqhkiG9w0BAQUFADCBvjELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE +ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z +dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq +hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDYwODE2MjA0NjUy +WhcNMTYwODEzMjA0NjUyWjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh +bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g +dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKSG9zdG1hc3RlcjEeMBwGA1UE +AxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZob3N0bWFz +dGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +uTlCOrOYvCe0Qszlz90rVIQkS2UDa7R+qCTkRE5ipKC+3OZXGgv2EOYk/IOuCE3D +8+tlTAl8MwvmwOHgL0GWnjoluR95narhNiV9Px8xyL2Z8kctwrWXbEii0Ot48VcN +IQMDW5GK8Ww5puMKZr8+bXF2HFzkt8gwaCtrojcF4fLGcm3//bR13CKWbOzacANZ +gAi00pD70ppjJU/uNVOe5HX6x/Id+50G6jwasanEzhteYJdbbHaMqrL4J6XbTwgJ +ZciB0ifOZkwTBvQiRJpTkTWPyn/HptMbJGOwwiNbcgtWV7QVLW1GB3HYVum47Zwp +XcXVM4Fs4XLwfx1Ti87LGdAJJYDS5K1F2prHKW5MsmFLJg61Nd6dZPRDLJLaOPEq +0Jxa1NdfDjJ8rXOIcuLRAozjBui23vUhfOW9z4kpVIg+c+ylV2Oh/7f+fO731P7E +AqsTFmiU7svcvkm2OKslolpnQ+pqGFLM4laQE/Q0kjogm7LiOpRssBW/ZfZ7pPLZ +Ru0/AXrgKwQIM8mLazwlD3wHKPRElhIkxSv4qZ95zgJo6ky/7BpzZ/OAlz3BICbN +WQhW/MBQVFiC6ivhjDq3AzgyykLShB0eIMRN0SBfTy3/aNfIJbqLmTNookXPoSP7 ++mg5OVzVBvDv5ZskWSl8kJB1DzJbN+DOr/i8V3Ugl90CAwEAAaOCAZ0wggGZMB0G +A1UdDgQWBBTON+buqfoMXkWdtvObUS11tnY77DCB6wYDVR0jBIHjMIHggBQHrehB +HX+91r8bgXo/jEuI3gTS+qGBxKSBwTCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEg +MB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEW +Fmhvc3RtYXN0ZXJAc3BpLWluYy5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zARBglg +hkgBhvhCAQEEBAMCAQYwCQYDVR0SBAIwADArBglghkgBhvhCAQ0EHhYcVGlueUNB +IEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAhBgNVHREEGjAYgRZob3N0bWFzdGVyQHNw +aS1pbmMub3JnMAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQA5HQcqwPE/ +RaN8cb8H1G34rkvSEsj4l8UIivMFEWIKnF3SQT8KVcD7j/eJuhMazwRlTs8Rnu6V +/uTC10w7SS6gELwDqAzR4PiXTzfkW8OJemyQn6JWXKfq2pR1n4fvwEn7htjeNS69 +iFKlFXyE9j2jhGaps1CKHfe1YX0MuwO4Jw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE +ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z +dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq +hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 +WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh +bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g +dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE +AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt +YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 +rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL +VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 +I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV +HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ +vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ +bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl +IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe +BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW +iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms +1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= +-----END CERTIFICATE----- diff --git a/ui/fixtures/der-certificate.crt b/ui/fixtures/der-certificate.crt new file mode 100644 index 0000000..56fa849 Binary files /dev/null and b/ui/fixtures/der-certificate.crt differ diff --git a/ui/fixtures/der-rsa-2048.p10 b/ui/fixtures/der-rsa-2048.p10 new file mode 100644 index 0000000..6355622 Binary files /dev/null and b/ui/fixtures/der-rsa-2048.p10 differ diff --git a/ui/fixtures/email.p12 b/ui/fixtures/email.p12 new file mode 100644 index 0000000..d45d0f8 Binary files /dev/null and b/ui/fixtures/email.p12 differ diff --git a/ui/fixtures/pem-dsa-1024.key b/ui/fixtures/pem-dsa-1024.key new file mode 100644 index 0000000..ccb1e7b --- /dev/null +++ b/ui/fixtures/pem-dsa-1024.key @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQCQ7Atgc1g5x1Tq+PZLsD/DU5jWl3K/rlQAed6i06Yfr/snYwoD +igGj0M1ioQdFpXSifstGL08IhbecYbvpVKYKKWaK1Uu6XAenL9ixEFJJZwsznfLF +nmSkcGTvzwtyNsXHLNVc6zKRdDC+yaAD1OSE+6qE15Vxs41rWslbtz4/ewIVAPoh +ShOFwhv+uq2rJAokMMYH1WJxAoGALeBXUfXa7pfz1DxUWVo+lKCAco8MZsmK6+1X +YvarFVgC2DWerR3h7DakWfvu6kjlm55qjLT1KVk2s8yIGl2VfHM5F14s/+DzDTcR +5DDbZkjC60dKoQpKMpdFBTH/LHxpUSIMnURra2sPACYuHr6zzIYUdqpRjMVVyav5 +5fOQI/wCgYBUc0RR23nU7t8LvOvUO7bLt7hYRgO5VwgAdd0xjrWwJm1LINxe/zdr +38TqKYOx9/AqOe1MYZ7WhxJyn/87fGlq3RttdI9WpLS+xcQ4XlKEI6O4iuZebVUA ++Xg556SGJVmCGJw7T6jZQzjHbw5cr8mjCh7XKLufIJHVlOMlCgnqAAIVAIdvhPcJ +1REI37DL+h8cVpwJxBPs +-----END DSA PRIVATE KEY----- diff --git a/ui/frob-certificate.c b/ui/frob-certificate.c new file mode 100644 index 0000000..f9cc259 --- /dev/null +++ b/ui/frob-certificate.c @@ -0,0 +1,112 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" + +#include "egg/egg-hex.h" + +#include + +#include +#include +#include + +static void +on_parser_parsed (GcrParser *parser, gpointer user_data) +{ + GcrCertificateWidget *details; + GtkDialog *dialog = GTK_DIALOG (user_data); + GcrCertificate *cert; + gpointer dn; + gsize n_dn; + gchar *string; + + details = g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, + "attributes", gcr_parser_get_parsed_attributes (parser), + NULL); + + cert = gcr_certificate_widget_get_certificate (details); + + dn = gcr_certificate_get_subject_raw (cert, &n_dn); + string = egg_hex_encode_full (dn, n_dn, TRUE, "\\", 1); + g_print ("subject: %s\n", string); + g_free (string); + g_free (dn); + + dn = gcr_certificate_get_issuer_raw (cert, &n_dn); + string = egg_hex_encode_full (dn, n_dn, TRUE, "\\", 1); + g_print ("issuer: %s\n", string); + g_free (string); + g_free (dn); + + gtk_widget_show (GTK_WIDGET (details)); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (details)); + + gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); +} + +static void +test_certificate (const gchar *path) +{ + GcrParser *parser; + GError *err = NULL; + guchar *data; + gsize n_data; + GBytes *bytes; + GtkWidget *dialog; + + if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) + g_error ("couldn't read file: %s", path); + + dialog = gtk_dialog_new (); + g_object_ref_sink (dialog); + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), dialog); + bytes = g_bytes_new_take (data, n_data); + if (!gcr_parser_parse_bytes (parser, bytes, &err)) + g_error ("couldn't parse data: %s", err->message); + + g_object_unref (parser); + g_bytes_unref (bytes); + + gtk_widget_show (dialog); + g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_main_quit), NULL); + gtk_main (); + + g_object_unref (dialog); +} + +int +main(int argc, char *argv[]) +{ + gtk_init (&argc, &argv); + g_set_prgname ("frob-certificate"); + + if (argc > 1) + test_certificate (argv[1]); + else + test_certificate (SRCDIR "/ui/fixtures/der-certificate.crt"); + + return 0; +} diff --git a/ui/frob-combo-selector.c b/ui/frob-combo-selector.c new file mode 100644 index 0000000..8263b94 --- /dev/null +++ b/ui/frob-combo-selector.c @@ -0,0 +1,97 @@ + +#include "config.h" + +#include "gcr/gcr.h" + +#include + +#include +#include +#include + +static void +on_parser_parsed (GcrParser *parser, gpointer user_data) +{ + GcrSimpleCollection *collection = user_data; + GcrRenderer *renderer; + + renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser), + gcr_parser_get_parsed_attributes (parser)); + + if (renderer) { + gcr_simple_collection_add (collection, G_OBJECT (renderer)); + g_object_unref (renderer); + } +} + +static void +add_to_selector (GcrParser *parser, const gchar *path) +{ + GError *err = NULL; + guchar *data; + gsize n_data; + GBytes *bytes; + + if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) + g_error ("couldn't read file: %s", path); + + bytes = g_bytes_new_take (data, n_data); + if (!gcr_parser_parse_bytes (parser, bytes, &err)) + g_error ("couldn't parse data: %s", err->message); + + g_bytes_unref (bytes); +} + +int +main (int argc, char *argv[]) +{ + GcrCollection *collection; + GcrComboSelector *selector; + GtkDialog *dialog; + GcrParser *parser; + GObject *selected; + int i; + + gtk_init (&argc, &argv); + + dialog = GTK_DIALOG (gtk_dialog_new ()); + g_object_ref_sink (dialog); + + collection = gcr_simple_collection_new (); + selector = gcr_combo_selector_new (collection); + + gtk_widget_show (GTK_WIDGET (selector)); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (selector)); + + gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection); + + if (argc == 1) { + add_to_selector (parser, SRCDIR "/ui/fixtures/ca-certificates.crt"); + } else { + for (i = 1; i < argc; ++i) + add_to_selector (parser, argv[i]); + } + + g_object_unref (parser); + g_object_unref (collection); + + gtk_dialog_run (dialog); + + selected = gcr_combo_selector_get_selected (selector); + if (selected == NULL) { + g_print ("nothing selected\n"); + } else { + gchar *label; + g_object_get (selected, "label", &label, NULL); + g_print ("selected: %s\n", label); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + g_object_unref (dialog); + + return 0; +} diff --git a/ui/frob-gnupg-selector.c b/ui/frob-gnupg-selector.c new file mode 100644 index 0000000..41b1977 --- /dev/null +++ b/ui/frob-gnupg-selector.c @@ -0,0 +1,94 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" +#include "gcr/gcr-gnupg-collection.h" +#include "gcr/gcr-gnupg-key.h" + +#include "ui/gcr-live-search.h" +#include "ui/gcr-list-selector-private.h" + +#include + +#include +#include +#include + +static void +on_collection_loaded (GObject *source, GAsyncResult *result, gpointer unused) +{ + GError *error = NULL; + + _gcr_gnupg_collection_load_finish (GCR_GNUPG_COLLECTION (source), result, &error); + if (error) { + g_warning ("collection load failed: %s", error->message); + g_clear_error (&error); + } +} + +int +main (int argc, char *argv[]) +{ + GcrCollection *collection; + GcrListSelector *selector; + GtkWidget *scroll; + GtkDialog *dialog; + GtkWidget *search; + GtkBox *box; + + gtk_init (&argc, &argv); + + dialog = GTK_DIALOG (gtk_dialog_new ()); + g_object_ref_sink (dialog); + + collection = _gcr_gnupg_collection_new (NULL); + selector = gcr_list_selector_new (collection); + search = _gcr_live_search_new (GTK_WIDGET (selector)); + _gcr_list_selector_set_live_search (selector, GCR_LIVE_SEARCH (search)); + + scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector)); + + box = GTK_BOX (gtk_dialog_get_content_area (dialog)); + gtk_box_pack_start (box, GTK_WIDGET (scroll), TRUE, TRUE, 0); + gtk_box_pack_end (box, search, FALSE, TRUE, 0); + + gtk_widget_show (GTK_WIDGET (selector)); + gtk_widget_show (scroll); + + _gcr_gnupg_collection_load_async (GCR_GNUPG_COLLECTION (collection), NULL, + on_collection_loaded, NULL); + + gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); + + g_object_unref (collection); + + gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + g_object_unref (dialog); + + return 0; +} diff --git a/ui/frob-import-button.c b/ui/frob-import-button.c new file mode 100644 index 0000000..c54435f --- /dev/null +++ b/ui/frob-import-button.c @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2014 Stef Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "ui/gcr-ui.h" + +#include "gcr/gcr-importer.h" + +#include + +#include +#include +#include + +typedef GObject MockImporter; +typedef GObjectClass MockImporterClass; + +enum { + PROP_0, + PROP_LABEL, + PROP_ICON, + PROP_URI, + PROP_INTERACTION +}; + +GType mock_importer_get_type (void) G_GNUC_CONST; + +static GList * +mock_importer_create_for_parsed (GcrParsed *parsed) +{ + GcrImporter *self; + GIcon *icon; + + icon = g_themed_icon_new ("dialog-warning"); + self = g_object_new (mock_importer_get_type (), + "label", gcr_parsed_get_label (parsed), + "icon", icon, + NULL); + g_object_unref (icon); + return g_list_append (NULL, self); +} + +static gboolean +mock_importer_queue_for_parsed (GcrImporter *importer, + GcrParsed *parsed) +{ + return TRUE; +} + +static void +mock_importer_import_async (GcrImporter *importer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (importer), callback, user_data, + mock_importer_import_async); + + g_printerr ("Import %p\n", importer); + g_simple_async_result_complete_in_idle (res); + g_object_unref (res); +} + + +static gboolean +mock_importer_import_finish (GcrImporter *importer, + GAsyncResult *result, + GError **error) +{ + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error); +} + + +static void +mock_importer_iface (GcrImporterIface *iface) +{ + iface->create_for_parsed = mock_importer_create_for_parsed; + iface->queue_for_parsed = mock_importer_queue_for_parsed; + iface->import_async = mock_importer_import_async; + iface->import_finish = mock_importer_import_finish; +} + +G_DEFINE_TYPE_WITH_CODE (MockImporter, mock_importer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, mock_importer_iface); +); + +static void +value_free (gpointer value) +{ + g_boxed_free (G_TYPE_VALUE, value); +} + +static void +mock_importer_init (MockImporter *self) +{ + +} + +static void +mock_importer_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + g_object_set_data_full (obj, pspec->name, g_boxed_copy (G_TYPE_VALUE, value), value_free); +} + +static void +mock_importer_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GValue *val = g_object_get_data (obj, pspec->name); + g_return_if_fail (val != NULL); + g_value_copy (val, value); +} + +static void +mock_importer_class_init (MockImporterClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->set_property = mock_importer_set_property; + gobject_class->get_property = mock_importer_get_property; + + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "", "", + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, PROP_ICON, + g_param_spec_object ("icon", "", "", + G_TYPE_ICON, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_override_property (gobject_class, PROP_URI, "uri"); + g_object_class_override_property (gobject_class, PROP_INTERACTION, "interaction"); +} + +typedef MockImporter MockImporterTwo; +typedef MockImporterClass MockImporterTwoClass; + +GType mock_importer_two_get_type (void) G_GNUC_CONST; + +G_DEFINE_TYPE (MockImporterTwo, mock_importer_two, mock_importer_get_type ()); + +static void +mock_importer_two_init (MockImporterTwo *self) +{ + +} + +static void +mock_importer_two_class_init (MockImporterTwoClass *klass) +{ + +} + + +static void +on_parser_parsed (GcrParser *parser, + gpointer user_data) +{ + gcr_import_button_add_parsed (user_data, + gcr_parser_get_parsed (parser)); +} + +static void +parse_file (GcrParser *parser, + const gchar *path) +{ + GError *err = NULL; + guchar *data; + gsize n_data; + GBytes *bytes; + + if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) + g_error ("couldn't read file: %s", path); + + bytes = g_bytes_new_take (data, n_data); + if (!gcr_parser_parse_bytes (parser, bytes, &err)) + g_error ("couldn't parse data: %s", err->message); + + g_bytes_unref (bytes); +} + +int +main (int argc, char *argv[]) +{ + GtkDialog *dialog; + GcrParser *parser; + GtkWidget *button; + int i; + + gtk_init (&argc, &argv); + + gcr_importer_register (mock_importer_get_type (), gck_attributes_new (0)); + gcr_importer_register (mock_importer_two_get_type (), gck_attributes_new (0)); + + dialog = GTK_DIALOG (gtk_dialog_new ()); + g_object_ref_sink (dialog); + + button = GTK_WIDGET (gcr_import_button_new ("Import Button")); + gtk_widget_show (button); + + gtk_widget_set_halign (button, 0.5); + gtk_widget_set_valign (button, 0.5); + + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), button); + + gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 300); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), button); + + if (argc == 1) { + parse_file (parser, SRCDIR "/ui/fixtures/ca-certificates.crt"); + } else { + for (i = 1; i < argc; ++i) + parse_file (parser, argv[i]); + } + + g_object_unref (parser); + + gtk_dialog_run (dialog); + + gtk_widget_destroy (GTK_WIDGET (dialog)); + g_object_unref (dialog); + + return 0; +} diff --git a/ui/frob-key.c b/ui/frob-key.c new file mode 100644 index 0000000..97d216b --- /dev/null +++ b/ui/frob-key.c @@ -0,0 +1,87 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" + +#include + +#include +#include +#include + +static void +on_parser_parsed (GcrParser *parser, gpointer unused) +{ + GcrKeyWidget *details; + GtkDialog *dialog; + + dialog = GTK_DIALOG (gtk_dialog_new ()); + g_object_ref_sink (dialog); + + details = gcr_key_widget_new (gcr_parser_get_parsed_attributes (parser)); + gtk_widget_show (GTK_WIDGET (details)); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (details)); + + gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); + gtk_dialog_run (dialog); + + g_object_unref (dialog); + g_object_unref (details); +} + +static void +test_key (const gchar *path) +{ + GcrParser *parser; + GError *err = NULL; + GBytes *bytes; + guchar *data; + gsize n_data; + + if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) + g_error ("couldn't read file: %s", path); + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL); + bytes = g_bytes_new_take (data, n_data); + if (!gcr_parser_parse_bytes (parser, bytes, &err)) + g_error ("couldn't parse data: %s", err->message); + + g_object_unref (parser); + g_bytes_unref (bytes); +} + +int +main(int argc, char *argv[]) +{ + gtk_init (&argc, &argv); + g_set_prgname ("frob-key"); + + if (argc > 1) + test_key (argv[1]); + else + test_key (SRCDIR "/ui/fixtures/pem-dsa-1024.key"); + + return 0; +} diff --git a/ui/frob-prompt.c b/ui/frob-prompt.c new file mode 100644 index 0000000..20462f6 --- /dev/null +++ b/ui/frob-prompt.c @@ -0,0 +1,232 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" +#include "gcr/gcr-base.h" + +#include +#include + +#include + +static const gchar *file_name = NULL; +static gchar *prompt_type = NULL; +static gint prompt_delay = 0; +static gboolean prompt_window = FALSE; + +static gboolean +on_delay_timeout (gpointer data) +{ + GMainLoop *loop = data; + g_main_loop_quit (loop); + return FALSE; +} + +static void +prompt_perform (GtkWidget *parent) +{ + GKeyFile *file; + GError *error = NULL; + gchar **groups, **keys; + GValue value = { 0, }; + GParamSpec *spec; + GcrPrompt *prompt; + const gchar *key; + const gchar *password; + GcrPromptReply reply; + gchar *caller_id = NULL; + gboolean cont = TRUE; + GMainLoop *loop; + gchar *type; + gchar *choice; + guint i, j; + + file = g_key_file_new (); + if (!g_key_file_load_from_file (file, file_name, G_KEY_FILE_NONE, &error)) + errx (1, "couldn't load prompt info: %s", error->message); + + if (!prompt_type || g_str_equal (prompt_type, "dialog")) + prompt = g_object_new (GCR_TYPE_PROMPT_DIALOG, NULL); + else if (g_str_equal (prompt_type, "system")) + prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.SystemPrompter", 5, NULL, &error); + else if (g_str_equal (prompt_type, "private")) + prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.PrivatePrompter", 5, NULL, &error); + else + errx (2, "invalid type: %s", prompt_type); + + if (error != NULL) + errx (1, "couldn't create prompt: %s", error->message); + + if (parent) { + caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (gtk_widget_get_window (parent))); + gcr_prompt_set_caller_window (GCR_PROMPT (prompt), caller_id); + g_free (caller_id); + } + + loop = g_main_loop_new (NULL, FALSE); + groups = g_key_file_get_groups (file, NULL); + for (i = 0; cont && groups[i] != NULL; i++) { + + if (i != 0) { + g_timeout_add_seconds (prompt_delay, on_delay_timeout, loop); + g_main_loop_run (loop); + } + + keys = g_key_file_get_keys (file, groups[i], NULL, NULL); + for (j = 0; keys[j] != NULL; j++) { + key = keys[j]; + if (g_str_equal (key, "type")) + continue; + spec = g_object_class_find_property (G_OBJECT_GET_CLASS (prompt), key); + if (spec == NULL) + errx (1, "couldn't find property %s on prompt %s", + key, G_OBJECT_TYPE_NAME (prompt)); + g_value_init (&value, spec->value_type); + switch (spec->value_type) { + case G_TYPE_STRING: + g_value_take_string (&value, g_key_file_get_string (file, groups[i], key, NULL)); + break; + case G_TYPE_INT: + g_value_set_int (&value, g_key_file_get_integer (file, groups[i], key, NULL)); + break; + case G_TYPE_BOOLEAN: + g_value_set_boolean (&value, g_key_file_get_boolean (file, groups[i], key, NULL)); + break; + default: + errx (1, "unsupported type %s for property %s", + g_type_name (spec->value_type), key); + break; + } + + g_object_set_property (G_OBJECT (prompt), key, &value); + g_value_unset (&value); + } + + g_strfreev (keys); + + type = g_key_file_get_value (file, groups[i], "type", NULL); + if (g_strcmp0 (type, "password") == 0) { + password = gcr_prompt_password_run (prompt, NULL, &error); + if (error != NULL) + errx (1, "couldn't prompt for password: %s", error->message); + g_print ("prompt password: %s\n", password); + g_print ("password strength: %d\n", gcr_prompt_get_password_strength (prompt)); + cont = (password != NULL); + } else if (g_strcmp0 (type, "confirm") == 0) { + reply = gcr_prompt_confirm_run (prompt, NULL, &error); + if (error != NULL) + errx (1, "couldn't prompt for confirm: %s", error->message); + g_print ("prompt confirm: %d\n", reply); + cont = (reply != GCR_PROMPT_REPLY_CANCEL); + } else { + errx (1, "unsupported prompt type: %s", type); + } + g_free (type); + + choice = gcr_prompt_get_choice_label (prompt); + if (choice) + g_print ("choice chosen: %s", gcr_prompt_get_choice_chosen (prompt) ? "true" : "false"); + g_free (choice); + g_print ("\n"); + } + + g_main_loop_unref (loop); + g_object_unref (prompt); + g_strfreev (groups); + g_key_file_free (file); + +} + +static void +on_prompt_clicked (GtkToolButton *button, + gpointer user_data) +{ + prompt_perform (user_data); +} + +static gboolean +on_window_delete (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + gtk_main_quit (); + return FALSE; +} + +static GOptionEntry option_entries[] = { + { "type", 'c', 0, G_OPTION_ARG_STRING, &prompt_type, + "'system', 'private' or 'dialog'", "type" }, + { "delay", 'd', 0, G_OPTION_ARG_INT, &prompt_delay, + "delay in seconds between prompts", "delay" }, + { "window", 'w', 0, G_OPTION_ARG_NONE, &prompt_window, + "prompt with a parent window", NULL }, + { NULL } +}; + +int +main (int argc, char *argv[]) +{ + GOptionContext *context; + GtkWidget *window; + GtkToolbar *toolbar; + GtkToolItem *item; + GError *error = NULL; + + g_set_prgname ("frob-prompt"); + + context = g_option_context_new (""); + g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE); + g_option_context_add_group (context, gtk_get_option_group (TRUE)); + + if (!g_option_context_parse (context, &argc, &argv, &error)) + errx (2, "%s", error->message); + + g_option_context_free (context); + + if (argc < 2) + errx (2, "specify file"); + file_name = argv[1]; + + if (prompt_window) { + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL); + + toolbar = GTK_TOOLBAR (gtk_toolbar_new ()); + gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT); + item = gtk_tool_button_new (NULL, "Prompt"); + g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window); + gtk_toolbar_insert (toolbar, item, 0); + gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar)); + + gtk_window_set_default_size (GTK_WINDOW (window), 400, 80); + gtk_widget_show_all (window); + + gtk_main (); + + } else { + prompt_perform (NULL); + } + + g_free (prompt_type); + return 0; +} diff --git a/ui/frob-request.c b/ui/frob-request.c new file mode 100644 index 0000000..1d2f946 --- /dev/null +++ b/ui/frob-request.c @@ -0,0 +1,97 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" + +#include "ui/gcr-certificate-request-renderer.h" + +#include + +#include +#include +#include + +static void +on_parser_parsed (GcrParser *parser, + gpointer user_data) +{ + GcrViewer *viewer; + GcrRenderer *renderer; + GtkDialog *dialog = GTK_DIALOG (user_data); + + viewer = gcr_viewer_new_scrolled (); + renderer = _gcr_certificate_request_renderer_new_for_attributes (gcr_parser_get_parsed_label (parser), + gcr_parser_get_parsed_attributes (parser)); + gcr_viewer_add_renderer (viewer, renderer); + g_object_unref (renderer); + gtk_widget_show (GTK_WIDGET (viewer)); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (viewer)); + + gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); +} + +static void +test_request (const gchar *path) +{ + GcrParser *parser; + GError *err = NULL; + guchar *data; + gsize n_data; + GtkWidget *dialog; + GBytes *bytes; + + if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) + g_error ("couldn't read file: %s", path); + + dialog = gtk_dialog_new (); + g_object_ref_sink (dialog); + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), dialog); + bytes = g_bytes_new_take (data, n_data); + if (!gcr_parser_parse_data (parser, data, n_data, &err)) + g_error ("couldn't parse data: %s", err->message); + + g_object_unref (parser); + g_bytes_unref (bytes); + + gtk_widget_show (dialog); + g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_main_quit), NULL); + gtk_main (); + + g_object_unref (dialog); +} + +int +main(int argc, char *argv[]) +{ + gtk_init (&argc, &argv); + g_set_prgname ("frob-request"); + + if (argc > 1) + test_request (argv[1]); + else + test_request (SRCDIR "/ui/fixtures/der-rsa-2048.p10"); + + return 0; +} diff --git a/ui/frob-system-prompt.c b/ui/frob-system-prompt.c new file mode 100644 index 0000000..e08114f --- /dev/null +++ b/ui/frob-system-prompt.c @@ -0,0 +1,108 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" + +#include "egg/egg-testing.h" + +#include +#include + +#include +#include +#include + +static void +on_prompt_clicked (GtkToolButton *button, + gpointer user_data) +{ + GcrPrompt *prompt; + GError *error = NULL; + const gchar *password; + GtkWidget *parent = user_data; + gchar *caller_id; + + prompt = gcr_system_prompt_open (-1, NULL, &error); + if (error != NULL) { + g_warning ("couldn't open prompt: %s", error->message); + g_error_free (error); + return; + } + g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); + + gcr_prompt_set_title (GCR_PROMPT (prompt), "This is the title"); + gcr_prompt_set_message (GCR_PROMPT (prompt), "This is the message"); + gcr_prompt_set_description (GCR_PROMPT (prompt), "This is the description"); + + caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (gtk_widget_get_window (parent))); + gcr_prompt_set_caller_window (GCR_PROMPT (prompt), caller_id); + g_free (caller_id); + + password = gcr_prompt_password_run (GCR_PROMPT (prompt), NULL, &error); + if (error != NULL) { + g_warning ("couldn't prompt for password: %s", error->message); + g_error_free (error); + g_object_unref (prompt); + return; + } + + g_print ("password: %s\n", password); + g_object_unref (prompt); + g_assert (prompt == NULL); +} + +static gboolean +on_window_delete (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + gtk_main_quit (); + return FALSE; +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkToolbar *toolbar; + GtkToolItem *item; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL); + + toolbar = GTK_TOOLBAR (gtk_toolbar_new ()); + gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT); + item = gtk_tool_button_new (NULL, "Prompt"); + g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window); + gtk_toolbar_insert (toolbar, item, 0); + gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar)); + + gtk_window_set_default_size (GTK_WINDOW (window), 400, 80); + gtk_widget_show_all (window); + + gtk_main (); + + return 0; +} diff --git a/ui/frob-tree-selector.c b/ui/frob-tree-selector.c new file mode 100644 index 0000000..f3b3187 --- /dev/null +++ b/ui/frob-tree-selector.c @@ -0,0 +1,210 @@ + +#include "config.h" + +#include "gcr/gcr.h" + +#include + +#include +#include +#include + +#define TEST_TYPE_COLLECTION (test_collection_get_type ()) +#define TEST_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_COLLECTION, TestCollection)) +#define TEST_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_COLLECTION)) + +typedef struct _TestCollection TestCollection; +typedef struct _TestCollectionClass TestCollectionClass; +typedef struct _TestCollectionPrivate TestCollectionPrivate; + +struct _TestCollection { + GcrSimpleCollection parent; + gchar *label; +}; + +struct _TestCollectionClass { + GcrSimpleCollectionClass parent_class; +}; + +GType test_collection_get_type (void) G_GNUC_CONST; + +enum { + PROP_0, + PROP_LABEL, +}; + +G_DEFINE_TYPE (TestCollection, test_collection, GCR_TYPE_SIMPLE_COLLECTION); + +static GHashTable *all_collections = NULL; + +static void +test_collection_init (TestCollection *self) +{ + +} + +static void +test_collection_finalize (GObject *obj) +{ + TestCollection *self = TEST_COLLECTION (obj); + g_free (self->label); + g_hash_table_remove (all_collections, self); + G_OBJECT_CLASS (test_collection_parent_class)->finalize (obj); +} + +static void +test_collection_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + TestCollection *self = TEST_COLLECTION (obj); + switch (prop_id) { + case PROP_LABEL: + g_value_set_string (value, self->label); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +test_collection_class_init (TestCollectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->get_property = test_collection_get_property; + gobject_class->finalize = test_collection_finalize; + + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "label", "label", NULL, G_PARAM_READABLE)); +} + +static GcrSimpleCollection * +test_collection_instance (const gchar *label) +{ + TestCollection *collection = NULL; + + g_assert (label); + + if (!all_collections) { + all_collections = g_hash_table_new (g_str_hash, g_str_equal); + } else { + collection = g_hash_table_lookup (all_collections, label); + if (collection != NULL) + return g_object_ref (collection); + } + + collection = g_object_new (TEST_TYPE_COLLECTION, NULL); + collection->label = g_strdup (label); + g_hash_table_insert (all_collections, collection->label, collection); + return GCR_SIMPLE_COLLECTION (collection); +} + +static void +on_parser_parsed (GcrParser *parser, gpointer user_data) +{ + GcrSimpleCollection *collection = user_data; + GcrSimpleCollection *testcol; + GcrRenderer *renderer; + gchar *group; + + renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser), + gcr_parser_get_parsed_attributes (parser)); + if (renderer == NULL) + return; + + if (GCR_IS_CERTIFICATE (renderer)) + group = gcr_certificate_get_subject_part (GCR_CERTIFICATE (renderer), "O"); + else + group = g_strdup (G_OBJECT_TYPE_NAME (renderer)); + + + testcol = test_collection_instance (group); + if (!gcr_simple_collection_contains (collection, G_OBJECT (testcol))) + gcr_simple_collection_add (collection, G_OBJECT (testcol)); + + gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (testcol), G_OBJECT (renderer)); + g_object_unref (renderer); + g_object_unref (testcol); + g_free (group); +} + +static void +add_to_selector (GcrParser *parser, const gchar *path) +{ + GError *err = NULL; + guchar *data; + gsize n_data; + GBytes *bytes; + + if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) + g_error ("couldn't read file: %s", path); + + bytes = g_bytes_new_take (data, n_data); + if (!gcr_parser_parse_bytes (parser, bytes, &err)) + g_error ("couldn't parse data: %s", err->message); + + g_bytes_unref (bytes); +} + +int +main (int argc, char *argv[]) +{ + GcrCollection *collection; + GcrTreeSelector *selector; + GtkDialog *dialog; + GcrParser *parser; + GtkWidget *scroll; + GList *selected, *l; + int i; + + gtk_init (&argc, &argv); + + dialog = GTK_DIALOG (gtk_dialog_new ()); + g_object_ref_sink (dialog); + + collection = gcr_simple_collection_new (); + selector = gcr_tree_selector_new (collection, GCR_CERTIFICATE_COLUMNS); + + scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector)); + gtk_widget_show_all (scroll); + + gtk_widget_show (GTK_WIDGET (selector)); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (scroll), TRUE, TRUE, 0); + + gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection); + + if (argc == 1) { + add_to_selector (parser, SRCDIR "/ui/fixtures/ca-certificates.crt"); + } else { + for (i = 1; i < argc; ++i) + add_to_selector (parser, argv[i]); + } + + g_object_unref (parser); + g_object_unref (collection); + + gtk_dialog_run (dialog); + + selected = gcr_tree_selector_get_selected (selector); + for (l = selected; l; l = g_list_next (l)) { + gchar *label; + g_object_get (l->data, "label", &label, NULL); + g_print ("selected: %s\n", label); + g_free (label); + } + g_list_free (selected); + + gtk_widget_destroy (GTK_WIDGET (dialog)); + g_object_unref (dialog); + + return 0; +} diff --git a/ui/frob-unlock-options.c b/ui/frob-unlock-options.c new file mode 100644 index 0000000..b9e5b09 --- /dev/null +++ b/ui/frob-unlock-options.c @@ -0,0 +1,82 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" + +#include + +#include +#include +#include + +static void +test_unlock_options (void) +{ + GcrUnlockOptionsWidget *unlock; + GtkDialog *dialog; + + dialog = GTK_DIALOG (gtk_dialog_new ()); + g_object_ref_sink (dialog); + + unlock = GCR_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_new ()); + gtk_widget_show (GTK_WIDGET (unlock)); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (unlock)); + + gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE, FALSE, + "This is a test of the tooltip."); + gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS, TRUE, NULL); + gcr_unlock_options_widget_set_label (unlock, GCR_UNLOCK_OPTION_IDLE, "Disabled label test"); + gcr_unlock_options_widget_set_ttl (unlock, 80); + gcr_unlock_options_widget_set_choice (unlock, GCR_UNLOCK_OPTION_ALWAYS); + + gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 400); + gtk_dialog_run (dialog); + + g_printerr ("choice: %s\n", + gcr_unlock_options_widget_get_choice (unlock)); + + g_printerr ("ttl: %u\n", + gcr_unlock_options_widget_get_ttl (unlock)); + + g_printerr ("idle sensitive: %s\n", + gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE) ? "T" : "F"); + + g_printerr ("always sensitive: %s\n", + gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS) ? "T" : "F"); + + g_printerr ("label: %s\n", + gcr_unlock_options_widget_get_label (unlock, GCR_UNLOCK_OPTION_ALWAYS)); + + g_object_unref (dialog); +} + +int +main(int argc, char *argv[]) +{ + gtk_init (&argc, &argv); + g_set_prgname ("frob-unlock-options"); + + test_unlock_options (); + + return 0; +} diff --git a/ui/frob-unlock.c b/ui/frob-unlock.c new file mode 100644 index 0000000..4919765 --- /dev/null +++ b/ui/frob-unlock.c @@ -0,0 +1,123 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr.h" + +#include "ui/gcr-unlock-renderer.h" +#include "ui/gcr-viewer-window.h" + +#include + +#include +#include +#include + +static gboolean +delete_event(GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + gtk_main_quit (); + return FALSE; +} + +static void +on_parser_parsed (GcrParser *parser, gpointer unused) +{ + +} + +static void +on_unlock_clicked (GcrUnlockRenderer *renderer, + GcrParser *parser) +{ + const gchar *password; + password = _gcr_unlock_renderer_get_password (renderer); + gcr_parser_add_password (parser, password); + gtk_main_quit (); +} + +static void +on_parser_authenticate (GcrParser *parser, + gint count, + gpointer user_data) +{ + GcrUnlockRenderer *renderer; + GtkWindow *window; + + window = GTK_WINDOW (gcr_viewer_window_new ()); + g_object_ref_sink (window); + + renderer = _gcr_unlock_renderer_new_for_parsed (parser); + g_signal_connect (renderer, "unlock-clicked", G_CALLBACK (on_unlock_clicked), parser); + gcr_viewer_add_renderer (gcr_viewer_window_get_viewer (GCR_VIEWER_WINDOW (window)), GCR_RENDERER (renderer)); + g_object_unref (renderer); + + gtk_window_set_default_size (window, 550, 400); + gtk_container_set_border_width (GTK_CONTAINER (window), 20); + + g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL); + gtk_widget_show (GTK_WIDGET (window)); + + gtk_main (); + + g_object_unref (window); +} + +static void +test_key (const gchar *path) +{ + GcrParser *parser; + GError *err = NULL; + guchar *data; + gsize n_data; + GBytes *bytes; + + if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) + g_error ("couldn't read file: %s", path); + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL); + g_signal_connect (parser, "authenticate", G_CALLBACK (on_parser_authenticate), NULL); + bytes = g_bytes_new_take (data, n_data); + if (!gcr_parser_parse_bytes (parser, bytes, &err)) + g_error ("couldn't parse data: %s", err->message); + + g_object_unref (parser); + g_bytes_unref (bytes); +} + +int +main(int argc, char *argv[]) +{ + gtk_init (&argc, &argv); + g_set_prgname ("frob-unlock"); + + if (argc > 1) { + test_key (argv[1]); + } else { + test_key (SRCDIR "/ui/fixtures/email.p12"); + } + + return 0; +} diff --git a/ui/gcr-certificate-basics-widget.c b/ui/gcr-certificate-basics-widget.c new file mode 100644 index 0000000..6646134 --- /dev/null +++ b/ui/gcr-certificate-basics-widget.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Stef Walter + */ + +#include "config.h" +#include "gcr-certificate-basics-widget.h" + +#ifndef GCR_DISABLE_DEPRECATED + +/* These are all stubs for GcrCertificateWidget */ + +GType +gcr_certificate_basics_widget_get_type (void) +{ + return gcr_certificate_widget_get_type (); +} + +/** + * gcr_certificate_basics_widget_new: (skip) + * + * Create new certificate viewer. + * + * Deprecated: Since 2.30 + * + * Returns: (transfer full) (type GcrUi.CertificateWidget): a new certificate widget + */ +GcrCertificateBasicsWidget * +gcr_certificate_basics_widget_new (GcrCertificate *cert) +{ + return gcr_certificate_widget_new (cert); +} + +/** + * gcr_certificate_basics_widget_get_certificate: (skip) + * + * Get certificate on viewer. + * + * Deprecated: Since 2.30 + * + * Returns: (transfer none): the certificate + */ +GcrCertificate * +gcr_certificate_basics_widget_get_certificate (GcrCertificateBasicsWidget *basics) +{ + return gcr_certificate_widget_get_certificate (basics); +} + +/** + * gcr_certificate_basics_widget_set_certificate: (skip) + * @basics: the certificate widget + * @cert: the certificate + * + * Set certificate on viewer. + * + * Deprecated: Since 2.30 + */ +void +gcr_certificate_basics_widget_set_certificate (GcrCertificateBasicsWidget *basics, + GcrCertificate *cert) +{ + return gcr_certificate_widget_set_certificate (basics, cert); +} + +#endif /* GCR_DISABLE_DEPRECATED */ diff --git a/ui/gcr-certificate-basics-widget.h b/ui/gcr-certificate-basics-widget.h new file mode 100644 index 0000000..66bd45b --- /dev/null +++ b/ui/gcr-certificate-basics-widget.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_CERTIFICATE_BASICS_WIDGET_H__ +#define __GCR_CERTIFICATE_BASICS_WIDGET_H__ + +/* + * GcrCertificateBasicsWidget has been replaced with GcrCertificateWidget. + * These functions are stubs for GcrCertificateWidget. + */ + +#ifndef GCR_DISABLE_DEPRECATED + +#include +#include + +#include "gcr/gcr-certificate.h" +#include "gcr/gcr-types.h" + +#include "gcr-certificate-widget.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_BASICS_WIDGET (gcr_certificate_basics_widget_get_type ()) +#define GCR_CERTIFICATE_BASICS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidget)) +#define GCR_CERTIFICATE_BASICS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidgetClass)) +#define GCR_IS_CERTIFICATE_BASICS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET)) +#define GCR_IS_CERTIFICATE_BASICS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_BASICS_WIDGET)) +#define GCR_CERTIFICATE_BASICS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidgetClass)) + +typedef GcrCertificateWidget GcrCertificateBasicsWidget; +typedef GcrCertificateWidgetClass GcrCertificateBasicsWidgetClass; + +GType gcr_certificate_basics_widget_get_type (void); + +GcrCertificateBasicsWidget* gcr_certificate_basics_widget_new (GcrCertificate *cert); + +GcrCertificate* gcr_certificate_basics_widget_get_certificate (GcrCertificateBasicsWidget *basics); + +void gcr_certificate_basics_widget_set_certificate (GcrCertificateBasicsWidget *basics, + GcrCertificate *cert); + +G_END_DECLS + +#endif /* GCR_DISABLE_DEPRECATED */ + +#endif /* __GCR_CERTIFICATE_BASICS_WIDGET_H__ */ diff --git a/ui/gcr-certificate-details-widget.c b/ui/gcr-certificate-details-widget.c new file mode 100644 index 0000000..79e215c --- /dev/null +++ b/ui/gcr-certificate-details-widget.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Stef Walter + */ + +#include "config.h" +#include "gcr-certificate-details-widget.h" + +#ifndef GCR_DISABLE_DEPRECATED + +/* These are all stubs for GcrCertificateWidget */ + +GType +gcr_certificate_details_widget_get_type (void) +{ + return gcr_certificate_widget_get_type (); +} + +/** + * gcr_certificate_details_widget_new: (skip) + * + * Create a new certificate viewer. + * + * Deprecated: Since 2.30 + * + * Returns: (transfer full) (type GcrUi.CertificateWidget): a new certificate widget + */ +GcrCertificateDetailsWidget * +gcr_certificate_details_widget_new (GcrCertificate *cert) +{ + return gcr_certificate_widget_new (cert); +} + +/** + * gcr_certificate_details_widget_get_certificate: (skip) + * + * Get certificate displayed in viewer. + * + * Deprecated: Since 2.30 + * + * Returns: (transfer none): the certificate + */ +GcrCertificate* +gcr_certificate_details_widget_get_certificate (GcrCertificateDetailsWidget *details) +{ + return gcr_certificate_widget_get_certificate (details); +} + +/** + * gcr_certificate_details_widget_set_certificate: (skip) + * @details: the certificate widget + * @cert: the certificate + * + * Set certificate displayed in viewer. + * + * Deprecated: Since 2.30 + */ +void +gcr_certificate_details_widget_set_certificate (GcrCertificateDetailsWidget *details, + GcrCertificate *cert) +{ + return gcr_certificate_widget_set_certificate (details, cert); +} + +#endif /* GCR_DISABLE_DEPRECATED */ diff --git a/ui/gcr-certificate-details-widget.h b/ui/gcr-certificate-details-widget.h new file mode 100644 index 0000000..27d6bb9 --- /dev/null +++ b/ui/gcr-certificate-details-widget.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_CERTIFICATE_DETAILS_WIDGET_H__ +#define __GCR_CERTIFICATE_DETAILS_WIDGET_H__ + +/* + * GcrCertificateDetailsWidget has been replaced with GcrCertificateWidget. + * These functions are stubs for GcrCertificateWidget. + */ + +#ifndef GCR_DISABLE_DEPRECATED + +#include +#include + +#include "gcr/gcr-certificate.h" +#include "gcr/gcr-types.h" + +#include "gcr-certificate-widget.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_DETAILS_WIDGET (gcr_certificate_details_widget_get_type ()) +#define GCR_CERTIFICATE_DETAILS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidget)) +#define GCR_CERTIFICATE_DETAILS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidgetClass)) +#define GCR_IS_CERTIFICATE_DETAILS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET)) +#define GCR_IS_CERTIFICATE_DETAILS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET)) +#define GCR_CERTIFICATE_DETAILS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidgetClass)) + +typedef GcrCertificateWidget GcrCertificateDetailsWidget; +typedef GcrCertificateWidgetClass GcrCertificateDetailsWidgetClass; + +GType gcr_certificate_details_widget_get_type (void); + +GcrCertificateDetailsWidget* gcr_certificate_details_widget_new (GcrCertificate *cert); + +GcrCertificate* gcr_certificate_details_widget_get_certificate (GcrCertificateDetailsWidget *details); + +void gcr_certificate_details_widget_set_certificate (GcrCertificateDetailsWidget *details, + GcrCertificate *cert); + +G_END_DECLS + +#endif /* GCR_DISABLE_DEPRECATED */ + +#endif /* __GCR_CERTIFICATE_DETAILS_WIDGET_H__ */ diff --git a/ui/gcr-certificate-exporter.c b/ui/gcr-certificate-exporter.c new file mode 100644 index 0000000..5c3e816 --- /dev/null +++ b/ui/gcr-certificate-exporter.c @@ -0,0 +1,568 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr-certificate.h" + +#include "gcr-certificate-exporter.h" + +#include "egg/egg-armor.h" +#include "egg/egg-openssl.h" + +#include + +enum { + PROP_0, + PROP_CERTIFICATE, + PROP_LABEL, + PROP_TRANSIENT_FOR +}; + +struct _GcrCertificateExporterPrivate { + + /* Setup stuff */ + GcrCertificate *certificate; + gchar *label; + GtkWindow *transient_for; + + /* Used during operation */ + GtkFileChooser *chooser_dialog; + GFile *output_file; + GByteArray *buffer; + guint buffer_at; + + /* Async stuff */ + GAsyncReadyCallback callback; + gpointer user_data; + GCancellable *cancellable; + GError *error; + gboolean completed; +}; + +static const gchar *BAD_FILENAME_CHARS = "/\\<>|?*"; + +/* Forward declarations */ +static void _gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface); +static void write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os); + +G_DEFINE_TYPE_WITH_CODE (GcrCertificateExporter, _gcr_certificate_exporter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, _gcr_certificate_exporter_async_result_init)); + +typedef void (*PrepareDataFunc) (GcrCertificateExporter *self); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static void +prepare_data_for_der (GcrCertificateExporter *self) +{ + gconstpointer data; + gsize n_data; + + data = gcr_certificate_get_der_data (self->pv->certificate, &n_data); + g_return_if_fail (data); + + self->pv->buffer = g_byte_array_new (); + g_byte_array_append (self->pv->buffer, data, n_data); +} + +static void +prepare_data_for_pem (GcrCertificateExporter *self) +{ + gconstpointer data; + gpointer encoded; + gsize n_data, n_encoded; + + data = gcr_certificate_get_der_data (self->pv->certificate, &n_data); + g_return_if_fail (data); + + self->pv->buffer = g_byte_array_new (); + + encoded = egg_armor_write (data, n_data, + g_quark_from_static_string ("CERTIFICATE"), + NULL, &n_encoded); + + g_byte_array_append (self->pv->buffer, encoded, n_encoded); + g_free (encoded); +} + +static void +complete_async_result (GcrCertificateExporter *self) +{ + g_assert (self->pv->callback); + g_assert (!self->pv->completed); + + if (self->pv->chooser_dialog) + gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog)); + + self->pv->completed = TRUE; + (self->pv->callback) (G_OBJECT (self), G_ASYNC_RESULT (self), + self->pv->user_data); +} + +static void +on_outputstream_write_ready (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); + GOutputStream *os = G_OUTPUT_STREAM (source); + gssize written; + + written = g_output_stream_write_finish (os, res, &self->pv->error); + + if (self->pv->error) { + complete_async_result (self); + return; + } + + g_return_if_fail (written >= 0); + g_return_if_fail (written <= self->pv->buffer->len - self->pv->buffer_at); + self->pv->buffer_at += written; + + /* Write next bit, or finished */ + write_to_outputstream (self, os); +} + +static void +on_outputstream_closed (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); + g_output_stream_close_finish (G_OUTPUT_STREAM (source), res, &self->pv->error); + complete_async_result (self); +} + +static void +write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os) +{ + gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog)); + g_assert (GTK_IS_WIDGET (self->pv->chooser_dialog)); + + /* Are we all done? */ + g_assert (self->pv->buffer_at <= self->pv->buffer->len); + if (self->pv->buffer_at == self->pv->buffer->len) { + g_output_stream_close_async (os, G_PRIORITY_DEFAULT, + self->pv->cancellable, + on_outputstream_closed, self); + return; + } + + g_output_stream_write_async (os, self->pv->buffer->data + self->pv->buffer_at, + self->pv->buffer->len - self->pv->buffer_at, + G_PRIORITY_DEFAULT, self->pv->cancellable, + on_outputstream_write_ready, self); +} + +static void +on_replace_file_ready (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); + GFile *file = G_FILE (source); + GFileOutputStream *os; + + os = g_file_replace_finish (file, res, &self->pv->error); + + if (self->pv->error) { + complete_async_result (self); + return; + } + + write_to_outputstream (self, G_OUTPUT_STREAM (os)); +} + +static void +on_replace_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); + + if (response_id == GTK_RESPONSE_ACCEPT) { + g_file_replace_async (self->pv->output_file, NULL, FALSE, G_FILE_CREATE_NONE, + G_PRIORITY_DEFAULT, self->pv->cancellable, + on_replace_file_ready, self); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); +} + +static void +on_cancel_replace_dialog (GCancellable *cancellable, gpointer user_data) +{ + gtk_widget_destroy (user_data); +} + +static void +on_create_file_ready (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); + GFileOutputStream *os; + GtkWidget *dialog; + + os = g_file_create_finish (self->pv->output_file, res, &self->pv->error); + + /* Try again this time replacing the file */ + if (g_error_matches (self->pv->error, G_IO_ERROR, G_IO_ERROR_EXISTS)) { + g_clear_error (&self->pv->error); + + dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (self->pv->chooser_dialog), + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, "%s\n\n%s", + _("A file already exists with this name."), + _("Do you want to replace it with a new file?")); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Replace"), GTK_RESPONSE_ACCEPT, NULL); + + g_signal_connect (dialog, "response", + G_CALLBACK (on_replace_dialog_response), self); + if (self->pv->cancellable) + g_cancellable_connect (self->pv->cancellable, + G_CALLBACK (on_cancel_replace_dialog), + g_object_ref (dialog), g_object_unref); + gtk_widget_show (dialog); + + return; + } + + if (self->pv->error) { + complete_async_result (self); + return; + } + + write_to_outputstream (self, G_OUTPUT_STREAM (os)); +} + +static void +on_chooser_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); + GtkFileFilter *filter; + PrepareDataFunc prepare_data; + + if (response_id != GTK_RESPONSE_ACCEPT) { + g_set_error (&self->pv->error, G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("The operation was cancelled.")); + complete_async_result (self); + return; + } + + if (self->pv->output_file) + g_object_unref (self->pv->output_file); + self->pv->output_file = gtk_file_chooser_get_file (self->pv->chooser_dialog); + g_return_if_fail (self->pv->output_file); + + filter = gtk_file_chooser_get_filter (self->pv->chooser_dialog); + prepare_data = g_object_get_data (G_OBJECT (filter), "prepare-data-func"); + g_assert (prepare_data); + + if (self->pv->buffer) + g_byte_array_free (self->pv->buffer, TRUE); + self->pv->buffer = NULL; + self->pv->buffer_at = 0; + + /* Prepare the for writing out */ + (prepare_data) (self); + + /* Try to open the file */ + g_file_create_async (self->pv->output_file, G_FILE_CREATE_NONE, G_PRIORITY_DEFAULT, + self->pv->cancellable, on_create_file_ready, + self); +} + +static void +on_cancel_chooser_dialog (GCancellable *cancellable, gpointer user_data) +{ + GtkDialog *dialog = GTK_DIALOG (user_data); + gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL); +} + +static void +exporter_display_chooser (GcrCertificateExporter *self) +{ + GtkFileFilter* filter; + GtkWidget *dialog; + gchar *filename; + + g_assert (!self->pv->chooser_dialog); + + dialog = gtk_file_chooser_dialog_new (_("Export certificate"), + NULL, GTK_FILE_CHOOSER_ACTION_SAVE, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_ACCEPT, + NULL); + + self->pv->chooser_dialog = g_object_ref_sink(dialog); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), + GTK_RESPONSE_ACCEPT); + gtk_file_chooser_set_local_only (self->pv->chooser_dialog, FALSE); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Certificate files")); + gtk_file_filter_add_mime_type (filter, "application/x-x509-ca-cert"); + gtk_file_filter_add_mime_type (filter, "application/x-x509-user-cert"); + gtk_file_filter_add_mime_type (filter, "application/pkix-cert"); + gtk_file_filter_add_pattern (filter, "*.cer"); + gtk_file_filter_add_pattern (filter, "*.crt"); + g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_der); + gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter); + gtk_file_chooser_set_filter (self->pv->chooser_dialog, filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("PEM files")); + gtk_file_filter_add_mime_type (filter, "text/plain"); + gtk_file_filter_add_pattern (filter, "*.pem"); + g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_pem); + gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter); + + filename = g_strconcat (self->pv->label, ".crt", NULL); + g_strdelimit (filename, BAD_FILENAME_CHARS, '_'); + gtk_file_chooser_set_current_name (self->pv->chooser_dialog, filename); + g_free (filename); + + g_signal_connect (self->pv->chooser_dialog, "response", + G_CALLBACK (on_chooser_dialog_response), self); + if (self->pv->cancellable) + g_cancellable_connect (self->pv->cancellable, + G_CALLBACK (on_cancel_chooser_dialog), self, NULL); + + gtk_dialog_run (GTK_DIALOG (self->pv->chooser_dialog)); +} + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static void +_gcr_certificate_exporter_init (GcrCertificateExporter *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_CERTIFICATE_EXPORTER, + GcrCertificateExporterPrivate)); +} + +static void +_gcr_certificate_exporter_dispose (GObject *obj) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); + + if (self->pv->certificate) + g_object_unref (self->pv->certificate); + self->pv->certificate = NULL; + + if (self->pv->cancellable) + g_object_unref (self->pv->cancellable); + self->pv->cancellable = NULL; + + G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->dispose (obj); +} + +static void +_gcr_certificate_exporter_finalize (GObject *obj) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); + + g_free (self->pv->label); + + /* + * Should have been freed in _export_finish, which holds a ref to self + * so this should never be reached without being finished. + */ + g_assert (!self->pv->chooser_dialog); + g_assert (!self->pv->output_file); + g_assert (!self->pv->buffer); + + g_clear_error (&self->pv->error); + + G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->finalize (obj); +} + +static void +_gcr_certificate_exporter_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); + GcrCertificate *cert; + + switch (prop_id) { + case PROP_CERTIFICATE: + cert = g_value_dup_object (value); + if (self->pv->certificate) + g_object_unref (self->pv->certificate); + self->pv->certificate = cert; + g_object_notify (G_OBJECT (self), "certificate"); + break; + case PROP_LABEL: + g_free (self->pv->label); + self->pv->label = g_value_dup_string (value); + g_object_notify (obj, "label"); + break; + case PROP_TRANSIENT_FOR: + self->pv->transient_for = g_value_get_object (value); + g_object_notify (obj, "transient-for"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_certificate_exporter_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); + + switch (prop_id) { + case PROP_CERTIFICATE: + g_value_set_object (value, self->pv->certificate); + break; + case PROP_LABEL: + g_value_take_string (value, self->pv->label); + break; + case PROP_TRANSIENT_FOR: + g_value_set_object (value, self->pv->transient_for); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_certificate_exporter_class_init (GcrCertificateExporterClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + _gcr_certificate_exporter_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrCertificateExporterPrivate)); + + gobject_class->dispose = _gcr_certificate_exporter_dispose; + gobject_class->finalize = _gcr_certificate_exporter_finalize; + gobject_class->set_property = _gcr_certificate_exporter_set_property; + gobject_class->get_property = _gcr_certificate_exporter_get_property; + + g_object_class_install_property (gobject_class, PROP_CERTIFICATE, + g_param_spec_object ("certificate", "Certificate", "Certificate to display.", + GCR_TYPE_CERTIFICATE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "Label", "Label of certificate.", + _("Certificate"), G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_TRANSIENT_FOR, + g_param_spec_object ("transient-for", "Transient For", "Transient for this Window", + GTK_TYPE_WINDOW, G_PARAM_READWRITE)); +} + +static GObject* +_gcr_certificate_exporter_get_source_object (GAsyncResult *result) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL); + return G_OBJECT (result); +} + +static gpointer +_gcr_certificate_exporter_get_user_data (GAsyncResult *result) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL); + return GCR_CERTIFICATE_EXPORTER (result)->pv->user_data; +} + +static void +_gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface) +{ + iface->get_source_object = _gcr_certificate_exporter_get_source_object; + iface->get_user_data = _gcr_certificate_exporter_get_user_data; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +GcrCertificateExporter* +_gcr_certificate_exporter_new (GcrCertificate *certificate, const gchar *label, + GtkWindow *transient_for) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_EXPORTER, + "certificate", certificate, + "label", label, + "transient-for", transient_for, + NULL); +} + +void +_gcr_certificate_exporter_export_async (GcrCertificateExporter *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (GCR_IS_CERTIFICATE_EXPORTER (self)); + g_return_if_fail (callback); + + /* Must not have already started */ + g_return_if_fail (!self->pv->callback); + g_return_if_fail (!self->pv->cancellable); + + self->pv->callback = callback; + self->pv->user_data = user_data; + if (cancellable) + self->pv->cancellable = g_object_ref (cancellable); + + /* Matching in export_finish */ + g_object_ref (self); + + exporter_display_chooser (self); +} + +gboolean +_gcr_certificate_exporter_export_finish (GcrCertificateExporter *self, + GAsyncResult *result, + GError **error) +{ + gboolean ret = TRUE; + + g_return_val_if_fail (G_ASYNC_RESULT (self) == result, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + g_return_val_if_fail (self->pv->completed, FALSE); + + /* Cleanup all the operation stuff */ + self->pv->callback = NULL; + + if (self->pv->chooser_dialog) + g_object_unref (self->pv->chooser_dialog); + self->pv->chooser_dialog = NULL; + + if (self->pv->output_file) + g_object_unref (self->pv->output_file); + self->pv->output_file = NULL; + + if (self->pv->buffer) + g_byte_array_free (self->pv->buffer, TRUE); + self->pv->buffer = NULL; + self->pv->buffer_at = 0; + + self->pv->completed = FALSE; + + if (self->pv->error) { + g_propagate_error (error, self->pv->error); + ret = FALSE; + } + + /* Matches in export_async */ + g_object_unref (self); + return ret; +} diff --git a/ui/gcr-certificate-exporter.h b/ui/gcr-certificate-exporter.h new file mode 100644 index 0000000..241bd95 --- /dev/null +++ b/ui/gcr-certificate-exporter.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_EXPORTER_H__ +#define __GCR_CERTIFICATE_EXPORTER_H__ + +#include +#include + +#include "gcr/gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_EXPORTER (_gcr_certificate_exporter_get_type ()) +#define GCR_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporter)) +#define GCR_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass)) +#define GCR_IS_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_EXPORTER)) +#define GCR_IS_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_EXPORTER)) +#define GCR_CERTIFICATE_EXPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass)) + +typedef struct _GcrCertificateExporter GcrCertificateExporter; +typedef struct _GcrCertificateExporterClass GcrCertificateExporterClass; +typedef struct _GcrCertificateExporterPrivate GcrCertificateExporterPrivate; + +struct _GcrCertificateExporter { + /*< private >*/ + GObject parent; + GcrCertificateExporterPrivate *pv; +}; + +struct _GcrCertificateExporterClass { + GObjectClass parent_class; +}; + +GType _gcr_certificate_exporter_get_type (void); + +GcrCertificateExporter* _gcr_certificate_exporter_new (GcrCertificate *certificate, + const gchar *label, + GtkWindow *transient_for); + +void _gcr_certificate_exporter_export_async (GcrCertificateExporter *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean _gcr_certificate_exporter_export_finish (GcrCertificateExporter *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_EXPORTER_H__ */ diff --git a/ui/gcr-certificate-renderer-private.h b/ui/gcr-certificate-renderer-private.h new file mode 100644 index 0000000..53f3bda --- /dev/null +++ b/ui/gcr-certificate-renderer-private.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ +#define __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ + +#include "gcr-display-view.h" +#include "gcr-renderer.h" + +G_BEGIN_DECLS + +void _gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *dn); + +void _gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer, + GcrDisplayView *view, + guint key_size, + GNode *subject_public_key); + +void _gcr_certificate_renderer_append_signature (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *asn); + +void _gcr_certificate_renderer_append_extension (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *asn); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ */ diff --git a/ui/gcr-certificate-renderer.c b/ui/gcr-certificate-renderer.c new file mode 100644 index 0000000..efd5911 --- /dev/null +++ b/ui/gcr-certificate-renderer.c @@ -0,0 +1,954 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-certificate.h" +#include "gcr/gcr-certificate-extensions.h" +#include "gcr/gcr-fingerprint.h" +#include "gcr/gcr-icons.h" +#include "gcr/gcr-oids.h" +#include "gcr/gcr-simple-certificate.h" + +#include "gcr-certificate-exporter.h" +#include "gcr-certificate-renderer.h" +#include "gcr-certificate-renderer-private.h" +#include "gcr-deprecated.h" +#include "gcr-display-view.h" +#include "gcr-renderer.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-dn.h" +#include "egg/egg-oid.h" +#include "egg/egg-hex.h" + +#include "gck/gck.h" + +#include +#include + +/** + * GcrCertificateRenderer: + * + * An implementation of #GcrRenderer which renders certificates. + */ + +/** + * GcrCertificateRendererClass: + * @parent_class: The parent class. + * + * The class for #GcrCertificateRenderer. + */ + +enum { + PROP_0, + PROP_CERTIFICATE, + PROP_LABEL, + PROP_ATTRIBUTES +}; + +struct _GcrCertificateRendererPrivate { + GcrCertificate *opt_cert; + GckAttributes *opt_attrs; + guint key_size; + gchar *label; +}; + +static void gcr_renderer_iface_init (GcrRendererIface *iface); +static void gcr_renderer_certificate_iface_init (GcrCertificateIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrCertificateRenderer, gcr_certificate_renderer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init); + GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE (); + G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, gcr_renderer_certificate_iface_init); +); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static gchar* +calculate_label (GcrCertificateRenderer *self) +{ + gchar *label; + + if (self->pv->label) + return g_strdup (self->pv->label); + + if (self->pv->opt_attrs) { + if (gck_attributes_find_string (self->pv->opt_attrs, CKA_LABEL, &label)) + return label; + } + + label = gcr_certificate_get_subject_cn (GCR_CERTIFICATE (self)); + if (label != NULL) + return label; + + return g_strdup (_("Certificate")); +} + +static gboolean +append_extension_basic_constraints (GcrRenderer *renderer, + GcrDisplayView *view, + GBytes *data) +{ + gboolean is_ca = FALSE; + gint path_len = -1; + gchar *number; + + if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len)) + return FALSE; + + _gcr_display_view_append_heading (view, renderer, _("Basic Constraints")); + + _gcr_display_view_append_value (view, renderer, _("Certificate Authority"), + is_ca ? _("Yes") : _("No"), FALSE); + + number = g_strdup_printf ("%d", path_len); + _gcr_display_view_append_value (view, renderer, _("Max Path Length"), + path_len < 0 ? _("Unlimited") : number, FALSE); + g_free (number); + + return TRUE; +} + +static gboolean +append_extension_extended_key_usage (GcrRenderer *renderer, + GcrDisplayView *view, + GBytes *data) +{ + GQuark *oids; + GString *text; + guint i; + + oids = _gcr_certificate_extension_extended_key_usage (data); + if (oids == NULL) + return FALSE; + + _gcr_display_view_append_heading (view, renderer, _("Extended Key Usage")); + + text = g_string_new (""); + for (i = 0; oids[i] != 0; i++) { + if (i > 0) + g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK); + g_string_append (text, egg_oid_get_description (oids[i])); + } + + g_free (oids); + + _gcr_display_view_append_value (view, renderer, _("Allowed Purposes"), + text->str, FALSE); + + g_string_free (text, TRUE); + + return TRUE; +} + +static gboolean +append_extension_subject_key_identifier (GcrRenderer *renderer, + GcrDisplayView *view, + GBytes *data) +{ + gpointer keyid; + gsize n_keyid; + + keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid); + if (keyid == NULL) + return FALSE; + + _gcr_display_view_append_heading (view, renderer, _("Subject Key Identifier")); + _gcr_display_view_append_hex (view, renderer, _("Key Identifier"), keyid, n_keyid); + + g_free (keyid); + + return TRUE; +} + +static const struct { + guint usage; + const gchar *description; +} usage_descriptions[] = { + { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") }, + { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") }, + { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") }, + { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") }, + { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") }, + { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") } +}; + +static gboolean +append_extension_key_usage (GcrRenderer *renderer, + GcrDisplayView *view, + GBytes *data) +{ + gulong key_usage; + GString *text; + guint i; + + if (!_gcr_certificate_extension_key_usage (data, &key_usage)) + return FALSE; + + text = g_string_new (""); + + for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) { + if (key_usage & usage_descriptions[i].usage) { + if (text->len > 0) + g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK); + g_string_append (text, _(usage_descriptions[i].description)); + } + } + + _gcr_display_view_append_heading (view, renderer, _("Key Usage")); + _gcr_display_view_append_value (view, renderer, _("Usages"), text->str, FALSE); + + g_string_free (text, TRUE); + + return TRUE; +} + +static gboolean +append_extension_subject_alt_name (GcrRenderer *renderer, + GcrDisplayView *view, + GBytes *data) +{ + GArray *general_names; + GcrGeneralName *general; + guint i; + + general_names = _gcr_certificate_extension_subject_alt_name (data); + if (general_names == NULL) + return FALSE; + + _gcr_display_view_append_heading (view, renderer, _("Subject Alternative Names")); + + for (i = 0; i < general_names->len; i++) { + general = &g_array_index (general_names, GcrGeneralName, i); + if (general->display == NULL) + _gcr_display_view_append_hex (view, renderer, general->description, + g_bytes_get_data (general->raw, NULL), + g_bytes_get_size (general->raw)); + else + _gcr_display_view_append_value (view, renderer, general->description, + general->display, FALSE); + } + + _gcr_general_names_free (general_names); + + return TRUE; +} + +static gboolean +append_extension_hex (GcrRenderer *renderer, + GcrDisplayView *view, + GQuark oid, + gconstpointer data, + gsize n_data) +{ + const gchar *text; + + _gcr_display_view_append_heading (view, renderer, _("Extension")); + + /* Extension type */ + text = egg_oid_get_description (oid); + _gcr_display_view_append_value (view, renderer, _("Identifier"), text, FALSE); + _gcr_display_view_append_hex (view, renderer, _("Value"), data, n_data); + + return TRUE; +} + +static void +on_export_completed (GObject *source, GAsyncResult *result, gpointer user_data) +{ + GtkWindow *parent = GTK_WINDOW (user_data); + GcrCertificateExporter *exporter = GCR_CERTIFICATE_EXPORTER (source); + GError *error = NULL; + GtkWidget *dialog; + + if (!_gcr_certificate_exporter_export_finish (exporter, result, &error)) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + dialog = gtk_message_dialog_new_with_markup (parent, + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, "%s\n\n%s", + _("Couldn’t export the certificate."), + error->message); + gtk_widget_show (dialog); + g_signal_connect (dialog, "delete-event", + G_CALLBACK (gtk_widget_destroy), dialog); + g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); + } + } + + /* Matches ref in on_certificate_export */ + if (parent) + g_object_unref (parent); +} + +static void +on_certificate_export (GtkMenuItem *menuitem, gpointer user_data) +{ + GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (user_data); + GcrCertificateExporter *exporter; + gchar *label; + GtkWidget *parent; + + label = calculate_label (self); + + parent = gtk_widget_get_toplevel (GTK_WIDGET (menuitem)); + if (parent && !GTK_IS_WINDOW (parent)) + parent = NULL; + + exporter = _gcr_certificate_exporter_new (GCR_CERTIFICATE (self), label, + GTK_WINDOW (parent)); + + g_free (label); + + _gcr_certificate_exporter_export_async (exporter, NULL, on_export_completed, + parent ? g_object_ref (parent) : NULL); +} + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static void +gcr_certificate_renderer_init (GcrCertificateRenderer *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererPrivate)); +} + +static void +gcr_certificate_renderer_dispose (GObject *obj) +{ + GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); + + if (self->pv->opt_cert) + g_object_unref (self->pv->opt_cert); + self->pv->opt_cert = NULL; + + G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->dispose (obj); +} + +static void +gcr_certificate_renderer_finalize (GObject *obj) +{ + GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); + + g_assert (!self->pv->opt_cert); + + if (self->pv->opt_attrs) + gck_attributes_unref (self->pv->opt_attrs); + self->pv->opt_attrs = NULL; + + g_free (self->pv->label); + self->pv->label = NULL; + + G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->finalize (obj); +} + +static void +gcr_certificate_renderer_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); + + switch (prop_id) { + case PROP_CERTIFICATE: + gcr_certificate_renderer_set_certificate (self, g_value_get_object (value)); + break; + case PROP_LABEL: + g_free (self->pv->label); + self->pv->label = g_value_dup_string (value); + g_object_notify (obj, "label"); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + break; + case PROP_ATTRIBUTES: + gck_attributes_unref (self->pv->opt_attrs); + self->pv->opt_attrs = g_value_get_boxed (value); + if (self->pv->opt_attrs) + gck_attributes_ref (self->pv->opt_attrs); + if (self->pv->opt_cert) { + g_object_unref (self->pv->opt_cert); + g_object_notify (G_OBJECT (self), "certificate"); + self->pv->opt_cert = NULL; + } + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + g_object_notify (G_OBJECT (self), "attributes"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_renderer_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); + + switch (prop_id) { + case PROP_CERTIFICATE: + g_value_set_object (value, self->pv->opt_cert); + break; + case PROP_LABEL: + g_value_take_string (value, calculate_label (self)); + break; + case PROP_ATTRIBUTES: + g_value_set_boxed (value, self->pv->opt_attrs); + break; + default: + gcr_certificate_mixin_get_property (obj, prop_id, value, pspec); + break; + } +} + +static void +gcr_certificate_renderer_class_init (GcrCertificateRendererClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GckBuilder builder = GCK_BUILDER_INIT; + + gcr_certificate_renderer_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrCertificateRendererPrivate)); + + gobject_class->dispose = gcr_certificate_renderer_dispose; + gobject_class->finalize = gcr_certificate_renderer_finalize; + gobject_class->set_property = gcr_certificate_renderer_set_property; + gobject_class->get_property = gcr_certificate_renderer_get_property; + + /** + * GcrCertificateRenderer:certificate: + * + * The certificate to display. May be %NULL. + */ + g_object_class_install_property (gobject_class, PROP_CERTIFICATE, + g_param_spec_object ("certificate", "Certificate", "Certificate to display.", + GCR_TYPE_CERTIFICATE, G_PARAM_READWRITE)); + + /** + * GcrCertificateRenderer:attributes: + * + * The certificate attributes to display. One of the attributes must be + * a CKA_VALUE type attribute which contains a DER encoded certificate. + */ + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); + + /** + * GcrCertificateRenderer:label: + * + * The label to display. + */ + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "Label", "Certificate Label", + "", G_PARAM_READWRITE)); + + gcr_certificate_mixin_class_init (gobject_class); + + /* Register this as a renderer which can be loaded */ + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); + gcr_renderer_register (GCR_TYPE_CERTIFICATE_RENDERER, gck_builder_end (&builder)); +} + +static void +gcr_certificate_renderer_render (GcrRenderer *renderer, GcrViewer *viewer) +{ + GcrCertificateRenderer *self; + GNode *extension; + gconstpointer data; + gsize n_data; + GcrDisplayView *view; + GcrCertificate *cert; + GBytes *number; + gulong version; + guint bits, index; + gchar *display; + GBytes *bytes; + GNode *asn; + GDate date; + GIcon *icon; + + self = GCR_CERTIFICATE_RENDERER (renderer); + + if (GCR_IS_DISPLAY_VIEW (viewer)) { + view = GCR_DISPLAY_VIEW (viewer); + + } else { + g_warning ("GcrCertificateRenderer only works with internal specific " + "GcrViewer returned by gcr_viewer_new()."); + return; + } + + _gcr_display_view_begin (view, renderer); + cert = GCR_CERTIFICATE (self); + + data = gcr_certificate_get_der_data (cert, &n_data); + if (!data) { + _gcr_display_view_end (view, renderer); + return; + } + + icon = gcr_certificate_get_icon (cert); + _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon); + g_object_unref (icon); + + bytes = g_bytes_new_static (data, n_data); + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes); + g_return_if_fail (asn != NULL); + g_bytes_unref (bytes); + + display = calculate_label (self); + _gcr_display_view_append_title (view, renderer, display); + g_free (display); + + display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN"); + _gcr_display_view_append_content (view, renderer, _("Identity"), display); + g_free (display); + + display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN"); + _gcr_display_view_append_content (view, renderer, _("Verified by"), display); + g_free (display); + + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { + display = g_malloc0 (128); + if (!g_date_strftime (display, 128, "%x", &date)) + g_return_if_reached (); + _gcr_display_view_append_content (view, renderer, _("Expires"), display); + g_free (display); + } + + _gcr_display_view_start_details (view, renderer); + + /* The subject */ + _gcr_display_view_append_heading (view, renderer, _("Subject Name")); + _gcr_certificate_renderer_append_distinguished_name (renderer, view, + egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL)); + + /* The Issuer */ + _gcr_display_view_append_heading (view, renderer, _("Issuer Name")); + _gcr_certificate_renderer_append_distinguished_name (renderer, view, + egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL)); + + /* The Issued Parameters */ + _gcr_display_view_append_heading (view, renderer, _("Issued Certificate")); + + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version)) + g_return_if_reached (); + display = g_strdup_printf ("%lu", version + 1); + _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE); + g_free (display); + + number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL)); + g_return_if_fail (number != NULL); + _gcr_display_view_append_hex (view, renderer, _("Serial Number"), + g_bytes_get_data (number, NULL), + g_bytes_get_size (number)); + g_bytes_unref (number); + + display = g_malloc0 (128); + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) { + if (!g_date_strftime (display, 128, "%Y-%m-%d", &date)) + g_return_if_reached (); + _gcr_display_view_append_value (view, renderer, _("Not Valid Before"), display, FALSE); + } + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { + if (!g_date_strftime (display, 128, "%Y-%m-%d", &date)) + g_return_if_reached (); + _gcr_display_view_append_value (view, renderer, _("Not Valid After"), display, FALSE); + } + g_free (display); + + /* Fingerprints */ + _gcr_display_view_append_heading (view, renderer, _("Certificate Fingerprints")); + + _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "SHA1", G_CHECKSUM_SHA1); + _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "MD5", G_CHECKSUM_MD5); + + /* Public Key Info */ + _gcr_display_view_append_heading (view, renderer, _("Public Key Info")); + bits = gcr_certificate_get_key_size (cert); + _gcr_certificate_renderer_append_subject_public_key (renderer, view, bits, + egg_asn1x_node (asn, "tbsCertificate", + "subjectPublicKeyInfo", NULL)); + + /* Extensions */ + for (index = 1; TRUE; ++index) { + extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL); + if (extension == NULL) + break; + _gcr_certificate_renderer_append_extension (renderer, view, extension); + } + + /* Signature */ + _gcr_display_view_append_heading (view, renderer, _("Signature")); + _gcr_certificate_renderer_append_signature (renderer, view, asn); + + egg_asn1x_destroy (asn); + _gcr_display_view_end (view, renderer); +} + +static void +gcr_certificate_renderer_populate_popup (GcrRenderer *self, GcrViewer *viewer, + GtkMenu *menu) +{ + GtkWidget *item; + + item = gtk_separator_menu_item_new (); + gtk_widget_show (item); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + + item = gtk_menu_item_new_with_label (_("Export Certificate\xE2\x80\xA6")); + gtk_widget_show (item); + g_signal_connect_data (item, "activate", G_CALLBACK (on_certificate_export), + g_object_ref (self), (GClosureNotify)g_object_unref, 0); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); +} + +static void +gcr_renderer_iface_init (GcrRendererIface *iface) +{ + iface->populate_popup = gcr_certificate_renderer_populate_popup; + iface->render_view = gcr_certificate_renderer_render; +} + +static const guchar * +gcr_certificate_renderer_get_der_data (GcrCertificate *cert, + gsize *n_data) +{ + GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (cert); + const GckAttribute *attr; + + g_assert (n_data); + + if (self->pv->opt_cert) + return gcr_certificate_get_der_data (self->pv->opt_cert, n_data); + + if (self->pv->opt_attrs) { + attr = gck_attributes_find (self->pv->opt_attrs, CKA_VALUE); + g_return_val_if_fail (attr, NULL); + *n_data = attr->length; + return attr->value; + } + + return NULL; +} + +static void +gcr_renderer_certificate_iface_init (GcrCertificateIface *iface) +{ + iface->get_der_data = gcr_certificate_renderer_get_der_data; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_certificate_renderer_new: + * @certificate: The certificate to display + * + * Create a new certificate renderer to display the certificate. + * + * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which + * should be released with g_object_unref() + */ +GcrCertificateRenderer * +gcr_certificate_renderer_new (GcrCertificate *certificate) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "certificate", certificate, NULL); +} + +/** + * gcr_certificate_renderer_new_for_attributes: + * @label: (allow-none): the label to display + * @attrs: The attributes to display + * + * Create a new certificate renderer to display the label and attributes. One + * of the attributes should be a CKA_VALUE type attribute containing a DER + * encoded certificate. + * + * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which + * should be released with g_object_unref() + */ +GcrCertificateRenderer * +gcr_certificate_renderer_new_for_attributes (const gchar *label, struct _GckAttributes *attrs) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "label", label, "attributes", attrs, NULL); +} + +/** + * gcr_certificate_renderer_get_certificate: + * @self: The renderer + * + * Get the certificate displayed in the renderer. If no certificate was + * explicitly set, then the renderer will return itself since it acts as + * a valid certificate. + * + * Returns: (transfer none): The certificate, owned by the renderer. + */ +GcrCertificate * +gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_RENDERER (self), NULL); + if (self->pv->opt_cert) + return self->pv->opt_cert; + return GCR_CERTIFICATE (self); +} + +/** + * gcr_certificate_renderer_set_certificate: + * @self: The renderer + * @certificate: (allow-none): the certificate to display + * + * Set a certificate to display in the renderer. + */ +void +gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self, GcrCertificate *certificate) +{ + g_return_if_fail (GCR_IS_CERTIFICATE_RENDERER (self)); + + if (self->pv->opt_cert) + g_object_unref (self->pv->opt_cert); + self->pv->opt_cert = certificate; + if (self->pv->opt_cert) + g_object_ref (self->pv->opt_cert); + + if (self->pv->opt_attrs) { + gck_attributes_unref (self->pv->opt_attrs); + self->pv->opt_attrs = NULL; + } + + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + g_object_notify (G_OBJECT (self), "certificate"); +} + +/** + * gcr_certificate_renderer_get_attributes: + * @self: The renderer + * + * Get the PKCS\#11 attributes, if any, set for this renderer to display. + * + * Returns: (allow-none) (transfer none): the attributes, owned by the renderer + * + * Deprecated: 3.6: Use gcr_renderer_get_attributes() instead + */ +GckAttributes * +gcr_certificate_renderer_get_attributes (GcrCertificateRenderer *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_RENDERER (self), NULL); + return gcr_renderer_get_attributes (GCR_RENDERER (self)); +} + +/** + * gcr_certificate_renderer_set_attributes: + * @self: The renderer + * @attrs: (allow-none): attributes to set + * + * Set the PKCS\#11 attributes for this renderer to display. One of the attributes + * should be a CKA_VALUE type attribute containing a DER encoded certificate. + * + * Deprecated: 3.6: Use gcr_renderer_set_attributes() instead + */ +void +gcr_certificate_renderer_set_attributes (GcrCertificateRenderer *self, GckAttributes *attrs) +{ + g_return_if_fail (GCR_IS_CERTIFICATE_RENDERER (self)); + gcr_renderer_set_attributes (GCR_RENDERER (self), attrs); +} + +typedef struct { + GcrRenderer *renderer; + GcrDisplayView *view; +} AppendDnClosure; + +static void +on_parsed_dn_part (guint index, + GQuark oid, + GNode *value, + gpointer user_data) +{ + GcrRenderer *renderer = ((AppendDnClosure *)user_data)->renderer; + GcrDisplayView *view = ((AppendDnClosure *)user_data)->view; + const gchar *attr; + const gchar *desc; + gchar *field = NULL; + gchar *display; + + attr = egg_oid_get_name (oid); + desc = egg_oid_get_description (oid); + + /* Combine them into something sane */ + if (attr && desc) { + if (strcmp (attr, desc) == 0) + field = g_strdup (attr); + else + field = g_strdup_printf ("%s (%s)", attr, desc); + } else if (!attr && !desc) { + field = g_strdup (""); + } else if (attr) { + field = g_strdup (attr); + } else if (desc) { + field = g_strdup (desc); + } else { + g_assert_not_reached (); + } + + display = egg_dn_print_value (oid, value); + if (display == NULL) + display = g_strdup (""); + + _gcr_display_view_append_value (view, renderer, field, display, FALSE); + g_free (field); + g_free (display); +} + + +void +_gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *dn) +{ + AppendDnClosure closure; + + g_return_if_fail (GCR_IS_RENDERER (renderer)); + g_return_if_fail (GCR_IS_DISPLAY_VIEW (view)); + g_return_if_fail (dn != NULL); + + closure.renderer = renderer; + closure.view = view; + egg_dn_parse (dn, on_parsed_dn_part, &closure); +} + +void +_gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer, + GcrDisplayView *view, + guint key_nbits, + GNode *subject_public_key) +{ + const gchar *text; + gchar *display; + GBytes *value; + guchar *raw; + gsize n_raw; + GQuark oid; + guint bits; + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key, + "algorithm", "algorithm", NULL)); + text = egg_oid_get_description (oid); + _gcr_display_view_append_value (view, renderer, _("Key Algorithm"), text, FALSE); + + value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key, + "algorithm", "parameters", NULL)); + if (value) { + _gcr_display_view_append_hex (view, renderer, _("Key Parameters"), + g_bytes_get_data (value, NULL), + g_bytes_get_size (value)); + g_bytes_unref (value); + } + + if (key_nbits > 0) { + display = g_strdup_printf ("%u", key_nbits); + _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE); + g_free (display); + } + + value = egg_asn1x_get_element_raw (subject_public_key); + raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL), + g_bytes_get_size (value), + G_CHECKSUM_SHA1, &n_raw); + _gcr_display_view_append_hex (view, renderer, _("Key SHA1 Fingerprint"), raw, n_raw); + g_bytes_unref (value); + g_free (raw); + + value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits); + _gcr_display_view_append_hex (view, renderer, _("Public Key"), + g_bytes_get_data (value, NULL), bits / 8); + g_bytes_unref (value); +} + +void +_gcr_certificate_renderer_append_signature (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *asn) +{ + const gchar *text; + GBytes *value; + GQuark oid; + guint bits; + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL)); + text = egg_oid_get_description (oid); + _gcr_display_view_append_value (view, renderer, _("Signature Algorithm"), text, FALSE); + + value = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL)); + if (value) { + _gcr_display_view_append_hex (view, renderer, _("Signature Parameters"), + g_bytes_get_data (value, NULL), + g_bytes_get_size (value)); + g_bytes_unref (value); + } + + value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits); + _gcr_display_view_append_hex (view, renderer, _("Signature"), + g_bytes_get_data (value, NULL), bits / 8); + g_bytes_unref (value); +} + +void +_gcr_certificate_renderer_append_extension (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *node) +{ + GQuark oid; + GBytes *value; + gboolean critical; + gboolean ret = FALSE; + + /* Dig out the OID */ + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL)); + g_return_if_fail (oid); + + /* Extension value */ + value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL)); + + /* The custom parsers */ + if (oid == GCR_OID_BASIC_CONSTRAINTS) + ret = append_extension_basic_constraints (renderer, view, value); + else if (oid == GCR_OID_EXTENDED_KEY_USAGE) + ret = append_extension_extended_key_usage (renderer, view, value); + else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER) + ret = append_extension_subject_key_identifier (renderer, view, value); + else if (oid == GCR_OID_KEY_USAGE) + ret = append_extension_key_usage (renderer, view, value); + else if (oid == GCR_OID_SUBJECT_ALT_NAME) + ret = append_extension_subject_alt_name (renderer, view, value); + + /* Otherwise the default raw display */ + if (ret == FALSE) + ret = append_extension_hex (renderer, view, oid, + g_bytes_get_data (value, NULL), + g_bytes_get_size (value)); + + /* Critical */ + if (ret == TRUE && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) { + _gcr_display_view_append_value (view, renderer, _("Critical"), + critical ? _("Yes") : _("No"), FALSE); + } +} diff --git a/ui/gcr-certificate-renderer.h b/ui/gcr-certificate-renderer.h new file mode 100644 index 0000000..3986124 --- /dev/null +++ b/ui/gcr-certificate-renderer.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_RENDERER_H__ +#define __GCR_CERTIFICATE_RENDERER_H__ + +#include +#include + +#include "gcr/gcr-certificate.h" +#include "gcr/gcr-types.h" + +#include "gcr-renderer.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_RENDERER (gcr_certificate_renderer_get_type ()) +#define GCR_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRenderer)) +#define GCR_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass)) +#define GCR_IS_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_RENDERER)) +#define GCR_IS_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_RENDERER)) +#define GCR_CERTIFICATE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass)) + +typedef struct _GcrCertificateRenderer GcrCertificateRenderer; +typedef struct _GcrCertificateRendererClass GcrCertificateRendererClass; +typedef struct _GcrCertificateRendererPrivate GcrCertificateRendererPrivate; + +struct _GcrCertificateRenderer { + GObject parent; + + /*< private >*/ + GcrCertificateRendererPrivate *pv; +}; + +struct _GcrCertificateRendererClass { + GObjectClass parent_class; +}; + +GType gcr_certificate_renderer_get_type (void); + +GcrCertificateRenderer* gcr_certificate_renderer_new (GcrCertificate *certificate); + +GcrCertificateRenderer* gcr_certificate_renderer_new_for_attributes (const gchar *label, + struct _GckAttributes *attrs); + +GcrCertificate* gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self); + +void gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self, + GcrCertificate *certificate); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_RENDERER_H__ */ diff --git a/ui/gcr-certificate-request-renderer.c b/ui/gcr-certificate-request-renderer.c new file mode 100644 index 0000000..06aca3b --- /dev/null +++ b/ui/gcr-certificate-request-renderer.c @@ -0,0 +1,532 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-oids.h" +#include "gcr/gcr-subject-public-key.h" + +#include "gcr-certificate-renderer-private.h" +#include "gcr-certificate-request-renderer.h" +#include "gcr-display-view.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-dn.h" +#include "egg/egg-oid.h" + +#include "gck/gck.h" + +#include + +/** + * GcrCertificateRequestRenderer: + * + * An implementation of #GcrRenderer which renders certificate requests + */ + +/** + * GcrCertificateRequestRendererClass: + * @parent_class: The parent class + * + * The class for #GcrCertificateRequestRenderer + */ + +enum { + PROP_0, + PROP_LABEL, + PROP_ATTRIBUTES +}; + +struct _GcrCertificateRequestRendererPrivate { + GckAttributes *attrs; + gchar *label; + + guint key_size; + gulong type; + GNode *asn; +}; + +static void _gcr_certificate_request_renderer_iface (GcrRendererIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrCertificateRequestRenderer, _gcr_certificate_request_renderer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_certificate_request_renderer_iface); +); + +static gchar* +calculate_label (GcrCertificateRequestRenderer *self) +{ + gchar *label = NULL; + + if (self->pv->label) + return g_strdup (self->pv->label); + + if (self->pv->attrs) { + if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label)) + return label; + } + + if (self->pv->asn && self->pv->type == CKQ_GCR_PKCS10) { + label = egg_dn_read_part (egg_asn1x_node (self->pv->asn, + "certificationRequestInfo", + "subject", + "rdnSequence", + NULL), "CN"); + } + + if (label != NULL) + return label; + + return g_strdup (_("Certificate request")); +} + +static void +_gcr_certificate_request_renderer_init (GcrCertificateRequestRenderer *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, + GcrCertificateRequestRendererPrivate)); +} + +static void +_gcr_certificate_request_renderer_finalize (GObject *obj) +{ + GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj); + + if (self->pv->attrs) + gck_attributes_unref (self->pv->attrs); + self->pv->attrs = NULL; + + g_free (self->pv->label); + self->pv->label = NULL; + + egg_asn1x_destroy (self->pv->asn); + + G_OBJECT_CLASS (_gcr_certificate_request_renderer_parent_class)->finalize (obj); +} + +static void +_gcr_certificate_request_renderer_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_free (self->pv->label); + self->pv->label = g_value_dup_string (value); + g_object_notify (obj, "label"); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + break; + case PROP_ATTRIBUTES: + _gcr_certificate_request_renderer_set_attributes (self, g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_certificate_request_renderer_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_take_string (value, calculate_label (self)); + break; + case PROP_ATTRIBUTES: + g_value_set_boxed (value, self->pv->attrs); + break; + default: + gcr_certificate_mixin_get_property (obj, prop_id, value, pspec); + break; + } +} + +static void +_gcr_certificate_request_renderer_class_init (GcrCertificateRequestRendererClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GckBuilder builder = GCK_BUILDER_INIT; + + g_type_class_add_private (klass, sizeof (GcrCertificateRequestRendererPrivate)); + + gobject_class->finalize = _gcr_certificate_request_renderer_finalize; + gobject_class->set_property = _gcr_certificate_request_renderer_set_property; + gobject_class->get_property = _gcr_certificate_request_renderer_get_property; + + /** + * GcrCertificateRequestRenderer:attributes: + * + * The certificate attributes to display. One of the attributes must be + * a CKA_VALUE type attribute which contains a DER encoded certificate. + */ + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); + + /** + * GcrCertificateRequestRenderer:label: + * + * The label to display. + */ + + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "Label", "Certificate Label", + "", G_PARAM_READWRITE)); + + /* Register this as a renderer which can be loaded */ + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST); + gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_PKCS10); + gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder)); + + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST); + gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_SPKAC); + gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder)); +} + +static gboolean +append_extension_request (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *attribute) +{ + GBytes *value; + GNode *node; + GNode *asn; + guint i; + + node = egg_asn1x_node (attribute, "values", 1, NULL); + if (node == NULL) + return FALSE; + + value = egg_asn1x_get_element_raw (node); + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "ExtensionRequest", value); + if (asn == NULL) + return FALSE; + + for (i = 1; TRUE; i++) { + node = egg_asn1x_node (asn, i, NULL); + if (node == NULL) + break; + _gcr_certificate_renderer_append_extension (renderer, view, node); + } + + egg_asn1x_destroy (asn); + return TRUE; +} + +static void +append_attribute (GcrRenderer *renderer, + GcrDisplayView *view, + GNode *attribute) +{ + GQuark oid; + GBytes *value; + const gchar *text; + GNode *node; + gboolean ret = FALSE; + gint i; + + /* Dig out the OID */ + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (attribute, "type", NULL)); + g_return_if_fail (oid); + + if (oid == GCR_OID_PKCS9_ATTRIBUTE_EXTENSION_REQ) + ret = append_extension_request (renderer, view, attribute); + + if (!ret) { + _gcr_display_view_append_heading (view, renderer, _("Attribute")); + + /* Extension type */ + text = egg_oid_get_description (oid); + _gcr_display_view_append_value (view, renderer, _("Type"), text, FALSE); + + for (i = 1; TRUE; i++) { + node = egg_asn1x_node (attribute, "values", i, NULL); + if (node == NULL) + break; + value = egg_asn1x_get_element_raw (node); + _gcr_display_view_append_hex (view, renderer, _("Value"), + g_bytes_get_data (value, NULL), + g_bytes_get_size (value)); + g_bytes_unref (value); + } + } +} + +static guint +ensure_key_size (GcrCertificateRequestRenderer *self, + GNode *public_key) +{ + if (self->pv->key_size) + return self->pv->key_size; + + self->pv->key_size = _gcr_subject_public_key_calculate_size (public_key); + return self->pv->key_size; +} + +static void +render_pkcs10_certificate_req (GcrCertificateRequestRenderer *self, + GcrDisplayView *view) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + GNode *public_key; + GNode *attribute; + GNode *subject; + gchar *display; + gulong version; + guint bits; + guint i; + + display = calculate_label (self); + _gcr_display_view_append_title (view, renderer, display); + g_free (display); + + _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL); + + subject = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", + "subject", "rdnSequence", NULL); + display = egg_dn_read_part (subject, "CN"); + _gcr_display_view_append_content (view, renderer, _("Identity"), display); + g_free (display); + + _gcr_display_view_start_details (view, renderer); + + /* The subject */ + _gcr_display_view_append_heading (view, renderer, _("Subject Name")); + _gcr_certificate_renderer_append_distinguished_name (renderer, view, subject); + + /* The certificate request type */ + _gcr_display_view_append_heading (view, renderer, _("Certificate request")); + _gcr_display_view_append_value (view, renderer, _("Type"), "PKCS#10", FALSE); + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (self->pv->asn, + "certificationRequestInfo", + "version", NULL), &version)) + g_return_if_reached (); + display = g_strdup_printf ("%lu", version + 1); + _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE); + g_free (display); + + _gcr_display_view_append_heading (view, renderer, _("Public Key Info")); + public_key = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "subjectPKInfo", NULL); + bits = ensure_key_size (self, public_key); + _gcr_certificate_renderer_append_subject_public_key (renderer, view, + bits, public_key); + + /* Attributes */ + for (i = 1; TRUE; ++i) { + /* Make sure it is present */ + attribute = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "attributes", i, NULL); + if (attribute == NULL) + break; + append_attribute (renderer, view, attribute); + } + + /* Signature */ + _gcr_display_view_append_heading (view, renderer, _("Signature")); + _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn); +} + +static void +render_spkac_certificate_req (GcrCertificateRequestRenderer *self, + GcrDisplayView *view) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + GNode *public_key; + gchar *display; + guint bits; + + display = calculate_label (self); + _gcr_display_view_append_title (view, renderer, display); + g_free (display); + + _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL); + + _gcr_display_view_start_details (view, renderer); + + /* The certificate request type */ + _gcr_display_view_append_heading (view, renderer, _("Certificate request")); + _gcr_display_view_append_value (view, renderer, _("Type"), "SPKAC", FALSE); + + display = egg_asn1x_get_string_as_utf8 (egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge", + "challenge", NULL), NULL); + _gcr_display_view_append_value (view, renderer, _("Challenge"), display, FALSE); + g_free (display); + + _gcr_display_view_append_heading (view, renderer, _("Public Key Info")); + public_key = egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge", "spki", NULL); + bits = ensure_key_size (self, public_key); + _gcr_certificate_renderer_append_subject_public_key (renderer, view, + bits, public_key); + + /* Signature */ + _gcr_display_view_append_heading (view, renderer, _("Signature")); + _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn); +} + +static void +gcr_certificate_request_renderer_render (GcrRenderer *renderer, + GcrViewer *viewer) +{ + GcrCertificateRequestRenderer *self; + GcrDisplayView *view; + GIcon *icon; + + self = GCR_CERTIFICATE_REQUEST_RENDERER (renderer); + + if (GCR_IS_DISPLAY_VIEW (viewer)) { + view = GCR_DISPLAY_VIEW (viewer); + + } else { + g_warning ("GcrCertificateRequestRenderer only works with internal specific " + "GcrViewer returned by gcr_viewer_new()."); + return; + } + + _gcr_display_view_begin (view, renderer); + + icon = g_themed_icon_new ("dialog-question"); + _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon); + g_object_unref (icon); + + switch (self->pv->type) { + case CKQ_GCR_PKCS10: + render_pkcs10_certificate_req (self, view); + break; + case CKQ_GCR_SPKAC: + render_spkac_certificate_req (self, view); + break; + default: + g_warning ("unknown request type in GcrCertificateRequestRenderer"); + break; + } + + _gcr_display_view_end (view, renderer); +} + +static void +_gcr_certificate_request_renderer_iface (GcrRendererIface *iface) +{ + iface->render_view = gcr_certificate_request_renderer_render; +} + +/** + * gcr_certificate_request_renderer_new_for_attributes: + * @label: (allow-none): the label to display + * @attrs: the attributes to display + * + * Create a new certificate request renderer to display the label and attributes. + * One of the attributes should be a CKA_VALUE type attribute containing a DER + * encoded PKCS\#10 certificate request or an SPKAC request. + * + * Returns: (transfer full): a newly allocated #GcrCertificateRequestRenderer, which + * should be released with g_object_unref() + */ +GcrRenderer * +_gcr_certificate_request_renderer_new_for_attributes (const gchar *label, + GckAttributes *attrs) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, + "label", label, + "attributes", attrs, + NULL); +} + +/** + * gcr_certificate_request_renderer_get_attributes: + * @self: the renderer + * + * Get the PKCS\#11 attributes, if any, set for this renderer to display. + * + * Returns: (allow-none) (transfer none): the attributes, owned by the renderer + */ +GckAttributes * +_gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self), NULL); + return self->pv->attrs; +} + +/** + * gcr_certificate_request_renderer_set_attributes: + * @self: the renderer + * @attrs: (allow-none): attributes to set + * + * Set the PKCS\#11 attributes for this renderer to display. One of the attributes + * should be a CKA_VALUE type attribute containing a DER encoded PKCS\#10 + * certificate request or an SPKAC request. + */ +void +_gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self, + GckAttributes *attrs) +{ + const GckAttribute *value; + GNode *asn = NULL; + gulong type = 0; + GBytes *bytes; + + g_return_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self)); + + if (attrs) { + value = gck_attributes_find (attrs, CKA_VALUE); + if (value == NULL) { + g_warning ("no CKA_VALUE found in attributes passed to " + "GcrCertificateRequestRenderer attributes property"); + return; + } + + bytes = g_bytes_new_with_free_func (value->value, value->length, + gck_attributes_unref, gck_attributes_ref (attrs)); + + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-10-CertificationRequest", bytes); + if (asn != NULL) { + type = CKQ_GCR_PKCS10; + } else { + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SignedPublicKeyAndChallenge", bytes); + if (asn != NULL) { + type = CKQ_GCR_SPKAC; + } else { + g_warning ("the data contained in the CKA_VALUE attribute passed to " + "GcrCertificateRequestRenderer was not valid DER encoded PKCS#10 " + "or SPKAC"); + } + } + + g_bytes_unref (bytes); + + if (type == 0) + return; + + gck_attributes_ref (attrs); + } + + if (self->pv->attrs) + gck_attributes_unref (self->pv->attrs); + self->pv->attrs = attrs; + self->pv->asn = asn; + self->pv->type = type; + self->pv->key_size = 0; /* calculated later */ + + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + g_object_notify (G_OBJECT (self), "attributes"); +} diff --git a/ui/gcr-certificate-request-renderer.h b/ui/gcr-certificate-request-renderer.h new file mode 100644 index 0000000..e5ea514 --- /dev/null +++ b/ui/gcr-certificate-request-renderer.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_REQUEST_RENDERER_H__ +#define __GCR_CERTIFICATE_REQUEST_RENDERER_H__ + +#include +#include + +#include "gcr/gcr-certificate.h" +#include "gcr/gcr-types.h" + +#include "gcr-renderer.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_REQUEST_RENDERER (_gcr_certificate_request_renderer_get_type ()) +#define GCR_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRenderer)) +#define GCR_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass)) +#define GCR_IS_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER)) +#define GCR_IS_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER)) +#define GCR_CERTIFICATE_REQUEST_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass)) + +typedef struct _GcrCertificateRequestRenderer GcrCertificateRequestRenderer; +typedef struct _GcrCertificateRequestRendererClass GcrCertificateRequestRendererClass; +typedef struct _GcrCertificateRequestRendererPrivate GcrCertificateRequestRendererPrivate; + +struct _GcrCertificateRequestRenderer { + GObject parent; + + /*< private >*/ + GcrCertificateRequestRendererPrivate *pv; +}; + +struct _GcrCertificateRequestRendererClass { + GObjectClass parent_class; +}; + +GType _gcr_certificate_request_renderer_get_type (void); + +GcrRenderer * _gcr_certificate_request_renderer_new_for_attributes (const gchar *label, + struct _GckAttributes *attrs); + +GckAttributes * _gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self); + +void _gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self, + GckAttributes *attrs); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_REQUEST_RENDERER_H__ */ diff --git a/ui/gcr-certificate-widget.c b/ui/gcr-certificate-widget.c new file mode 100644 index 0000000..aff1059 --- /dev/null +++ b/ui/gcr-certificate-widget.c @@ -0,0 +1,260 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-certificate.h" + +#include "gcr-certificate-renderer.h" +#include "gcr-certificate-widget.h" +#include "gcr-deprecated.h" +#include "gcr-renderer.h" +#include "gcr-viewer.h" + +#include "gck/gck.h" + +#include +#include + +/** + * SECTION:gcr-certificate-widget + * @title: GcrCertificateWidget + * @short_description: Certificate widget and renderer + * + * A #GcrCertificateWidget can be used to display a certificate. The widget + * is normally in a collapsed state showing only details, but can be expanded + * by the user. + * + * Use gcr_certificate_widget_new() to create a new certificate widget. Only + * one certificate can be displayed. A #GcrCertificateWidget contains a + * #GcrViewer internally and #GcrCertificateRenderer is used to render the + * certificate to the viewer. To show more than one certificate in a view, + * create the viewer and add renderers to it. + */ + +/** + * GcrCertificateWidget: + * + * A widget that displays a certificate. + */ + +/** + * GcrCertificateWidgetClass: + * + * The class for #GcrCertificateWidget + */ + +enum { + PROP_0, + PROP_CERTIFICATE, + PROP_ATTRIBUTES +}; + +struct _GcrCertificateWidgetPrivate { + GcrViewer *viewer; + GcrCertificateRenderer *renderer; +}; + +G_DEFINE_TYPE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_BIN); + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static GObject* +gcr_certificate_widget_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + GObject *obj = G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->constructor (type, n_props, props); + GcrCertificateWidget *self = NULL; + + g_return_val_if_fail (obj, NULL); + + self = GCR_CERTIFICATE_WIDGET (obj); + + self->pv->viewer = gcr_viewer_new_scrolled (); + gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer)); + gtk_widget_show (GTK_WIDGET (self->pv->viewer)); + + gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer)); + return obj; +} + +static void +gcr_certificate_widget_init (GcrCertificateWidget *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetPrivate)); + self->pv->renderer = gcr_certificate_renderer_new (NULL); +} + +static void +gcr_certificate_widget_finalize (GObject *obj) +{ + GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj); + + g_assert (self->pv->renderer); + g_object_unref (self->pv->renderer); + self->pv->renderer = NULL; + + g_assert (self->pv->viewer); + self->pv->viewer = NULL; + + G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (obj); +} + +static void +gcr_certificate_widget_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj); + + switch (prop_id) { + case PROP_CERTIFICATE: + gcr_certificate_widget_set_certificate (self, g_value_get_object (value)); + break; + case PROP_ATTRIBUTES: + gcr_certificate_widget_set_attributes (self, g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_widget_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj); + + switch (prop_id) { + case PROP_CERTIFICATE: + g_value_set_object (value, gcr_certificate_widget_get_certificate (self)); + break; + case PROP_ATTRIBUTES: + g_value_set_boxed (value, gcr_certificate_widget_get_attributes (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gcr_certificate_widget_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrCertificateWidgetPrivate)); + + gobject_class->constructor = gcr_certificate_widget_constructor; + gobject_class->finalize = gcr_certificate_widget_finalize; + gobject_class->set_property = gcr_certificate_widget_set_property; + gobject_class->get_property = gcr_certificate_widget_get_property; + + g_object_class_install_property (gobject_class, PROP_CERTIFICATE, + g_param_spec_object("certificate", "Certificate", "Certificate to display.", + GCR_TYPE_CERTIFICATE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "Attributes which contain the certificate", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_certificate_widget_new: + * @certificate: (allow-none): certificate to display, or %NULL + * + * Create a new certificate widget which displays a given certificate. + * + * Returns: (transfer full): a newly allocated #GcrCertificateWidget, which + * should be freed with g_object_unref() + */ +GcrCertificateWidget * +gcr_certificate_widget_new (GcrCertificate *certificate) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL); +} + +/** + * gcr_certificate_widget_get_certificate: + * @self: The certificate widget + * + * Get the certificate displayed in the widget. + * + * Returns: (allow-none) (transfer none): the certificate + */ +GcrCertificate * +gcr_certificate_widget_get_certificate (GcrCertificateWidget *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL); + return gcr_certificate_renderer_get_certificate (self->pv->renderer); +} + +/** + * gcr_certificate_widget_set_certificate: + * @self: The certificate widget + * @certificate: (allow-none): the certificate to display + * + * Set the certificate displayed in the widget + */ +void +gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate) +{ + g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self)); + gcr_certificate_renderer_set_certificate (self->pv->renderer, certificate); +} + +/** + * gcr_certificate_widget_get_attributes: + * @self: The certificate widget + * + * Get the attributes displayed in the widget. The attributes should contain + * a certificate. + * + * Returns: (allow-none) (transfer none): the attributes, owned by the widget + * + * Deprecated: 3.6: Use gcr_renderer_get_attributes() instead + */ +GckAttributes * +gcr_certificate_widget_get_attributes (GcrCertificateWidget *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL); + return gcr_renderer_get_attributes (GCR_RENDERER (self->pv->renderer)); +} + +/** + * gcr_certificate_widget_set_attributes: + * @self: The certificate widget + * @attrs: (allow-none): the attributes to display + * + * Set the attributes displayed in the widget. The attributes should contain + * a certificate. + * + * Deprecated: 3.6: Use gcr_renderer_set_attributes() instead + */ +void +gcr_certificate_widget_set_attributes (GcrCertificateWidget *self, + GckAttributes *attrs) +{ + g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self)); + gcr_renderer_set_attributes (GCR_RENDERER (self->pv->renderer), attrs); +} diff --git a/ui/gcr-certificate-widget.h b/ui/gcr-certificate-widget.h new file mode 100644 index 0000000..b967444 --- /dev/null +++ b/ui/gcr-certificate-widget.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_WIDGET_H__ +#define __GCR_CERTIFICATE_WIDGET_H__ + +#include +#include + +#include "gcr/gcr-certificate.h" +#include "gcr/gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_WIDGET (gcr_certificate_widget_get_type ()) +#define GCR_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidget)) +#define GCR_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass)) +#define GCR_IS_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_WIDGET)) +#define GCR_IS_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_WIDGET)) +#define GCR_CERTIFICATE_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass)) + +typedef struct _GcrCertificateWidget GcrCertificateWidget; +typedef struct _GcrCertificateWidgetClass GcrCertificateWidgetClass; +typedef struct _GcrCertificateWidgetPrivate GcrCertificateWidgetPrivate; + +struct _GcrCertificateWidget { + /*< private >*/ + GtkBin parent; + GcrCertificateWidgetPrivate *pv; +}; + +struct _GcrCertificateWidgetClass { + /*< private >*/ + GtkBinClass parent_class; +}; + +GType gcr_certificate_widget_get_type (void); + +GcrCertificateWidget* gcr_certificate_widget_new (GcrCertificate *certificate); + +GcrCertificate* gcr_certificate_widget_get_certificate (GcrCertificateWidget *self); + +void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, + GcrCertificate *certificate); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_WIDGET_H__ */ diff --git a/ui/gcr-collection-model.c b/ui/gcr-collection-model.c new file mode 100644 index 0000000..d4f7c10 --- /dev/null +++ b/ui/gcr-collection-model.c @@ -0,0 +1,1659 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-collection-model.h" + +#include "ui/gcr-enum-types.h" + +#include + +#include +#include + +/** + * SECTION:gcr-collection-model + * @title: GcrCollectionModel + * @short_description: A GtkTreeModel that represents a collection + * + * This is an implementation of #GtkTreeModel which represents the objects in + * the a #GcrCollection. As objects are added or removed from the collection, + * rows are added and removed from this model. + * + * The row values come from the properties of the objects in the collection. Use + * gcr_collection_model_new() to create a new collection model. To have more + * control over the values use a set of #GcrColumn structures to define the + * columns. This can be done with gcr_collection_model_new_full() or + * gcr_collection_model_set_columns(). + * + * Each row can have a selected state, which is represented by a boolean column. + * The selected state can be toggled with gcr_collection_model_toggle_selected() + * or set with gcr_collection_model_set_selected_objects() and retrieved with + * gcr_collection_model_get_selected_objects(). + * + * To determine which object a row represents and vice versa, use the + * gcr_collection_model_iter_for_object() or gcr_collection_model_object_for_iter() + * functions. + */ + +/** + * GcrCollectionModel: + * + * A #GtkTreeModel which contains a row for each object in a #GcrCollection. + */ + +/** + * GcrCollectionModelClass: + * @parent_class: The parent class + * + * The class for #GcrCollectionModel. + */ + +/** + * GcrCollectionModelMode: + * @GCR_COLLECTION_MODEL_LIST: only objects in the top collection, no child objects + * @GCR_COLLECTION_MODEL_TREE: show objects in the collection, and child objects in a tree form + * + * If set GcrCollectionModel is created with a mode of %GCR_COLLECTION_MODEL_TREE, + * then any included objects that are themselves a #GcrCollection, will have all child + * objects include as child rows in a tree form. + */ + +#define COLLECTION_MODEL_STAMP 0xAABBCCDD + +enum { + PROP_0, + PROP_COLLECTION, + PROP_COLUMNS, + PROP_MODE +}; + +typedef struct { + GObject *object; + GSequenceIter *parent; + GSequence *children; +} GcrCollectionRow; + +typedef struct { + GtkTreeIterCompareFunc sort_func; + gpointer user_data; + GDestroyNotify destroy_func; +} GcrCollectionSortClosure; + +typedef struct _GcrCollectionColumn { + gchar *property; + GType *type; + GtkTreeIterCompareFunc sort_func; + gpointer sort_data; + GDestroyNotify sort_destroy; +} GcrCollectionColumn; + +struct _GcrCollectionModelPrivate { + GcrCollectionModelMode mode; + GcrCollection *collection; + GHashTable *selected; + GSequence *root_sequence; + GHashTable *object_to_seq; + + const GcrColumn *columns; + guint n_columns; + + /* Sort information */ + gint sort_column_id; + GtkSortType sort_order_type; + GcrCollectionSortClosure *column_sort_closures; + GcrCollectionSortClosure default_sort_closure; + + /* Sequence ordering information */ + GCompareDataFunc order_current; + gpointer order_argument; +}; + +/* Forward declarations */ +static void gcr_collection_model_tree_model_init (GtkTreeModelIface *iface); +static void gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface); + +G_DEFINE_TYPE_EXTENDED (GcrCollectionModel, gcr_collection_model, G_TYPE_OBJECT, 0, + G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, gcr_collection_model_tree_model_init) + G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE, gcr_collection_model_tree_sortable_init) +); + +typedef gint (*CompareValueFunc) (const GValue *va, + const GValue *vb); + +static gint +compare_int_value (const GValue *va, + const GValue *vb) +{ + gint a = g_value_get_int (va); + gint b = g_value_get_int (vb); + if (a > b) return 1; + else if (a < b) return -1; + return 0; +} + +static gint +compare_uint_value (const GValue *va, + const GValue *vb) +{ + guint a = g_value_get_uint (va); + guint b = g_value_get_uint (vb); + if (a > b) return 1; + else if (a < b) return -1; + return 0; +} + +static gint +compare_long_value (const GValue *va, + const GValue *vb) +{ + glong a = g_value_get_long (va); + glong b = g_value_get_long (vb); + if (a > b) return 1; + else if (a < b) return -1; + return 0; +} + +static gint +compare_ulong_value (const GValue *va, + const GValue *vb) +{ + gulong a = g_value_get_ulong (va); + gulong b = g_value_get_ulong (vb); + if (a > b) return 1; + else if (a < b) return -1; + return 0; +} + +static gint +compare_string_value (const GValue *va, + const GValue *vb) +{ + const gchar *a = g_value_get_string (va); + const gchar *b = g_value_get_string (vb); + gchar *case_a; + gchar *case_b; + gboolean ret; + + if (a == b) + return 0; + else if (!a) + return -1; + else if (!b) + return 1; + + case_a = g_utf8_casefold (a, -1); + case_b = g_utf8_casefold (b, -1); + ret = g_utf8_collate (case_a, case_b); + g_free (case_a); + g_free (case_b); + + return ret; +} + +static gint +compare_date_value (const GValue *va, + const GValue *vb) +{ + GDate *a = g_value_get_boxed (va); + GDate *b = g_value_get_boxed (vb); + + if (a == b) + return 0; + else if (!a) + return -1; + else if (!b) + return 1; + else + return g_date_compare (a, b); +} + +static CompareValueFunc +lookup_compare_func (GType type) +{ + switch (type) { + case G_TYPE_INT: + return compare_int_value; + case G_TYPE_UINT: + return compare_uint_value; + case G_TYPE_LONG: + return compare_long_value; + case G_TYPE_ULONG: + return compare_ulong_value; + case G_TYPE_STRING: + return compare_string_value; + } + + if (type == G_TYPE_DATE) + return compare_date_value; + + return NULL; +} + +static gint +order_sequence_by_closure (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); + GcrCollectionSortClosure *closure = self->pv->order_argument; + const GcrCollectionRow *row_a = a; + const GcrCollectionRow *row_b = b; + GtkTreeIter iter_a; + GtkTreeIter iter_b; + + g_assert (closure); + g_assert (closure->sort_func); + + if (!gcr_collection_model_iter_for_object (self, row_a->object, &iter_a)) + g_return_val_if_reached (0); + if (!gcr_collection_model_iter_for_object (self, row_b->object, &iter_b)) + g_return_val_if_reached (0); + + return (closure->sort_func) (GTK_TREE_MODEL (self), + &iter_a, &iter_b, closure->user_data); +} + +static gint +order_sequence_by_closure_reverse (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + return 0 - order_sequence_by_closure (a, b, user_data); +} + +static gint +order_sequence_as_unsorted (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const GcrCollectionRow *row_a = a; + const GcrCollectionRow *row_b = b; + return GPOINTER_TO_INT (row_a->object) - GPOINTER_TO_INT (row_b->object); +} + +static gint +order_sequence_as_unsorted_reverse (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const GcrCollectionRow *row_a = a; + const GcrCollectionRow *row_b = b; + return GPOINTER_TO_INT (row_b->object) - GPOINTER_TO_INT (row_a->object); +} + +static void +lookup_object_property (GObject *object, + const gchar *property_name, + GValue *value) +{ + if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), property_name)) + g_object_get_property (object, property_name, value); + + /* Other types have sane defaults */ + else if (G_VALUE_TYPE (value) == G_TYPE_STRING) + g_value_set_string (value, ""); +} + +static gint +order_sequence_by_property (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const GcrCollectionRow *row_a = a; + const GcrCollectionRow *row_b = b; + GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); + const GcrColumn *column = self->pv->order_argument; + GValue value_a = { 0, }; + GValue value_b = { 0, }; + CompareValueFunc compare; + gint ret; + + g_assert (column); + + /* Sort according to property values */ + column = &self->pv->columns[self->pv->sort_column_id]; + g_value_init (&value_a, column->property_type); + lookup_object_property (row_a->object, column->property_name, &value_a); + g_value_init (&value_b, column->property_type); + lookup_object_property (row_b->object, column->property_name, &value_b); + + compare = lookup_compare_func (column->property_type); + g_assert (compare != NULL); + + ret = (compare) (&value_a, &value_b); + + g_value_unset (&value_a); + g_value_unset (&value_b); + + return ret; +} + +static gint +order_sequence_by_property_reverse (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + return 0 - order_sequence_by_property (a, b, user_data); +} + +static GHashTable* +selected_hash_table_new (void) +{ + return g_hash_table_new (g_direct_hash, g_direct_equal); +} + +static gboolean +sequence_iter_to_tree (GcrCollectionModel *self, + GSequenceIter *seq, + GtkTreeIter *iter) +{ + GcrCollectionRow *row; + + g_return_val_if_fail (seq != NULL, FALSE); + + if (g_sequence_iter_is_end (seq)) + return FALSE; + + row = g_sequence_get (seq); + g_return_val_if_fail (row != NULL && G_IS_OBJECT (row->object), FALSE); + + memset (iter, 0, sizeof (*iter)); + iter->stamp = COLLECTION_MODEL_STAMP; + iter->user_data = row->object; + iter->user_data2 = seq; + return TRUE; +} + +static GSequenceIter * +sequence_iter_for_tree (GcrCollectionModel *self, + GtkTreeIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL); + return iter->user_data2; +} + +static GtkTreePath * +sequence_iter_to_path (GcrCollectionModel *self, + GSequenceIter *seq) +{ + GcrCollectionRow *row; + GtkTreePath *path; + + path = gtk_tree_path_new (); + while (seq) { + gtk_tree_path_prepend_index (path, g_sequence_iter_get_position (seq)); + row = g_sequence_get (seq); + seq = row->parent; + } + return path; +} + +static GSequence * +child_sequence_for_tree (GcrCollectionModel *self, + GtkTreeIter *iter) +{ + GcrCollectionRow *row; + GSequenceIter *seq; + + if (iter == NULL) { + return self->pv->root_sequence; + } else { + seq = sequence_iter_for_tree (self, iter); + g_return_val_if_fail (seq != NULL, NULL); + row = g_sequence_get (seq); + return row->children; + } +} + +static void +on_object_notify (GObject *object, GParamSpec *spec, GcrCollectionModel *self) +{ + GtkTreeIter iter; + GtkTreePath *path; + gboolean found = FALSE; + guint i; + + g_return_if_fail (spec->name); + + for (i = 0; i < self->pv->n_columns - 1; ++i) { + g_assert (self->pv->columns[i].property_name); + if (g_str_equal (self->pv->columns[i].property_name, spec->name)) { + found = TRUE; + break; + } + } + + /* Tell the tree view that this row changed */ + if (found) { + if (!gcr_collection_model_iter_for_object (self, object, &iter)) + g_return_if_reached (); + path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter); + g_return_if_fail (path); + gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, &iter); + gtk_tree_path_free (path); + } +} + +static void +on_object_gone (gpointer unused, GObject *was_object) +{ + g_warning ("object contained in GcrCollection and included in GcrCollectionModel " + "was destroyed before it was removed from the collection"); +} + +static void on_collection_added (GcrCollection *collection, + GObject *object, + gpointer user_data); + +static void on_collection_removed (GcrCollection *collection, + GObject *object, + gpointer user_data); + +static void add_object_to_sequence (GcrCollectionModel *self, + GSequence *sequence, + GSequenceIter *parent, + GObject *object, + gboolean emit); + +static void remove_object_from_sequence (GcrCollectionModel *self, + GSequence *sequence, + GSequenceIter *seq, + GObject *object, + gboolean emit); + +static void +add_children_to_sequence (GcrCollectionModel *self, + GSequence *sequence, + GSequenceIter *parent, + GcrCollection *collection, + GList *children, + GHashTable *exclude, + gboolean emit) +{ + GList *l; + + for (l = children; l; l = g_list_next (l)) { + if (!exclude || g_hash_table_lookup (exclude, l->data) == NULL) + add_object_to_sequence (self, sequence, parent, l->data, emit); + } + + /* Now listen in for any changes */ + g_signal_connect_after (collection, "added", G_CALLBACK (on_collection_added), self); + g_signal_connect_after (collection, "removed", G_CALLBACK (on_collection_removed), self); +} + +static void +add_object_to_sequence (GcrCollectionModel *self, + GSequence *sequence, + GSequenceIter *parent, + GObject *object, + gboolean emit) +{ + GcrCollectionRow *row; + GcrCollection *collection; + GSequenceIter *seq; + GtkTreeIter iter; + GtkTreePath *path; + GList *children; + + g_assert (GCR_IS_COLLECTION_MODEL (self)); + g_assert (G_IS_OBJECT (object)); + g_assert (self->pv->order_current); + + if (g_hash_table_lookup (self->pv->object_to_seq, object)) { + g_warning ("object was already added to the GcrCollectionModel. Perhaps " + "a loop exists in a tree structure?"); + return; + } + + row = g_slice_new0 (GcrCollectionRow); + row->object = object; + row->parent = parent; + row->children = NULL; + + seq = g_sequence_insert_sorted (sequence, row, self->pv->order_current, self); + g_hash_table_insert (self->pv->object_to_seq, object, seq); + g_object_weak_ref (G_OBJECT (object), (GWeakNotify)on_object_gone, self); + g_signal_connect (object, "notify", G_CALLBACK (on_object_notify), self); + + if (emit) { + if (!sequence_iter_to_tree (self, seq, &iter)) + g_assert_not_reached (); + path = sequence_iter_to_path (self, seq); + g_assert (path != NULL); + gtk_tree_model_row_inserted (GTK_TREE_MODEL (self), path, &iter); + gtk_tree_path_free (path); + } + + if (self->pv->mode == GCR_COLLECTION_MODEL_TREE && + GCR_IS_COLLECTION (object)) { + row->children = g_sequence_new (NULL); + collection = GCR_COLLECTION (object); + children = gcr_collection_get_objects (collection); + add_children_to_sequence (self, row->children, seq, + collection, children, NULL, emit); + g_list_free (children); + } +} + +static void +on_collection_added (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); + GSequence *sequence; + GSequenceIter *parent; + GcrCollectionRow *row; + + if (collection == self->pv->collection) { + sequence = self->pv->root_sequence; + parent = NULL; + } else { + parent = g_hash_table_lookup (self->pv->object_to_seq, G_OBJECT (collection)); + row = g_sequence_get (parent); + g_assert (row->children); + sequence = row->children; + } + + add_object_to_sequence (self, sequence, parent, object, TRUE); +} + +static void +remove_children_from_sequence (GcrCollectionModel *self, + GSequence *sequence, + GcrCollection *collection, + GHashTable *exclude, + gboolean emit) +{ + GSequenceIter *seq, *next; + GcrCollectionRow *row; + + g_signal_handlers_disconnect_by_func (collection, on_collection_added, self); + g_signal_handlers_disconnect_by_func (collection, on_collection_removed, self); + + for (seq = g_sequence_get_begin_iter (sequence); + !g_sequence_iter_is_end (seq); seq = next) { + next = g_sequence_iter_next (seq); + row = g_sequence_get (seq); + if (!exclude || g_hash_table_lookup (exclude, row->object) == NULL) + remove_object_from_sequence (self, sequence, seq, row->object, emit); + } +} + +static void +remove_object_from_sequence (GcrCollectionModel *self, + GSequence *sequence, + GSequenceIter *seq, + GObject *object, + gboolean emit) +{ + GcrCollectionRow *row; + GtkTreePath *path = NULL; + + if (emit) { + path = sequence_iter_to_path (self, seq); + g_assert (path != NULL); + } + + row = g_sequence_get (seq); + g_assert (row->object == object); + + g_object_weak_unref (object, on_object_gone, self); + g_signal_handlers_disconnect_by_func (object, on_object_notify, self); + + if (row->children) { + g_assert (self->pv->mode == GCR_COLLECTION_MODEL_TREE); + g_assert (GCR_IS_COLLECTION (object)); + remove_children_from_sequence (self, row->children, + GCR_COLLECTION (object), NULL, emit); + g_assert (g_sequence_get_length (row->children) == 0); + g_sequence_free (row->children); + row->children = NULL; + } + + if (self->pv->selected) + g_hash_table_remove (self->pv->selected, object); + if (!g_hash_table_remove (self->pv->object_to_seq, object)) + g_assert_not_reached (); + + g_sequence_remove (seq); + g_slice_free (GcrCollectionRow, row); + + /* Fire signal for this removed row */ + if (path != NULL) { + gtk_tree_model_row_deleted (GTK_TREE_MODEL (self), path); + gtk_tree_path_free (path); + } + +} + +static void +on_collection_removed (GcrCollection *collection, + GObject *object, + gpointer user_data) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); + GSequenceIter *seq; + GSequence *sequence; + + seq = g_hash_table_lookup (self->pv->object_to_seq, object); + g_return_if_fail (seq != NULL); + + sequence = g_sequence_iter_get_sequence (seq); + g_assert (sequence != NULL); + + remove_object_from_sequence (self, sequence, seq, object, TRUE); +} + +static void +free_owned_columns (gpointer data) +{ + GcrColumn *columns; + g_assert (data); + + /* Only the property column is in use */ + for (columns = data; columns->property_name; ++columns) + g_free ((gchar*)columns->property_name); + g_free (data); +} + +static GtkTreeModelFlags +gcr_collection_model_real_get_flags (GtkTreeModel *model) +{ + return GTK_TREE_MODEL_ITERS_PERSIST; +} + +static gint +gcr_collection_model_real_get_n_columns (GtkTreeModel *model) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + return self->pv->n_columns; +} + +static GType +gcr_collection_model_real_get_column_type (GtkTreeModel *model, + gint column_id) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + g_return_val_if_fail (column_id >= 0 && column_id <= self->pv->n_columns, 0); + + /* The last is the selected column */ + if (column_id == self->pv->n_columns) + return G_TYPE_BOOLEAN; + + return self->pv->columns[column_id].column_type; +} + +static gboolean +gcr_collection_model_real_get_iter (GtkTreeModel *model, + GtkTreeIter *iter, + GtkTreePath *path) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + const gint *indices; + GSequence *sequence; + GSequenceIter *seq; + GcrCollectionRow *row; + gint count; + gint i; + + sequence = self->pv->root_sequence; + seq = NULL; + + indices = gtk_tree_path_get_indices_with_depth (path, &count); + if (count == 0) + return FALSE; + + for (i = 0; i < count; i++) { + if (!sequence) + return FALSE; + seq = g_sequence_get_iter_at_pos (sequence, indices[i]); + if (g_sequence_iter_is_end (seq)) + return FALSE; + row = g_sequence_get (seq); + sequence = row->children; + } + + return sequence_iter_to_tree (self, seq, iter); +} + +static GtkTreePath* +gcr_collection_model_real_get_path (GtkTreeModel *model, + GtkTreeIter *iter) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GSequenceIter *seq; + + if (iter == NULL) + return gtk_tree_path_new (); + + seq = sequence_iter_for_tree (self, iter); + g_return_val_if_fail (seq != NULL, NULL); + return sequence_iter_to_path (self, seq); +} + +static void +gcr_collection_model_real_get_value (GtkTreeModel *model, + GtkTreeIter *iter, + gint column_id, + GValue *value) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GObject *object; + GValue original; + const GcrColumn *column; + GParamSpec *spec; + + object = gcr_collection_model_object_for_iter (self, iter); + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (column_id >= 0 && column_id < self->pv->n_columns); + + /* The selected column? Last one */ + if (column_id == self->pv->n_columns - 1) { + g_value_init (value, G_TYPE_BOOLEAN); + g_value_set_boolean (value, gcr_collection_model_is_selected (self, iter)); + return; + } + + /* Figure out which property */ + column = &self->pv->columns[column_id]; + g_assert (column->property_name); + g_value_init (value, column->column_type); + + /* Lookup the property on the object */ + spec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), column->property_name); + if (spec != NULL) { + /* A transformer is specified, or mismatched types */ + if (column->transformer || column->column_type != column->property_type) { + memset (&original, 0, sizeof (original)); + g_value_init (&original, column->property_type); + g_object_get_property (object, column->property_name, &original); + + if (column->transformer) { + (column->transformer) (&original, value); + } else { + g_warning ("%s property of %s class was of type %s instead of type %s" + " and cannot be converted due to lack of transformer", + column->property_name, G_OBJECT_TYPE_NAME (object), + g_type_name (column->property_type), + g_type_name (column->column_type)); + spec = NULL; + } + + /* Simple, no transformation necessary */ + } else { + g_object_get_property (object, column->property_name, value); + } + } + + if (spec == NULL) { + + /* All the number types have sane defaults */ + if (column->column_type == G_TYPE_STRING) + g_value_set_string (value, ""); + } +} + +static gboolean +gcr_collection_model_real_iter_next (GtkTreeModel *model, + GtkTreeIter *iter) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GSequenceIter *seq = sequence_iter_for_tree (self, iter); + g_return_val_if_fail (seq != NULL, FALSE); + return sequence_iter_to_tree (self, g_sequence_iter_next (seq), iter); +} + +static gboolean +gcr_collection_model_real_iter_children (GtkTreeModel *model, + GtkTreeIter *iter, + GtkTreeIter *parent) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GSequence *sequence = child_sequence_for_tree (self, parent); + return sequence && sequence_iter_to_tree (self, g_sequence_get_begin_iter (sequence), iter); +} + +static gboolean +gcr_collection_model_real_iter_has_child (GtkTreeModel *model, + GtkTreeIter *iter) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GSequence *sequence = child_sequence_for_tree (self, iter); + return sequence && !g_sequence_iter_is_end (g_sequence_get_begin_iter (sequence)); +} + +static gint +gcr_collection_model_real_iter_n_children (GtkTreeModel *model, + GtkTreeIter *iter) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GSequence *sequence = child_sequence_for_tree (self, iter); + return sequence ? g_sequence_get_length (sequence) : 0; +} + +static gboolean +gcr_collection_model_real_iter_nth_child (GtkTreeModel *model, + GtkTreeIter *iter, + GtkTreeIter *parent, + gint n) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GSequence *sequence; + GSequenceIter *seq; + + sequence = child_sequence_for_tree (self, parent); + if (sequence == NULL) + return FALSE; + seq = g_sequence_get_iter_at_pos (sequence, n); + return sequence_iter_to_tree (self, seq, iter); +} + +static gboolean +gcr_collection_model_real_iter_parent (GtkTreeModel *model, + GtkTreeIter *iter, + GtkTreeIter *child) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); + GSequenceIter *seq; + GcrCollectionRow *row; + + seq = sequence_iter_for_tree (self, child); + g_return_val_if_fail (seq != NULL, FALSE); + row = g_sequence_get (seq); + if (row->parent == NULL) + return FALSE; + return sequence_iter_to_tree (self, row->parent, iter); +} + +static void +gcr_collection_model_real_ref_node (GtkTreeModel *model, + GtkTreeIter *iter) +{ + /* Nothing to do */ +} + +static void +gcr_collection_model_real_unref_node (GtkTreeModel *model, + GtkTreeIter *iter) +{ + /* Nothing to do */ +} + +static void +gcr_collection_model_tree_model_init (GtkTreeModelIface *iface) +{ + iface->get_flags = gcr_collection_model_real_get_flags; + iface->get_n_columns = gcr_collection_model_real_get_n_columns; + iface->get_column_type = gcr_collection_model_real_get_column_type; + iface->get_iter = gcr_collection_model_real_get_iter; + iface->get_path = gcr_collection_model_real_get_path; + iface->get_value = gcr_collection_model_real_get_value; + iface->iter_next = gcr_collection_model_real_iter_next; + iface->iter_children = gcr_collection_model_real_iter_children; + iface->iter_has_child = gcr_collection_model_real_iter_has_child; + iface->iter_n_children = gcr_collection_model_real_iter_n_children; + iface->iter_nth_child = gcr_collection_model_real_iter_nth_child; + iface->iter_parent = gcr_collection_model_real_iter_parent; + iface->ref_node = gcr_collection_model_real_ref_node; + iface->unref_node = gcr_collection_model_real_unref_node; +} + +static void +collection_resort_sequence (GcrCollectionModel *self, + GSequenceIter *parent, + GSequence *sequence) +{ + GPtrArray *previous; + GSequenceIter *seq, *next; + gint *new_order; + GtkTreePath *path; + GtkTreeIter iter; + GcrCollectionRow *row; + gint index; + gint i; + + /* Make note of how things stand, and at same time resort all kids */ + previous = g_ptr_array_new (); + for (seq = g_sequence_get_begin_iter (sequence); + !g_sequence_iter_is_end (seq); seq = next) { + next = g_sequence_iter_next (seq); + row = g_sequence_get (seq); + if (row->children) + collection_resort_sequence (self, seq, row->children); + g_ptr_array_add (previous, row->object); + } + + if (previous->len == 0) { + g_ptr_array_free (previous, TRUE); + return; + } + + /* Actually perform the sort */ + g_sequence_sort (sequence, self->pv->order_current, self); + + /* Now go through and map out how things changed */ + new_order = g_new0 (gint, previous->len); + for (i = 0; i < previous->len; i++) { + seq = g_hash_table_lookup (self->pv->object_to_seq, previous->pdata[i]); + g_assert (seq != NULL); + index = g_sequence_iter_get_position (seq); + g_assert (index >= 0 && index < previous->len); + new_order[index] = i; + } + + g_ptr_array_free (previous, TRUE); + + path = sequence_iter_to_path (self, parent); + if (parent == NULL) { + gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, NULL, new_order); + } else { + if (!sequence_iter_to_tree (self, parent, &iter)) + g_assert_not_reached (); + gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, &iter, new_order); + } + gtk_tree_path_free (path); + g_free (new_order); +} + +static gboolean +gcr_collection_model_get_sort_column_id (GtkTreeSortable *sortable, + gint *sort_column_id, + GtkSortType *order) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); + + if (order) + *order = self->pv->sort_order_type; + if (sort_column_id) + *sort_column_id = self->pv->sort_column_id; + return (self->pv->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID && + self->pv->sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID); +} + +static void +gcr_collection_model_set_sort_column_id (GtkTreeSortable *sortable, + gint sort_column_id, + GtkSortType order) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); + GCompareDataFunc func; + gpointer argument; + const GcrColumn *column; + gboolean reverse; + + reverse = (order == GTK_SORT_DESCENDING); + + if (sort_column_id == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID) { + func = reverse ? order_sequence_as_unsorted_reverse : order_sequence_as_unsorted; + argument = NULL; + + } else if (sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) { + func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure; + argument = &self->pv->default_sort_closure; + + } else if (sort_column_id >= 0 && sort_column_id < self->pv->n_columns) { + if (self->pv->column_sort_closures[sort_column_id].sort_func) { + func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure; + argument = &self->pv->column_sort_closures[sort_column_id]; + } else { + column = &self->pv->columns[sort_column_id]; + if (!(column->flags & GCR_COLUMN_SORTABLE)) + return; + if (!lookup_compare_func (column->property_type)) { + g_warning ("no sort implementation defined for type '%s' on column '%s'", + g_type_name (column->property_type), column->property_name); + return; + } + + func = reverse ? order_sequence_by_property_reverse : order_sequence_by_property; + argument = (gpointer)column; + } + } else { + g_warning ("invalid sort_column_id passed to gtk_tree_sortable_set_sort_column_id(): %d", + sort_column_id); + return; + } + + if (sort_column_id != self->pv->sort_column_id || + order != self->pv->sort_order_type) { + self->pv->sort_column_id = sort_column_id; + self->pv->sort_order_type = order; + gtk_tree_sortable_sort_column_changed (sortable); + } + + if (func != self->pv->order_current || + argument != self->pv->order_argument) { + self->pv->order_current = func; + self->pv->order_argument = (gpointer)argument; + collection_resort_sequence (self, NULL, self->pv->root_sequence); + } +} + +static void +clear_sort_closure (GcrCollectionSortClosure *closure) +{ + if (closure->destroy_func) + (closure->destroy_func) (closure->user_data); + closure->sort_func = NULL; + closure->destroy_func = NULL; + closure->user_data = NULL; +} + +static void +set_sort_closure (GcrCollectionSortClosure *closure, + GtkTreeIterCompareFunc func, + gpointer data, + GDestroyNotify destroy) +{ + clear_sort_closure (closure); + closure->sort_func = func; + closure->user_data = data; + closure->destroy_func = destroy; +} + +static void +gcr_collection_model_set_sort_func (GtkTreeSortable *sortable, + gint sort_column_id, + GtkTreeIterCompareFunc func, + gpointer data, + GDestroyNotify destroy) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); + + g_return_if_fail (sort_column_id >= 0 && sort_column_id < self->pv->n_columns); + + set_sort_closure (&self->pv->column_sort_closures[sort_column_id], + func, data, destroy); + + /* Resorts if necessary */ + if (self->pv->sort_column_id == sort_column_id) { + gcr_collection_model_set_sort_column_id (sortable, + self->pv->sort_column_id, + self->pv->sort_order_type); + } +} + +static void +gcr_collection_model_set_default_sort_func (GtkTreeSortable *sortable, + GtkTreeIterCompareFunc func, + gpointer data, GDestroyNotify destroy) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); + + set_sort_closure (&self->pv->default_sort_closure, + func, data, destroy); + + /* Resorts if necessary */ + if (self->pv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) { + gcr_collection_model_set_sort_column_id (sortable, + self->pv->sort_column_id, + self->pv->sort_order_type); + } +} + +static gboolean +gcr_collection_model_has_default_sort_func (GtkTreeSortable *sortable) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); + + return (self->pv->default_sort_closure.sort_func != NULL); +} + +static void +gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface) +{ + iface->get_sort_column_id = gcr_collection_model_get_sort_column_id; + iface->set_sort_column_id = gcr_collection_model_set_sort_column_id; + iface->set_sort_func = gcr_collection_model_set_sort_func; + iface->set_default_sort_func = gcr_collection_model_set_default_sort_func; + iface->has_default_sort_func = gcr_collection_model_has_default_sort_func; +} + +static void +gcr_collection_model_init (GcrCollectionModel *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelPrivate); + + self->pv->root_sequence = g_sequence_new (NULL); + self->pv->object_to_seq = g_hash_table_new (g_direct_hash, g_direct_equal); + self->pv->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID; + self->pv->sort_order_type = GTK_SORT_ASCENDING; + self->pv->order_current = order_sequence_as_unsorted; +} + +static void +gcr_collection_model_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); + GcrColumn *columns; + + switch (prop_id) { + case PROP_MODE: + self->pv->mode = g_value_get_enum (value); + break; + case PROP_COLLECTION: + gcr_collection_model_set_collection (self, g_value_get_object (value)); + break; + case PROP_COLUMNS: + columns = g_value_get_pointer (value); + if (columns) + gcr_collection_model_set_columns (self, columns); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gcr_collection_model_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, self->pv->mode); + break; + case PROP_COLLECTION: + g_value_set_object (value, self->pv->collection); + break; + case PROP_COLUMNS: + g_value_set_pointer (value, (gpointer)self->pv->columns); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gcr_collection_model_dispose (GObject *object) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); + + /* Disconnect from all rows */ + if (self->pv->collection) { + remove_children_from_sequence (self, self->pv->root_sequence, + self->pv->collection, NULL, FALSE); + g_object_unref (self->pv->collection); + self->pv->collection = NULL; + } + + G_OBJECT_CLASS (gcr_collection_model_parent_class)->dispose (object); +} + +static void +gcr_collection_model_finalize (GObject *object) +{ + GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); + guint i; + + g_assert (!self->pv->collection); + + g_assert (g_sequence_get_length (self->pv->root_sequence) == 0); + g_sequence_free (self->pv->root_sequence); + g_assert (g_hash_table_size (self->pv->object_to_seq) == 0); + g_hash_table_destroy (self->pv->object_to_seq); + + if (self->pv->selected) { + g_assert (g_hash_table_size (self->pv->selected) == 0); + g_hash_table_destroy (self->pv->selected); + self->pv->selected = NULL; + } + + self->pv->columns = NULL; + for (i = 0; i < self->pv->n_columns; i++) + clear_sort_closure (&self->pv->column_sort_closures[i]); + g_free (self->pv->column_sort_closures); + clear_sort_closure (&self->pv->default_sort_closure); + + G_OBJECT_CLASS (gcr_collection_model_parent_class)->finalize (object); +} + +static void +gcr_collection_model_class_init (GcrCollectionModelClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gcr_collection_model_parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = gcr_collection_model_dispose; + gobject_class->finalize = gcr_collection_model_finalize; + gobject_class->set_property = gcr_collection_model_set_property; + gobject_class->get_property = gcr_collection_model_get_property; + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", "Tree or list mode", + GCR_TYPE_COLLECTION_MODEL_MODE, GCR_COLLECTION_MODEL_TREE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, PROP_COLLECTION, + g_param_spec_object ("collection", "Object Collection", "Collection to get objects from", + GCR_TYPE_COLLECTION, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_COLUMNS, + g_param_spec_pointer ("columns", "Columns", "Columns for the model", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (klass, sizeof (GcrCollectionModelPrivate)); +} + +/** + * gcr_collection_model_new: (skip) + * @collection: the collection to represent + * @mode: whether list or tree mode + * @...: the column names and types + * + * Create a new #GcrCollectionModel. The variable argument list should contain + * pairs of property names, and #GType values. The variable argument list should + * be terminated with %NULL. + * + * Returns: (transfer full): a newly allocated model, which should be released + * with g_object_unref(). + */ +GcrCollectionModel* +gcr_collection_model_new (GcrCollection *collection, + GcrCollectionModelMode mode, + ...) +{ + GcrColumn column; + GcrCollectionModel *self; + const gchar *arg; + GArray *array; + va_list va; + + /* With a null terminator */ + array = g_array_new (TRUE, TRUE, sizeof (GcrColumn)); + + va_start (va, mode); + while ((arg = va_arg (va, const gchar*)) != NULL) { + memset (&column, 0, sizeof (column)); + column.property_name = g_strdup (arg); + column.property_type = va_arg (va, GType); + column.column_type = column.property_type; + g_array_append_val (array, column); + } + va_end (va); + + self = gcr_collection_model_new_full (collection, mode, (GcrColumn*)array->data); + g_object_set_data_full (G_OBJECT (self), "gcr_collection_model_new", + g_array_free (array, FALSE), free_owned_columns); + return self; +} + +/** + * gcr_collection_model_new_full: (skip) + * @collection: the collection to represent + * @mode: whether list or tree mode + * @columns: the columns the model should contain + * + * Create a new #GcrCollectionModel. + * + * Returns: (transfer full): a newly allocated model, which should be released + * with g_object_unref() + */ +GcrCollectionModel* +gcr_collection_model_new_full (GcrCollection *collection, + GcrCollectionModelMode mode, + const GcrColumn *columns) +{ + GcrCollectionModel *self = g_object_new (GCR_TYPE_COLLECTION_MODEL, + "collection", collection, + "mode", mode, + NULL); + gcr_collection_model_set_columns (self, columns); + return self; +} + +/** + * gcr_collection_model_set_columns: (skip) + * @self: The model + * @columns: The columns the model should contain + * + * Set the columns that the model should contain. @columns is an array of + * #GcrColumn structures, with the last one containing %NULL for all values. + * + * This function can only be called once, and only if the model was not created + * without a set of columns. This function cannot be called after the model + * has been added to a view. + * + * The columns are accessed as static data. They should continue to remain + * in memory for longer than the GcrCollectionModel object. + * + * Returns: The number of columns + */ +guint +gcr_collection_model_set_columns (GcrCollectionModel *self, + const GcrColumn *columns) +{ + const GcrColumn *col; + guint n_columns; + + g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0); + g_return_val_if_fail (columns, 0); + g_return_val_if_fail (self->pv->n_columns == 0, 0); + + /* Count the number of columns, extra column for selected */ + for (col = columns, n_columns = 1; col->property_name; ++col) + ++n_columns; + + /* We expect the columns to stay around */ + self->pv->columns = columns; + self->pv->n_columns = n_columns; + self->pv->column_sort_closures = g_new0 (GcrCollectionSortClosure, self->pv->n_columns); + + return n_columns - 1; +} + +/** + * gcr_collection_model_get_collection: + * @self: a collection model + * + * Get the collection which this model represents + * + * Returns: (transfer none): the collection, owned by the model + */ +GcrCollection * +gcr_collection_model_get_collection (GcrCollectionModel *self) +{ + g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL); + return self->pv->collection; +} + +/** + * gcr_collection_model_set_collection: + * @self: a collection model + * @collection: (allow-none): the collection or %NULL + * + * Set the collection which this model represents + */ +void +gcr_collection_model_set_collection (GcrCollectionModel *self, + GcrCollection *collection) +{ + GcrCollection *previous; + GHashTable *exclude; + GList *children = NULL; + GList *l; + + g_return_if_fail (GCR_IS_COLLECTION_MODEL (self)); + g_return_if_fail (collection == NULL || GCR_IS_COLLECTION (collection)); + + if (collection == self->pv->collection) + return; + + if (collection) + g_object_ref (collection); + previous = self->pv->collection; + self->pv->collection = collection; + + if (collection) + children = gcr_collection_get_objects (collection); + + if (previous) { + exclude = g_hash_table_new (g_direct_hash, g_direct_equal); + for (l = children; l != NULL; l = g_list_next (l)) + g_hash_table_insert (exclude, l->data, l->data); + + remove_children_from_sequence (self, self->pv->root_sequence, + previous, exclude, TRUE); + + g_hash_table_destroy (exclude); + g_object_unref (previous); + } + + if (collection) { + add_children_to_sequence (self, self->pv->root_sequence, + NULL, collection, children, + self->pv->object_to_seq, TRUE); + g_list_free (children); + } + + g_object_notify (G_OBJECT (self), "collection"); +} + +/** + * gcr_collection_model_object_for_iter: + * @self: The model + * @iter: The row + * + * Get the object that is represented by the given row in the model. + * + * Returns: (transfer none): The object, owned by the model. + */ +GObject * +gcr_collection_model_object_for_iter (GcrCollectionModel *self, const GtkTreeIter *iter) +{ + g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL); + g_return_val_if_fail (iter != NULL, NULL); + g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL); + g_return_val_if_fail (G_IS_OBJECT (iter->user_data), NULL); + + return G_OBJECT (iter->user_data); +} + +/** + * gcr_collection_model_iter_for_object: + * @self: The model + * @object: The object + * @iter: The row for the object + * + * Set @iter to the row for the given object. If the object is not in this + * model, then %FALSE will be returned. + * + * Returns: %TRUE if the object was present. + */ +gboolean +gcr_collection_model_iter_for_object (GcrCollectionModel *self, GObject *object, + GtkTreeIter *iter) +{ + GSequenceIter *seq; + + g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE); + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + g_return_val_if_fail (iter != NULL, FALSE); + + seq = g_hash_table_lookup (self->pv->object_to_seq, object); + if (seq == NULL) + return FALSE; + + return sequence_iter_to_tree (self, seq, iter); +} + +/** + * gcr_collection_model_column_for_selected: + * @self: The model + * + * Get the column identifier for the column that contains the values + * of the selected state. + * + * Returns: The column identifier. + */ +gint +gcr_collection_model_column_for_selected (GcrCollectionModel *self) +{ + g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0); + g_assert (self->pv->n_columns > 0); + return self->pv->n_columns - 1; +} + +/** + * gcr_collection_model_toggle_selected: + * @self: The model + * @iter: The row + * + * Toggle the selected state of a given row. + */ +void +gcr_collection_model_toggle_selected (GcrCollectionModel *self, GtkTreeIter *iter) +{ + GObject *object; + + g_return_if_fail (GCR_IS_COLLECTION_MODEL (self)); + + object = gcr_collection_model_object_for_iter (self, iter); + g_return_if_fail (G_IS_OBJECT (object)); + + if (!self->pv->selected) + self->pv->selected = selected_hash_table_new (); + + if (g_hash_table_lookup (self->pv->selected, object)) + g_hash_table_remove (self->pv->selected, object); + else + g_hash_table_insert (self->pv->selected, object, object); +} + +/** + * gcr_collection_model_change_selected: + * @self: The model + * @iter: The row + * @selected: Whether the row should be selected or not. + * + * Set whether a given row is toggled selected or not. + */ +void +gcr_collection_model_change_selected (GcrCollectionModel *self, GtkTreeIter *iter, gboolean selected) +{ + GtkTreePath *path; + GObject *object; + + g_return_if_fail (GCR_IS_COLLECTION_MODEL (self)); + + object = gcr_collection_model_object_for_iter (self, iter); + g_return_if_fail (G_IS_OBJECT (object)); + + if (!self->pv->selected) + self->pv->selected = g_hash_table_new (g_direct_hash, g_direct_equal); + + if (selected) + g_hash_table_insert (self->pv->selected, object, object); + else + g_hash_table_remove (self->pv->selected, object); + + /* Tell the view that this row changed */ + path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), iter); + g_return_if_fail (path); + gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, iter); + gtk_tree_path_free (path); +} + +/** + * gcr_collection_model_is_selected: + * @self: The model + * @iter: The row + * + * Check whether a given row has been toggled as selected. + * + * Returns: Whether the row has been selected. + */ +gboolean +gcr_collection_model_is_selected (GcrCollectionModel *self, GtkTreeIter *iter) +{ + GObject *object; + + g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE); + + object = gcr_collection_model_object_for_iter (self, iter); + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + + if (!self->pv->selected) + return FALSE; + + return g_hash_table_lookup (self->pv->selected, object) ? TRUE : FALSE; +} + +/** + * gcr_collection_model_get_selected_objects: + * @self: the collection model + * + * Get a list of checked/selected objects. + * + * Returns: (transfer container) (element-type GObject.Object): a list of selected + * objects, which should be freed with g_list_free() + */ +GList * +gcr_collection_model_get_selected_objects (GcrCollectionModel *self) +{ + GHashTableIter iter; + GList *result = NULL; + gpointer key; + + g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL); + + if (!self->pv->selected) + return NULL; + + g_hash_table_iter_init (&iter, self->pv->selected); + while (g_hash_table_iter_next (&iter, &key, NULL)) + result = g_list_prepend (result, key); + return result; +} + +/** + * gcr_collection_model_set_selected_objects: + * @self: the collection model + * @selected: (element-type GObject.Object): a list of objects to select + * + * Set the checked/selected objects. + */ +void +gcr_collection_model_set_selected_objects (GcrCollectionModel *self, + GList *selected) +{ + GHashTable *newly_selected; + GList *old_selection; + GtkTreeIter iter; + GList *l; + + old_selection = gcr_collection_model_get_selected_objects (self); + newly_selected = selected_hash_table_new (); + + /* Select all the objects in selected which aren't already selected */ + for (l = selected; l; l = g_list_next (l)) { + if (!self->pv->selected || !g_hash_table_lookup (self->pv->selected, l->data)) { + if (!gcr_collection_model_iter_for_object (self, l->data, &iter)) + g_return_if_reached (); + gcr_collection_model_change_selected (self, &iter, TRUE); + } + + /* Note that we've seen this one */ + g_hash_table_insert (newly_selected, l->data, l->data); + } + + /* Unselect all the objects which aren't supposed to be selected */ + for (l = old_selection; l; l = g_list_next (l)) { + if (!g_hash_table_lookup (newly_selected, l->data)) { + if (!gcr_collection_model_iter_for_object (self, l->data, &iter)) + g_return_if_reached (); + gcr_collection_model_change_selected (self, &iter, FALSE); + } + } + + g_list_free (old_selection); + g_hash_table_destroy (newly_selected); +} diff --git a/ui/gcr-collection-model.h b/ui/gcr-collection-model.h new file mode 100644 index 0000000..4241d3a --- /dev/null +++ b/ui/gcr-collection-model.h @@ -0,0 +1,100 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_COLLECTION_MODEL_H__ +#define __GCR_COLLECTION_MODEL_H__ + +#include + +#include "gcr/gcr-collection.h" +#include "gcr/gcr-column.h" + +typedef enum { + GCR_COLLECTION_MODEL_LIST = 0, + GCR_COLLECTION_MODEL_TREE +} GcrCollectionModelMode; + +#define GCR_TYPE_COLLECTION_MODEL (gcr_collection_model_get_type ()) +#define GCR_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModel)) +#define GCR_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass)) +#define GCR_IS_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION_MODEL)) +#define GCR_IS_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION_MODEL)) +#define GCR_COLLECTION_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass)) + +typedef struct _GcrCollectionModel GcrCollectionModel; +typedef struct _GcrCollectionModelClass GcrCollectionModelClass; +typedef struct _GcrCollectionModelPrivate GcrCollectionModelPrivate; + +struct _GcrCollectionModel { + GObject parent; + + /*< private >*/ + GcrCollectionModelPrivate *pv; +}; + +struct _GcrCollectionModelClass { + GObjectClass parent_class; +}; + +GType gcr_collection_model_get_type (void); + +GcrCollectionModel* gcr_collection_model_new (GcrCollection *collection, + GcrCollectionModelMode mode, + ...) G_GNUC_NULL_TERMINATED; + +GcrCollectionModel* gcr_collection_model_new_full (GcrCollection *collection, + GcrCollectionModelMode mode, + const GcrColumn *columns); + +guint gcr_collection_model_set_columns (GcrCollectionModel *self, + const GcrColumn *columns); + +GcrCollection * gcr_collection_model_get_collection (GcrCollectionModel *self); + +void gcr_collection_model_set_collection (GcrCollectionModel *self, + GcrCollection *collection); + +GObject* gcr_collection_model_object_for_iter (GcrCollectionModel *self, + const GtkTreeIter *iter); + +gboolean gcr_collection_model_iter_for_object (GcrCollectionModel *self, + GObject *object, + GtkTreeIter *iter); + +gint gcr_collection_model_column_for_selected (GcrCollectionModel *self); + +void gcr_collection_model_toggle_selected (GcrCollectionModel *self, + GtkTreeIter *iter); + +void gcr_collection_model_change_selected (GcrCollectionModel *self, + GtkTreeIter *iter, + gboolean selected); + +gboolean gcr_collection_model_is_selected (GcrCollectionModel *self, + GtkTreeIter *iter); + +GList* gcr_collection_model_get_selected_objects (GcrCollectionModel *self); + +void gcr_collection_model_set_selected_objects (GcrCollectionModel *self, + GList *selected); + +#endif /* __GCR_COLLECTION_MODEL_H__ */ diff --git a/ui/gcr-combo-selector.c b/ui/gcr-combo-selector.c new file mode 100644 index 0000000..d225491 --- /dev/null +++ b/ui/gcr-combo-selector.c @@ -0,0 +1,269 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-internal.h" + +#include "gcr-collection-model.h" +#include "gcr-combo-selector.h" + +#include + +#include + +/** + * SECTION:gcr-combo-selector + * @title: GcrComboSelector + * @short_description: A selector widget to select a single certificate or key. + * + * The #GcrComboSelector can be used to select a certificate or key. It allows + * the user to select one object from the selector at a time. + */ + +/** + * GcrComboSelector: + * + * A combo selector widget. + */ + +/** + * GcrComboSelectorClass: + * + * The class for #GcrComboSelector. + */ + +enum { + PROP_0, + PROP_COLLECTION +}; + +struct _GcrComboSelectorPrivate { + GcrCollection *collection; + GcrCollectionModel *model; +}; + +G_DEFINE_TYPE (GcrComboSelector, gcr_combo_selector, GTK_TYPE_COMBO_BOX); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static GObject* +gcr_combo_selector_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + GcrComboSelector *self = GCR_COMBO_SELECTOR (G_OBJECT_CLASS (gcr_combo_selector_parent_class)->constructor(type, n_props, props)); + GtkCellRenderer *cell; + + g_return_val_if_fail (self, NULL); + + self->pv->model = gcr_collection_model_new (self->pv->collection, + GCR_COLLECTION_MODEL_LIST, + "icon", G_TYPE_ICON, + "markup", G_TYPE_STRING, + NULL); + + gtk_combo_box_set_model (GTK_COMBO_BOX (self), GTK_TREE_MODEL (self->pv->model)); + + /* The icon */ + cell = gtk_cell_renderer_pixbuf_new (); + g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, FALSE); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "gicon", 0); + + /* The markup */ + cell = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, TRUE); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "markup", 1); + + return G_OBJECT (self); +} + +static void +gcr_combo_selector_init (GcrComboSelector *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorPrivate); +} + +static void +gcr_combo_selector_dispose (GObject *obj) +{ + GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); + + if (self->pv->model) + g_object_unref (self->pv->model); + self->pv->model = NULL; + + if (self->pv->collection) + g_object_unref (self->pv->collection); + self->pv->collection = NULL; + + G_OBJECT_CLASS (gcr_combo_selector_parent_class)->dispose (obj); +} + +static void +gcr_combo_selector_finalize (GObject *obj) +{ + GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); + + g_assert (!self->pv->collection); + g_assert (!self->pv->model); + + G_OBJECT_CLASS (gcr_combo_selector_parent_class)->finalize (obj); +} + +static void +gcr_combo_selector_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); + + switch (prop_id) { + case PROP_COLLECTION: + g_return_if_fail (!self->pv->collection); + self->pv->collection = g_value_dup_object (value); + g_return_if_fail (self->pv->collection); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_combo_selector_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); + + switch (prop_id) { + case PROP_COLLECTION: + g_value_set_object (value, gcr_combo_selector_get_collection (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_combo_selector_class_init (GcrComboSelectorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructor = gcr_combo_selector_constructor; + gobject_class->dispose = gcr_combo_selector_dispose; + gobject_class->finalize = gcr_combo_selector_finalize; + gobject_class->set_property = gcr_combo_selector_set_property; + gobject_class->get_property = gcr_combo_selector_get_property; + + g_type_class_add_private (gobject_class, sizeof (GcrComboSelectorPrivate)); + + /** + * GcrComboSelector:collection: + * + * The collection which contains the objects to display in the selector. + */ + g_object_class_install_property (gobject_class, PROP_COLLECTION, + g_param_spec_object ("collection", "Collection", "Collection to select from", + GCR_TYPE_COLLECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_combo_selector_new: + * @collection: The collection that contains the objects to display + * + * Create a new #GcrTreeSelector. + * + * Returns: A newly allocated selector, which should be released with + * g_object_unref(). + */ +GcrComboSelector* +gcr_combo_selector_new (GcrCollection *collection) +{ + return g_object_new (GCR_TYPE_COMBO_SELECTOR, + "collection", collection, + NULL); +} + +/** + * gcr_combo_selector_get_collection: + * @self: The selector + * + * Get the collection that this selector is displaying objects from. + * + * Returns: (transfer none): The collection, owned by the selector. + */ +GcrCollection * +gcr_combo_selector_get_collection (GcrComboSelector *self) +{ + g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL); + return self->pv->collection; +} + +/** + * gcr_combo_selector_get_selected: + * @self: The selector + * + * Get the selected object in the selector, or %NULL if nothing selected. + * + * Returns: (transfer none): the selected object, owned by the selector, or %NULL + */ +GObject * +gcr_combo_selector_get_selected (GcrComboSelector *self) +{ + GtkTreeIter iter; + + g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL); + gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self), &iter); + + return gcr_collection_model_object_for_iter (self->pv->model, &iter); +} + +/** + * gcr_combo_selector_set_selected: + * @self: The selector + * @selected: (allow-none): the object to select or %NULL + * + * Set the currently selected object in the selector, or clear the selection + * if selected is set to %NULL. + */ +void +gcr_combo_selector_set_selected (GcrComboSelector *self, GObject *selected) +{ + GtkTreeIter iter; + + g_return_if_fail (GCR_IS_COMBO_SELECTOR (self)); + + if (selected) { + if (!gcr_collection_model_iter_for_object (self->pv->model, selected, &iter)) + g_return_if_reached (); + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter); + } else { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), NULL); + } +} diff --git a/ui/gcr-combo-selector.h b/ui/gcr-combo-selector.h new file mode 100644 index 0000000..d1b91d0 --- /dev/null +++ b/ui/gcr-combo-selector.h @@ -0,0 +1,65 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_COMBO_SELECTOR_H__ +#define __GCR_COMBO_SELECTOR_H__ + +#include "gcr/gcr-types.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_COMBO_SELECTOR (gcr_combo_selector_get_type ()) +#define GCR_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelector)) +#define GCR_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass)) +#define GCR_IS_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COMBO_SELECTOR)) +#define GCR_IS_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COMBO_SELECTOR)) +#define GCR_COMBO_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass)) + +typedef struct _GcrComboSelector GcrComboSelector; +typedef struct _GcrComboSelectorClass GcrComboSelectorClass; +typedef struct _GcrComboSelectorPrivate GcrComboSelectorPrivate; + +struct _GcrComboSelector { + GtkComboBox parent; + + /*< private >*/ + GcrComboSelectorPrivate *pv; +}; + +struct _GcrComboSelectorClass { + /*< private >*/ + GtkComboBoxClass parent_class; +}; + +GType gcr_combo_selector_get_type (void); + +GcrComboSelector* gcr_combo_selector_new (GcrCollection *collection); + +GcrCollection* gcr_combo_selector_get_collection (GcrComboSelector *self); + +GObject* gcr_combo_selector_get_selected (GcrComboSelector *self); + +void gcr_combo_selector_set_selected (GcrComboSelector *self, + GObject *selected); + +G_END_DECLS + +#endif /* __GCR_COMBO_SELECTOR_H__ */ diff --git a/ui/gcr-crypto-types.xml b/ui/gcr-crypto-types.xml new file mode 100644 index 0000000..4b5037b --- /dev/null +++ b/ui/gcr-crypto-types.xml @@ -0,0 +1,168 @@ + + + + + + Openssl PEM format + PEM + + + + + + + X.509 Certificate + + + + + + + + + + + + + + X.509 Certificate in PEM format + + + + + + + + + Certificate Revocation List + CRL + Certificate Revocation List + + + + + + Certificate Revocation List in PEM format + + + + + + + + + PKCS#12 Personal Key and Certificates + PKCS#12 + + + + + + + + + + + + PKCS#12 Personal Key and Certificates in PEM format + + + + + + + + + PKCS#8 Personal Key + PKCS#8 + + + + + + + + + PKCS#8 Personal Key in PEM format + + + + + + + + + + PKCS#7 Message and Certificates + PKCS#7 + + + + + + + + + + + + + + PKCS#7 Message and Certificates in PEM format + + + + + + + + + PKCS#7 Signature + PKCS#7 + + + + + + PKCS#10 Certificate Request + PKCS#10 + + + + + + + PKCS#10 Certificate Request in PEM format + + + + + + + + + + SPKAC Certificate Request + + + + + + SPKAC Certificate Request in OpenSSL format + + + + + + + + + Private Key in PEM format + + + + + + + + diff --git a/ui/gcr-deprecated.h b/ui/gcr-deprecated.h new file mode 100644 index 0000000..39cf50c --- /dev/null +++ b/ui/gcr-deprecated.h @@ -0,0 +1,57 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef GCR_DEPRECATED_H_ +#define GCR_DEPRECATED_H_ +#ifndef GCR_DISABLE_DEPRECATED +#ifndef __GI_SCANNER__ + +#include + +#include "gcr-certificate-basics-widget.h" +#include "gcr-certificate-details-widget.h" +#include "gcr-certificate-renderer.h" +#include "gcr-viewer.h" + +G_BEGIN_DECLS + +void gcr_renderer_render (GcrRenderer *self, + GcrViewer *viewer); + +GckAttributes * gcr_certificate_renderer_get_attributes (GcrCertificateRenderer *self); + +void gcr_certificate_renderer_set_attributes (GcrCertificateRenderer *self, + GckAttributes *attrs); + +GckAttributes * gcr_certificate_widget_get_attributes (GcrCertificateWidget *self); + +void gcr_certificate_widget_set_attributes (GcrCertificateWidget *self, + GckAttributes *attrs); + +G_END_DECLS + +#endif /* __GI_SCANNER__ */ +#endif /* GCR_DISABLE_DEPRECATED */ +#endif /* GCRTYPES_H_ */ diff --git a/ui/gcr-dialog-util.c b/ui/gcr-dialog-util.c new file mode 100644 index 0000000..b37aa63 --- /dev/null +++ b/ui/gcr-dialog-util.c @@ -0,0 +1,180 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr-dialog-util.h" + +#include + +typedef struct { + GtkDialog *dialog; + gint response_id; + gboolean was_modal; + gboolean destroyed; + gulong response_sig; + gulong unmap_sig; + gulong delete_sig; + gulong destroy_sig; +} DialogRunClosure; + +static void +dialog_run_closure_free (gpointer data) +{ + DialogRunClosure *closure = data; + g_object_unref (closure->dialog); + g_assert (closure->response_sig == 0); + g_assert (closure->unmap_sig == 0); + g_assert (closure->delete_sig == 0); + g_assert (closure->destroy_sig == 0); + g_free (closure); +} + +static void +complete_async_result (GSimpleAsyncResult *res) +{ + DialogRunClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + + g_object_ref (res); + + if (!closure->destroyed) { + if (!closure->was_modal) + gtk_window_set_modal (GTK_WINDOW (closure->dialog), FALSE); + + g_signal_handler_disconnect (closure->dialog, closure->response_sig); + closure->response_sig = 0; + g_signal_handler_disconnect (closure->dialog, closure->unmap_sig); + closure->unmap_sig = 0; + g_signal_handler_disconnect (closure->dialog, closure->delete_sig); + closure->delete_sig = 0; + g_signal_handler_disconnect (closure->dialog, closure->destroy_sig); + closure->destroy_sig = 0; + } + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +on_dialog_unmap (GtkDialog *dialog, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + + complete_async_result (res); +} + +static void +on_dialog_response (GtkDialog *dialog, + gint response_id, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + DialogRunClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + + closure->response_id = response_id; + complete_async_result (res); +} + +static gint +on_dialog_delete (GtkDialog *dialog, + GdkEventAny *event, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + complete_async_result (res); + return TRUE; /* Do not destroy */ +} + +static void +on_dialog_destroy (GtkDialog *dialog, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + DialogRunClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + + /* complete will be called by run_unmap_handler */ + closure->destroyed = TRUE; +} + +void +_gcr_dialog_util_run_async (GtkDialog *dialog, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + DialogRunClosure *closure; + + g_return_if_fail (GTK_IS_DIALOG (dialog)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + res = g_simple_async_result_new (G_OBJECT (dialog), callback, user_data, + _gcr_dialog_util_run_async); + closure = g_new0 (DialogRunClosure, 1); + + closure->dialog = g_object_ref (dialog); + closure->response_id = GTK_RESPONSE_NONE; + closure->was_modal = gtk_window_get_modal (GTK_WINDOW (dialog)); + if (!closure->was_modal) + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + + if (!gtk_widget_get_visible (GTK_WIDGET (dialog))) + gtk_widget_show (GTK_WIDGET (dialog)); + + g_simple_async_result_set_op_res_gpointer (res, closure, dialog_run_closure_free); + + closure->response_sig = g_signal_connect_data (dialog, "response", + G_CALLBACK (on_dialog_response), + g_object_ref (res), + (GClosureNotify)g_object_unref, 0); + + closure->unmap_sig = g_signal_connect_data (dialog, "unmap", + G_CALLBACK (on_dialog_unmap), + g_object_ref (res), + (GClosureNotify)g_object_unref, 0); + + closure->delete_sig = g_signal_connect_data (dialog, "delete-event", + G_CALLBACK (on_dialog_delete), + g_object_ref (res), + (GClosureNotify)g_object_unref, 0); + + closure->destroy_sig = g_signal_connect_data (dialog, "destroy", + G_CALLBACK (on_dialog_destroy), + g_object_ref (res), + (GClosureNotify)g_object_unref, 0); + + g_object_unref (res); +} + + +gint +_gcr_dialog_util_run_finish (GtkDialog *dialog, + GAsyncResult *result) +{ + DialogRunClosure *closure; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (dialog), + _gcr_dialog_util_run_async), GTK_RESPONSE_NONE); + + closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); + return closure->response_id; +} diff --git a/ui/gcr-dialog-util.h b/ui/gcr-dialog-util.h new file mode 100644 index 0000000..b40b14c --- /dev/null +++ b/ui/gcr-dialog-util.h @@ -0,0 +1,40 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_DIALOG_UTIL_H +#define GCR_DIALOG_UTIL_H + +#include +#include + +G_BEGIN_DECLS + +void _gcr_dialog_util_run_async (GtkDialog *dialog, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gint _gcr_dialog_util_run_finish (GtkDialog *dialog, + GAsyncResult *result); + +G_END_DECLS + +#endif /* __GCR_TOKEN_MANAGER_H__ */ diff --git a/ui/gcr-display-scrolled.c b/ui/gcr-display-scrolled.c new file mode 100644 index 0000000..e4e63e1 --- /dev/null +++ b/ui/gcr-display-scrolled.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + + +#include "config.h" + +#include "gcr-display-scrolled.h" +#include "gcr-viewer.h" + +static void _gcr_display_scrolled_viewer_iface (GcrViewerIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrDisplayScrolled, _gcr_display_scrolled, GTK_TYPE_SCROLLED_WINDOW, + G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_scrolled_viewer_iface)); + +struct _GcrDisplayScrolledPrivate { + GcrViewer *internal; +}; + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static void +_gcr_display_scrolled_init (GcrDisplayScrolled *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledPrivate)); + self->pv->internal = gcr_viewer_new (); +} + +static void +_gcr_display_scrolled_constructed (GObject *object) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (object); + + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->internal)); + gtk_widget_show (GTK_WIDGET (self->pv->internal)); +} + +static void +_gcr_display_scrolled_get_preferred_height (GtkWidget *widget, gint *minimal_height, + gint *natural_height) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget); + gint minimal, natural; + + GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_height (widget, + minimal_height, + natural_height); + + minimal = 0; + natural = 0; + + gtk_widget_get_preferred_height (GTK_WIDGET (self->pv->internal), + &minimal, &natural); + + /* This is messy, we add a extra for the etching height */ + *minimal_height = MAX (minimal + 3, *minimal_height); + *natural_height = MAX (natural + 3, *natural_height); +} + +static void +_gcr_display_scrolled_get_preferred_width (GtkWidget *widget, gint *minimal_width, + gint *natural_width) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget); + gint minimal, natural; + + GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_width (widget, + minimal_width, + natural_width); + + minimal = 0; + natural = 0; + + gtk_widget_get_preferred_width (GTK_WIDGET (self->pv->internal), + &minimal, &natural); + + /* This is messy, we add a extra for the scrollbar width, etching */ + *minimal_width = MAX (minimal + 32, *minimal_width); + *natural_width = MAX (natural + 32, *natural_width); +} + +static void +_gcr_display_scrolled_class_init (GcrDisplayScrolledClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + widget_class->get_preferred_height = _gcr_display_scrolled_get_preferred_height; + widget_class->get_preferred_width = _gcr_display_scrolled_get_preferred_width; + + object_class->constructed = _gcr_display_scrolled_constructed; + + g_type_class_add_private (klass, sizeof (GcrDisplayScrolledPrivate)); +} + +static void +_gcr_display_scrolled_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); + gcr_viewer_add_renderer (self->pv->internal, renderer); +} + +static void +_gcr_display_scrolled_real_insert_renderer (GcrViewer *viewer, + GcrRenderer *renderer, + GcrRenderer *before) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); + gcr_viewer_insert_renderer (self->pv->internal, renderer, before); +} + +static void +_gcr_display_scrolled_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); + gcr_viewer_remove_renderer (self->pv->internal, renderer); +} + +static guint +_gcr_display_scrolled_real_count_renderers (GcrViewer *viewer) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); + return gcr_viewer_count_renderers (self->pv->internal); +} + +static GcrRenderer* +_gcr_display_scrolled_real_get_renderer (GcrViewer *viewer, guint index_) +{ + GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); + return gcr_viewer_get_renderer (self->pv->internal, index_); +} + +static void +_gcr_display_scrolled_viewer_iface (GcrViewerIface *iface) +{ + iface->add_renderer = _gcr_display_scrolled_real_add_renderer; + iface->insert_renderer = _gcr_display_scrolled_real_insert_renderer; + iface->remove_renderer = _gcr_display_scrolled_real_remove_renderer; + iface->count_renderers = _gcr_display_scrolled_real_count_renderers; + iface->get_renderer = _gcr_display_scrolled_real_get_renderer; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +GcrDisplayScrolled* +_gcr_display_scrolled_new (void) +{ + return g_object_new (GCR_TYPE_DISPLAY_SCROLLED, NULL); +} diff --git a/ui/gcr-display-scrolled.h b/ui/gcr-display-scrolled.h new file mode 100644 index 0000000..9bf9fc1 --- /dev/null +++ b/ui/gcr-display-scrolled.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_DISPLAY_SCROLLED_H__ +#define __GCR_DISPLAY_SCROLLED_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_DISPLAY_SCROLLED (_gcr_display_scrolled_get_type ()) +#define GCR_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolled)) +#define GCR_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass)) +#define GCR_IS_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_SCROLLED)) +#define GCR_IS_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_SCROLLED)) +#define GCR_DISPLAY_SCROLLED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass)) + +typedef struct _GcrDisplayScrolled GcrDisplayScrolled; +typedef struct _GcrDisplayScrolledClass GcrDisplayScrolledClass; +typedef struct _GcrDisplayScrolledPrivate GcrDisplayScrolledPrivate; + +struct _GcrDisplayScrolled { + /*< private >*/ + GtkScrolledWindow parent; + GcrDisplayScrolledPrivate *pv; +}; + +struct _GcrDisplayScrolledClass { + GtkScrolledWindowClass parent_class; +}; + +GType _gcr_display_scrolled_get_type (void); + +GcrDisplayScrolled* _gcr_display_scrolled_new (void); + +G_END_DECLS + +#endif /* __GCR_DISPLAY_SCROLLED_H__ */ diff --git a/ui/gcr-display-view.c b/ui/gcr-display-view.c new file mode 100644 index 0000000..bc97c2e --- /dev/null +++ b/ui/gcr-display-view.c @@ -0,0 +1,1261 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-display-view.h" +#include "gcr-renderer.h" +#include "gcr-viewer.h" + +#include "egg/egg-oid.h" +#include "egg/egg-hex.h" + +#include +#include + +static void _gcr_display_view_viewer_iface (GcrViewerIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrDisplayView, _gcr_display_view, GTK_TYPE_TEXT_VIEW, + G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_view_viewer_iface)); + +#define ZWSP "\342\200\213" +#define NORMAL_MARGIN 10 +#define FIELD_MARGIN 17 +#define COLUMN_MARGIN 6 +#define ICON_MARGIN 8 +#define MESSAGE_PADDING 8 + +typedef struct _GcrDisplayItem { + GcrDisplayView *display_view; + GcrRenderer *renderer; + gboolean expanded; + gboolean details; + GtkTextMark *beginning; + GtkTextMark *ending; + GtkWidget *details_widget; + GtkTextChildAnchor *area_anchor; + GtkTextTag *extra_tag; + gint field_width; + GdkPixbuf *pixbuf; + GtkTextTag *field_tag; + GtkTextTag *details_tag; + gulong data_changed_id; +} GcrDisplayItem; + +struct _GcrDisplayViewPrivate { + GtkTextBuffer *buffer; + GPtrArray *renderers; + GHashTable *items; + GtkTextTag *title_tag; + GtkTextTag *content_tag; + GtkTextTag *heading_tag; + GtkTextTag *message_tag; + GtkTextTag *monospace_tag; + GtkTextTag *area_tag; + GcrDisplayItem *current_item; + gint text_height; + GdkCursor *cursor; + + gboolean have_measurements; + gint minimal_width; + gint natural_width; + gint minimal_height; + gint natural_height; +}; + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static void +ensure_measurements (GcrDisplayView *self) +{ + PangoLayout *layout; + PangoRectangle extents; + gint icon_width; + gint icon_height; + GHashTableIter iter; + GcrDisplayItem *item; + gpointer value; + gboolean expanded; + + if (self->pv->have_measurements) + return; + + /* See if anything is expanded? */ + expanded = FALSE; + g_hash_table_iter_init (&iter, self->pv->items); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + item = value; + if (item->expanded) { + expanded = TRUE; + break; + } + } + + /* + * We use a string in our widget font as the basis for our measurements. + * These are just estimates of what we need, and what looks goodish. + * There's room here for improvement. If this is causes problems for + * you or bothers you, scratch that itch: + */ + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "0123456789"); + pango_layout_get_extents (layout, NULL, &extents); + pango_extents_to_pixels (&extents, NULL); + g_object_unref (layout); + + if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &icon_width, &icon_height)) { + icon_width = 48; + icon_height = 48; + } + + if (expanded) { + /* If expanded, display more 10 lines at least */ + self->pv->minimal_height = extents.height * 14; + self->pv->natural_height = extents.height * 25; + } else { + /* If not expanded we can get by with 9 lines */ + self->pv->minimal_height = extents.height * 8; + self->pv->natural_height = extents.height * 9; + } + + self->pv->minimal_width = icon_width + (extents.width * 5); + self->pv->natural_width = icon_width + (extents.width * 8); + self->pv->have_measurements = TRUE; +} + +static void +ensure_text_height (GcrDisplayView *self) +{ + PangoRectangle extents; + PangoLayout *layout; + + if (self->pv->text_height > 0) + return; + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "Wp"); + pango_layout_get_extents (layout, NULL, &extents); + pango_extents_to_pixels (&extents, NULL); + g_object_unref (layout); + + self->pv->text_height = extents.height; +} + +static void +recalculate_and_resize (GcrDisplayView *self) +{ + self->pv->have_measurements = FALSE; + gtk_widget_queue_resize (GTK_WIDGET (self)); +} + +static GtkTextTagTable* +create_tag_table (GcrDisplayView *self) +{ + GtkTextTagTable *tags; + gint width, height; + + g_assert (GCR_IS_DISPLAY_VIEW (self)); + + tags = gtk_text_tag_table_new (); + + if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height)) + width = 48; + + self->pv->title_tag = g_object_new (GTK_TYPE_TEXT_TAG, + "name", "title", + "scale", PANGO_SCALE_LARGE, + "right-margin", (ICON_MARGIN * 2) + width, + "pixels-below-lines", 6, + "weight", PANGO_WEIGHT_BOLD, + NULL); + gtk_text_tag_table_add (tags, self->pv->title_tag); + + self->pv->content_tag = g_object_new (GTK_TYPE_TEXT_TAG, + "name", "content", + "right-margin", (ICON_MARGIN * 2) + width, + "left-margin", FIELD_MARGIN, + "pixels-below-lines", 3, + "wrap-mode", GTK_WRAP_WORD, + NULL); + gtk_text_tag_table_add (tags, self->pv->content_tag); + + self->pv->message_tag = g_object_new (GTK_TYPE_TEXT_TAG, + "name", "message", + "right-margin", (ICON_MARGIN * 2) + width, + "rise", 3 * PANGO_SCALE, + "pixels-below-lines", 3, + "wrap-mode", GTK_WRAP_WORD, + NULL); + gtk_text_tag_table_add (tags, self->pv->message_tag); + + self->pv->heading_tag = g_object_new (GTK_TYPE_TEXT_TAG, + "name", "heading", + "pixels-above-lines", 9, + "pixels-below-lines", 3, + "weight", PANGO_WEIGHT_BOLD, + NULL); + gtk_text_tag_table_add (tags, self->pv->heading_tag); + + self->pv->monospace_tag = g_object_new (GTK_TYPE_TEXT_TAG, + "name", "monospace", + "family", "monospace", + NULL); + gtk_text_tag_table_add (tags, self->pv->monospace_tag); + + self->pv->area_tag = g_object_new (GTK_TYPE_TEXT_TAG, + "name", "area", + "justification", GTK_JUSTIFY_CENTER, + NULL); + gtk_text_tag_table_add (tags, self->pv->area_tag); + + return tags; +} + +static void +on_expander_realize (GtkWidget *widget, gpointer user_data) +{ + GdkCursor *cursor = gdk_cursor_new (GDK_ARROW); + gdk_window_set_cursor (gtk_widget_get_window (widget), cursor); + g_object_unref (cursor); +} + +static void +on_expander_expanded (GObject *object, GParamSpec *param_spec, gpointer user_data) +{ + GtkExpander *expander = GTK_EXPANDER (object); + GcrDisplayItem *item = user_data; + item->expanded = gtk_expander_get_expanded (expander); + gcr_renderer_render_view (item->renderer, GCR_VIEWER (item->display_view)); + recalculate_and_resize (item->display_view); +} + +static void +style_display_item (GtkWidget *widget, GcrDisplayItem *item) +{ + GtkStyleContext *style; + GdkRGBA color; + + style = gtk_widget_get_style_context (GTK_WIDGET (widget)); + gtk_style_context_save (style); + + gtk_style_context_add_class (style, GTK_STYLE_CLASS_VIEW); + gtk_style_context_set_state (style, GTK_STATE_FLAG_NORMAL); + gtk_style_context_get_background_color (style, + gtk_style_context_get_state (style), + &color); + + gtk_style_context_restore (style); + + color.red = 255; + color.green = 0; + color.blue = 0; + gtk_widget_override_background_color (item->details_widget, GTK_STATE_FLAG_NORMAL, &color); +} + +static GcrDisplayItem* +create_display_item (GcrDisplayView *self, GcrRenderer *renderer) +{ + GcrDisplayItem *item; + GtkTextTagTable *tags; + GtkTextIter iter; + GtkWidget *widget; + GtkWidget *label; + gchar *text; + + item = g_new0 (GcrDisplayItem, 1); + item->display_view = self; + item->renderer = renderer; + + tags = gtk_text_buffer_get_tag_table (self->pv->buffer); + + g_assert (!item->field_tag); + item->field_width = 0; + item->field_tag = g_object_new (GTK_TYPE_TEXT_TAG, + "left-margin", item->field_width + FIELD_MARGIN, + "indent", item->field_width, + "pixels-below-lines", 3, + "wrap-mode", GTK_WRAP_WORD_CHAR, + NULL); + gtk_text_tag_table_add (tags, item->field_tag); + + g_assert (!item->details_tag); + item->details_tag = g_object_new (GTK_TYPE_TEXT_TAG, NULL); + gtk_text_tag_table_add (tags, item->details_tag); + + /* + * Add two lines space that delimit this from later items. The + * item will live between the two zero width spaces. + */ + gtk_text_buffer_get_end_iter (self->pv->buffer, &iter); + gtk_text_buffer_insert (self->pv->buffer, &iter, "\n\n", -1); + if (!gtk_text_iter_backward_char (&iter)) + g_assert_not_reached (); + + /* The mark that determines the beginning of this item, with left gravity. */ + item->beginning = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, TRUE); + g_object_ref (item->beginning); + + /* The mark that determines the end of this item, with right gravity. */ + item->ending = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, FALSE); + g_object_ref (item->ending); + + widget = gtk_expander_new_with_mnemonic (""); + label = gtk_expander_get_label_widget (GTK_EXPANDER (widget)); + text = g_strdup_printf ("%s", _("_Details")); + gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), text); + g_signal_connect (widget, "notify::expanded", G_CALLBACK (on_expander_expanded), item); + g_signal_connect (widget, "realize", G_CALLBACK (on_expander_realize), NULL); + item->expanded = gtk_expander_get_expanded (GTK_EXPANDER (widget)); + g_free (text); + + gtk_widget_set_halign (widget, 0.5); + gtk_widget_set_valign (widget, 0.5); + gtk_widget_set_margin_top (widget, 6); + gtk_widget_set_margin_bottom (widget, 9); + gtk_widget_show_all (widget); + + item->details_widget = gtk_event_box_new (); + gtk_event_box_set_visible_window (GTK_EVENT_BOX (item->details_widget), FALSE); + gtk_container_add (GTK_CONTAINER (item->details_widget), widget); + g_signal_connect (item->details_widget, "realize", G_CALLBACK (on_expander_realize), NULL); + g_object_ref (item->details_widget); + + if (gtk_widget_get_realized (GTK_WIDGET (self))) + style_display_item (GTK_WIDGET (self), item); + + return item; +} + +static void +destroy_display_item (gpointer data) +{ + GcrDisplayItem *item = data; + GtkTextIter iter, end; + GtkTextTagTable *tags; + GcrDisplayView *self; + + g_assert (item); + + g_assert (GCR_IS_DISPLAY_VIEW (item->display_view)); + self = item->display_view; + + tags = gtk_text_buffer_get_tag_table (self->pv->buffer); + gtk_text_tag_table_remove (tags, item->field_tag); + gtk_text_tag_table_remove (tags, item->details_tag); + + g_object_unref (item->field_tag); + g_object_unref (item->details_tag); + + if (item->pixbuf) + g_object_unref (item->pixbuf); + item->pixbuf = NULL; + + g_assert (item->details_widget); + g_object_unref (item->details_widget); + item->details_widget = NULL; + + g_clear_object (&item->area_anchor); + + g_return_if_fail (!gtk_text_mark_get_deleted (item->beginning)); + g_return_if_fail (!gtk_text_mark_get_deleted (item->ending)); + + /* Setup iters to encompass our delemiter characters see create_display_item() */ + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning); + gtk_text_iter_backward_char (&iter); + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending); + gtk_text_iter_forward_char (&end); + gtk_text_buffer_delete (self->pv->buffer, &iter, &end); + + gtk_text_buffer_delete_mark (self->pv->buffer, item->beginning); + gtk_text_buffer_delete_mark (self->pv->buffer, item->ending); + + g_object_unref (item->beginning); + g_object_unref (item->ending); + + g_free (item); +} + +static GcrDisplayItem* +lookup_display_item (GcrDisplayView *self, GcrRenderer *renderer) +{ + GcrDisplayItem *item = g_hash_table_lookup (self->pv->items, renderer); + g_return_val_if_fail (item, NULL); + g_assert (item->display_view == self); + return item; +} + +static GcrDisplayItem* +find_item_at_iter (GcrDisplayView *self, GtkTextIter *iter) +{ + GHashTableIter hi; + GcrDisplayItem *item; + gpointer value; + GtkTextIter start, end; + + g_hash_table_iter_init (&hi, self->pv->items); + while (g_hash_table_iter_next (&hi, NULL, &value)) { + item = value; + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning); + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending); + + if (gtk_text_iter_compare (iter, &start) >= 0 && + gtk_text_iter_compare (iter, &end) < 0) + return item; + } + + return NULL; +} + +static void +on_renderer_data_changed (GcrRenderer *renderer, + gpointer user_data) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (user_data); + + /* Item may be removed, but not yet destroyed */ + if (!g_hash_table_lookup (self->pv->items, renderer)) + return; + + /* Just ask the renderer to render itself on us */ + gcr_renderer_render_view (renderer, GCR_VIEWER (self)); +} + +static void +paint_item_icon (GcrDisplayView *self, + GcrDisplayItem *item, + GdkRectangle *visible, + cairo_t *cr) +{ + GtkTextIter iter; + GdkRectangle location; + GtkTextView *view; + + if (item->pixbuf == NULL) + return; + + view = GTK_TEXT_VIEW (self); + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning); + gtk_text_view_get_iter_location (view, &iter, &location); + + location.height = gdk_pixbuf_get_height (item->pixbuf); + location.width = gdk_pixbuf_get_width (item->pixbuf); + location.x = visible->width - location.width - ICON_MARGIN; + + if (!gdk_rectangle_intersect (visible, &location, NULL)) + return; + + gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_TEXT, + location.x, location.y, + &location.x, &location.y); + + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, item->pixbuf, location.x, location.y); + cairo_rectangle (cr, location.x, location.y, location.width, location.height); + cairo_fill (cr); + cairo_restore (cr); +} + +static void +paint_item_border (GcrDisplayView *self, + GcrDisplayItem *item, + GtkStyleContext *context, + GdkRectangle *visible, + gint index, + cairo_t *cr) +{ + GdkRGBA color; + GtkTextView *view; + GtkTextIter iter, end; + GdkRectangle location; + + if (index == 0) + return; + + view = GTK_TEXT_VIEW (self); + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning); + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending); + + /* Don't paint for non-visible items */ + if (gtk_text_iter_compare (&iter, &end) == 0) + return; + + ensure_text_height (self); + + gtk_style_context_save (context); + gtk_style_context_set_state (context, GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_FOCUSED); + gtk_style_context_get_background_color (context, + gtk_style_context_get_state (context), + &color); + gtk_style_context_restore (context); + + gtk_text_view_get_iter_location (view, &iter, &location); + + location.height = 2; + location.width = visible->width - (NORMAL_MARGIN * 2); + location.x = NORMAL_MARGIN; + location.y -= self->pv->text_height / 2; + + if (!gdk_rectangle_intersect (visible, &location, NULL)) + return; + + gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_TEXT, + location.x, location.y, + &location.x, &location.y); + + cairo_save (cr); + cairo_set_source_rgb (cr, color.red, color.green, color.blue); + cairo_set_line_width (cr, 0.5); + cairo_move_to (cr, location.x, location.y); + cairo_line_to (cr, location.x + location.width, location.y); + cairo_stroke (cr); + cairo_restore (cr); +} + +static void +paint_extras (GcrDisplayView *self, cairo_t *cr) +{ + GdkRectangle visible; + GcrDisplayItem *item; + GtkStyleContext *context; + guint i; + + gtk_text_view_get_visible_rect (GTK_TEXT_VIEW (self), &visible); + context = gtk_widget_get_style_context (GTK_WIDGET (self)); + + for (i = 0; i < self->pv->renderers->len; i++) { + item = g_hash_table_lookup (self->pv->items, self->pv->renderers->pdata[i]); + g_assert (item != NULL); + paint_item_icon (self, item, &visible, cr); + paint_item_border (self, item, context, &visible, i, cr); + } +} + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static GObject* +_gcr_display_view_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + GObject *obj = G_OBJECT_CLASS (_gcr_display_view_parent_class)->constructor (type, n_props, props); + GcrDisplayView *self = NULL; + GtkTextView *view = NULL; + GtkTextTagTable *tags; + + g_return_val_if_fail (obj, NULL); + + self = GCR_DISPLAY_VIEW (obj); + view = GTK_TEXT_VIEW (obj); + + tags = create_tag_table (self); + self->pv->buffer = gtk_text_buffer_new (tags); + g_object_unref (tags); + + gtk_text_view_set_buffer (view, self->pv->buffer); + gtk_text_view_set_editable (view, FALSE); + gtk_text_view_set_left_margin (view, NORMAL_MARGIN); + gtk_text_view_set_right_margin (view, NORMAL_MARGIN); + gtk_text_view_set_cursor_visible (view, FALSE); + + return obj; +} + +static void +_gcr_display_view_init (GcrDisplayView *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewPrivate)); + self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, destroy_display_item); + self->pv->renderers = g_ptr_array_new_with_free_func (g_object_unref); +} + +static void +_gcr_display_view_dispose (GObject *obj) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (obj); + GcrRenderer *renderer; + GcrDisplayItem *item; + + while (self->pv->renderers->len) { + renderer = g_ptr_array_index (self->pv->renderers, 0); + item = g_hash_table_lookup (self->pv->items, renderer); + g_return_if_fail (item); + g_signal_handler_disconnect (renderer, item->data_changed_id); + if (!g_hash_table_remove (self->pv->items, renderer)) + g_return_if_reached (); + g_ptr_array_remove_index_fast (self->pv->renderers, 0); + } + + if (self->pv->buffer) + g_object_unref (self->pv->buffer); + self->pv->buffer = NULL; + + g_assert (g_hash_table_size (self->pv->items) == 0); + + G_OBJECT_CLASS (_gcr_display_view_parent_class)->dispose (obj); +} + +static void +_gcr_display_view_finalize (GObject *obj) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (obj); + + if (self->pv->buffer) + g_object_unref (self->pv->buffer); + self->pv->buffer = NULL; + + g_assert (g_hash_table_size (self->pv->items) == 0); + g_hash_table_destroy (self->pv->items); + self->pv->items = NULL; + + g_assert (self->pv->renderers); + g_assert (self->pv->renderers->len == 0); + g_ptr_array_free (self->pv->renderers, TRUE); + self->pv->renderers = NULL; + + g_assert (self->pv->content_tag); + g_object_unref (self->pv->content_tag); + self->pv->content_tag = NULL; + + g_assert (self->pv->heading_tag); + g_object_unref (self->pv->heading_tag); + self->pv->heading_tag = NULL; + + g_assert (self->pv->monospace_tag); + g_object_unref (self->pv->monospace_tag); + self->pv->monospace_tag = NULL; + + g_assert (self->pv->title_tag); + g_object_unref (self->pv->title_tag); + self->pv->title_tag = NULL; + + g_clear_object (&self->pv->cursor); + + G_OBJECT_CLASS (_gcr_display_view_parent_class)->finalize (obj); +} + +static void +_gcr_display_view_realize (GtkWidget *widget) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); + GHashTableIter iter; + GdkDisplay *display; + gpointer value; + + if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize) + GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize (widget); + + /* Set style on all the items */ + g_hash_table_iter_init (&iter, self->pv->items); + while (g_hash_table_iter_next (&iter, NULL, &value)) + style_display_item (widget, value); + + if (!self->pv->cursor) { + display = gtk_widget_get_display (GTK_WIDGET (self)); + self->pv->cursor = gdk_cursor_new_for_display (display, GDK_ARROW); + } + + gdk_window_set_cursor (gtk_text_view_get_window (GTK_TEXT_VIEW (self), GTK_TEXT_WINDOW_WIDGET), + self->pv->cursor); +} + +static gboolean +_gcr_display_view_button_press_event (GtkWidget *widget, GdkEventButton *event) +{ + GtkTextView *text_view = GTK_TEXT_VIEW (widget); + GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); + GcrDisplayItem *item; + gboolean handled = FALSE; + GtkTextIter iter; + gint x, y; + + if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event) + handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event ( + widget, event); + + if (event->window == gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT)) { + gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_TEXT, + event->x, event->y, &x, &y); + gtk_text_view_get_iter_at_location (text_view, &iter, x, y); + + item = find_item_at_iter (self, &iter); + self->pv->current_item = item; + } + + return handled; +} + +static gboolean +_gcr_display_view_draw (GtkWidget *widget, cairo_t *cr) +{ + GdkWindow *window; + gboolean handled = TRUE; + + /* Have GtkTextView draw the text first. */ + if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw) + handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw (widget, cr); + + window = gtk_text_view_get_window (GTK_TEXT_VIEW (widget), GTK_TEXT_WINDOW_TEXT); + if (gtk_cairo_should_draw_window (cr, window)) + paint_extras (GCR_DISPLAY_VIEW (widget), cr); + + return handled; +} + +static void +_gcr_display_get_preferred_height (GtkWidget *widget, gint *minimal_height, + gint *natural_height) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); + ensure_measurements (self); + *minimal_height = self->pv->minimal_height; + *natural_height = self->pv->natural_height; +} + +static void +_gcr_display_get_preferred_width (GtkWidget *widget, gint *minimal_width, + gint *natural_width) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); + ensure_measurements (self); + *minimal_width = self->pv->minimal_width; + *natural_width = self->pv->natural_width; +} + +static void +_gcr_display_view_populate_popup (GtkTextView *text_view, +#if GTK_CHECK_VERSION (3, 8, 0) + GtkWidget *menu +#else + GtkMenu *menu +#endif + ) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (text_view); + + if (GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup) + GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup (text_view, menu); + + /* Ask the current renderer to add menu items */ + if (self->pv->current_item) + gcr_renderer_popuplate_popup (self->pv->current_item->renderer, + GCR_VIEWER (self), GTK_MENU (menu)); +} + +static void +_gcr_display_view_class_init (GcrDisplayViewClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GtkTextViewClass *text_view_class = GTK_TEXT_VIEW_CLASS (klass); + + _gcr_display_view_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrDisplayViewPrivate)); + + gobject_class->constructor = _gcr_display_view_constructor; + gobject_class->dispose = _gcr_display_view_dispose; + gobject_class->finalize = _gcr_display_view_finalize; + + widget_class->realize = _gcr_display_view_realize; + widget_class->button_press_event = _gcr_display_view_button_press_event; + widget_class->get_preferred_height = _gcr_display_get_preferred_height; + widget_class->get_preferred_width = _gcr_display_get_preferred_width; + widget_class->draw = _gcr_display_view_draw; + + text_view_class->populate_popup = _gcr_display_view_populate_popup; +} + +static void +_gcr_display_view_real_insert_renderer (GcrViewer *viewer, + GcrRenderer *renderer, + GcrRenderer *before) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); + GcrDisplayItem *item; + guint i; + + if (before != NULL) + g_return_if_fail (g_hash_table_lookup (self->pv->items, before) != NULL); + + item = create_display_item (self, renderer); + g_object_ref (renderer); + + /* Insert it at the right place */ + if (before != NULL) { + g_ptr_array_add (self->pv->renderers, NULL); + for (i = self->pv->renderers->len; i > 0; i--) { + self->pv->renderers->pdata[i] = self->pv->renderers->pdata[i - 1]; + if (self->pv->renderers->pdata[i] == before) { + self->pv->renderers->pdata[i - 1] = renderer; + break; + } + } + + /* Must have been found */ + g_assert (i > 0); + + /* No before, just add to end */ + } else { + g_ptr_array_add (self->pv->renderers, renderer); + } + + g_hash_table_insert (self->pv->items, renderer, item); + + gcr_renderer_render_view (renderer, viewer); + item->data_changed_id = g_signal_connect (renderer, "data-changed", + G_CALLBACK (on_renderer_data_changed), self); +} + +static void +_gcr_display_view_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer) +{ + _gcr_display_view_real_insert_renderer (viewer, renderer, NULL); +} + +static void +_gcr_display_view_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); + GcrDisplayItem *item; + + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + /* Unhook the callback */ + g_signal_handler_disconnect (renderer, item->data_changed_id); + + /* Destroys the display item */ + g_assert (item->display_view == self); + g_hash_table_remove (self->pv->items, renderer); + + /* Unrefs the renderer */ + if (!g_ptr_array_remove (self->pv->renderers, renderer)) + g_return_if_reached (); +} + +static guint +_gcr_display_view_real_count_renderers (GcrViewer *viewer) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); + return self->pv->renderers->len; +} + +static GcrRenderer* +_gcr_display_view_real_get_renderer (GcrViewer *viewer, guint index_) +{ + GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); + g_return_val_if_fail (index_ < self->pv->renderers->len, NULL); + return g_ptr_array_index (self->pv->renderers, index_); +} + +static void +_gcr_display_view_viewer_iface (GcrViewerIface *iface) +{ + iface->add_renderer = (gpointer)_gcr_display_view_real_add_renderer; + iface->insert_renderer = (gpointer)_gcr_display_view_real_insert_renderer; + iface->remove_renderer = (gpointer)_gcr_display_view_real_remove_renderer; + iface->count_renderers = (gpointer)_gcr_display_view_real_count_renderers; + iface->get_renderer = (gpointer)_gcr_display_view_real_get_renderer; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +GcrDisplayView* +_gcr_display_view_new (void) +{ + return g_object_new (GCR_TYPE_DISPLAY_VIEW, NULL); +} + +void +_gcr_display_view_begin (GcrDisplayView *self, + GcrRenderer *renderer) +{ + GtkTextIter start, iter; + GcrDisplayItem *item; + GList *widgets, *l; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + /* Remove the details widget so it doesn't get destroyed */ + if (gtk_widget_get_parent (item->details_widget)) + gtk_container_remove (GTK_CONTAINER (self), item->details_widget); + + /* Remove area widgets so they don't get destroyed unnecessarily */ + if (item->area_anchor) { + g_assert (!gtk_text_child_anchor_get_deleted (item->area_anchor)); + widgets = gtk_text_child_anchor_get_widgets (item->area_anchor); + for (l = widgets; l != NULL; l = g_list_next (l)) + gtk_container_remove (GTK_CONTAINER (self), l->data); + g_list_free (widgets); + g_object_unref (item->area_anchor); + item->area_anchor = NULL; + } + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning); + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + gtk_text_buffer_delete (self->pv->buffer, &start, &iter); + + item->extra_tag = NULL; + item->field_width = 0; + item->details = FALSE; +} + +void +_gcr_display_view_end (GcrDisplayView *self, + GcrRenderer *renderer) +{ + GcrDisplayItem *item; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + item = lookup_display_item (self, renderer); + g_return_if_fail (item); +} + +void +_gcr_display_view_start_details (GcrDisplayView *self, GcrRenderer *renderer) +{ + GtkTextChildAnchor *anchor; + GcrDisplayItem *item; + GtkTextIter iter; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + if (item->details) { + g_warning ("A GcrRenderer implementation has called %s twice in one render", + G_STRFUNC); + return; + } + + item->extra_tag = item->details_tag; + item->details = TRUE; + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter); + gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), item->details_widget, anchor); + gtk_widget_show_all (item->details_widget); + gtk_text_buffer_insert (self->pv->buffer, &iter, "\n", 1); +} + +void +_gcr_display_view_append_content (GcrDisplayView *self, GcrRenderer *renderer, + const gchar *content, const gchar *details) +{ + GcrDisplayItem *item; + GtkTextIter iter; + gchar *memory = NULL; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + g_return_if_fail (content); + + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + if (item->details && !item->expanded) + return; + + if (details) + content = memory = g_strdup_printf ("%s: %s", content, details); + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, content, -1, + self->pv->content_tag, item->extra_tag, NULL); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, + item->extra_tag, NULL); + + g_free (memory); +} + +void +_gcr_display_view_append_value (GcrDisplayView *self, GcrRenderer *renderer, const gchar *field, + const gchar *value, gboolean monospace) +{ + GcrDisplayItem *item; + PangoRectangle extents; + PangoTabArray *tabs; + PangoLayout *layout; + GtkTextIter iter; + gchar *text; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + g_return_if_fail (field); + + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + if (item->details && !item->expanded) + return; + + text = g_strdup_printf ("%s:", field); + if (value == NULL) + value = ""; + + /* Measure the width of the field */ + layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), text); + pango_layout_get_extents (layout, NULL, &extents); + pango_extents_to_pixels (&extents, NULL); + g_object_unref (layout); + + /* An estimate of the text height */ + self->pv->text_height = extents.height; + + /* Make the tab wide enough to accomodate */ + if (extents.width > item->field_width) { + item->field_width = extents.width + COLUMN_MARGIN; + tabs = pango_tab_array_new (1, TRUE); + pango_tab_array_set_tab (tabs, 0, PANGO_TAB_LEFT, item->field_width); + g_object_set (item->field_tag, + "left-margin", FIELD_MARGIN, + "indent", 0 - item->field_width, + "tabs", tabs, + NULL); + pango_tab_array_free (tabs); + } + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, text, -1, + item->field_tag, item->extra_tag, NULL); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\t", 1, + item->extra_tag, NULL); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, value, -1, item->field_tag, + monospace ? self->pv->monospace_tag : item->extra_tag, + monospace ? item->extra_tag : NULL, NULL); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, + item->extra_tag, NULL); + + g_free (text); +} + +void +_gcr_display_view_append_hex (GcrDisplayView *self, GcrRenderer *renderer, + const gchar *field, gconstpointer value, gsize n_value) +{ + gchar *display; + + display = egg_hex_encode_full (value, n_value, TRUE, " ", 1); + _gcr_display_view_append_value (self, renderer, field, display, TRUE); + g_free (display); +} + +void +_gcr_display_view_append_title (GcrDisplayView *self, GcrRenderer *renderer, const gchar *title) +{ + GcrDisplayItem *item; + GtkTextIter iter; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + g_return_if_fail (title); + + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + if (item->details && !item->expanded) + return; + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, title, -1, + self->pv->title_tag, item->extra_tag, NULL); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, + item->extra_tag, NULL); +} + +void +_gcr_display_view_append_heading (GcrDisplayView *self, GcrRenderer *renderer, const gchar *heading) +{ + GcrDisplayItem *item; + GtkTextIter iter; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + g_return_if_fail (heading); + + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + if (item->details && !item->expanded) + return; + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, heading, -1, + self->pv->heading_tag, item->extra_tag, NULL); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, + item->extra_tag, NULL); +} + +void +_gcr_display_view_append_fingerprint (GcrDisplayView *self, GcrRenderer *renderer, const guchar *data, + gsize n_data, const gchar *name, GChecksumType type) +{ + GChecksum *checksum; + guint8 *buffer; + gsize n_buffer; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + + checksum = g_checksum_new (type); + g_return_if_fail (checksum); + g_checksum_update (checksum, data, n_data); + + n_buffer = g_checksum_type_get_length (type); + g_return_if_fail (n_buffer); + buffer = g_malloc0 (n_buffer); + + g_checksum_get_digest (checksum, buffer, &n_buffer); + g_checksum_free (checksum); + + _gcr_display_view_append_hex (self, renderer, name, buffer, n_buffer); + + g_free (buffer); +} + +void +_gcr_display_view_append_message (GcrDisplayView *self, + GcrRenderer *renderer, + GtkMessageType message_type, + const gchar *message) +{ + const gchar *name = NULL; + GtkWidget *image = NULL; + GcrDisplayItem *item; + GtkTextChildAnchor *anchor; + GtkTextIter iter; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + g_return_if_fail (GCR_IS_RENDERER (renderer)); + + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + switch (message_type) { + case GTK_MESSAGE_INFO: + name = "dialog-information"; + break; + + case GTK_MESSAGE_QUESTION: + name = "dialog-question"; + break; + + case GTK_MESSAGE_WARNING: + name = "dialog-warning"; + break; + + case GTK_MESSAGE_ERROR: + name = "dialog-error"; + break; + + case GTK_MESSAGE_OTHER: + break; + + default: + g_warning ("unknown GtkMessageType: %u", message_type); + break; + } + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + + if (name != NULL) { + image = gtk_image_new_from_icon_name (name, GTK_ICON_SIZE_MENU); +#if GTK_CHECK_VERSION (3, 12, 0) + gtk_widget_set_margin_start (image, MESSAGE_PADDING); + gtk_widget_set_margin_end (image, MESSAGE_PADDING); +#else + gtk_widget_set_margin_left (image, MESSAGE_PADDING); + gtk_widget_set_margin_right (image, MESSAGE_PADDING); +#endif + gtk_widget_show (image); + + anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter); + gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), image, anchor); + } + + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, message, -1, + self->pv->message_tag, item->extra_tag, NULL); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, + item->extra_tag, NULL); +} + +void +_gcr_display_view_set_icon (GcrDisplayView *self, GcrRenderer *renderer, GIcon *icon) +{ + GcrDisplayItem *item; + GdkScreen *screen; + GtkIconTheme *icon_theme; + gint width, height; + GtkIconInfo *info; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + item = lookup_display_item (self, renderer); + g_return_if_fail (item); + + if (item->pixbuf) + g_object_unref (item->pixbuf); + item->pixbuf = NULL; + + if (!icon) + return; + + screen = gtk_widget_get_screen (GTK_WIDGET (self)); + icon_theme = gtk_icon_theme_get_for_screen (screen); + + if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height)) + g_return_if_reached (); + + info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, MIN (width, height), + GTK_ICON_LOOKUP_USE_BUILTIN); + + if (info) { + GtkStyleContext *style = gtk_widget_get_style_context (GTK_WIDGET (self)); + item->pixbuf = gtk_icon_info_load_symbolic_for_context (info, style, FALSE, NULL); +#if GTK_CHECK_VERSION(3, 8, 0) + g_object_unref (info); +#else + gtk_icon_info_free (info); +#endif + } +} + +void +_gcr_display_view_add_widget_area (GcrDisplayView *self, + GcrRenderer *renderer, + GtkWidget *area) +{ + GtkTextIter iter, start; + GcrDisplayItem *item; + + g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); + g_return_if_fail (GTK_IS_WIDGET (area)); + + item = lookup_display_item (self, renderer); + g_return_if_fail (item != NULL); + g_return_if_fail (item->area_anchor == NULL); + + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->ending); + iter = start; + + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n" ZWSP, -1, self->pv->area_tag, NULL); + gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); + + item->area_anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter); + g_object_ref (item->area_anchor); + gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), area, item->area_anchor); + gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, ZWSP "\n", -1, self->pv->area_tag, NULL); +} diff --git a/ui/gcr-display-view.h b/ui/gcr-display-view.h new file mode 100644 index 0000000..415bff5 --- /dev/null +++ b/ui/gcr-display-view.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_DISPLAY_VIEW_H__ +#define __GCR_DISPLAY_VIEW_H__ + +#include +#include + +#include "gcr/gcr-certificate.h" +#include "gcr/gcr-types.h" + +#include "gcr-viewer.h" + +G_BEGIN_DECLS + +#define GCR_DISPLAY_VIEW_LINE_BREAK 0x2028 + +#define GCR_TYPE_DISPLAY_VIEW (_gcr_display_view_get_type ()) +#define GCR_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayView)) +#define GCR_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass)) +#define GCR_IS_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_VIEW)) +#define GCR_IS_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_VIEW)) +#define GCR_DISPLAY_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass)) + +typedef struct _GcrDisplayView GcrDisplayView; +typedef struct _GcrDisplayViewClass GcrDisplayViewClass; +typedef struct _GcrDisplayViewPrivate GcrDisplayViewPrivate; + +struct _GcrDisplayView { + /*< private >*/ + GtkTextView parent; + GcrDisplayViewPrivate *pv; +}; + +struct _GcrDisplayViewClass { + GtkTextViewClass parent_class; +}; + +GType _gcr_display_view_get_type (void); + +GcrDisplayView* _gcr_display_view_new (void); + +void _gcr_display_view_begin (GcrDisplayView *self, + GcrRenderer *renderer); + +void _gcr_display_view_end (GcrDisplayView *self, + GcrRenderer *renderer); + +void _gcr_display_view_append_value (GcrDisplayView *self, + GcrRenderer *renderer, + const gchar *field, + const gchar *value, + gboolean monospace); + +void _gcr_display_view_append_hex (GcrDisplayView *self, + GcrRenderer *renderer, + const gchar *field, + gconstpointer value, + gsize n_value); + +void _gcr_display_view_append_title (GcrDisplayView *self, + GcrRenderer *renderer, + const gchar *title); + +void _gcr_display_view_append_content (GcrDisplayView *self, + GcrRenderer *renderer, + const gchar *content, + const gchar *details); + +void _gcr_display_view_start_details (GcrDisplayView *self, + GcrRenderer *renderer); + +void _gcr_display_view_append_heading (GcrDisplayView *self, + GcrRenderer *renderer, + const gchar *heading); + +void _gcr_display_view_append_fingerprint (GcrDisplayView *self, + GcrRenderer *renderer, + const guchar *data, + gsize n_data, + const gchar *name, + GChecksumType type); + +void _gcr_display_view_append_message (GcrDisplayView *self, + GcrRenderer *renderer, + GtkMessageType message_type, + const gchar *message); + +void _gcr_display_view_set_icon (GcrDisplayView *self, + GcrRenderer *renderer, + GIcon *icon); + +void _gcr_display_view_add_widget_area (GcrDisplayView *self, + GcrRenderer *render, + GtkWidget *area); + +G_END_DECLS + +#endif /* __GCR_DISPLAY_VIEW_H__ */ diff --git a/ui/gcr-enum-types.h b/ui/gcr-enum-types.h new file mode 100644 index 0000000..868aba9 --- /dev/null +++ b/ui/gcr-enum-types.h @@ -0,0 +1,17 @@ + +/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ + + +#include + +G_BEGIN_DECLS + +/* enumerations from "ui/gcr-collection-model.h" */ +#ifndef GCR_TYPE_COLLECTION_MODEL_MODE +GType gcr_collection_model_mode_get_type (void) G_GNUC_CONST; +#define GCR_TYPE_COLLECTION_MODEL_MODE (gcr_collection_model_mode_get_type ()) +#endif +G_END_DECLS + +/* Generated data ends here */ + diff --git a/ui/gcr-failure-renderer.c b/ui/gcr-failure-renderer.c new file mode 100644 index 0000000..30b7ef7 --- /dev/null +++ b/ui/gcr-failure-renderer.c @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-icons.h" +#include "gcr/gcr-parser.h" + +#include "gcr-display-view.h" +#include "gcr-failure-renderer.h" +#include "gcr-secure-entry-buffer.h" + +#include +#include + +enum { + PROP_0, + PROP_LABEL, + PROP_ATTRIBUTES +}; + +struct _GcrFailureRendererPrivate { + gchar *label; + GError *error; +}; + +static void gcr_renderer_iface_init (GcrRendererIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrFailureRenderer, gcr_failure_renderer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init); +); + +static void +gcr_failure_renderer_init (GcrFailureRenderer *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_FAILURE_RENDERER, + GcrFailureRendererPrivate)); +} + +static void +gcr_failure_renderer_finalize (GObject *obj) +{ + GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj); + + g_error_free (self->pv->error); + g_free (self->pv->label); + + G_OBJECT_CLASS (gcr_failure_renderer_parent_class)->finalize (obj); +} + +static void +gcr_failure_renderer_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_free (self->pv->label); + self->pv->label = g_value_dup_string (value); + g_object_notify (obj, "label"); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + break; + case PROP_ATTRIBUTES: + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_failure_renderer_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_take_string (value, self->pv->label); + break; + case PROP_ATTRIBUTES: + g_value_set_boxed (value, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_failure_renderer_class_init (GcrFailureRendererClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GcrFailureRendererPrivate)); + + gobject_class->finalize = gcr_failure_renderer_finalize; + gobject_class->set_property = gcr_failure_renderer_set_property; + gobject_class->get_property = gcr_failure_renderer_get_property; + + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "Label", "Failure Label", + "", G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "Renderer attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); +} + +static void +gcr_failure_renderer_render (GcrRenderer *renderer, + GcrViewer *viewer) +{ + GcrFailureRenderer *self = GCR_FAILURE_RENDERER (renderer); + GcrDisplayView *view; + gchar *display; + GIcon *icon; + + if (GCR_IS_DISPLAY_VIEW (viewer)) { + view = GCR_DISPLAY_VIEW (viewer); + + } else { + g_warning ("GcrFailureRenderer only works with internal specific " + "GcrViewer returned by gcr_viewer_new()."); + return; + } + + _gcr_display_view_begin (view, renderer); + + if (g_error_matches (self->pv->error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED)) + icon = g_themed_icon_new ("dialog-warning"); + else + icon = g_themed_icon_new ("dialog-error"); + _gcr_display_view_set_icon (view, renderer, icon); + g_object_unref (icon); + + _gcr_display_view_append_title (view, renderer, self->pv->label); + + if (self->pv->label) + display = g_strdup_printf (_("Could not display “%s”"), self->pv->label); + else + display = g_strdup (_("Could not display file")); + _gcr_display_view_append_content (view, renderer, display, NULL); + g_free (display); + + if (self->pv->error->message) + _gcr_display_view_append_value (view, renderer, _("Reason"), + self->pv->error->message, FALSE); + + _gcr_display_view_end (view, renderer); +} + +static void +gcr_renderer_iface_init (GcrRendererIface *iface) +{ + iface->render_view = gcr_failure_renderer_render; +} + +/** + * gcr_failure_renderer_new: + * @label: (allow-none): the label for the failure + * @error: the error to display + * + * Create a new renderer for an error. + * + * Returns: (transfer full) (type GcrUi.FailureRenderer): the new renderer + */ +GcrRenderer * +gcr_failure_renderer_new (const gchar *label, + GError *error) +{ + GcrFailureRenderer *renderer; + + renderer = g_object_new (GCR_TYPE_FAILURE_RENDERER, + "label", label, + NULL); + + renderer->pv->error = g_error_copy (error); + return GCR_RENDERER (renderer); +} + +/** + * gcr_failure_renderer_new_unsupported: + * @label: the label for the failure + * + * Create a new renderer for unsupported data. + * + * Returns: (transfer full): the new renderer + */ +GcrRenderer * +gcr_failure_renderer_new_unsupported (const gchar *label) +{ + GcrRenderer *renderer; + GError *error; + + error = g_error_new (GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED, + _("Cannot display a file of this type.")); + + renderer = gcr_failure_renderer_new (label, error); + + g_error_free (error); + return renderer; +} diff --git a/ui/gcr-failure-renderer.h b/ui/gcr-failure-renderer.h new file mode 100644 index 0000000..a7972d2 --- /dev/null +++ b/ui/gcr-failure-renderer.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_FAILURE_RENDERER_H__ +#define __GCR_FAILURE_RENDERER_H__ + +#include +#include + +#include "gcr-renderer.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_FAILURE_RENDERER (gcr_failure_renderer_get_type ()) +#define GCR_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRenderer)) +#define GCR_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass)) +#define GCR_IS_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_FAILURE_RENDERER)) +#define GCR_IS_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_FAILURE_RENDERER)) +#define GCR_FAILURE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass)) + +typedef struct _GcrFailureRenderer GcrFailureRenderer; +typedef struct _GcrFailureRendererClass GcrFailureRendererClass; +typedef struct _GcrFailureRendererPrivate GcrFailureRendererPrivate; + +struct _GcrFailureRenderer { + /*< private >*/ + GObject parent; + GcrFailureRendererPrivate *pv; +}; + +struct _GcrFailureRendererClass { + /*< private >*/ + GObjectClass parent_class; +}; + +GType gcr_failure_renderer_get_type (void); + +GcrRenderer * gcr_failure_renderer_new (const gchar *label, + GError *error); + +GcrRenderer * gcr_failure_renderer_new_unsupported (const gchar *label); + +G_END_DECLS + +#endif /* __GCR_FAILURE_RENDERER_H__ */ diff --git a/ui/gcr-gnupg-renderer.c b/ui/gcr-gnupg-renderer.c new file mode 100644 index 0000000..31559b1 --- /dev/null +++ b/ui/gcr-gnupg-renderer.c @@ -0,0 +1,850 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr-icons.h" +#include "gcr/gcr-gnupg-records.h" +#include "gcr/gcr-openpgp.h" +#include "gcr/gcr-simple-certificate.h" +#include "gcr/gcr-types.h" + +#include "gcr-display-view.h" +#include "gcr-gnupg-renderer.h" +#include "gcr-renderer.h" + +#include "gck/gck.h" + +#include "egg/egg-hex.h" + +#include +#include + +#include + +enum { + PROP_0, + PROP_RECORDS, + PROP_LABEL, + PROP_ATTRIBUTES +}; + +struct _GcrGnupgRendererPrivate { + GPtrArray *records; + GckAttributes *attrs; + gchar *label; +}; + +static void _gcr_gnupg_renderer_iface_init (GcrRendererIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrGnupgRenderer, _gcr_gnupg_renderer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_gnupg_renderer_iface_init); +); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static gchar * +calculate_label (GcrGnupgRenderer *self) +{ + gchar *userid; + gchar *label = NULL; + + if (self->pv->attrs) { + if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label)) + return label; + } + + userid = _gcr_gnupg_records_get_user_id (self->pv->records); + if (userid != NULL) { + if (!_gcr_gnupg_records_parse_user_id (userid, &label, NULL, NULL)) + label = NULL; + } + + if (label != NULL) + return label; + + if (self->pv->label) + return g_strdup (self->pv->label); + + return g_strdup (_("PGP Key")); +} + +static void +_gcr_gnupg_renderer_init (GcrGnupgRenderer *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_GNUPG_RENDERER, + GcrGnupgRendererPrivate)); +} + +static void +_gcr_gnupg_renderer_finalize (GObject *obj) +{ + GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj); + + gck_attributes_unref (self->pv->attrs); + g_free (self->pv->label); + if (self->pv->records) + g_ptr_array_unref (self->pv->records); + + G_OBJECT_CLASS (_gcr_gnupg_renderer_parent_class)->finalize (obj); +} + +static void +_gcr_gnupg_renderer_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj); + + switch (prop_id) { + case PROP_RECORDS: + _gcr_gnupg_renderer_set_records (self, g_value_get_boxed (value)); + break; + case PROP_LABEL: + g_free (self->pv->label); + self->pv->label = g_value_dup_string (value); + g_object_notify (obj, "label"); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + break; + case PROP_ATTRIBUTES: + _gcr_gnupg_renderer_set_attributes (self, g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_renderer_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj); + + switch (prop_id) { + case PROP_RECORDS: + g_value_set_object (value, self->pv->records); + break; + case PROP_LABEL: + g_value_take_string (value, calculate_label (self)); + break; + case PROP_ATTRIBUTES: + g_value_set_boxed (value, self->pv->attrs); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_gnupg_renderer_class_init (GcrGnupgRendererClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GckBuilder builder = GCK_BUILDER_INIT; + + _gcr_gnupg_renderer_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrGnupgRendererPrivate)); + + gobject_class->finalize = _gcr_gnupg_renderer_finalize; + gobject_class->set_property = _gcr_gnupg_renderer_set_property; + gobject_class->get_property = _gcr_gnupg_renderer_get_property; + + g_object_class_install_property (gobject_class, PROP_RECORDS, + g_param_spec_boxed ("records", "Records", "Gnupg records to display", + G_TYPE_PTR_ARRAY, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "Label", "Certificate Label", + "", G_PARAM_READWRITE)); + + /* Register this as a renderer which can be loaded */ + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_GNUPG_RECORDS); + gcr_renderer_register (GCR_TYPE_GNUPG_RENDERER, gck_builder_end (&builder)); +} + +static const gchar * +name_for_algo (guint algo) +{ + switch (algo) + { + case GCR_OPENPGP_ALGO_RSA: + case GCR_OPENPGP_ALGO_RSA_E: + case GCR_OPENPGP_ALGO_RSA_S: + return _("RSA"); + case GCR_OPENPGP_ALGO_ELG_E: + return _("Elgamal"); + case GCR_OPENPGP_ALGO_DSA: + return _("DSA"); + default: + return NULL; + } +} + +static const gchar * +capability_for_code (gchar code) +{ + switch (code) { + case 'e': case 'E': + return _("Encrypt"); + case 's': case 'S': + return _("Sign"); + case 'c': case 'C': + return _("Certify"); + case 'a': case 'A': + return _("Authenticate"); + case 'D': + return C_("capability", "Disabled"); + default: + return NULL; + } +} + +static gchar * +capabilities_for_codes (const gchar *codes) +{ + const gchar *cap; + GString *result; + guint i; + + result = g_string_new (""); + for (i = 0; codes[i] != 0; i++) { + if (result->len) + g_string_append_unichar (result, GCR_DISPLAY_VIEW_LINE_BREAK); + cap = capability_for_code (codes[i]); + if (cap != NULL) + g_string_append (result, cap); + else + g_string_append_c (result, codes[i]); + } + return g_string_free (result, FALSE); +} + +static const gchar * +status_for_code (gchar code) +{ + switch (code) { + case 'o': + return _("Unknown"); + case 'i': + return _("Invalid"); + case 'd': + return C_("ownertrust", "Disabled"); + case 'r': + return _("Revoked"); + case 'e': + return _("Expired"); + case 'q': case '-': + return _("Undefined trust"); + case 'n': + return _("Distrusted"); + case 'm': + return _("Marginally trusted"); + case 'f': + return _("Fully trusted"); + case 'u': + return _("Ultimately trusted"); + default: + return NULL; + } +} + +static const gchar * +message_for_code (gchar code, + GtkMessageType *message_type) +{ + *message_type = GTK_MESSAGE_OTHER; + switch (code) { + case 'o': + *message_type = GTK_MESSAGE_QUESTION; + return _("The information in this key has not yet been verified"); + case 'i': + *message_type = GTK_MESSAGE_ERROR; + return _("This key is invalid"); + case 'd': + *message_type = GTK_MESSAGE_WARNING; + return _("This key has been disabled"); + case 'r': + *message_type = GTK_MESSAGE_ERROR; + return _("This key has been revoked"); + case 'e': + *message_type = GTK_MESSAGE_ERROR; + return _("This key has expired"); + case 'q': case '-': + return NULL; + case 'n': + *message_type = GTK_MESSAGE_WARNING; + return _("This key is distrusted"); + case 'm': + *message_type = GTK_MESSAGE_OTHER; + return _("This key is marginally trusted"); + case 'f': + *message_type = GTK_MESSAGE_OTHER; + return _("This key is fully trusted"); + case 'u': + *message_type = GTK_MESSAGE_OTHER; + return _("This key is ultimately trusted"); + default: + return NULL; + } +} + +static void +append_key_record (GcrGnupgRenderer *self, + GcrDisplayView *view, + GcrRecord *record, + const gchar *title) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + const gchar *value; + gchar *display; + GDateTime *date; + gchar code; + guint algo; + guint bits; + + _gcr_display_view_append_heading (view, renderer, title); + + /* Key ID */ + value = _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID); + if (value != NULL) + _gcr_display_view_append_value (view, renderer, _("Key ID"), value, TRUE); + + /* Algorithm */ + if (_gcr_record_get_uint (record, GCR_RECORD_KEY_ALGO, &algo)) { + display = NULL; + value = name_for_algo (algo); + if (value == NULL) + value = display = g_strdup_printf ("%u", algo); + _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE); + g_free (display); + } + + /* Key Size */ + if (_gcr_record_get_uint (record, GCR_RECORD_KEY_BITS, &bits)) { + display = g_strdup_printf ("%u", bits); + _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE); + g_free (display); + } + + /* Created */ + date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP); + if (date != NULL) { + display = g_date_time_format (date, "%x"); + _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE); + g_free (display); + g_date_time_unref (date); + } + + /* Expiry */ + date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY); + if (date != NULL) { + display = g_date_time_format (date, "%x"); + _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE); + g_free (display); + g_date_time_unref (date); + } + + /* Capabilities */ + value = _gcr_record_get_raw (record, GCR_RECORD_PUB_CAPS); + if (value != NULL && value[0] != '\0') { + display = capabilities_for_codes (value); + _gcr_display_view_append_value (view, renderer, _("Capabilities"), display, FALSE); + g_free (display); + } + + /* Owner Trust */ + code = _gcr_record_get_char (record, GCR_RECORD_KEY_OWNERTRUST); + if (code != 0) { + display = NULL; + value = status_for_code (code); + if (value == NULL) { + value = display = g_new0 (gchar, 2); + display[0] = code; + } + _gcr_display_view_append_value (view, renderer, _("Owner trust"), value, FALSE); + g_free (display); + } +} + +static void +append_uid_record (GcrGnupgRenderer *self, + GcrDisplayView *view, + GcrRecord *record) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + gchar *userid; + gchar *name; + gchar *comment; + gchar *email; + GDateTime *date; + gchar *display; + + _gcr_display_view_append_heading (view, renderer, _("User ID")); + + userid = _gcr_record_get_string (record, GCR_RECORD_UID_USERID); + if (userid == NULL) { + _gcr_display_view_append_value (view, renderer, _("Value"), _("Unknown"), FALSE); + return; + } + + if (_gcr_gnupg_records_parse_user_id (userid, &name, &email, &comment)) { + if (name != NULL) + _gcr_display_view_append_value (view, renderer, _("Name"), name, FALSE); + g_free (name); + if (email != NULL) + _gcr_display_view_append_value (view, renderer, _("Email"), email, FALSE); + g_free (email); + if (comment != NULL) + _gcr_display_view_append_value (view, renderer, _("Comment"), comment, FALSE); + g_free (comment); + + /* Unparseable user id */ + } else { + _gcr_display_view_append_value (view, renderer, _("Value"), userid, FALSE); + } + + /* Created */ + date = _gcr_record_get_date (record, GCR_RECORD_UID_TIMESTAMP); + if (date != NULL) { + display = g_date_time_format (date, "%x"); + _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE); + g_free (display); + g_date_time_unref (date); + } + + /* Expiry */ + date = _gcr_record_get_date (record, GCR_RECORD_UID_EXPIRY); + if (date != NULL) { + display = g_date_time_format (date, "%x"); + _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE); + g_free (display); + g_date_time_unref (date); + } + + g_free (userid); +} + +static void +append_uat_record (GcrGnupgRenderer *self, + GcrDisplayView *view, + GcrRecord *record) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + gchar **parts; + gchar *display; + const gchar *value; + GDateTime *date; + + _gcr_display_view_append_heading (view, renderer, _("User Attribute")); + + /* Size */ + value = _gcr_record_get_raw (record, GCR_RECORD_UAT_COUNT_SIZE); + if (value != NULL) { + parts = g_strsplit (value, " ", 2); + if (parts && parts[0] && parts[1]) + _gcr_display_view_append_value (view, renderer, _("Size"), parts[1], FALSE); + g_strfreev (parts); + } + + /* Created */ + date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP); + if (date != NULL) { + display = g_date_time_format (date, "%x"); + _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE); + g_free (display); + g_date_time_unref (date); + } + + /* Expiry */ + date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY); + if (date != NULL) { + display = g_date_time_format (date, "%x"); + _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE); + g_free (display); + g_date_time_unref (date); + } +} + +static const gchar * +signature_klass_string (const gchar *klass) +{ + char *end; + guint val; + + val = strtoul (klass, &end, 16); + if (end != klass + 2) + return NULL; + + switch (val) { + case 0x00: + return _("Signature of a binary document"); + case 0x01: + return _("Signature of a canonical text document"); + case 0x02: + return _("Standalone signature"); + case 0x10: + return _("Generic certification of key"); + case 0x11: + return _("Persona certification of key"); + case 0x12: + return _("Casual certification of key"); + case 0x13: + return _("Positive certification of key"); + case 0x18: + return _("Subkey binding signature"); + case 0x19: + return _("Primary key binding signature"); + case 0x1F: + return _("Signature directly on key"); + case 0x20: + return _("Key revocation signature"); + case 0x28: + return _("Subkey revocation signature"); + case 0x30: + return _("Certification revocation signature"); + case 0x40: + return _("Timestamp signature"); + case 0x50: + return _("Third-party confirmation signature"); + default: + return NULL; + } +} + +static void +append_sig_record (GcrGnupgRenderer *self, + GcrDisplayView *view, + GcrRecord *record, + const gchar *keyid) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + const gchar *sigid; + gchar *display; + const gchar *value; + const gchar *klass; + guint algo; + + /* Hide self-signatures. There's so many of them */ + sigid = _gcr_record_get_raw (record, GCR_RECORD_SIG_KEYID); + if (sigid && keyid && g_str_equal (sigid, keyid)) + return; + + _gcr_display_view_append_heading (view, renderer, _("Signature")); + + /* Key ID */ + if (sigid != NULL) + _gcr_display_view_append_value (view, renderer, _("Key ID"), sigid, TRUE); + + /* Algorithm */ + if (_gcr_record_get_uint (record, GCR_RECORD_SIG_ALGO, &algo)) { + display = NULL; + value = name_for_algo (algo); + if (value == NULL) + value = display = g_strdup_printf ("%u", algo); + _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE); + g_free (display); + } + + /* User ID */ + display = _gcr_record_get_string (record, GCR_RECORD_SIG_USERID); + if (display != NULL) + _gcr_display_view_append_value (view, renderer, _("User ID"), display, FALSE); + g_free (display); + + /* Signature class */ + klass = _gcr_record_get_raw (record, GCR_RECORD_SIG_CLASS); + if (klass != NULL) { + value = NULL; + if (strlen (klass) >= 2) { + value = signature_klass_string (klass); + if (value != NULL) { + _gcr_display_view_append_value (view, renderer, _("Class"), value, FALSE); + if (klass[2] == 'l') + _gcr_display_view_append_value (view, renderer, _("Type"), _("Local only"), FALSE); + else if (klass[2] == 'x') + _gcr_display_view_append_value (view, renderer, _("Type"), _("Exportable"), FALSE); + } + } + if (value == NULL) + _gcr_display_view_append_value (view, renderer, _("Class"), klass, FALSE); + } +} + +static void +append_rvk_record (GcrGnupgRenderer *self, + GcrDisplayView *view, + GcrRecord *record) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + const gchar *value; + gchar *display; + guint algo; + + _gcr_display_view_append_heading (view, renderer, _("Revocation Key")); + + /* Algorithm */ + if (_gcr_record_get_uint (record, GCR_RECORD_RVK_ALGO, &algo)) { + display = NULL; + value = name_for_algo (algo); + if (value == NULL) + value = display = g_strdup_printf ("%u", algo); + _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE); + g_free (display); + } + + value = _gcr_record_get_raw (record, GCR_RECORD_RVK_FINGERPRINT); + if (value != NULL) + _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE); +} + +static void +append_fpr_record (GcrGnupgRenderer *self, + GcrDisplayView *view, + GcrRecord *record, + GQuark last_schema) +{ + GcrRenderer *renderer = GCR_RENDERER (self); + const gchar *value; + gpointer raw; + gsize n_raw; + + if (last_schema != GCR_RECORD_SCHEMA_PUB && + last_schema != GCR_RECORD_SCHEMA_SUB && + last_schema != GCR_RECORD_SCHEMA_SEC && + last_schema != GCR_RECORD_SCHEMA_SSB) + return; + + value = _gcr_record_get_raw (record, GCR_RECORD_FPR_FINGERPRINT); + if (value != NULL) { + raw = egg_hex_decode (value, -1, &n_raw); + if (raw != NULL) + _gcr_display_view_append_hex (view, renderer, _("Fingerprint"), raw, n_raw); + else + _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE); + g_free (raw); + } +} + +static void +_gcr_gnupg_renderer_render (GcrRenderer *renderer, + GcrViewer *viewer) +{ + GtkMessageType message_type; + GcrGnupgRenderer *self; + GcrDisplayView *view; + GDateTime *date; + const gchar *value; + gchar *display; + gchar *userid; + gchar *email; + gchar *comment; + GIcon *icon; + GQuark schema; + GQuark last_schema; + gchar code; + guint i; + + self = GCR_GNUPG_RENDERER (renderer); + + if (GCR_IS_DISPLAY_VIEW (viewer)) { + view = GCR_DISPLAY_VIEW (viewer); + + } else { + g_warning ("GcrGnupgRenderer only works with internal specific " + "GcrViewer returned by gcr_viewer_new()."); + return; + } + + _gcr_display_view_begin (view, renderer); + + if (self->pv->records == NULL || self->pv->records->len == 0) { + _gcr_display_view_end (view, renderer); + return; + } + + icon = _gcr_gnupg_records_get_icon (self->pv->records); + _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon); + g_object_unref (icon); + + display = calculate_label (self); + _gcr_display_view_append_title (view, renderer, display); + g_free (display); + + userid = _gcr_gnupg_records_get_user_id (self->pv->records); + if (userid != NULL) { + if (_gcr_gnupg_records_parse_user_id (userid, NULL, &email, &comment)) { + if (email != NULL) + _gcr_display_view_append_content (view, renderer, _("Email"), email); + g_free (email); + if (comment != NULL) + _gcr_display_view_append_content (view, renderer, _("Comment"), comment); + g_free (comment); + } + g_free (userid); + } + + code = _gcr_record_get_char (self->pv->records->pdata[0], GCR_RECORD_TRUST); + if (code != 'e') { + date = _gcr_record_get_date (self->pv->records->pdata[0], GCR_RECORD_KEY_EXPIRY); + if (date != NULL) { + display = g_date_time_format (date, "%x"); + _gcr_display_view_append_content (view, renderer, _("Expires"), display); + g_date_time_unref (date); + g_free (display); + } + } + + /* The warning or status */ + value = message_for_code (code, &message_type); + if (value != NULL) + _gcr_display_view_append_message (view, renderer, message_type, value); + + _gcr_display_view_start_details (view, renderer); + + value = _gcr_gnupg_records_get_keyid (self->pv->records); + last_schema = 0; + + for (i = 0; i < self->pv->records->len; i++) { + schema = _gcr_record_get_schema (self->pv->records->pdata[i]); + if (schema == GCR_RECORD_SCHEMA_PUB) + append_key_record (self, view, self->pv->records->pdata[i], _("Public Key")); + else if (schema == GCR_RECORD_SCHEMA_SUB) + append_key_record (self, view, self->pv->records->pdata[i], _("Public Subkey")); + else if (schema == GCR_RECORD_SCHEMA_SEC) + append_key_record (self, view, self->pv->records->pdata[i], _("Secret Key")); + else if (schema == GCR_RECORD_SCHEMA_SSB) + append_key_record (self, view, self->pv->records->pdata[i], _("Secret Subkey")); + else if (schema == GCR_RECORD_SCHEMA_UID) + append_uid_record (self, view, self->pv->records->pdata[i]); + else if (schema == GCR_RECORD_SCHEMA_UAT) + append_uat_record (self, view, self->pv->records->pdata[i]); + else if (schema == GCR_RECORD_SCHEMA_SIG) + append_sig_record (self, view, self->pv->records->pdata[i], value); + else if (schema == GCR_RECORD_SCHEMA_RVK) + append_rvk_record (self, view, self->pv->records->pdata[i]); + else if (schema == GCR_RECORD_SCHEMA_FPR) + append_fpr_record (self, view, self->pv->records->pdata[i], last_schema); + last_schema = schema; + } + + _gcr_display_view_end (view, renderer); +} + +static void +_gcr_gnupg_renderer_iface_init (GcrRendererIface *iface) +{ + iface->render_view = _gcr_gnupg_renderer_render; +} + +GcrGnupgRenderer * +_gcr_gnupg_renderer_new (GPtrArray *records) +{ + g_return_val_if_fail (records != NULL, NULL); + + return g_object_new (GCR_TYPE_GNUPG_RENDERER, + "records", records, + NULL); +} + +GcrGnupgRenderer * +_gcr_gnupg_renderer_new_for_attributes (const gchar *label, + GckAttributes *attrs) +{ + g_return_val_if_fail (attrs != NULL, NULL); + + return g_object_new (GCR_TYPE_GNUPG_RENDERER, + "label", label, + "attributes", attrs, + NULL); +} + +GPtrArray * +_gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self) +{ + g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL); + return self->pv->records; +} + +void +_gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self, + GPtrArray *records) +{ + g_return_if_fail (GCR_IS_GNUPG_RENDERER (self)); + + if (records) + g_ptr_array_ref (records); + if (self->pv->records) + g_ptr_array_unref (self->pv->records); + self->pv->records = records; + + if (self->pv->attrs) { + gck_attributes_unref (self->pv->attrs); + self->pv->attrs = NULL; + g_object_notify (G_OBJECT (self), "attributes"); + } + + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + g_object_notify (G_OBJECT (self), "records"); +} + +GckAttributes* +_gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self) +{ + g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL); + return self->pv->attrs; +} + +void +_gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self, + GckAttributes *attrs) +{ + const GckAttribute *attr; + GPtrArray *records; + + g_return_if_fail (GCR_IS_GNUPG_RENDERER (self)); + + attr = gck_attributes_find (attrs, CKA_VALUE); + g_return_if_fail (attr != NULL); + records = _gcr_records_parse_colons (attr->value, attr->length); + g_return_if_fail (records != NULL); + + if (attrs) + gck_attributes_ref (attrs); + gck_attributes_unref (self->pv->attrs); + self->pv->attrs = attrs; + + if (self->pv->records) + g_ptr_array_unref (self->pv->records); + self->pv->records = records; + g_object_notify (G_OBJECT (self), "records"); + + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + g_object_notify (G_OBJECT (self), "attributes"); + +} diff --git a/ui/gcr-gnupg-renderer.h b/ui/gcr-gnupg-renderer.h new file mode 100644 index 0000000..f009a58 --- /dev/null +++ b/ui/gcr-gnupg-renderer.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GCR_GNUPG_RENDERER_H__ +#define __GCR_GNUPG_RENDERER_H__ + +#include +#include + +#include "gcr/gcr-record.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_GNUPG_RENDERER (_gcr_gnupg_renderer_get_type ()) +#define GCR_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRenderer)) +#define GCR_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass)) +#define GCR_IS_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_RENDERER)) +#define GCR_IS_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_RENDERER)) +#define GCR_GNUPG_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass)) + +typedef struct _GcrGnupgRenderer GcrGnupgRenderer; +typedef struct _GcrGnupgRendererClass GcrGnupgRendererClass; +typedef struct _GcrGnupgRendererPrivate GcrGnupgRendererPrivate; + +struct _GcrGnupgRenderer { + GObject parent; + + /*< private >*/ + GcrGnupgRendererPrivate *pv; +}; + +struct _GcrGnupgRendererClass { + GObjectClass parent_class; +}; + +GType _gcr_gnupg_renderer_get_type (void); + +GcrGnupgRenderer * _gcr_gnupg_renderer_new (GPtrArray *records); + +GcrGnupgRenderer * _gcr_gnupg_renderer_new_for_attributes (const gchar *label, + GckAttributes *attrs); + +GPtrArray * _gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self); + +void _gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self, + GPtrArray *records); + +GckAttributes * _gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self); + +void _gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self, + GckAttributes *attrs); + +G_END_DECLS + +#endif /* __GCR_GNUPG_RENDERER_H__ */ diff --git a/ui/gcr-import-button.c b/ui/gcr-import-button.c new file mode 100644 index 0000000..33cc443 --- /dev/null +++ b/ui/gcr-import-button.c @@ -0,0 +1,582 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr-internal.h" +#include "gcr/gcr-library.h" +#include "gcr/gcr-marshal.h" +#include "gcr/gcr-parser.h" +#include "gcr/gcr-version.h" + +#include "eggimagemenuitem.h" +#include "gcr-import-button.h" +#include "gcr-pkcs11-import-interaction.h" + +#include + +enum { + PROP_0, + PROP_LABEL +}; + +/** + * SECTION:gcr-import-button + * @title: GcrImportButton + * @short_description: Button which imports parsed certificates and keys + * + * A button which imports keys and certificates. Shows a spinner when the + * button is activated. When more than one importer is available shows + * a drop down to select which to import to. + */ + +/** + * GcrImportButton: + * + * Button which imports parsed certificates and keys. + */ + +/** + * GcrImportButtonClass: + * @parent_class: The parent class + * @importing: Emitted when the import begins. + * @imported: Emitted when the import completes, or fails. + * + * Class for #GcrImportButton. + */ + +struct _GcrImportButtonPrivate { + GList *queued; + GList *importers; + gboolean ready; + gboolean created; + gboolean importing; + gchar *imported; + GtkWidget *spinner; + GtkWidget *arrow; + GtkWidget *label; + GCancellable *cancellable; + GtkMenu *menu; +}; + +enum { + IMPORTING, + IMPORTED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +static GQuark QUARK_IMPORTER = 0; + +#if GCR_CHECK_VERSION(4,0,0) +#error Port this class to derive from GtkMenuButton during 4.x ABI bump +#endif + +G_DEFINE_TYPE (GcrImportButton, gcr_import_button, GTK_TYPE_BUTTON); + +static void +gcr_import_button_init (GcrImportButton *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_IMPORT_BUTTON, GcrImportButtonPrivate); + self->pv->cancellable = g_cancellable_new (); + self->pv->label = gtk_label_new (""); +} + +static void +update_import_button (GcrImportButton *self) +{ + gchar *message; + gchar *label; + + /* Initializing, set a spinner */ + if (self->pv->queued && !self->pv->ready) { + gtk_widget_show (self->pv->spinner); + gtk_spinner_start (GTK_SPINNER (self->pv->spinner)); + gtk_widget_hide (self->pv->arrow); + gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Initializing\xE2\x80\xA6")); + + /* Importing, set a spinner */ + } else if (self->pv->importing) { + gtk_widget_show (self->pv->spinner); + gtk_spinner_start (GTK_SPINNER (self->pv->spinner)); + gtk_widget_hide (self->pv->arrow); + gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Import is in progress\xE2\x80\xA6")); + + } else if (self->pv->imported) { + gtk_widget_hide (self->pv->spinner); + gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); + gtk_widget_hide (self->pv->arrow); + gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); + message = g_strdup_printf (_("Imported to: %s"), self->pv->imported); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), message); + g_free (message); + + /* Not importing, but have importers */ + } else if (self->pv->importers) { + + gtk_widget_hide (self->pv->spinner); + gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); + gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE); + + /* More than one importer */ + if (self->pv->importers->next) { + gtk_widget_show (self->pv->arrow); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), NULL); + + /* Only one importer */ + } else { + gtk_widget_hide (self->pv->arrow); + g_object_get (self->pv->importers->data, "label", &label, NULL); + message = g_strdup_printf (_("Import to: %s"), label); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), message); + g_free (message); + g_free (label); + } + + /* No importers, none compatible */ + } else if (self->pv->created) { + gtk_widget_hide (self->pv->spinner); + gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); + gtk_widget_hide (self->pv->arrow); + + gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Cannot import because there are no compatible importers")); + + /* No importers yet added */ + } else { + gtk_widget_hide (self->pv->spinner); + gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); + gtk_widget_hide (self->pv->arrow); + + gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("No data to import")); + } +} + +static void +on_library_pkcs11_ready (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); + GList *queued, *l; + + self->pv->ready = TRUE; + + /* Process the parsed items that have been seen */ + queued = self->pv->queued; + self->pv->queued = NULL; + for (l = queued; l != NULL; l = g_list_next (l)) + gcr_import_button_add_parsed (self, l->data); + g_assert (self->pv->queued == NULL); + g_list_free_full (queued, gcr_parsed_unref); +} + +static void +gcr_import_button_constructed (GObject *obj) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (obj); + GtkWidget *grid; + + G_OBJECT_CLASS (gcr_import_button_parent_class)->constructed (obj); + + self->pv->spinner = gtk_spinner_new (); + self->pv->arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); + grid = gtk_grid_new (); + + gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_HORIZONTAL); + gtk_container_add (GTK_CONTAINER (grid), self->pv->spinner); + gtk_container_add (GTK_CONTAINER (grid), self->pv->label); + gtk_container_add (GTK_CONTAINER (grid), self->pv->arrow); + gtk_grid_set_row_spacing (GTK_GRID (grid), 3); + gtk_widget_set_hexpand (grid, TRUE); + gtk_widget_set_halign (grid, GTK_ALIGN_CENTER); + + gtk_widget_show (self->pv->label); + gtk_widget_show (grid); + + gtk_container_add (GTK_CONTAINER (self), grid); + + update_import_button (self); + + gcr_pkcs11_initialize_async (NULL, on_library_pkcs11_ready, g_object_ref (self)); +} + +static void +gcr_import_button_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (obj); + + switch (prop_id) { + case PROP_LABEL: + gtk_label_set_label (GTK_LABEL (self->pv->label), g_value_get_string (value)); + g_object_notify (obj, "label"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_import_button_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->pv->label))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_import_button_dispose (GObject *obj) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (obj); + + gck_list_unref_free (self->pv->importers); + self->pv->importers = NULL; + g_cancellable_cancel (self->pv->cancellable); + g_clear_object (&self->pv->menu); + + g_list_free_full (self->pv->queued, gcr_parsed_unref); + self->pv->queued = NULL; + + G_OBJECT_CLASS (gcr_import_button_parent_class)->dispose (obj); +} + +static void +gcr_import_button_finalize (GObject *obj) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (obj); + + g_object_unref (self->pv->cancellable); + + G_OBJECT_CLASS (gcr_import_button_parent_class)->finalize (obj); +} + +static void +on_import_complete (GObject *importer, + GAsyncResult *result, + gpointer user_data) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); + GError *error = NULL; + + g_return_if_fail (self->pv->imported == NULL); + + self->pv->importing = FALSE; + + gcr_importer_import_finish (GCR_IMPORTER (importer), result, &error); + if (error == NULL) { + g_object_get (importer, "label", &self->pv->imported, NULL); + gck_list_unref_free (self->pv->importers); + self->pv->importers = NULL; + } + + g_signal_emit (self, signals[IMPORTED], 0, importer, error); + g_clear_error (&error); + + update_import_button (self); +} + +static void +begin_import (GcrImportButton *self, + GcrImporter *importer) +{ + GTlsInteraction *interaction; + GtkWindow *window; + + g_return_if_fail (self->pv->importing == FALSE); + + g_signal_emit (self, signals[IMPORTING], 0, importer); + + self->pv->importing = TRUE; + g_free (self->pv->imported); + self->pv->imported = NULL; + + /* TODO: Hack. Need to figure out how to pair these up... */ + if (g_strcmp0 (G_OBJECT_TYPE_NAME (importer), "GcrPkcs11Importer") == 0) { + window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); + interaction = _gcr_pkcs11_import_interaction_new (window); + gcr_importer_set_interaction (importer, interaction); + g_object_unref (interaction); + } + + gcr_importer_import_async (importer, + self->pv->cancellable, + on_import_complete, + g_object_ref (self)); +} + +static void +on_importer_menu_activated (GtkMenuItem *menu_item, + gpointer user_data) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); + GcrImporter *importer; + + importer = g_object_get_qdata (G_OBJECT (menu_item), QUARK_IMPORTER); + g_return_if_fail (GCR_IMPORTER (importer)); + g_return_if_fail (self->pv->importing == FALSE); + + begin_import (self, importer); + update_import_button (self); +} + +static void +update_importer_menu (GcrImportButton *self) +{ + GtkWidget *menu_item; + GtkWidget *image; + GList *children, *l; + GIcon *icon; + gchar *label; + + if (!self->pv->menu) { + self->pv->menu = GTK_MENU (gtk_menu_new ()); + g_object_ref_sink (self->pv->menu); + } + + children = gtk_container_get_children (GTK_CONTAINER (self->pv->menu)); + for (l = children; l != NULL; l = g_list_next (l)) + gtk_container_remove (GTK_CONTAINER (self->pv->menu), l->data); + g_list_free (children); + + for (l = self->pv->importers; l != NULL; l = g_list_next (l)) { + g_object_get (l->data, "label", &label, "icon", &icon, NULL); + menu_item = egg_image_menu_item_new_with_label (label); + g_signal_connect (menu_item, "activate", G_CALLBACK (on_importer_menu_activated), self); + g_object_set_qdata (G_OBJECT (menu_item), QUARK_IMPORTER, l->data); + image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_MENU); + egg_image_menu_item_set_image (EGG_IMAGE_MENU_ITEM (menu_item), image); + egg_image_menu_item_set_always_show_image (EGG_IMAGE_MENU_ITEM (menu_item), TRUE); + gtk_widget_show (image); + gtk_widget_show (menu_item); + gtk_container_add (GTK_CONTAINER (self->pv->menu), menu_item); + g_object_unref (icon); + g_free (label); + } +} + +static void +on_menu_position (GtkMenu *menu, + gint *x, + gint *y, + gboolean *push_in, + gpointer user_data) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); + GtkWidget *widget = GTK_WIDGET (self); + GtkAllocation allocation; + GtkRequisition menu_req; + GdkRectangle monitor; + GdkWindow *window; + GtkWidget *toplevel; + GdkScreen *screen; + gint monitor_num; + gint sx = 0; + gint sy = 0; + + g_return_if_fail (x != NULL); + g_return_if_fail (y != NULL); + g_return_if_fail (push_in != NULL); + + gtk_widget_get_allocation (widget, &allocation); + + if (!gtk_widget_get_has_window (widget)) { + sx += allocation.x; + sy += allocation.y; + } + + window = gtk_widget_get_window (widget); + gdk_window_get_root_coords (window, sx, sy, &sx, &sy); + + gtk_widget_get_preferred_size (GTK_WIDGET (menu), NULL, &menu_req); + if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) + *x = sx; + else + *x = sx + allocation.width - menu_req.width; + *y = sy; + + screen = gtk_widget_get_screen (widget); + monitor_num = gdk_screen_get_monitor_at_window (screen, window); + if (monitor_num < 0) + monitor_num = 0; + gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); + + if (*x < monitor.x) + *x = monitor.x; + else if (*x + menu_req.width > monitor.x + monitor.width) + *x = monitor.x + monitor.width - menu_req.width; + + if (monitor.y + monitor.height - *y - allocation.height >= menu_req.height) + *y += allocation.height; + else if (*y - monitor.y >= menu_req.height) + *y -= menu_req.height; + else if (monitor.y + monitor.height - *y - allocation.height > *y - monitor.y) + *y += allocation.height; + else + *y -= menu_req.height; + + gtk_menu_set_monitor (menu, monitor_num); + + toplevel = gtk_widget_get_parent (GTK_WIDGET (menu)); + if (GTK_IS_WINDOW (toplevel) && gtk_widget_get_visible (toplevel)) + gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU); + + *push_in = FALSE; +} + +static void +gcr_import_button_clicked (GtkButton *button) +{ + GcrImportButton *self = GCR_IMPORT_BUTTON (button); + + g_return_if_fail (self->pv->importing == FALSE); + g_return_if_fail (self->pv->importers != NULL); + + /* More than one importer, show the menu */ + if (self->pv->importers->next) { + update_importer_menu (self); + gtk_menu_popup (self->pv->menu, NULL, NULL, on_menu_position, + self, 1, gtk_get_current_event_time ()); + + /* Only one importer, import on click */ + } else { + begin_import (self, self->pv->importers->data); + } + + update_import_button (self); +} + +static void +gcr_import_button_class_init (GcrImportButtonClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass); + + gobject_class->constructed = gcr_import_button_constructed; + gobject_class->dispose = gcr_import_button_dispose; + gobject_class->finalize = gcr_import_button_finalize; + gobject_class->get_property = gcr_import_button_get_property; + gobject_class->set_property = gcr_import_button_set_property; + + button_class->clicked = gcr_import_button_clicked; + + g_object_class_override_property (gobject_class, PROP_LABEL, "label"); + + /** + * GcrImportButton::importing: + * @self: the import button + * @importer: the importer that will be imported to + * + * Signal emitted when an import begins. + */ + signals[IMPORTING] = g_signal_new ("importing", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GcrImportButtonClass, importing), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + + /** + * GcrImportButton::imported: + * @self: the import button + * @importer: the importer that was imported to + * @error: if import was successful %NULL, or an error + * + * Signal emitted when an import completes or fails. + */ + signals[IMPORTED] = g_signal_new ("imported", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GcrImportButtonClass, imported), + NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED, + G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_ERROR); + + QUARK_IMPORTER = g_quark_from_static_string ("gcr-import-button-importer"); + + g_type_class_add_private (klass, sizeof (GcrImportButtonPrivate)); +} + +/** + * gcr_import_button_new: + * @label: (allow-none): label to display on the button + * + * Create a new #GcrImportButton. + * + * Returns: (transfer full): a newly created #GcrImportButton + */ +GcrImportButton * +gcr_import_button_new (const gchar *label) +{ + return g_object_new (GCR_TYPE_IMPORT_BUTTON, + "label", label, + NULL); +} + +/** + * gcr_import_button_add_parsed: + * @self: an import button + * @parsed: a parsed item + * + * Queue an item to import via the button + */ +void +gcr_import_button_add_parsed (GcrImportButton *self, + GcrParsed *parsed) +{ + GList *importers; + + g_return_if_fail (GCR_IS_IMPORT_BUTTON (self)); + g_return_if_fail (parsed != NULL); + + if (!self->pv->ready) { + self->pv->queued = g_list_prepend (self->pv->queued, gcr_parsed_ref (parsed)); + update_import_button (self); + return; + } + + g_free (self->pv->imported); + self->pv->imported = NULL; + + if (self->pv->created) { + importers = gcr_importer_queue_and_filter_for_parsed (self->pv->importers, parsed); + } else { + importers = gcr_importer_create_for_parsed (parsed); + self->pv->created = TRUE; + } + + gck_list_unref_free (self->pv->importers); + self->pv->importers = importers; + + update_import_button (self); +} diff --git a/ui/gcr-import-button.h b/ui/gcr-import-button.h new file mode 100644 index 0000000..01743e2 --- /dev/null +++ b/ui/gcr-import-button.h @@ -0,0 +1,72 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_IMPORT_BUTTON_H__ +#define __GCR_IMPORT_BUTTON_H__ + +#include "gcr/gcr-importer.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_IMPORT_BUTTON (gcr_import_button_get_type ()) +#define GCR_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButton)) +#define GCR_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass)) +#define GCR_IS_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORT_BUTTON)) +#define GCR_IS_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_IMPORT_BUTTON)) +#define GCR_IMPORT_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass)) + +typedef struct _GcrImportButton GcrImportButton; +typedef struct _GcrImportButtonClass GcrImportButtonClass; +typedef struct _GcrImportButtonPrivate GcrImportButtonPrivate; + +struct _GcrImportButton { + GtkButton parent; + + /*< private >*/ + GcrImportButtonPrivate *pv; +}; + +struct _GcrImportButtonClass { + GtkButtonClass parent_class; + + void (*importing) (GcrImportButton *self, + GcrImporter *importer); + + void (*imported) (GcrImportButton *self, + GcrImporter *importer, + GError *error); + + /*< private >*/ + gpointer padding[10]; +}; + +GType gcr_import_button_get_type (void) G_GNUC_CONST; + +GcrImportButton * gcr_import_button_new (const gchar *label); + +void gcr_import_button_add_parsed (GcrImportButton *self, + GcrParsed *parsed); + +G_END_DECLS + +#endif /* __GCR_IMPORT_BUTTON_H__ */ diff --git a/ui/gcr-key-renderer.c b/ui/gcr-key-renderer.c new file mode 100644 index 0000000..e2a8c4c --- /dev/null +++ b/ui/gcr-key-renderer.c @@ -0,0 +1,481 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-fingerprint.h" +#include "gcr/gcr-icons.h" +#include "gcr/gcr-subject-public-key.h" + +#include "gcr-key-renderer.h" +#include "gcr-display-view.h" +#include "gcr-renderer.h" +#include "gcr-viewer.h" + +#include "gck/gck.h" + +#include "egg/egg-asn1x.h" + +#include +#include + +/** + * GcrKeyRenderer: + * + * An implementation of #GcrRenderer which renders keys. + */ + +/** + * GcrKeyRendererClass: + * @parent_class: The parent class. + * + * The class for #GcrKeyRenderer. + */ + +enum { + PROP_0, + PROP_LABEL, + PROP_ATTRIBUTES, + PROP_OBJECT +}; + +struct _GcrKeyRendererPrivate { + guint key_size; + gchar *label; + GckAttributes *attributes; + GckObject *object; + GIcon *icon; + gulong notify_sig; + GBytes *spk; +}; + +static void gcr_key_renderer_renderer_iface (GcrRendererIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrKeyRenderer, gcr_key_renderer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_key_renderer_renderer_iface)); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static gchar* +calculate_label (GcrKeyRenderer *self) +{ + gchar *label; + + if (self->pv->label) + return g_strdup (self->pv->label); + + if (self->pv->attributes) { + if (gck_attributes_find_string (self->pv->attributes, CKA_LABEL, &label)) + return label; + } + + return g_strdup (_("Key")); +} + +static GckAttributes * +calculate_attrs (GcrKeyRenderer *self) +{ + if (self->pv->attributes) + return gck_attributes_ref (self->pv->attributes); + + if (GCK_IS_OBJECT_CACHE (self->pv->object)) + return gck_object_cache_get_attributes (GCK_OBJECT_CACHE (self->pv->object)); + + return NULL; +} + +static guchar * +calculate_fingerprint (GcrKeyRenderer *self, + GckAttributes *attrs, + GChecksumType algorithm, + gsize *n_fingerprint) +{ + if (self->pv->spk) + return gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (self->pv->spk, NULL), + g_bytes_get_size (self->pv->spk), + algorithm, n_fingerprint); + + return gcr_fingerprint_from_attributes (attrs, algorithm, n_fingerprint); +} + +static void +on_subject_public_key (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data); + GError *error = NULL; + GNode *node; + + node = _gcr_subject_public_key_load_finish (result, &error); + if (error != NULL) { + g_message ("couldn't load key information: %s", error->message); + g_clear_error (&error); + + } else { + if (self->pv->spk) + g_bytes_unref (self->pv->spk); + self->pv->spk = NULL; + + self->pv->spk = egg_asn1x_encode (node, NULL); + if (self->pv->spk == NULL) + g_warning ("invalid subjectPublicKey loaded: %s", + egg_asn1x_message (node)); + egg_asn1x_destroy (node); + + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + } + + g_object_unref (self); +} + +static void +update_subject_public_key (GcrKeyRenderer *self) +{ + if (self->pv->spk) + g_bytes_unref (self->pv->spk); + self->pv->spk = NULL; + + if (!self->pv->object) + return; + + _gcr_subject_public_key_load_async (self->pv->object, NULL, + on_subject_public_key, + g_object_ref (self)); +} + +static void +on_object_cache_attributes (GObject *obj, + GParamSpec *spec, + gpointer user_data) +{ + GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data); + update_subject_public_key (self); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); +} + +static void +gcr_key_renderer_init (GcrKeyRenderer *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_KEY_RENDERER, GcrKeyRendererPrivate)); + self->pv->icon = g_themed_icon_new (GCR_ICON_KEY); +} + +static void +gcr_key_renderer_dispose (GObject *obj) +{ + GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); + + if (self->pv->spk) + g_bytes_unref (self->pv->spk); + self->pv->spk = NULL; + + if (self->pv->object && self->pv->notify_sig) { + g_signal_handler_disconnect (self->pv->object, self->pv->notify_sig); + self->pv->notify_sig = 0; + } + g_clear_object (&self->pv->object); + + G_OBJECT_CLASS (gcr_key_renderer_parent_class)->dispose (obj); +} + +static void +gcr_key_renderer_finalize (GObject *obj) +{ + GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); + + if (self->pv->attributes) + gck_attributes_unref (self->pv->attributes); + self->pv->attributes = NULL; + + g_free (self->pv->label); + self->pv->label = NULL; + + if (self->pv->icon) + g_object_unref (self->pv->icon); + self->pv->icon = NULL; + + G_OBJECT_CLASS (gcr_key_renderer_parent_class)->finalize (obj); +} + +static void +gcr_key_renderer_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_free (self->pv->label); + self->pv->label = g_value_dup_string (value); + g_object_notify (obj, "label"); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + break; + case PROP_ATTRIBUTES: + gck_attributes_unref (self->pv->attributes); + self->pv->attributes = g_value_dup_boxed (value); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + break; + case PROP_OBJECT: + g_clear_object (&self->pv->object); + self->pv->object = g_value_dup_object (value); + if (self->pv->object) { + gck_attributes_unref (self->pv->attributes); + self->pv->attributes = NULL; + } + if (GCK_IS_OBJECT_CACHE (self->pv->object)) { + self->pv->notify_sig = g_signal_connect (self->pv->object, + "notify::attributes", + G_CALLBACK (on_object_cache_attributes), + self); + on_object_cache_attributes (G_OBJECT (self->pv->object), NULL, self); + } + g_object_notify (obj, "attributes"); + g_object_notify (obj, "object"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_key_renderer_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_take_string (value, calculate_label (self)); + break; + case PROP_ATTRIBUTES: + g_value_take_boxed (value, calculate_attrs (self)); + break; + case PROP_OBJECT: + g_value_set_object (value, self->pv->object); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_key_renderer_class_init (GcrKeyRendererClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GckBuilder builder = GCK_BUILDER_INIT; + + gcr_key_renderer_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrKeyRendererPrivate)); + + gobject_class->dispose = gcr_key_renderer_dispose; + gobject_class->finalize = gcr_key_renderer_finalize; + gobject_class->set_property = gcr_key_renderer_set_property; + gobject_class->get_property = gcr_key_renderer_get_property; + + g_object_class_override_property (gobject_class, PROP_LABEL, "label"); + g_object_class_override_property (gobject_class, PROP_ATTRIBUTES, "attributes"); + + g_object_class_install_property (gobject_class, PROP_OBJECT, + g_param_spec_object ("object", "Object", "Key Object", GCK_TYPE_OBJECT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /* Register this as a view which can be loaded */ + gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); + gcr_renderer_register (GCR_TYPE_KEY_RENDERER, gck_builder_end (&builder)); +} + +static void +gcr_key_renderer_real_render (GcrRenderer *renderer, GcrViewer *viewer) +{ + GcrKeyRenderer *self; + GcrDisplayView *view; + const gchar *text = ""; + GckAttributes *attrs; + gpointer fingerprint; + gsize n_fingerprint; + gchar *display; + gulong klass; + gulong key_type; + guint size; + + self = GCR_KEY_RENDERER (renderer); + + if (GCR_IS_DISPLAY_VIEW (viewer)) { + view = GCR_DISPLAY_VIEW (viewer); + + } else { + g_warning ("GcrKeyRenderer only works with internal specific " + "GcrViewer returned by gcr_viewer_new()."); + return; + } + + _gcr_display_view_begin (view, renderer); + + attrs = calculate_attrs (self); + if (attrs == NULL) { + _gcr_display_view_end (view, renderer); + return; + } + + if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) || + !gck_attributes_find_ulong (attrs, CKA_KEY_TYPE, &key_type)) { + g_warning ("private key does not have the CKA_CLASS and CKA_KEY_TYPE attributes"); + _gcr_display_view_end (view, renderer); + gck_attributes_unref (attrs); + return; + } + + _gcr_display_view_set_icon (view, renderer, self->pv->icon); + + display = calculate_label (self); + _gcr_display_view_append_title (view, renderer, display); + g_free (display); + + if (klass == CKO_PRIVATE_KEY) { + if (key_type == CKK_RSA) + text = _("Private RSA Key"); + else if (key_type == CKK_DSA) + text = _("Private DSA Key"); + else if (key_type == CKK_EC) + text = _("Private Elliptic Curve Key"); + else + text = _("Private Key"); + } else if (klass == CKO_PUBLIC_KEY) { + if (key_type == CKK_RSA) + text = _("Public DSA Key"); + else if (key_type == CKK_DSA) + text = _("Public DSA Key"); + else if (key_type == CKK_EC) + text = _("Public Elliptic Curve Key"); + else + text = _("Public Key"); + } + + _gcr_display_view_append_content (view, renderer, text, NULL); + + size = _gcr_subject_public_key_attributes_size (attrs); + if (size > 0) { + display = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%u bit", "%u bits", size), size); + _gcr_display_view_append_content (view, renderer, _("Strength"), display); + g_free (display); + } + + _gcr_display_view_start_details (view, renderer); + + if (key_type == CKK_RSA) + text = _("RSA"); + else if (key_type == CKK_DSA) + text = _("DSA"); + else if (key_type == CKK_EC) + text = _("Elliptic Curve"); + else + text = _("Unknown"); + _gcr_display_view_append_value (view, renderer, _("Algorithm"), text, FALSE); + + if (size == 0) + display = g_strdup (_("Unknown")); + else + display = g_strdup_printf ("%u", size); + _gcr_display_view_append_value (view, renderer, _("Size"), display, FALSE); + g_free (display); + + /* Fingerprints */ + _gcr_display_view_append_heading (view, renderer, _("Fingerprints")); + + fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA1, &n_fingerprint); + if (fingerprint) { + _gcr_display_view_append_hex (view, renderer, _("SHA1"), fingerprint, n_fingerprint); + g_free (fingerprint); + } + fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA256, &n_fingerprint); + if (fingerprint) { + _gcr_display_view_append_hex (view, renderer, _("SHA256"), fingerprint, n_fingerprint); + g_free (fingerprint); + } + + _gcr_display_view_end (view, renderer); + gck_attributes_unref (attrs); +} + +static void +gcr_key_renderer_renderer_iface (GcrRendererIface *iface) +{ + iface->render_view = gcr_key_renderer_real_render; +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_key_renderer_new: + * @label: (allow-none): label describing the key + * @attrs: (allow-none): key to display, or %NULL + * + * Create a new key renderer which renders a given key in the attributes. + * + * Returns: (transfer full): a newly allocated #GcrKeyRenderer, which should be + * freed with g_object_unref() + */ +GcrKeyRenderer* +gcr_key_renderer_new (const gchar *label, GckAttributes *attrs) +{ + return g_object_new (GCR_TYPE_KEY_RENDERER, "label", label, "attributes", attrs, NULL); +} + +/** + * gcr_key_renderer_set_attributes: + * @self: The key renderer + * @attrs: (allow-none): the attributes to display + * + * Get the attributes displayed in the renderer. The attributes should represent + * either an RSA, DSA, or EC key in PKCS\#11 style. + */ +void +gcr_key_renderer_set_attributes (GcrKeyRenderer *self, GckAttributes *attrs) +{ + g_return_if_fail (GCR_IS_KEY_RENDERER (self)); + + if (self->pv->attributes) + gck_attributes_unref (self->pv->attributes); + self->pv->attributes = attrs; + if (self->pv->attributes) + gck_attributes_ref (self->pv->attributes); + + g_object_notify (G_OBJECT (self), "attributes"); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); +} + +/** + * gcr_key_renderer_get_attributes: + * @self: The key renderer + * + * Get the attributes displayed in the renderer. + * + * Returns: (transfer none) (allow-none): the attributes, owned by the renderer + */ +GckAttributes* +gcr_key_renderer_get_attributes (GcrKeyRenderer *self) +{ + g_return_val_if_fail (GCR_IS_KEY_RENDERER (self), NULL); + return self->pv->attributes; +} diff --git a/ui/gcr-key-renderer.h b/ui/gcr-key-renderer.h new file mode 100644 index 0000000..0ff592f --- /dev/null +++ b/ui/gcr-key-renderer.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_KEY_RENDERER_H__ +#define __GCR_KEY_RENDERER_H__ + +#include +#include + +#include "gcr/gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_KEY_RENDERER (gcr_key_renderer_get_type ()) +#define GCR_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRenderer)) +#define GCR_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass)) +#define GCR_IS_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_RENDERER)) +#define GCR_IS_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_RENDERER)) +#define GCR_KEY_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass)) + +typedef struct _GcrKeyRenderer GcrKeyRenderer; +typedef struct _GcrKeyRendererClass GcrKeyRendererClass; +typedef struct _GcrKeyRendererPrivate GcrKeyRendererPrivate; + +struct _GcrKeyRenderer { + GObject parent; + + /*< private >*/ + GcrKeyRendererPrivate *pv; +}; + +struct _GcrKeyRendererClass { + GObjectClass parent_class; +}; + +GType gcr_key_renderer_get_type (void); + +GcrKeyRenderer* gcr_key_renderer_new (const gchar *label, + GckAttributes *attrs); + +void gcr_key_renderer_set_attributes (GcrKeyRenderer *self, + GckAttributes *attrs); + +GckAttributes* gcr_key_renderer_get_attributes (GcrKeyRenderer *self); + +G_END_DECLS + +#endif /* __GCR_KEY_RENDERER_H__ */ diff --git a/ui/gcr-key-widget.c b/ui/gcr-key-widget.c new file mode 100644 index 0000000..75f861b --- /dev/null +++ b/ui/gcr-key-widget.c @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-key-renderer.h" +#include "gcr-key-widget.h" +#include "gcr-renderer.h" +#include "gcr-viewer.h" + +#include "gck/gck.h" + +#include +#include + +/** + * SECTION:gcr-key-widget + * @title: GcrKeyWidget + * @short_description: Key widget and renderer + * + * A #GcrKeyWidget can be used to display a RSA, DSA or EC key. The widget + * is normally in a collapsed state showing only details, but can be expanded + * by the user. + * + * Use gcr_key_widget_new() to create a new key widget. Only + * one key can be displayed. A #GcrKeyWidget contains a + * #GcrViewer internally and #GcrKeyRenderer is used to render the + * key to the viewer. To show more than one key in a view, + * create the viewer and add renderers to it. + */ + +/** + * GcrKeyWidget: + * + * A widget that displays a key. + */ + +/** + * GcrKeyWidgetClass: + * + * The class for #GcrKeyWidget + */ +enum { + PROP_0, + PROP_ATTRIBUTES +}; + +struct _GcrKeyWidget { + GtkBin parent; + + /*< private >*/ + GcrKeyWidgetPrivate *pv; +}; + +struct _GcrKeyWidgetClass { + /*< private >*/ + GtkBinClass parent_class; +}; + +struct _GcrKeyWidgetPrivate { + GcrViewer *viewer; + GcrKeyRenderer *renderer; +}; + +G_DEFINE_TYPE (GcrKeyWidget, gcr_key_widget, GTK_TYPE_BIN); + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static GObject* +gcr_key_widget_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + GObject *obj = G_OBJECT_CLASS (gcr_key_widget_parent_class)->constructor (type, n_props, props); + GcrKeyWidget *self = NULL; + + g_return_val_if_fail (obj, NULL); + + self = GCR_KEY_WIDGET (obj); + + self->pv->viewer = gcr_viewer_new_scrolled (); + gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer)); + gtk_widget_show (GTK_WIDGET (self->pv->viewer)); + + gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer)); + return obj; +} + +static void +gcr_key_widget_init (GcrKeyWidget *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_KEY_WIDGET, GcrKeyWidgetPrivate)); + self->pv->renderer = gcr_key_renderer_new (NULL, NULL); +} + +static void +gcr_key_widget_finalize (GObject *obj) +{ + GcrKeyWidget *self = GCR_KEY_WIDGET (obj); + + g_assert (self->pv->renderer); + g_object_unref (self->pv->renderer); + self->pv->renderer = NULL; + + g_assert (self->pv->viewer); + self->pv->viewer = NULL; + + G_OBJECT_CLASS (gcr_key_widget_parent_class)->finalize (obj); +} + +static void +gcr_key_widget_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrKeyWidget *self = GCR_KEY_WIDGET (obj); + + switch (prop_id) { + case PROP_ATTRIBUTES: + gcr_key_widget_set_attributes (self, g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_key_widget_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrKeyWidget *self = GCR_KEY_WIDGET (obj); + + switch (prop_id) { + case PROP_ATTRIBUTES: + g_value_set_boxed (value, gcr_key_widget_get_attributes (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_key_widget_class_init (GcrKeyWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gcr_key_widget_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrKeyWidgetPrivate)); + + gobject_class->constructor = gcr_key_widget_constructor; + gobject_class->finalize = gcr_key_widget_finalize; + gobject_class->set_property = gcr_key_widget_set_property; + gobject_class->get_property = gcr_key_widget_get_property; + + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the widget", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_key_widget_new: + * @attrs: (allow-none): key to display, or %NULL + * + * Create a new key widget which displays a given key in the attributes. + * + * Returns: A newly allocated #GcrKeyWidget, which should be freed + * with g_object_unref(). + */ +GcrKeyWidget* +gcr_key_widget_new (GckAttributes *attrs) +{ + return g_object_new (GCR_TYPE_KEY_WIDGET, "attributes", attrs, NULL); +} + +/** + * gcr_key_widget_set_attributes: + * @self: The key widget + * @attrs: (allow-none): the attributes to display + * + * Get the attributes displayed in the widget. The attributes should represent + * either an RSA, DSA or EC key in PKCS\#11 style. + */ +void +gcr_key_widget_set_attributes (GcrKeyWidget *self, GckAttributes *attrs) +{ + g_return_if_fail (GCR_IS_KEY_WIDGET (self)); + gcr_key_renderer_set_attributes (self->pv->renderer, attrs); +} + +/** + * gcr_key_widget_get_attributes: + * @self: The key widget + * + * Get the attributes displayed in the widget. + * + * Returns: (allow-none) (transfer none): The attributes, owned by the widget. + */ +GckAttributes* +gcr_key_widget_get_attributes (GcrKeyWidget *self) +{ + g_return_val_if_fail (GCR_IS_KEY_WIDGET (self), NULL); + return gcr_key_renderer_get_attributes (self->pv->renderer); +} diff --git a/ui/gcr-key-widget.h b/ui/gcr-key-widget.h new file mode 100644 index 0000000..9384c08 --- /dev/null +++ b/ui/gcr-key-widget.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_KEY_WIDGET_H__ +#define __GCR_KEY_WIDGET_H__ + +#include +#include + +#include "gcr/gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_KEY_WIDGET (gcr_key_widget_get_type ()) +#define GCR_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidget)) +#define GCR_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass)) +#define GCR_IS_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_WIDGET)) +#define GCR_IS_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_WIDGET)) +#define GCR_KEY_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass)) + +typedef struct _GcrKeyWidget GcrKeyWidget; +typedef struct _GcrKeyWidgetClass GcrKeyWidgetClass; +typedef struct _GcrKeyWidgetPrivate GcrKeyWidgetPrivate; + +/* + * TODO: GcrKeyWidget and GcrKeyWidgetClass are hidden until + * we can figure out what they should be derived from. + */ + +GType gcr_key_widget_get_type (void); + +GcrKeyWidget* gcr_key_widget_new (GckAttributes *attrs); + +void gcr_key_widget_set_attributes (GcrKeyWidget *self, + GckAttributes *attrs); + +GckAttributes* gcr_key_widget_get_attributes (GcrKeyWidget *self); + +G_END_DECLS + +#endif /* __GCR_KEY_WIDGET_H__ */ diff --git a/ui/gcr-list-selector-private.h b/ui/gcr-list-selector-private.h new file mode 100644 index 0000000..b1c4739 --- /dev/null +++ b/ui/gcr-list-selector-private.h @@ -0,0 +1,39 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_LIST_SELECTOR_PRIVATE_H__ +#define __GCR_LIST_SELECTOR_PRIVATE_H__ + +#include "gcr/gcr-types.h" + +#include "gcr-list-selector.h" +#include "gcr-live-search.h" + +#include + +G_BEGIN_DECLS + +void _gcr_list_selector_set_live_search (GcrListSelector *self, + GcrLiveSearch *search); + +G_END_DECLS + +#endif /* __GCR_LIST_SELECTOR_PRIVATE_H__ */ diff --git a/ui/gcr-list-selector.c b/ui/gcr-list-selector.c new file mode 100644 index 0000000..c924e27 --- /dev/null +++ b/ui/gcr-list-selector.c @@ -0,0 +1,456 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr-internal.h" + +#include "gcr-collection-model.h" +#include "gcr-list-selector.h" +#include "gcr-list-selector-private.h" +#include "gcr-live-search.h" + +#include + +#include + +/** + * SECTION:gcr-list-selector + * @title: GcrListSelector + * @short_description: A selector widget to one or more certificates from a list. + * + * The #GcrListSelector can be used to select one or more certificates or keys. + * Live search is available for quick filtering. + */ + +/** + * GcrListSelector: + * + * A list selector widget. + */ + +/** + * GcrListSelectorClass: + * + * The class for #GcrListSelector. + */ + +enum { + PROP_0, + PROP_COLLECTION +}; + +struct _GcrListSelectorPrivate { + GcrCollection *collection; + GcrCollectionModel *model; + + GtkTreeModelFilter *filter; + GtkWidget *search_widget; +}; + +G_DEFINE_TYPE (GcrListSelector, gcr_list_selector, GTK_TYPE_TREE_VIEW); + +static gboolean +object_is_visible (GcrListSelector *self, GObject *object) +{ + gchar *text; + gboolean visible; + + if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), "search-text")) + g_object_get (object, "search-text", &text, NULL); + else + g_object_get (object, "label", &text, NULL); + + visible = _gcr_live_search_match (GCR_LIVE_SEARCH (self->pv->search_widget), text); + g_free (text); + + return visible; +} + +static gboolean +on_tree_filter_visible_func (GtkTreeModel *model, GtkTreeIter *iter, + gpointer user_data) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (user_data); + GObject *object; + + if (self->pv->search_widget == NULL || + !gtk_widget_get_visible (self->pv->search_widget)) + return TRUE; + + object = gcr_collection_model_object_for_iter (self->pv->model, iter); + if (object != NULL) + return object_is_visible (self, object); + + return FALSE; +} + +static gboolean +on_tree_view_start_search (GtkTreeView *view, gpointer user_data) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (view); + + if (self->pv->search_widget == NULL) + return FALSE; + + if (gtk_widget_get_visible (self->pv->search_widget)) + gtk_widget_grab_focus (self->pv->search_widget); + else + gtk_widget_show (self->pv->search_widget); + + return TRUE; +} + +static void +on_search_widget_text_notify (GcrLiveSearch *search, GParamSpec *pspec, + gpointer user_data) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (user_data); +#if 0 + GtkTreeViewColumn *focus_column; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *path; + gboolean set_cursor = FALSE; +#endif + + gtk_tree_model_filter_refilter (self->pv->filter); + +#if 0 + /* Set cursor on the first object. */ + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); + gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &path, &focus_column); + + if (path == NULL) { + path = gtk_tree_path_new_from_string ("0"); + set_cursor = TRUE; + } + + if (set_cursor) { + /* FIXME: Workaround for GTK bug #621651, we have to make sure + * the path is valid. */ + if (gtk_tree_model_get_iter (model, &iter, path)) { + gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, + focus_column, FALSE); + } + } + + gtk_tree_path_free (path); +#endif +} + +static void +on_search_widget_activate (GtkWidget *search, gpointer user_data) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (user_data); + GtkTreePath *path; + GtkTreeViewColumn *focus_column; + + gtk_tree_view_get_cursor (GTK_TREE_VIEW (self), &path, &focus_column); + if (path != NULL) { + gtk_tree_view_row_activated (GTK_TREE_VIEW (self), path, focus_column); + gtk_tree_path_free (path); + + gtk_widget_hide (search); + } +} + +static gboolean +on_search_widget_key_navigation (GtkWidget *search, GdkEvent *event, gpointer user_data) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (user_data); + GdkEvent *new_event; + gboolean ret = FALSE; + + new_event = gdk_event_copy (event); + gtk_widget_grab_focus (GTK_WIDGET (self)); + ret = gtk_widget_event (GTK_WIDGET (self), new_event); + gtk_widget_grab_focus (search); + + gdk_event_free (new_event); + + return ret; +} + +static void +on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, gpointer user_data) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (user_data); + GtkTreeIter iter, model_iter; + + g_assert (path != NULL); + + if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (self->pv->filter), &iter, path)) { + gtk_tree_model_filter_convert_iter_to_child_iter (self->pv->filter, &model_iter, &iter); + gcr_collection_model_toggle_selected (self->pv->model, &model_iter); + } +} + +static void +gcr_list_selector_constructed (GObject *object) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (object); + GtkCellRenderer *cell; + GtkTreeViewColumn *column; + guint column_id; + + G_OBJECT_CLASS (gcr_list_selector_parent_class)->constructed (object); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (self), FALSE); + + self->pv->model = gcr_collection_model_new (self->pv->collection, + GCR_COLLECTION_MODEL_LIST, + "icon", G_TYPE_ICON, + "markup", G_TYPE_STRING, + NULL); + + self->pv->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new ( + GTK_TREE_MODEL (self->pv->model), NULL)); + gtk_tree_model_filter_set_visible_func (self->pv->filter, + on_tree_filter_visible_func, self, NULL); + + gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->filter)); + + /* The check */ + + cell = gtk_cell_renderer_toggle_new (); + g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self); + + column_id = gcr_collection_model_column_for_selected (self->pv->model); + column = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL); + gtk_tree_view_column_set_resizable (column, FALSE); + gtk_tree_view_append_column (GTK_TREE_VIEW (self), column); + + column = gtk_tree_view_column_new (); + + /* The icon */ + cell = gtk_cell_renderer_pixbuf_new (); + g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL); + gtk_tree_view_column_pack_start (column, cell, FALSE); + gtk_tree_view_column_add_attribute (column, cell, "gicon", 0); + + /* The markup */ + cell = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, cell, TRUE); + gtk_tree_view_column_add_attribute (column, cell, "markup", 1); + + gtk_tree_view_append_column (GTK_TREE_VIEW (self), column); +} + +static void +gcr_list_selector_init (GcrListSelector *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_LIST_SELECTOR, GcrListSelectorPrivate); +} + +static void +gcr_list_selector_dispose (GObject *obj) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (obj); + + if (self->pv->filter) + g_object_unref (self->pv->filter); + self->pv->filter = NULL; + + if (self->pv->model) + g_object_unref (self->pv->model); + self->pv->model = NULL; + + if (self->pv->collection) + g_object_unref (self->pv->collection); + self->pv->collection = NULL; + + _gcr_list_selector_set_live_search (self, NULL); + + G_OBJECT_CLASS (gcr_list_selector_parent_class)->dispose (obj); +} + +static void +gcr_list_selector_finalize (GObject *obj) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (obj); + + g_assert (!self->pv->collection); + g_assert (!self->pv->model); + + G_OBJECT_CLASS (gcr_list_selector_parent_class)->finalize (obj); +} + +static void +gcr_list_selector_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (obj); + + switch (prop_id) { + case PROP_COLLECTION: + g_return_if_fail (!self->pv->collection); + self->pv->collection = g_value_dup_object (value); + g_return_if_fail (self->pv->collection); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_list_selector_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrListSelector *self = GCR_LIST_SELECTOR (obj); + + switch (prop_id) { + case PROP_COLLECTION: + g_value_set_object (value, gcr_list_selector_get_collection (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_list_selector_class_init (GcrListSelectorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructed = gcr_list_selector_constructed; + gobject_class->dispose = gcr_list_selector_dispose; + gobject_class->finalize = gcr_list_selector_finalize; + gobject_class->set_property = gcr_list_selector_set_property; + gobject_class->get_property = gcr_list_selector_get_property; + + g_type_class_add_private (gobject_class, sizeof (GcrListSelectorPrivate)); + + /** + * GcrListSelector:collection: + * + * The collection which contains the objects to display in the selector. + */ + g_object_class_install_property (gobject_class, PROP_COLLECTION, + g_param_spec_object ("collection", "Collection", "Collection to select from", + GCR_TYPE_COLLECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_list_selector_new: + * @collection: The collection that contains the objects to display + * + * Create a new #GcrListSelector. + * + * Returns: (transfer full): a newly allocated selector, which should be + * released with g_object_unref() + */ +GcrListSelector * +gcr_list_selector_new (GcrCollection *collection) +{ + return g_object_new (GCR_TYPE_LIST_SELECTOR, + "collection", collection, + NULL); +} + +/** + * gcr_list_selector_get_collection: + * @self: The selector + * + * Get the collection that this selector is displaying objects from. + * + * Returns: (transfer none): The collection, owned by the selector. + */ +GcrCollection * +gcr_list_selector_get_collection (GcrListSelector *self) +{ + g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL); + return self->pv->collection; +} + +/** + * gcr_list_selector_get_selected: + * @self: The selector + * + * Get a list of selected objects. + * + * Returns: (transfer container) (element-type GObject.Object): the list of + * selected objects, to be released with g_list_free() + */ +GList* +gcr_list_selector_get_selected (GcrListSelector *self) +{ + g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL); + return gcr_collection_model_get_selected_objects (self->pv->model); +} + +/** + * gcr_list_selector_set_selected: + * @self: The selector + * @selected: (element-type GObject.Object): the list of objects to select + * + * Select certain objects in the selector. + */ +void +gcr_list_selector_set_selected (GcrListSelector *self, GList *selected) +{ + g_return_if_fail (GCR_IS_LIST_SELECTOR (self)); + gcr_collection_model_set_selected_objects (self->pv->model, selected); +} + + +void +_gcr_list_selector_set_live_search (GcrListSelector *self, GcrLiveSearch *search) +{ + g_return_if_fail (GCR_IS_LIST_SELECTOR (self)); + + /* remove old handlers if old search was not null */ + if (self->pv->search_widget != NULL) { + g_signal_handlers_disconnect_by_func (self, on_tree_view_start_search, NULL); + + g_signal_handlers_disconnect_by_func (self->pv->search_widget, + on_search_widget_text_notify, self); + g_signal_handlers_disconnect_by_func (self->pv->search_widget, + on_search_widget_activate, self); + g_signal_handlers_disconnect_by_func (self->pv->search_widget, + on_search_widget_key_navigation, self); + g_object_unref (self->pv->search_widget); + self->pv->search_widget = NULL; + } + + /* connect handlers if new search is not null */ + if (search != NULL) { + self->pv->search_widget = g_object_ref (search); + + g_signal_connect (self, "start-interactive-search", + G_CALLBACK (on_tree_view_start_search), NULL); + + g_signal_connect (self->pv->search_widget, "notify::text", + G_CALLBACK (on_search_widget_text_notify), self); + g_signal_connect (self->pv->search_widget, "activate", + G_CALLBACK (on_search_widget_activate), self); + g_signal_connect (self->pv->search_widget, "key-navigation", + G_CALLBACK (on_search_widget_key_navigation), self); + } +} diff --git a/ui/gcr-list-selector.h b/ui/gcr-list-selector.h new file mode 100644 index 0000000..d6454d9 --- /dev/null +++ b/ui/gcr-list-selector.h @@ -0,0 +1,69 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_LIST_SELECTOR_H__ +#define __GCR_LIST_SELECTOR_H__ + +#include "gcr/gcr-types.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_LIST_SELECTOR (gcr_list_selector_get_type ()) +#define GCR_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelector)) +#define GCR_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass)) +#define GCR_IS_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_LIST_SELECTOR)) +#define GCR_IS_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_LIST_SELECTOR)) +#define GCR_LIST_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass)) + +typedef struct _GcrListSelector GcrListSelector; +typedef struct _GcrListSelectorClass GcrListSelectorClass; +typedef struct _GcrListSelectorPrivate GcrListSelectorPrivate; + +struct _GcrListSelector { + GtkTreeView parent; + + /*< private >*/ + GcrListSelectorPrivate *pv; +}; + +struct _GcrListSelectorClass { + + /*< private >*/ + GtkTreeViewClass parent_class; +}; + +GType gcr_list_selector_get_type (void); + +GcrListSelector* gcr_list_selector_new (GcrCollection *collection); + +GcrCollection* gcr_list_selector_get_collection (GcrListSelector *self); + +GList* gcr_list_selector_get_selected (GcrListSelector *self); + +void gcr_list_selector_set_selected (GcrListSelector *self, + GList *selected); + +G_END_DECLS + +#endif /* __GCR_LIST_SELECTOR_H__ */ diff --git a/ui/gcr-live-search.c b/ui/gcr-live-search.c new file mode 100644 index 0000000..f8483bf --- /dev/null +++ b/ui/gcr-live-search.c @@ -0,0 +1,658 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * Copyright (C) 2010 Collabora Ltd. + * Copyright (C) 2007-2010 Nokia Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Felix Kaser + * Xavier Claessens + * Claudio Saavedra + * Stef Walter + */ + +/* Code borrowed from Empathy */ + +#include "config.h" + +#include "gcr-live-search.h" + +#include "gcr/gcr-marshal.h" + +#include +#include + +#include + +G_DEFINE_TYPE (GcrLiveSearch, _gcr_live_search, GTK_TYPE_BOX) + +struct _GcrLiveSearchPrivate { + GtkWidget *search_entry; + GtkWidget *hook_widget; + GPtrArray *stripped_words; +}; + +enum { + PROP_0, + PROP_HOOK_WIDGET, + PROP_TEXT +}; + +enum { + ACTIVATE, + KEYNAV, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void on_hook_widget_destroy (GtkWidget *object, gpointer user_data); + +static gunichar +stripped_char (gunichar ch) +{ + gunichar retval = 0; + GUnicodeType utype; + gunichar decomp[4]; + gsize dlen; + + utype = g_unichar_type (ch); + + switch (utype) { + case G_UNICODE_CONTROL: + case G_UNICODE_FORMAT: + case G_UNICODE_UNASSIGNED: + case G_UNICODE_NON_SPACING_MARK: + case G_UNICODE_SPACING_MARK: + case G_UNICODE_ENCLOSING_MARK: + /* Ignore those */ + break; + case G_UNICODE_PRIVATE_USE: + case G_UNICODE_SURROGATE: + case G_UNICODE_LOWERCASE_LETTER: + case G_UNICODE_MODIFIER_LETTER: + case G_UNICODE_OTHER_LETTER: + case G_UNICODE_TITLECASE_LETTER: + case G_UNICODE_UPPERCASE_LETTER: + case G_UNICODE_DECIMAL_NUMBER: + case G_UNICODE_LETTER_NUMBER: + case G_UNICODE_OTHER_NUMBER: + case G_UNICODE_CONNECT_PUNCTUATION: + case G_UNICODE_DASH_PUNCTUATION: + case G_UNICODE_CLOSE_PUNCTUATION: + case G_UNICODE_FINAL_PUNCTUATION: + case G_UNICODE_INITIAL_PUNCTUATION: + case G_UNICODE_OTHER_PUNCTUATION: + case G_UNICODE_OPEN_PUNCTUATION: + case G_UNICODE_CURRENCY_SYMBOL: + case G_UNICODE_MODIFIER_SYMBOL: + case G_UNICODE_MATH_SYMBOL: + case G_UNICODE_OTHER_SYMBOL: + case G_UNICODE_LINE_SEPARATOR: + case G_UNICODE_PARAGRAPH_SEPARATOR: + case G_UNICODE_SPACE_SEPARATOR: + default: + ch = g_unichar_tolower (ch); + dlen = g_unichar_fully_decompose (ch, FALSE, decomp, 4); + if (dlen > 0) + retval = decomp[0]; + } + + return retval; +} + +static void +append_word (GPtrArray **word_array, GString **word) +{ + if (*word != NULL) { + if (*word_array == NULL) + *word_array = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (*word_array, g_string_free (*word, FALSE)); + *word = NULL; + } +} + +GPtrArray * +_gcr_live_search_strip_utf8_string (const gchar *string) +{ + GPtrArray *word_array = NULL; + GString *word = NULL; + const gchar *p; + + if (string == NULL || *string == '\0') + return NULL; + + for (p = string; *p != '\0'; p = g_utf8_next_char (p)) { + gunichar sc; + + /* Make the char lower-case, remove its accentuation marks, and ignore it + * if it is just unicode marks */ + sc = stripped_char (g_utf8_get_char (p)); + if (sc == 0) + continue; + + /* If it is not alpha-num, it is separator between words */ + if (!g_unichar_isalnum (sc)) { + append_word (&word_array, &word); + continue; + } + + /* It is alpha-num, append this char to current word, or start new word */ + if (word == NULL) + word = g_string_new (NULL); + g_string_append_unichar (word, sc); + } + + append_word (&word_array, &word); + + return word_array; +} + +static gboolean +live_search_match_prefix (const gchar *string, const gchar *prefix) +{ + const gchar *p; + const gchar *prefix_p; + gboolean next_word = FALSE; + + if (prefix == NULL || prefix[0] == 0) + return TRUE; + + if (string == NULL || *string == '\0') + return FALSE; + + prefix_p = prefix; + for (p = string; *p != '\0'; p = g_utf8_next_char (p)) { + gunichar sc; + + /* Make the char lower-case, remove its accentuation marks, and ignore it + * if it is just unicode marks */ + sc = stripped_char (g_utf8_get_char (p)); + if (sc == 0) + continue; + + /* If we want to go to next word, ignore alpha-num chars */ + if (next_word && g_unichar_isalnum (sc)) + continue; + next_word = FALSE; + + /* Ignore word separators */ + if (!g_unichar_isalnum (sc)) + continue; + + /* If this char does not match prefix_p, go to next word and start again + * from the beginning of prefix */ + if (sc != g_utf8_get_char (prefix_p)) { + next_word = TRUE; + prefix_p = prefix; + continue; + } + + /* prefix_p match, verify to next char. If this was the last of prefix, + * it means it completely machted and we are done. */ + prefix_p = g_utf8_next_char (prefix_p); + if (*prefix_p == '\0') + return TRUE; + } + + return FALSE; +} + +gboolean +_gcr_live_search_match_words (const gchar *string, GPtrArray *words) +{ + guint i; + + if (words == NULL) + return TRUE; + + for (i = 0; i < words->len; i++) + if (!live_search_match_prefix (string, g_ptr_array_index (words, i))) + return FALSE; + + return TRUE; +} + +static gboolean +fire_key_navigation_sig (GcrLiveSearch *self, GdkEventKey *event) +{ + gboolean ret; + + g_signal_emit (self, signals[KEYNAV], 0, event, &ret); + return ret; +} + +static gboolean +on_search_entry_key_pressed (GtkEntry *entry, GdkEventKey *event, gpointer user_data) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); + + /* if esc key pressed, hide the search */ + if (event->keyval == GDK_KEY_Escape) { + gtk_widget_hide (GTK_WIDGET (self)); + return TRUE; + } + + /* emit key navigation signal, so other widgets can respond to it properly */ + if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down + || event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down) { + return fire_key_navigation_sig (self, event); + } + + if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End || + event->keyval == GDK_KEY_space) { + /* If the live search is visible, the entry should catch the Home/End + * and space events */ + if (!gtk_widget_get_visible (GTK_WIDGET (self))) { + return fire_key_navigation_sig (self, event); + } + } + + return FALSE; +} + +static void +on_search_entry_text_changed (GtkEntry *entry, gpointer user_data) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); + const gchar *text; + + text = gtk_entry_get_text (entry); + + if (text == NULL || *text == '\0') + gtk_widget_hide (GTK_WIDGET (self)); + else + gtk_widget_show (GTK_WIDGET (self)); + + if (self->pv->stripped_words != NULL) + g_ptr_array_unref (self->pv->stripped_words); + + self->pv->stripped_words = _gcr_live_search_strip_utf8_string (text); + + g_object_notify (G_OBJECT (self), "text"); +} + +static void +on_search_entry_close_pressed (GtkEntry *entry, GtkEntryIconPosition icon_pos, + GdkEvent *event, gpointer user_data) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); + gtk_widget_hide (GTK_WIDGET (self)); +} + +static gboolean +on_hook_widget_key_press_event (GtkWidget *widget, GdkEventKey *event, + gpointer user_data) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); + GdkEvent *new_event; + gboolean ret; + + /* dont forward this event to the entry, else the event is consumed by the + * entry and does not close the window */ + if (!gtk_widget_get_visible (GTK_WIDGET (self)) && + event->keyval == GDK_KEY_Escape) + return FALSE; + + /* do not show the search if CTRL and/or ALT are pressed with a key + * this is needed, because otherwise the CTRL + F accel would not work, + * because the entry consumes it */ + if (event->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK) || + event->keyval == GDK_KEY_Control_L || + event->keyval == GDK_KEY_Control_R) + return FALSE; + + /* dont forward the up/down and Page Up/Down arrow keys to the entry, + * they are needed for navigation in the treeview and are not needed in + * the search entry */ + if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down || + event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down) + return FALSE; + + if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End || + event->keyval == GDK_KEY_space) { + /* Home/End and space keys have to be forwarded to the entry only if + * the live search is visible (to move the cursor inside the entry). */ + if (!gtk_widget_get_visible (GTK_WIDGET (self))) + return FALSE; + } + + /* realize the widget if it is not realized yet */ + gtk_widget_realize (self->pv->search_entry); + if (!gtk_widget_has_focus (self->pv->search_entry)) { + gtk_widget_grab_focus (self->pv->search_entry); + gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1); + } + + /* forward the event to the search entry */ + new_event = gdk_event_copy ((GdkEvent *) event); + ret = gtk_widget_event (self->pv->search_entry, new_event); + gdk_event_free (new_event); + + return ret; +} + +static void +on_search_entry_activate (GtkEntry *entry, GcrLiveSearch *self) +{ + g_signal_emit (self, signals[ACTIVATE], 0); +} + +static void +live_search_release_hook_widget (GcrLiveSearch *self) +{ + /* remove old handlers if old source was not null */ + if (self->pv->hook_widget != NULL) { + g_signal_handlers_disconnect_by_func (self->pv->hook_widget, + on_hook_widget_key_press_event, self); + g_signal_handlers_disconnect_by_func (self->pv->hook_widget, + on_hook_widget_destroy, self); + g_object_unref (self->pv->hook_widget); + self->pv->hook_widget = NULL; + } +} + +static void +on_hook_widget_destroy (GtkWidget *object, gpointer user_data) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); + + /* unref the hook widget and hide search */ + gtk_widget_hide (GTK_WIDGET (self)); + live_search_release_hook_widget (self); +} + +static void +live_search_dispose (GObject *obj) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (obj); + + live_search_release_hook_widget (self); + + G_OBJECT_CLASS (_gcr_live_search_parent_class)->dispose (obj); +} + +static void +live_search_finalize (GObject *obj) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (obj); + + if (self->pv->stripped_words != NULL) + g_ptr_array_unref (self->pv->stripped_words); + + G_OBJECT_CLASS (_gcr_live_search_parent_class)->finalize (obj); +} + +static void +live_search_get_property (GObject *object, guint param_id, + GValue *value, GParamSpec *pspec) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (object); + + switch (param_id) { + case PROP_HOOK_WIDGET: + g_value_set_object (value, _gcr_live_search_get_hook_widget (self)); + break; + case PROP_TEXT: + g_value_set_string (value, _gcr_live_search_get_text (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +live_search_set_property (GObject *object, guint param_id, + const GValue *value, GParamSpec *pspec) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (object); + + switch (param_id) { + case PROP_HOOK_WIDGET: + _gcr_live_search_set_hook_widget (self, g_value_get_object (value)); + break; + case PROP_TEXT: + _gcr_live_search_set_text (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + }; +} + +static void +live_search_unmap (GtkWidget *widget) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (widget); + + GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->unmap (widget); + + /* unmap can happen if a parent gets hidden, in that case we want to hide + * the live search as well, so when it gets mapped again, the live search + * won't be shown. */ + gtk_widget_hide (widget); + + gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), ""); + gtk_widget_grab_focus (self->pv->hook_widget); +} + +static void +live_search_show (GtkWidget *widget) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (widget); + + if (!gtk_widget_has_focus (self->pv->search_entry)) + gtk_widget_grab_focus (self->pv->search_entry); + + GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->show (widget); +} + +static void +live_search_grab_focus (GtkWidget *widget) +{ + GcrLiveSearch *self = GCR_LIVE_SEARCH (widget); + + if (!gtk_widget_has_focus (self->pv->search_entry)) { + gtk_widget_grab_focus (self->pv->search_entry); + gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1); + } +} + +static void +_gcr_live_search_class_init (GcrLiveSearchClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + GParamSpec *param_spec; + + object_class->finalize = live_search_finalize; + object_class->dispose = live_search_dispose; + object_class->get_property = live_search_get_property; + object_class->set_property = live_search_set_property; + + widget_class->unmap = live_search_unmap; + widget_class->show = live_search_show; + widget_class->grab_focus = live_search_grab_focus; + + signals[ACTIVATE] = g_signal_new ("activate", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[KEYNAV] = g_signal_new ("key-navigation", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + g_signal_accumulator_true_handled, NULL, + _gcr_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, 1, GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); + + param_spec = g_param_spec_object ("hook-widget", "Live Search Hook Widget", + "The live search catches key-press-events on this widget", + GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_HOOK_WIDGET, param_spec); + + param_spec = g_param_spec_string ("text", "Live Search Text", + "The text of the live search entry", + "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_TEXT, param_spec); + + g_type_class_add_private (klass, sizeof (GcrLiveSearchPrivate)); +} + +static void +_gcr_live_search_init (GcrLiveSearch *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE ((self), GCR_TYPE_LIVE_SEARCH, + GcrLiveSearchPrivate); + + gtk_widget_set_no_show_all (GTK_WIDGET (self), TRUE); + + self->pv->search_entry = gtk_entry_new (); + gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->pv->search_entry), + GTK_ENTRY_ICON_SECONDARY, "window-close"); + gtk_entry_set_icon_activatable (GTK_ENTRY (self->pv->search_entry), + GTK_ENTRY_ICON_SECONDARY, TRUE); + gtk_entry_set_icon_sensitive (GTK_ENTRY (self->pv->search_entry), + GTK_ENTRY_ICON_SECONDARY, TRUE); + gtk_widget_show (self->pv->search_entry); + + gtk_box_pack_start (GTK_BOX (self), self->pv->search_entry, TRUE, TRUE, 0); + + g_signal_connect (self->pv->search_entry, "icon_release", + G_CALLBACK (on_search_entry_close_pressed), self); + g_signal_connect (self->pv->search_entry, "changed", + G_CALLBACK (on_search_entry_text_changed), self); + g_signal_connect (self->pv->search_entry, "key-press-event", + G_CALLBACK (on_search_entry_key_pressed), self); + g_signal_connect (self->pv->search_entry, "activate", + G_CALLBACK (on_search_entry_activate), self); + + self->pv->hook_widget = NULL; +} + +/** + * _gcr_live_search_new: + * @hook: (allow-none): the widget to hook + * + * Create a new #GcrLiveSearch. + * + * Returns: (transfer full) (type GcrUi.LiveSearch): The new widget + */ +GtkWidget * +_gcr_live_search_new (GtkWidget *hook) +{ + g_return_val_if_fail (hook == NULL || GTK_IS_WIDGET (hook), NULL); + + return g_object_new (GCR_TYPE_LIVE_SEARCH, + "hook-widget", hook, + NULL); +} + +/* public methods */ + +GtkWidget * +_gcr_live_search_get_hook_widget (GcrLiveSearch *self) +{ + g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL); + + return self->pv->hook_widget; +} + +void +_gcr_live_search_set_hook_widget (GcrLiveSearch *self, GtkWidget *hook) +{ + g_return_if_fail (GCR_IS_LIVE_SEARCH (self)); + g_return_if_fail (hook == NULL || GTK_IS_WIDGET (hook)); + + /* release the actual widget */ + live_search_release_hook_widget (self); + + /* connect handlers if new source is not null */ + if (hook != NULL) { + self->pv->hook_widget = g_object_ref (hook); + g_signal_connect (self->pv->hook_widget, "key-press-event", + G_CALLBACK (on_hook_widget_key_press_event), + self); + g_signal_connect (self->pv->hook_widget, "destroy", + G_CALLBACK (on_hook_widget_destroy), + self); + } +} + +const gchar * +_gcr_live_search_get_text (GcrLiveSearch *self) +{ + g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL); + + return gtk_entry_get_text (GTK_ENTRY (self->pv->search_entry)); +} + +void +_gcr_live_search_set_text (GcrLiveSearch *self, const gchar *text) +{ + g_return_if_fail (GCR_IS_LIVE_SEARCH (self)); + g_return_if_fail (text != NULL); + + gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), text); +} + +/** + * _gcr_live_search_match: + * @self: a #GcrLiveSearch + * @string: a string where to search, must be valid UTF-8. + * + * Search if one of the words in @string string starts with the current text + * of @self. + * + * Searching for "aba" in "Abasto" will match, searching in "Moraba" will not, + * and searching in "A tool (abacus)" will do. + * + * The match is not case-sensitive, and regardless of the accentuation marks. + * + * Returns: %TRUE if a match is found, %FALSE otherwise. + * + **/ +gboolean +_gcr_live_search_match (GcrLiveSearch *self, const gchar *string) +{ + g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), FALSE); + + return _gcr_live_search_match_words (string, self->pv->stripped_words); +} + +gboolean +_gcr_live_search_match_string (const gchar *string, const gchar *prefix) +{ + GPtrArray *words; + gboolean match; + + words = _gcr_live_search_strip_utf8_string (prefix); + match = _gcr_live_search_match_words (string, words); + if (words != NULL) + g_ptr_array_unref (words); + + return match; +} + +GPtrArray * +_gcr_live_search_get_words (GcrLiveSearch *self) +{ + return self->pv->stripped_words; +} diff --git a/ui/gcr-live-search.h b/ui/gcr-live-search.h new file mode 100644 index 0000000..cf048fd --- /dev/null +++ b/ui/gcr-live-search.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * Copyright (C) 2010 Collabora Ltd. + * Copyright (C) 2007-2010 Nokia Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Felix Kaser + * Xavier Claessens + * Claudio Saavedra + * Stef Walter + */ + +/* Code borrowed from Empathy */ + +#ifndef __GCR_LIVE_SEARCH_H__ +#define __GCR_LIVE_SEARCH_H__ + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_LIVE_SEARCH (_gcr_live_search_get_type ()) +#define GCR_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearch)) +#define GCR_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass)) +#define GCR_IS_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCR_TYPE_LIVE_SEARCH)) +#define GCR_IS_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCR_TYPE_LIVE_SEARCH)) +#define GCR_LIVE_SEARCH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass)) + +typedef struct _GcrLiveSearch GcrLiveSearch; +typedef struct _GcrLiveSearchClass GcrLiveSearchClass; +typedef struct _GcrLiveSearchPrivate GcrLiveSearchPrivate; + +struct _GcrLiveSearch { + /*< private >*/ + GtkBox parent; + GcrLiveSearchPrivate *pv; +}; + +struct _GcrLiveSearchClass { + GtkBoxClass parent_class; +}; + +GType _gcr_live_search_get_type (void) G_GNUC_CONST; + +GtkWidget * _gcr_live_search_new (GtkWidget *hook); + +GtkWidget * _gcr_live_search_get_hook_widget (GcrLiveSearch *self); +void _gcr_live_search_set_hook_widget (GcrLiveSearch *self, + GtkWidget *hook); + +const gchar * _gcr_live_search_get_text (GcrLiveSearch *self); +void _gcr_live_search_set_text (GcrLiveSearch *self, + const gchar *text); + +gboolean _gcr_live_search_match (GcrLiveSearch *self, + const gchar *string); + +GPtrArray * _gcr_live_search_strip_utf8_string (const gchar *string); + +gboolean _gcr_live_search_match_words (const gchar *string, + GPtrArray *words); + +GPtrArray * _gcr_live_search_get_words (GcrLiveSearch *self); + +/* Made public for unit tests */ +gboolean _gcr_live_search_match_string (const gchar *string, + const gchar *prefix); + +G_END_DECLS + +#endif /* __GCR_LIVE_SEARCH_H__ */ diff --git a/ui/gcr-pkcs11-import-dialog.c b/ui/gcr-pkcs11-import-dialog.c new file mode 100644 index 0000000..46781a9 --- /dev/null +++ b/ui/gcr-pkcs11-import-dialog.c @@ -0,0 +1,281 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-icons.h" + +#include "gcr-dialog-util.h" +#include "gcr-secure-entry-buffer.h" +#include "gcr-pkcs11-import-dialog.h" + +#include "egg/egg-secure-memory.h" + +#include + +#include + +EGG_SECURE_DECLARE (import_dialog); + +#define GCR_PKCS11_IMPORT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PKCS11_IMPORT_DIALOG, GcrPkcs11ImportDialogClass)) +#define GCR_IS_PKCS11_IMPORT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PKCS11_IMPORT_DIALOG)) +#define GCR_PKCS11_IMPORT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PKCS11_IMPORT_DIALOG, GcrPkcs11ImportDialogClass)) + +enum { + PROP_0, + PROP_IMPORTER +}; + +struct _GcrPkcs11ImportDialog { + GtkDialog parent; + GtkBuilder *builder; + GtkWidget *password_area; + GtkLabel *token_label; + GtkImage *token_image; + GtkEntry *password_entry; + GtkEntry *label_entry; + gboolean label_changed; +}; + +typedef struct _GcrPkcs11ImportDialogClass GcrPkcs11ImportDialogClass; + +struct _GcrPkcs11ImportDialogClass { + GtkDialogClass parent; +}; + +G_DEFINE_TYPE (GcrPkcs11ImportDialog, _gcr_pkcs11_import_dialog, GTK_TYPE_DIALOG); + +static void +on_label_changed (GtkEditable *editable, + gpointer user_data) +{ + GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (user_data); + self->label_changed = TRUE; +} + +static void +_gcr_pkcs11_import_dialog_constructed (GObject *obj) +{ + GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj); + GError *error = NULL; + GtkEntryBuffer *buffer; + GtkWidget *widget; + GtkBox *contents; + GtkWidget *button; + + G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->constructed (obj); + + if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/gcr/ui/gcr-pkcs11-import-dialog.ui", &error)) { + g_warning ("couldn't load ui builder file: %s", error->message); + return; + } + + /* Fill in the dialog from builder */ + widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "pkcs11-import-dialog")); + contents = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))); + gtk_box_pack_start (contents, widget, TRUE, TRUE, 0); + + /* The password area */ + self->password_area = GTK_WIDGET (gtk_builder_get_object (self->builder, "unlock-area")); + gtk_widget_hide (self->password_area); + + /* Add a secure entry */ + buffer = gcr_secure_entry_buffer_new (); + self->password_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "password-entry")); + gtk_entry_set_buffer (self->password_entry, buffer); + gtk_entry_set_activates_default (self->password_entry, TRUE); + g_object_unref (buffer); + + self->token_label = GTK_LABEL (gtk_builder_get_object (self->builder, "token-description")); + self->token_image = GTK_IMAGE (gtk_builder_get_object (self->builder, "token-image")); + + /* Setup the label */ + self->label_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "label-entry")); + g_signal_connect (self->label_entry, "changed", G_CALLBACK (on_label_changed), self); + gtk_entry_set_activates_default (self->label_entry, TRUE); + + /* Add our various buttons */ + button = gtk_dialog_add_button (GTK_DIALOG (self), _("_Cancel"), GTK_RESPONSE_CANCEL); + gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); + button = gtk_dialog_add_button (GTK_DIALOG (self), _("_OK"), GTK_RESPONSE_OK); + gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); + gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_OK); + + gtk_window_set_modal (GTK_WINDOW (self), TRUE); +} + +static void +_gcr_pkcs11_import_dialog_init (GcrPkcs11ImportDialog *self) +{ + self->builder = gtk_builder_new (); +} + +static void +_gcr_pkcs11_import_dialog_finalize (GObject *obj) +{ + GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj); + + g_object_unref (self->builder); + + G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->finalize (obj); +} + +static void +_gcr_pkcs11_import_dialog_class_init (GcrPkcs11ImportDialogClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructed = _gcr_pkcs11_import_dialog_constructed; + gobject_class->finalize = _gcr_pkcs11_import_dialog_finalize; +} + +GcrPkcs11ImportDialog * +_gcr_pkcs11_import_dialog_new (GtkWindow *parent) +{ + GcrPkcs11ImportDialog *dialog; + + g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL); + + dialog = g_object_new (GCR_TYPE_PKCS11_IMPORT_DIALOG, + "transient-for", parent, + NULL); + + return g_object_ref_sink (dialog); +} + +void +_gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self, + GckBuilder *builder) +{ + const gchar *label; + + g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self)); + g_return_if_fail (builder != NULL); + + label = gtk_entry_get_text (self->label_entry); + if (self->label_changed && label != NULL && label[0]) + gck_builder_set_string (builder, CKA_LABEL, label); +} + +void +_gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self, + GckBuilder *builder) +{ + gchar *label; + + g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self)); + g_return_if_fail (builder != NULL); + + if (!gck_builder_find_string (builder, CKA_LABEL, &label)) + label = NULL; + + if (label == NULL) + gtk_entry_set_placeholder_text (self->label_entry, _("Automatically chosen")); + gtk_entry_set_text (self->label_entry, label == NULL ? "" : label); + g_free (label); + + self->label_changed = FALSE; +} + +gboolean +_gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE); + + if (gtk_dialog_run (GTK_DIALOG (self)) == GTK_RESPONSE_OK) { + ret = TRUE; + } + + gtk_widget_hide (GTK_WIDGET (self)); + + return ret; +} + +void +_gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self)); + + _gcr_dialog_util_run_async (GTK_DIALOG (self), cancellable, callback, user_data); +} + +gboolean +_gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self, + GAsyncResult *result) +{ + gint response; + + g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE); + + response = _gcr_dialog_util_run_finish (GTK_DIALOG (self), result); + + gtk_widget_hide (GTK_WIDGET (self)); + + return (response == GTK_RESPONSE_OK) ? TRUE : FALSE; +} + +GTlsInteractionResult +_gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + GckTokenInfo *token_info; + const gchar *value; + GckSlot *slot; + GIcon *icon; + gboolean ret; + + g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (G_IS_TLS_PASSWORD (password), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED); + + if (GCK_IS_PASSWORD (password)) { + slot = gck_password_get_token (GCK_PASSWORD (password)); + token_info = gck_slot_get_token_info (slot); + icon = gcr_icon_for_token (token_info); + gtk_image_set_from_gicon (self->token_image, icon, GTK_ICON_SIZE_BUTTON); + gck_token_info_free (token_info); + g_object_unref (icon); + } + + gtk_label_set_text (self->token_label, g_tls_password_get_description (password)); + + gtk_widget_show (self->password_area); + + ret = _gcr_pkcs11_import_dialog_run (self); + + gtk_widget_hide (self->password_area); + + if (!ret) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("The user cancelled the operation")); + return G_TLS_INTERACTION_FAILED; + } + + value = gtk_entry_get_text (self->password_entry); + g_tls_password_set_value_full (password, egg_secure_strdup (value), + -1, egg_secure_free); + return G_TLS_INTERACTION_HANDLED; +} diff --git a/ui/gcr-pkcs11-import-dialog.h b/ui/gcr-pkcs11-import-dialog.h new file mode 100644 index 0000000..07a0205 --- /dev/null +++ b/ui/gcr-pkcs11-import-dialog.h @@ -0,0 +1,65 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_PKCS11_IMPORT_DIALOG_H__ +#define __GCR_PKCS11_IMPORT_DIALOG_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_PKCS11_IMPORT_DIALOG (_gcr_pkcs11_import_dialog_get_type ()) +#define GCR_PKCS11_IMPORT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PKCS11_IMPORT_DIALOG, GcrPkcs11ImportDialog)) +#define GCR_IS_PKCS11_IMPORT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PKCS11_IMPORT_DIALOG)) + +typedef struct _GcrPkcs11ImportDialog GcrPkcs11ImportDialog; + +GType _gcr_pkcs11_import_dialog_get_type (void) G_GNUC_CONST; + +GcrPkcs11ImportDialog * _gcr_pkcs11_import_dialog_new (GtkWindow *parent); + +void _gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self, + GckBuilder *builder); + +void _gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self, + GckBuilder *builder); + +gboolean _gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self); + +void _gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean _gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self, + GAsyncResult *result); + +GTlsInteractionResult _gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self, + GTlsPassword *password, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __GCR_PKCS11_IMPORT_DIALOG_H__ */ diff --git a/ui/gcr-pkcs11-import-dialog.ui b/ui/gcr-pkcs11-import-dialog.ui new file mode 100644 index 0000000..b95d0ff --- /dev/null +++ b/ui/gcr-pkcs11-import-dialog.ui @@ -0,0 +1,255 @@ + + + + + True + False + 6 + 6 + + + True + False + 0 + none + + + True + False + 12 + + + True + False + vertical + 6 + + + True + False + 0 + In order to import, please enter the password. + + + False + True + 0 + + + + + True + False + 6 + 12 + + + True + True + + False + 20 + True + + + 1 + 1 + 1 + 1 + + + + + True + False + 0 + Password: + + + 0 + 1 + 1 + 1 + + + + + True + False + 0 + Token: + + + 0 + 0 + 1 + 1 + + + + + True + False + 6 + + + True + False + gtk-missing-image + + + False + True + 0 + + + + + True + False + 0 + + + + True + True + 1 + + + + + 1 + 0 + 1 + 1 + + + + + False + True + 1 + + + + + + + + + True + False + 0 + Unlock + + + + + + + + True + True + 0 + + + + + True + False + 0 + none + + + True + False + 12 + + + True + False + 6 + 12 + + + True + False + 0 + Label: + + + 0 + 0 + 1 + 1 + + + + + True + True + + 20 + True + + + 1 + 0 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + False + 6 + 0 + Import settings + + + + + + + + True + True + 1 + + + + + GTK_SIZE_GROUP_HORIZONTAL + + + + + + + diff --git a/ui/gcr-pkcs11-import-interaction.c b/ui/gcr-pkcs11-import-interaction.c new file mode 100644 index 0000000..52e9fe3 --- /dev/null +++ b/ui/gcr-pkcs11-import-interaction.c @@ -0,0 +1,258 @@ +/* + * gnome-keyring + * + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-import-interaction.h" + +#include "gcr-dialog-util.h" +#include "gcr-pkcs11-import-interaction.h" + +#include + +#define GCR_PKCS11_IMPORT_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PKCS11_IMPORT_INTERACTION, GcrPkcs11ImportInteractionClass)) +#define GCR_IS_PKCS11_IMPORT_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PKCS11_IMPORT_INTERACTION)) +#define GCR_PKCS11_IMPORT_INTERACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PKCS11_IMPORT_INTERACTION, GcrPkcs11ImportInteractionClass)) + +enum { + PROP_0, + PROP_PARENT_WINDOW +}; + +typedef struct _GcrPkcs11ImportInteractionClass GcrPkcs11ImportInteractionClass; + +struct _GcrPkcs11ImportInteraction { + GTlsInteraction parent; + gboolean supplemented; + GtkWindow *parent_window; + GcrPkcs11ImportDialog *dialog; +}; + +struct _GcrPkcs11ImportInteractionClass { + GTlsInteractionClass parent_class; +}; + +static void _gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface); + +G_DEFINE_TYPE_WITH_CODE(GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction, G_TYPE_TLS_INTERACTION, + G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORT_INTERACTION, _gcr_pkcs11_import_interaction_iface_init)); + +static void +_gcr_pkcs11_import_interaction_init (GcrPkcs11ImportInteraction *self) +{ + self->dialog = _gcr_pkcs11_import_dialog_new (self->parent_window); +} + +static void +_gcr_pkcs11_import_interaction_dispose (GObject *obj) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj); + + g_clear_object (&self->dialog); + + G_OBJECT_CLASS (_gcr_pkcs11_import_interaction_parent_class)->dispose (obj); +} + +static void +_gcr_pkcs11_import_interaction_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj); + + switch (prop_id) { + case PROP_PARENT_WINDOW: + gtk_window_set_transient_for (GTK_WINDOW (self->dialog), + g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_pkcs11_import_interaction_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj); + + switch (prop_id) { + case PROP_PARENT_WINDOW: + g_value_set_object (value, gtk_window_get_transient_for (GTK_WINDOW (self->dialog))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static GTlsInteractionResult +_gcr_pkcs11_import_interaction_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); + + g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED); + + self->supplemented = TRUE; + return _gcr_pkcs11_import_dialog_run_ask_password (self->dialog, password, cancellable, error); +} + +static void +_gcr_pkcs11_import_interaction_supplement_prep (GcrImportInteraction *interaction, + GckBuilder *builder) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); + + self->supplemented = FALSE; + _gcr_pkcs11_import_dialog_set_supplements (self->dialog, builder); +} + +static GTlsInteractionResult +_gcr_pkcs11_import_interaction_supplement (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GError **error) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); + + g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED); + + if (self->supplemented) + return G_TLS_INTERACTION_HANDLED; + + self->supplemented = TRUE; + if (_gcr_pkcs11_import_dialog_run (self->dialog)) { + _gcr_pkcs11_import_dialog_get_supplements (self->dialog, builder); + return G_TLS_INTERACTION_HANDLED; + + } else { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("The user cancelled the operation")); + return G_TLS_INTERACTION_FAILED; + } +} + +static void +on_dialog_run_async (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GckBuilder *builder = g_simple_async_result_get_op_res_gpointer (res); + + if (_gcr_pkcs11_import_dialog_run_finish (GCR_PKCS11_IMPORT_DIALOG (source), result)) { + _gcr_pkcs11_import_dialog_get_supplements (GCR_PKCS11_IMPORT_DIALOG (source), builder); + + } else { + g_simple_async_result_set_error (res, G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("The user cancelled the operation")); + } + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +_gcr_pkcs11_import_interaction_supplement_async (GcrImportInteraction *interaction, + GckBuilder *builder, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); + GSimpleAsyncResult *res; + + g_return_if_fail (self->dialog != NULL); + + res = g_simple_async_result_new (G_OBJECT (interaction), callback, user_data, + _gcr_pkcs11_import_interaction_supplement_async); + + /* If dialog was already shown, then short circuit */ + if (self->supplemented) { + g_simple_async_result_complete_in_idle (res); + + } else { + self->supplemented = TRUE; + g_simple_async_result_set_op_res_gpointer (res, gck_builder_ref (builder), + (GDestroyNotify)gck_builder_unref); + _gcr_pkcs11_import_dialog_run_async (self->dialog, cancellable, + on_dialog_run_async, g_object_ref (res)); + } + + g_object_unref (res); +} + +static GTlsInteractionResult +_gcr_pkcs11_import_interaction_supplement_finish (GcrImportInteraction *interaction, + GAsyncResult *result, + GError **error) +{ + GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); + + g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (interaction), + _gcr_pkcs11_import_interaction_supplement_async), G_TLS_INTERACTION_UNHANDLED); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return G_TLS_INTERACTION_FAILED; + + return G_TLS_INTERACTION_HANDLED; + +} + +static void +_gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface) +{ + iface->supplement_prep = _gcr_pkcs11_import_interaction_supplement_prep; + iface->supplement = _gcr_pkcs11_import_interaction_supplement; + iface->supplement_async = _gcr_pkcs11_import_interaction_supplement_async; + iface->supplement_finish = _gcr_pkcs11_import_interaction_supplement_finish; +} + +static void +_gcr_pkcs11_import_interaction_class_init (GcrPkcs11ImportInteractionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass); + + gobject_class->dispose = _gcr_pkcs11_import_interaction_dispose; + gobject_class->set_property = _gcr_pkcs11_import_interaction_set_property; + gobject_class->get_property = _gcr_pkcs11_import_interaction_get_property; + + interaction_class->ask_password = _gcr_pkcs11_import_interaction_ask_password; + + g_object_class_install_property (gobject_class, PROP_PARENT_WINDOW, + g_param_spec_object ("parent-window", "Parent Window", "Prompt Parent Window", + GTK_TYPE_WINDOW, G_PARAM_READWRITE)); +} + +GTlsInteraction * +_gcr_pkcs11_import_interaction_new (GtkWindow *parent_window) +{ + g_return_val_if_fail (parent_window == NULL || GTK_IS_WINDOW (parent_window), NULL); + return g_object_new (GCR_TYPE_PKCS11_IMPORT_INTERACTION, + "parent-window", parent_window, + NULL); +} diff --git a/ui/gcr-pkcs11-import-interaction.h b/ui/gcr-pkcs11-import-interaction.h new file mode 100644 index 0000000..041aaf5 --- /dev/null +++ b/ui/gcr-pkcs11-import-interaction.h @@ -0,0 +1,41 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef __GCR_PKCS11_IMPORT_INTERACTION_H__ +#define __GCR_PKCS11_IMPORT_INTERACTION_H__ + +#include "gcr-pkcs11-import-dialog.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_PKCS11_IMPORT_INTERACTION (_gcr_pkcs11_import_interaction_get_type ()) +#define GCR_PKCS11_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PKCS11_IMPORT_INTERACTION, GcrPkcs11ImportInteraction)) +#define GCR_IS_PKCS11_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PKCS11_IMPORT_INTERACTION)) + +typedef struct _GcrPkcs11ImportInteraction GcrPkcs11ImportInteraction; + +GType _gcr_pkcs11_import_interaction_get_type (void) G_GNUC_CONST; + +GTlsInteraction * _gcr_pkcs11_import_interaction_new (GtkWindow *parent_window); + +G_END_DECLS + +#endif /* __GCR_PKCS11_IMPORT_INTERACTION_H__ */ diff --git a/ui/gcr-prompt-dialog.c b/ui/gcr-prompt-dialog.c new file mode 100644 index 0000000..48088d7 --- /dev/null +++ b/ui/gcr-prompt-dialog.c @@ -0,0 +1,964 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "gcr/gcr-prompt.h" + +#include "gcr-prompt-dialog.h" +#include "gcr-secure-entry-buffer.h" + +#include +#include +#include + +/** + * SECTION:gcr-prompt-dialog + * @title: GcrPromptDialog + * @short_description: a GTK+ dialog prompt + * + * A #GcrPrompt implementation which shows a GTK+ dialog. The dialog will + * remain visible (but insensitive) between prompts. If the user cancels the + * dialog between prompts, then the dialog will be hidden. + */ + +/** + * GcrPromptDialog: + * + * A #GcrPrompt implementation which shows a GTK+ dialog. + */ + +/** + * GcrPromptDialogClass: + * @parent_class: parent class + * + * The class for #GcrPromptDialog. + */ + +#ifdef GCR_DISABLE_GRABS +#define GRAB_KEYBOARD 0 +#else +#define GRAB_KEYBOARD 1 +#endif + +typedef enum { + PROMPT_NONE, + PROMPT_CONFIRMING, + PROMPT_PASSWORDING +} PromptMode; + +enum { + PROP_0, + PROP_MESSAGE, + PROP_DESCRIPTION, + PROP_WARNING, + PROP_CHOICE_LABEL, + PROP_CHOICE_CHOSEN, + PROP_PASSWORD_NEW, + PROP_PASSWORD_STRENGTH, + PROP_CALLER_WINDOW, + PROP_CONTINUE_LABEL, + PROP_CANCEL_LABEL, + + PROP_PASSWORD_VISIBLE, + PROP_CONFIRM_VISIBLE, + PROP_WARNING_VISIBLE, + PROP_CHOICE_VISIBLE, +}; + +struct _GcrPromptDialogPrivate { + gchar *title; + gchar *message; + gchar *description; + gchar *warning; + gchar *choice_label; + gboolean choice_chosen; + gboolean password_new; + guint password_strength; + gchar *caller_window; + gchar *continue_label; + gchar *cancel_label; + + GSimpleAsyncResult *async_result; + GcrPromptReply last_reply; + GtkWidget *widget_grid; + GtkWidget *continue_button; + GtkWidget *spinner; + GtkWidget *image; + GtkWidget *password_entry; + GtkEntryBuffer *password_buffer; + GtkEntryBuffer *confirm_buffer; + PromptMode mode; + GdkDevice *grabbed_device; + gulong grab_broken_id; + gboolean grab_disabled; + gboolean was_closed; +}; + +static void gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface); + +static gboolean ungrab_keyboard (GtkWidget *win, + GdkEvent *event, + gpointer unused); + +G_DEFINE_TYPE_WITH_CODE (GcrPromptDialog, gcr_prompt_dialog, GTK_TYPE_DIALOG, + G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_prompt_dialog_prompt_iface); +); + +static void +update_transient_for (GcrPromptDialog *self) +{ + GdkDisplay *display; + GdkWindow *transient_for; + GdkWindow *window; + gint64 handle; + gchar *end; + + if (self->pv->caller_window == NULL || g_str_equal (self->pv->caller_window, "")) { + gtk_window_set_modal (GTK_WINDOW (self), FALSE); + return; + } + + window = gtk_widget_get_window (GTK_WIDGET (self)); + if (window == NULL) + return; + + handle = g_ascii_strtoll (self->pv->caller_window, &end, 10); + if (!end || *end != '\0') { + g_warning ("couldn't parse caller-window property: %s", self->pv->caller_window); + return; + } + + display = gtk_widget_get_display (GTK_WIDGET (self)); + transient_for = gdk_x11_window_foreign_new_for_display (display, (Window)handle); + if (transient_for == NULL) { + g_warning ("caller-window property doesn't represent a window on current display: %s", + self->pv->caller_window); + } else { + gdk_window_set_transient_for (window, transient_for); + g_object_unref (transient_for); + } + + gtk_window_set_modal (GTK_WINDOW (self), TRUE); +} + +static void +gcr_prompt_dialog_init (GcrPromptDialog *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_PROMPT_DIALOG, + GcrPromptDialogPrivate); + + /* + * This is a stupid hack to work around to help the window act like + * a normal object with regards to reference counting and unref. + */ + gtk_window_set_has_user_ref_count (GTK_WINDOW (self), FALSE); +} + +static void +gcr_prompt_dialog_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); + + switch (prop_id) { + case PROP_MESSAGE: + g_free (self->pv->message); + self->pv->message = g_value_dup_string (value); + g_object_notify (obj, "message"); + break; + case PROP_DESCRIPTION: + g_free (self->pv->description); + self->pv->description = g_value_dup_string (value); + g_object_notify (obj, "description"); + break; + case PROP_WARNING: + g_free (self->pv->warning); + self->pv->warning = g_value_dup_string (value); + if (self->pv->warning && self->pv->warning[0] == '\0') { + g_free (self->pv->warning); + self->pv->warning = NULL; + } + g_object_notify (obj, "warning"); + g_object_notify (obj, "warning-visible"); + break; + case PROP_CHOICE_LABEL: + g_free (self->pv->choice_label); + self->pv->choice_label = g_value_dup_string (value); + if (self->pv->choice_label && self->pv->choice_label[0] == '\0') { + g_free (self->pv->choice_label); + self->pv->choice_label = NULL; + } + g_object_notify (obj, "choice-label"); + g_object_notify (obj, "choice-visible"); + break; + case PROP_CHOICE_CHOSEN: + self->pv->choice_chosen = g_value_get_boolean (value); + g_object_notify (obj, "choice-chosen"); + break; + case PROP_PASSWORD_NEW: + self->pv->password_new = g_value_get_boolean (value); + g_object_notify (obj, "password-new"); + g_object_notify (obj, "confirm-visible"); + break; + case PROP_CALLER_WINDOW: + g_free (self->pv->caller_window); + self->pv->caller_window = g_value_dup_string (value); + if (self->pv->caller_window && self->pv->caller_window[0] == '\0') { + g_free (self->pv->caller_window); + self->pv->caller_window = NULL; + } + update_transient_for (self); + g_object_notify (obj, "caller-window"); + break; + case PROP_CONTINUE_LABEL: + g_free (self->pv->continue_label); + self->pv->continue_label = g_value_dup_string (value); + g_object_notify (obj, "continue-label"); + break; + case PROP_CANCEL_LABEL: + g_free (self->pv->cancel_label); + self->pv->cancel_label = g_value_dup_string (value); + g_object_notify (obj, "cancel-label"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_prompt_dialog_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); + + switch (prop_id) { + case PROP_MESSAGE: + g_value_set_string (value, self->pv->message); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, self->pv->description); + break; + case PROP_WARNING: + g_value_set_string (value, self->pv->warning); + break; + case PROP_CHOICE_LABEL: + g_value_set_string (value, self->pv->choice_label); + break; + case PROP_CHOICE_CHOSEN: + g_value_set_boolean (value, self->pv->choice_chosen); + break; + case PROP_PASSWORD_NEW: + g_value_set_boolean (value, self->pv->password_new); + break; + case PROP_PASSWORD_STRENGTH: + g_value_set_int (value, self->pv->password_strength); + break; + case PROP_CALLER_WINDOW: + g_value_set_string (value, self->pv->caller_window); + break; + case PROP_PASSWORD_VISIBLE: + g_value_set_boolean (value, self->pv->mode == PROMPT_PASSWORDING); + break; + case PROP_CONFIRM_VISIBLE: + g_value_set_boolean (value, self->pv->password_new && + self->pv->mode == PROMPT_PASSWORDING); + break; + case PROP_WARNING_VISIBLE: + g_value_set_boolean (value, self->pv->warning && self->pv->warning[0]); + break; + case PROP_CHOICE_VISIBLE: + g_value_set_boolean (value, self->pv->choice_label && self->pv->choice_label[0]); + break; + case PROP_CONTINUE_LABEL: + g_value_set_string (value, self->pv->continue_label); + break; + case PROP_CANCEL_LABEL: + g_value_set_string (value, self->pv->cancel_label); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + + +static void +on_password_changed (GtkEditable *editable, + gpointer user_data) +{ + int upper, lower, digit, misc; + const char *password; + gdouble pwstrength; + int length, i; + + password = gtk_entry_get_text (GTK_ENTRY (editable)); + + /* + * This code is based on the Master Password dialog in Firefox + * (pref-masterpass.js) + * Original code triple-licensed under the MPL, GPL, and LGPL + * so is license-compatible with this file + */ + + length = strlen (password); + upper = 0; + lower = 0; + digit = 0; + misc = 0; + + for ( i = 0; i < length ; i++) { + if (g_ascii_isdigit (password[i])) + digit++; + else if (g_ascii_islower (password[i])) + lower++; + else if (g_ascii_isupper (password[i])) + upper++; + else + misc++; + } + + if (length > 5) + length = 5; + if (digit > 3) + digit = 3; + if (upper > 3) + upper = 3; + if (misc > 3) + misc = 3; + + pwstrength = ((length * 0.1) - 0.2) + + (digit * 0.1) + + (misc * 0.15) + + (upper * 0.1); + + if (pwstrength < 0.0) + pwstrength = 0.0; + if (pwstrength > 1.0) + pwstrength = 1.0; + + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (user_data), pwstrength); +} + + +static const gchar* +grab_status_message (GdkGrabStatus status) +{ + switch (status) { + case GDK_GRAB_SUCCESS: + g_return_val_if_reached (""); + break; + case GDK_GRAB_ALREADY_GRABBED: + return "already grabbed"; + case GDK_GRAB_INVALID_TIME: + return "invalid time"; + case GDK_GRAB_NOT_VIEWABLE: + return "not viewable"; + case GDK_GRAB_FROZEN: + return "frozen"; + default: + g_message ("unknown grab status: %d", (int)status); + return "unknown"; + } +} + +static gboolean +on_grab_broken (GtkWidget *widget, + GdkEventGrabBroken * event, + gpointer user_data) +{ + ungrab_keyboard (widget, (GdkEvent *)event, user_data); + return TRUE; +} + +static gboolean +grab_keyboard (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data); + GdkGrabStatus status; + guint32 at; + GdkDevice *device = NULL; + GdkDeviceManager *manager; + GdkDisplay *display; + GList *devices, *l; + + if (self->pv->grabbed_device || !GRAB_KEYBOARD) + return FALSE; + + display = gtk_widget_get_display (widget); + manager = gdk_display_get_device_manager (display); + devices = gdk_device_manager_list_devices (manager, GDK_DEVICE_TYPE_MASTER); + for (l = devices; l; l = g_list_next (l)) { + device = l->data; + if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) + break; + } + g_list_free (devices); + + if (!device) { + g_message ("couldn't find device to grab"); + return FALSE; + } + + at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME; + status = gdk_device_grab (device, gtk_widget_get_window (widget), + GDK_OWNERSHIP_APPLICATION, TRUE, + GDK_KEY_PRESS | GDK_KEY_RELEASE, NULL, at); + if (status == GDK_GRAB_SUCCESS) { + self->pv->grab_broken_id = g_signal_connect (widget, "grab-broken-event", + G_CALLBACK (on_grab_broken), self); + gtk_device_grab_add (widget, device, TRUE); + self->pv->grabbed_device = device; + } else { + g_message ("could not grab keyboard: %s", grab_status_message (status)); + } + + /* Always return false, so event is handled elsewhere */ + return FALSE; +} + +static gboolean +ungrab_keyboard (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + guint32 at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME; + GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data); + + if (self->pv->grabbed_device) { + g_signal_handler_disconnect (widget, self->pv->grab_broken_id); + gdk_device_ungrab (self->pv->grabbed_device, at); + gtk_device_grab_remove (widget, self->pv->grabbed_device); + self->pv->grabbed_device = NULL; + self->pv->grab_broken_id = 0; + } + + /* Always return false, so event is handled elsewhere */ + return FALSE; +} + +static gboolean +window_state_changed (GtkWidget *win, GdkEventWindowState *event, gpointer data) +{ + GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (win)); + GcrPromptDialog *self = GCR_PROMPT_DIALOG (data); + + if (state & GDK_WINDOW_STATE_WITHDRAWN || + state & GDK_WINDOW_STATE_ICONIFIED || + state & GDK_WINDOW_STATE_FULLSCREEN || + state & GDK_WINDOW_STATE_MAXIMIZED) { + self->pv->grab_disabled = TRUE; + ungrab_keyboard (win, (GdkEvent*)event, data); + } else if (self->pv->grab_disabled) { + self->pv->grab_disabled = FALSE; + grab_keyboard (win, (GdkEvent*)event, data); + } + + return FALSE; +} + +static void +gcr_prompt_dialog_constructed (GObject *obj) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); + GtkDialog *dialog; + PangoAttrList *attrs; + GtkWidget *widget; + GtkWidget *entry; + GtkWidget *content; + GtkWidget *button; + GtkGrid *grid; + + G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->constructed (obj); + + dialog = GTK_DIALOG (self); + button = gtk_dialog_add_button (dialog, _("_Cancel"), GTK_RESPONSE_CANCEL); + g_object_bind_property (self, "cancel-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); + gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); + button = gtk_dialog_add_button (dialog, _("_OK"), GTK_RESPONSE_OK); + g_object_bind_property (self, "continue-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); + gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); + self->pv->continue_button = button; + + gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_NORMAL); + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE); + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK); + + content = gtk_dialog_get_content_area (dialog); + + grid = GTK_GRID (gtk_grid_new ()); + gtk_container_set_border_width (GTK_CONTAINER (grid), 6); + gtk_widget_set_hexpand (GTK_WIDGET (grid), TRUE); + gtk_grid_set_column_homogeneous (grid, FALSE); + gtk_grid_set_column_spacing (grid, 12); + gtk_grid_set_row_spacing (grid, 6); + + /* The prompt image */ + self->pv->image = gtk_image_new_from_icon_name ("dialog-password", GTK_ICON_SIZE_DIALOG); + gtk_widget_set_valign (self->pv->image, GTK_ALIGN_START); + gtk_grid_attach (grid, self->pv->image, -1, 0, 1, 4); + gtk_widget_show (self->pv->image); + + /* The prompt spinner on the continue button */ + widget = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), + GTK_RESPONSE_OK); + self->pv->spinner = gtk_spinner_new (); + gtk_button_set_image (GTK_BUTTON (widget), self->pv->spinner); + gtk_button_set_image_position (GTK_BUTTON (widget), GTK_POS_LEFT); + + /* The message label */ + widget = gtk_label_new (""); + attrs = pango_attr_list_new (); + pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD)); + pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_LARGE)); + gtk_label_set_attributes (GTK_LABEL (widget), attrs); + pango_attr_list_unref (attrs); + gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_widget_set_hexpand (widget, TRUE); + gtk_widget_set_margin_bottom (widget, 8); + g_object_bind_property (self, "message", widget, "label", G_BINDING_DEFAULT); + gtk_grid_attach (grid, widget, 0, 0, 2, 1); + gtk_widget_show (widget); + + /* The description label */ + widget = gtk_label_new (""); + gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_widget_set_hexpand (widget, TRUE); + gtk_widget_set_margin_bottom (widget, 4); + g_object_bind_property (self, "description", widget, "label", G_BINDING_DEFAULT); + gtk_grid_attach (grid, widget, 0, 1, 2, 1); + gtk_widget_show (widget); + + /* The password label */ + widget = gtk_label_new (_("Password:")); + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_widget_set_hexpand (widget, FALSE); + g_object_bind_property (self, "password-visible", widget, "visible", G_BINDING_DEFAULT); + gtk_grid_attach (grid, widget, 0, 2, 1, 1); + + /* The password entry */ + self->pv->password_buffer = gcr_secure_entry_buffer_new (); + entry = gtk_entry_new_with_buffer (self->pv->password_buffer); + gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + gtk_widget_set_hexpand (entry, TRUE); + g_object_bind_property (self, "password-visible", entry, "visible", G_BINDING_DEFAULT); + gtk_grid_attach (grid, entry, 1, 2, 1, 1); + self->pv->password_entry = entry; + + /* The confirm label */ + widget = gtk_label_new (_("Confirm:")); + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_widget_set_hexpand (widget, FALSE); + g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT); + gtk_grid_attach (grid, widget, 0, 3, 1, 1); + + /* The confirm entry */ + self->pv->confirm_buffer = gcr_secure_entry_buffer_new (); + widget = gtk_entry_new_with_buffer (self->pv->confirm_buffer); + gtk_widget_set_hexpand (widget, TRUE); + gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE); + gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); + g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT); + gtk_grid_attach (grid, widget, 1, 3, 1, 1); + + /* The quality progress bar */ + widget = gtk_progress_bar_new (); + gtk_widget_set_hexpand (widget, TRUE); + g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT); + gtk_grid_attach (grid, widget, 1, 4, 1, 1); + g_signal_connect (entry, "changed", G_CALLBACK (on_password_changed), widget); + + /* The warning */ + widget = gtk_label_new (""); + attrs = pango_attr_list_new (); + pango_attr_list_insert (attrs, pango_attr_style_new (PANGO_STYLE_ITALIC)); + gtk_label_set_attributes (GTK_LABEL (widget), attrs); + pango_attr_list_unref (attrs); + gtk_widget_set_hexpand (widget, FALSE); + g_object_bind_property (self, "warning", widget, "label", G_BINDING_DEFAULT); + g_object_bind_property (self, "warning-visible", widget, "visible", G_BINDING_DEFAULT); + gtk_grid_attach (grid, widget, 0, 5, 2, 1); + gtk_widget_show (widget); + + /* The checkbox */ + widget = gtk_check_button_new (); + g_object_bind_property (self, "choice-label", widget, "label", G_BINDING_DEFAULT); + g_object_bind_property (self, "choice-visible", widget, "visible", G_BINDING_DEFAULT); + g_object_bind_property (self, "choice-chosen", widget, "active", G_BINDING_BIDIRECTIONAL); + gtk_widget_set_hexpand (widget, FALSE); + gtk_grid_attach (grid, widget, 0, 6, 2, 1); + + gtk_container_add (GTK_CONTAINER (content), GTK_WIDGET (grid)); + gtk_widget_show (GTK_WIDGET (grid)); + self->pv->widget_grid = GTK_WIDGET (grid); + + g_signal_connect (self, "map-event", G_CALLBACK (grab_keyboard), self); + g_signal_connect (self, "unmap-event", G_CALLBACK (ungrab_keyboard), self); + g_signal_connect (self, "window-state-event", G_CALLBACK (window_state_changed), self); + +} + +static gboolean +handle_password_response (GcrPromptDialog *self) +{ + const gchar *password; + const gchar *confirm; + const gchar *env; + gint strength; + + password = gtk_entry_buffer_get_text (self->pv->password_buffer); + + /* Is it a new password? */ + if (self->pv->password_new) { + confirm = gtk_entry_buffer_get_text (self->pv->confirm_buffer); + + /* Do the passwords match? */ + if (!g_str_equal (password, confirm)) { + gcr_prompt_set_warning (GCR_PROMPT (self), _("Passwords do not match.")); + return FALSE; + } + + /* Don't allow blank passwords if in paranoid mode */ + env = g_getenv ("GNOME_KEYRING_PARANOID"); + if (env && *env) { + gcr_prompt_set_warning (GCR_PROMPT (self), _("Password cannot be blank")); + return FALSE; + } + } + + if (g_str_equal (password, "")) + strength = 0; + else + strength = 1; + + self->pv->password_strength = strength; + g_object_notify (G_OBJECT (self), "password-strength"); + return TRUE; +} + +static void +gcr_prompt_dialog_response (GtkDialog *dialog, + gint response_id) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (dialog); + GSimpleAsyncResult *res; + + /* + * If this is called while no prompting is going on, then the dialog + * is waiting for the caller to perform some action. Close the dialog. + */ + + if (self->pv->mode == PROMPT_NONE) { + g_return_if_fail (response_id != GTK_RESPONSE_OK); + gcr_prompt_close (GCR_PROMPT (self)); + return; + } + + switch (response_id) { + case GTK_RESPONSE_OK: + switch (self->pv->mode) { + case PROMPT_PASSWORDING: + if (!handle_password_response (self)) + return; + break; + default: + break; + } + self->pv->last_reply = GCR_PROMPT_REPLY_CONTINUE; + break; + + default: + self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL; + break; + } + + gtk_widget_set_sensitive (self->pv->continue_button, FALSE); + gtk_widget_set_sensitive (self->pv->widget_grid, FALSE); + gtk_widget_show (self->pv->spinner); + gtk_spinner_start (GTK_SPINNER (self->pv->spinner)); + self->pv->mode = PROMPT_NONE; + + res = self->pv->async_result; + self->pv->async_result = NULL; + + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +gcr_prompt_dialog_dispose (GObject *obj) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); + + gcr_prompt_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_DELETE_EVENT); + g_assert (self->pv->async_result == NULL); + + gcr_prompt_close (GCR_PROMPT (self)); + + ungrab_keyboard (GTK_WIDGET (self), NULL, self); + g_assert (self->pv->grabbed_device == NULL); + + G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->dispose (obj); +} + +static void +gcr_prompt_dialog_finalize (GObject *obj) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); + + g_free (self->pv->title); + g_free (self->pv->message); + g_free (self->pv->description); + g_free (self->pv->warning); + g_free (self->pv->choice_label); + g_free (self->pv->caller_window); + + g_object_unref (self->pv->password_buffer); + g_object_unref (self->pv->confirm_buffer); + + G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->finalize (obj); +} + +static void +gcr_prompt_dialog_class_init (GcrPromptDialogClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass); + + gobject_class->constructed = gcr_prompt_dialog_constructed; + gobject_class->get_property = gcr_prompt_dialog_get_property; + gobject_class->set_property = gcr_prompt_dialog_set_property; + gobject_class->dispose = gcr_prompt_dialog_dispose; + gobject_class->finalize = gcr_prompt_dialog_finalize; + + dialog_class->response = gcr_prompt_dialog_response; + + g_type_class_add_private (gobject_class, sizeof (GcrPromptDialogPrivate)); + + g_object_class_override_property (gobject_class, PROP_MESSAGE, "message"); + + g_object_class_override_property (gobject_class, PROP_DESCRIPTION, "description"); + + g_object_class_override_property (gobject_class, PROP_WARNING, "warning"); + + g_object_class_override_property (gobject_class, PROP_PASSWORD_NEW, "password-new"); + + g_object_class_override_property (gobject_class, PROP_PASSWORD_STRENGTH, "password-strength"); + + g_object_class_override_property (gobject_class, PROP_CHOICE_LABEL, "choice-label"); + + g_object_class_override_property (gobject_class, PROP_CHOICE_CHOSEN, "choice-chosen"); + + g_object_class_override_property (gobject_class, PROP_CALLER_WINDOW, "caller-window"); + + g_object_class_override_property (gobject_class, PROP_CONTINUE_LABEL, "continue-label"); + + g_object_class_override_property (gobject_class, PROP_CANCEL_LABEL, "cancel-label"); + + /** + * GcrPromptDialog:password-visible: + * + * Whether the password entry is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_PASSWORD_VISIBLE, + g_param_spec_boolean ("password-visible", "Password visible", "Password field is visible", + FALSE, G_PARAM_READABLE)); + + /** + * GcrPromptDialog:confirm-visible: + * + * Whether the password confirm entry is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_CONFIRM_VISIBLE, + g_param_spec_boolean ("confirm-visible", "Confirm visible", "Confirm field is visible", + FALSE, G_PARAM_READABLE)); + + /** + * GcrPromptDialog:warning-visible: + * + * Whether the warning label is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_WARNING_VISIBLE, + g_param_spec_boolean ("warning-visible", "Warning visible", "Warning is visible", + FALSE, G_PARAM_READABLE)); + + /** + * GcrPromptDialog:choice-visible: + * + * Whether the choice check box is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_CHOICE_VISIBLE, + g_param_spec_boolean ("choice-visible", "Choice visible", "Choice is visible", + FALSE, G_PARAM_READABLE)); +} + +static void +gcr_prompt_dialog_password_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); + GObject *obj; + + if (self->pv->async_result != NULL) { + g_warning ("this prompt is already prompting"); + return; + } + + self->pv->mode = PROMPT_PASSWORDING; + self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, + gcr_prompt_dialog_password_async); + + gtk_entry_buffer_set_text (self->pv->password_buffer, "", 0); + gtk_entry_buffer_set_text (self->pv->confirm_buffer, "", 0); + + if (self->pv->was_closed) { + self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL; + g_simple_async_result_complete_in_idle (self->pv->async_result); + return; + } + + gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image), + "dialog-password", GTK_ICON_SIZE_DIALOG); + gtk_widget_set_sensitive (self->pv->continue_button, TRUE); + gtk_widget_set_sensitive (self->pv->widget_grid, TRUE); + gtk_widget_hide (self->pv->spinner); + gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); + + obj = G_OBJECT (self); + g_object_notify (obj, "password-visible"); + g_object_notify (obj, "confirm-visible"); + g_object_notify (obj, "warning-visible"); + g_object_notify (obj, "choice-visible"); + + gtk_widget_grab_focus (self->pv->password_entry); + gtk_widget_show (GTK_WIDGET (self)); +} + +static const gchar * +gcr_prompt_dialog_password_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt), + gcr_prompt_dialog_password_async), NULL); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return NULL; + + if (self->pv->last_reply == GCR_PROMPT_REPLY_CONTINUE) + return gtk_entry_buffer_get_text (self->pv->password_buffer); + return NULL; +} + +static void +gcr_prompt_dialog_confirm_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); + GtkWidget *button; + GObject *obj; + + if (self->pv->async_result != NULL) { + g_warning ("this prompt is already prompting"); + return; + } + + self->pv->mode = PROMPT_CONFIRMING; + self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, + gcr_prompt_dialog_confirm_async); + + if (self->pv->was_closed) { + self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL; + g_simple_async_result_complete_in_idle (self->pv->async_result); + return; + } + + gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image), + "dialog-question", GTK_ICON_SIZE_DIALOG); + gtk_widget_set_sensitive (self->pv->continue_button, TRUE); + gtk_widget_set_sensitive (self->pv->widget_grid, TRUE); + gtk_widget_hide (self->pv->spinner); + gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); + + button = gtk_dialog_get_widget_for_response (GTK_DIALOG (self), GTK_RESPONSE_OK); + gtk_widget_grab_focus (button); + + obj = G_OBJECT (self); + g_object_notify (obj, "password-visible"); + g_object_notify (obj, "confirm-visible"); + g_object_notify (obj, "warning-visible"); + g_object_notify (obj, "choice-visible"); + + gtk_widget_show (GTK_WIDGET (self)); +} + +static GcrPromptReply +gcr_prompt_dialog_confirm_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt), + gcr_prompt_dialog_confirm_async), GCR_PROMPT_REPLY_CANCEL); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + return GCR_PROMPT_REPLY_CANCEL; + + return self->pv->last_reply; +} + +static void +gcr_prompt_dialog_close (GcrPrompt *prompt) +{ + GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); + if (!self->pv->was_closed) { + self->pv->was_closed = TRUE; + gtk_widget_hide (GTK_WIDGET (self)); + } +} + +static void +gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface) +{ + iface->prompt_password_async = gcr_prompt_dialog_password_async; + iface->prompt_password_finish = gcr_prompt_dialog_password_finish; + iface->prompt_confirm_async = gcr_prompt_dialog_confirm_async; + iface->prompt_confirm_finish = gcr_prompt_dialog_confirm_finish; + iface->prompt_close = gcr_prompt_dialog_close; +} diff --git a/ui/gcr-prompt-dialog.h b/ui/gcr-prompt-dialog.h new file mode 100644 index 0000000..6181fa0 --- /dev/null +++ b/ui/gcr-prompt-dialog.h @@ -0,0 +1,61 @@ +/* + * gnome-keyring + * + * Copyright (C) 2011 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_PROMPT_DIALOG_H__ +#define __GCR_PROMPT_DIALOG_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_PROMPT_DIALOG (gcr_prompt_dialog_get_type ()) +#define GCR_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialog)) +#define GCR_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass)) +#define GCR_IS_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PROMPT_DIALOG)) +#define GCR_IS_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PROMPT_DIALOG)) +#define GCR_PROMPT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass)) + +typedef struct _GcrPromptDialog GcrPromptDialog; +typedef struct _GcrPromptDialogClass GcrPromptDialogClass; +typedef struct _GcrPromptDialogPrivate GcrPromptDialogPrivate; + +struct _GcrPromptDialog { + GtkDialog parent; + + /*< private >*/ + GcrPromptDialogPrivate *pv; +}; + +struct _GcrPromptDialogClass { + GtkDialogClass parent_class; +}; + +GType gcr_prompt_dialog_get_type (void); + +G_END_DECLS + +#endif /* __GCR_PROMPT_DIALOG_H__ */ diff --git a/ui/gcr-prompter-tool.c b/ui/gcr-prompter-tool.c new file mode 100644 index 0000000..0a22238 --- /dev/null +++ b/ui/gcr-prompter-tool.c @@ -0,0 +1,259 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-viewer-tool.c: Command line utility + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr.h" +#include "gcr/gcr-dbus-constants.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#define QUIT_TIMEOUT 10 + +static GcrSystemPrompter *the_prompter = NULL; +static gboolean registered_prompter = FALSE; +static gboolean acquired_system_prompter = FALSE; +static gboolean acquired_private_prompter = FALSE; +static guint timeout_source = 0; + +static gboolean +on_timeout_quit (gpointer unused) +{ + g_debug ("%d second inactivity timeout, quitting", QUIT_TIMEOUT); + gtk_main_quit (); + + return FALSE; /* Don't run again */ +} + +static void +start_timeout (void) +{ + if (g_getenv ("GCR_PERSIST") != NULL) + return; + + if (!timeout_source) + timeout_source = g_timeout_add_seconds (QUIT_TIMEOUT, on_timeout_quit, NULL); +} + +static void +stop_timeout (void) +{ + if (timeout_source) + g_source_remove (timeout_source); + timeout_source = 0; +} + +static void +on_prompter_prompting (GObject *obj, + GParamSpec param, + gpointer user_data) +{ + if (gcr_system_prompter_get_prompting (the_prompter)) + stop_timeout (); + else + start_timeout (); +} + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_debug ("bus acquired: %s", name); + + if (!registered_prompter) + gcr_system_prompter_register (the_prompter, connection); + + registered_prompter = TRUE; +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_debug ("acquired name: %s", name); + + if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0) + acquired_system_prompter = TRUE; + + else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0) + acquired_private_prompter = TRUE; +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_debug ("lost name: %s", name); + + /* Called like so when no connection can be made */ + if (connection == NULL) { + g_warning ("couldn't connect to session bus"); + gtk_main_quit (); + + } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0) { + acquired_system_prompter = FALSE; + + } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0) { + acquired_private_prompter = FALSE; + + } +} + +static void +log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + int level; + + /* Note that crit and err are the other way around in syslog */ + + switch (G_LOG_LEVEL_MASK & log_level) { + case G_LOG_LEVEL_ERROR: + level = LOG_CRIT; + break; + case G_LOG_LEVEL_CRITICAL: + level = LOG_ERR; + break; + case G_LOG_LEVEL_WARNING: + level = LOG_WARNING; + break; + case G_LOG_LEVEL_MESSAGE: + level = LOG_NOTICE; + break; + case G_LOG_LEVEL_INFO: + level = LOG_INFO; + break; + case G_LOG_LEVEL_DEBUG: + level = LOG_DEBUG; + break; + default: + level = LOG_ERR; + break; + } + + /* Log to syslog first */ + if (log_domain) + syslog (level, "%s: %s", log_domain, message); + else + syslog (level, "%s", message); + + /* And then to default handler for aborting and stuff like that */ + g_log_default_handler (log_domain, log_level, message, user_data); +} + +static void +printerr_handler (const gchar *string) +{ + /* Print to syslog and stderr */ + syslog (LOG_WARNING, "%s", string); + fprintf (stderr, "%s", string); +} + +static void +prepare_logging () +{ + GLogLevelFlags flags = G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR | + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO; + + openlog ("gcr-prompter", LOG_PID, LOG_AUTH); + + g_log_set_handler (NULL, flags, log_handler, NULL); + g_log_set_handler ("Glib", flags, log_handler, NULL); + g_log_set_handler ("Gtk", flags, log_handler, NULL); + g_log_set_handler ("Gnome", flags, log_handler, NULL); + g_log_set_handler ("Gcr", flags, log_handler, NULL); + g_log_set_handler ("Gck", flags, log_handler, NULL); + g_log_set_default_handler (log_handler, NULL); + g_set_printerr_handler (printerr_handler); +} + +int +main (int argc, char *argv[]) +{ + guint system_owner_id; + guint private_owner_id; + + gtk_init (&argc, &argv); + +#ifdef HAVE_LOCALE_H + /* internationalisation */ + setlocale (LC_ALL, ""); +#endif + +#ifdef HAVE_GETTEXT + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + textdomain (GETTEXT_PACKAGE); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + + prepare_logging (); + + the_prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE, + GCR_TYPE_PROMPT_DIALOG); + g_signal_connect (the_prompter, "notify::prompting", + G_CALLBACK (on_prompter_prompting), NULL); + + system_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_REPLACE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + private_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_REPLACE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + start_timeout (); + gtk_main (); + + if (registered_prompter) + gcr_system_prompter_unregister (the_prompter, TRUE); + + g_bus_unown_name (system_owner_id); + g_bus_unown_name (private_owner_id); + + g_object_unref (the_prompter); + + return 0; +} diff --git a/ui/gcr-prompter.desktop.in.in b/ui/gcr-prompter.desktop.in.in new file mode 100644 index 0000000..6d43e0c --- /dev/null +++ b/ui/gcr-prompter.desktop.in.in @@ -0,0 +1,8 @@ +[Desktop Entry] +_Name=Access Prompt +_Comment=Unlock access to passwords and other secrets +Icon=security-medium +Exec=@libexecdir@/gcr-prompter +Terminal=false +Type=Application +NoDisplay=true diff --git a/ui/gcr-renderer.c b/ui/gcr-renderer.c new file mode 100644 index 0000000..cba7492 --- /dev/null +++ b/ui/gcr-renderer.c @@ -0,0 +1,331 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-deprecated.h" +#include "gcr-renderer.h" + +#include "gcr-certificate-renderer.h" +#include "gcr-certificate-request-renderer.h" +#include "gcr-gnupg-renderer.h" +#include "gcr-key-renderer.h" + +#include "gck/gck.h" + +#include + +/** + * SECTION:gcr-renderer + * @title: GcrRenderer + * @short_description: An interface implemented by renderers. + * + * A #GcrRenderer is an interface that's implemented by renderers which wish + * to render data to a #GcrViewer. + * + * The interaction between #GcrRenderer and #GcrViewer is not stable yet, and + * so new renderers cannot be implemented outside the Gcr library at this time. + * + * To lookup a renderer for a given set of attributes, use the gcr_renderer_create() + * function. This will create and initialize a renderer that's capable of viewing + * the data in those attributes. + */ + +/** + * GcrRenderer: + * + * A renderer. + */ + +/** + * GcrRendererIface: + * @parent: the parent interface type + * @data_changed: signal emitted when data being rendered changes + * @render_view: method invoked to render the data into a viewer + * @populate_popup: method invoked to populate a popup menu with additional + * renderer options + * + * The interface for #GcrRenderer + */ + +enum { + DATA_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +typedef struct _GcrRegistered { + GckAttributes *attrs; + GType renderer_type; +} GcrRegistered; + +static GArray *registered_renderers = NULL; +static gboolean registered_sorted = FALSE; + +static void +gcr_renderer_default_init (GcrRendererIface *iface) +{ + static gboolean initialized = FALSE; + if (!initialized) { + + /** + * GcrRenderer:label: + * + * The label to display. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("label", "Label", "The label for the renderer", + "", G_PARAM_READWRITE)); + + /** + * GcrRenderer:attributes: + * + * The attributes to display. + */ + g_object_interface_install_property (iface, + g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the renderer", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); + + /** + * GcrRenderer::data-changed: + * + * A signal that is emitted by the renderer when it's data + * changed and should be rerendered. + */ + signals[DATA_CHANGED] = g_signal_new ("data-changed", GCR_TYPE_RENDERER, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GcrRendererIface, data_changed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + initialized = TRUE; + } +} + +typedef GcrRendererIface GcrRendererInterface; + +G_DEFINE_INTERFACE (GcrRenderer, gcr_renderer, G_TYPE_OBJECT); + +/** + * gcr_renderer_render_view: + * @self: The renderer + * @viewer: The viewer to render to. + * + * Render the contents of the renderer to the given viewer. + */ +void +gcr_renderer_render_view (GcrRenderer *self, GcrViewer *viewer) +{ + g_return_if_fail (GCR_IS_RENDERER (self)); + g_return_if_fail (GCR_RENDERER_GET_INTERFACE (self)->render_view); + GCR_RENDERER_GET_INTERFACE (self)->render_view (self, viewer); +} + +/** + * gcr_renderer_render: + * @self: the renderer + * @viewer: the viewer to render to + * + * Render a renderer to the viewer. + * + * Deprecated: 3.2: Use gcr_renderer_render_view() instead + */ +void +gcr_renderer_render (GcrRenderer *self, + GcrViewer *viewer) +{ + gcr_renderer_render_view (self, viewer); +} + +/** + * gcr_renderer_popuplate_popup: + * @self: The renderer + * @viewer: The viewer that is displaying a popup + * @menu: The popup menu being displayed + * + * Called by #GcrViewer when about to display a popup menu for the content + * displayed by the renderer. The renderer can add a menu item if desired. + */ +void +gcr_renderer_popuplate_popup (GcrRenderer *self, GcrViewer *viewer, + GtkMenu *menu) +{ + g_return_if_fail (GCR_IS_RENDERER (self)); + if (GCR_RENDERER_GET_INTERFACE (self)->populate_popup) + GCR_RENDERER_GET_INTERFACE (self)->populate_popup (self, viewer, menu); +} + +/** + * gcr_renderer_emit_data_changed: + * @self: The renderer + * + * Emit the #GcrRenderer::data-changed signal on the renderer. This is used by + * renderer implementations. + */ +void +gcr_renderer_emit_data_changed (GcrRenderer *self) +{ + g_return_if_fail (GCR_IS_RENDERER (self)); + g_signal_emit (self, signals[DATA_CHANGED], 0); +} + +/** + * gcr_renderer_get_attributes: + * @self: The renderer + * + * Get the PKCS\#11 attributes, if any, set for this renderer to display. + * + * Returns: (allow-none) (transfer none): the attributes, owned by the renderer + */ +GckAttributes * +gcr_renderer_get_attributes (GcrRenderer *self) +{ + GckAttributes *attrs; + + g_return_val_if_fail (GCR_IS_RENDERER (self), NULL); + + g_object_get (self, "attributes", &attrs, NULL); + if (attrs != NULL) + gck_attributes_unref (attrs); + return attrs; +} + +/** + * gcr_renderer_set_attributes: + * @self: The renderer + * @attrs: (allow-none): attributes to set + * + * Set the PKCS\#11 attributes for this renderer to display. + */ +void +gcr_renderer_set_attributes (GcrRenderer *self, + GckAttributes *attrs) +{ + g_return_if_fail (GCR_IS_RENDERER (self)); + + g_object_set (self, "attributes", attrs, NULL); +} + +static gint +sort_registered_by_n_attrs (gconstpointer a, gconstpointer b) +{ + const GcrRegistered *ra = a; + const GcrRegistered *rb = b; + gulong na, nb; + + g_assert (a); + g_assert (b); + + na = gck_attributes_count (ra->attrs); + nb = gck_attributes_count (rb->attrs); + + /* Note we're sorting in reverse order */ + if (na < nb) + return 1; + return (na == nb) ? 0 : -1; +} + +/** + * gcr_renderer_create: + * @label: (allow-none): The label for the renderer + * @attrs: The attributes to render + * + * Create and initialize a renderer for the given attributes and label. These + * renderers should have been preregistered via gcr_renderer_register(). + * + * Returns: (transfer full) (allow-none): a new renderer, or %NULL if no renderer + * matched the attributes; the render should be released with g_object_unref() + */ +GcrRenderer * +gcr_renderer_create (const gchar *label, GckAttributes *attrs) +{ + GcrRegistered *registered; + gboolean matched; + gulong n_attrs; + gulong j; + gsize i; + + g_return_val_if_fail (attrs, NULL); + + gcr_renderer_register_well_known (); + + if (!registered_renderers) + return NULL; + + if (!registered_sorted) { + g_array_sort (registered_renderers, sort_registered_by_n_attrs); + registered_sorted = TRUE; + } + + for (i = 0; i < registered_renderers->len; ++i) { + registered = &(g_array_index (registered_renderers, GcrRegistered, i)); + n_attrs = gck_attributes_count (registered->attrs); + + matched = TRUE; + + for (j = 0; j < n_attrs; ++j) { + if (!gck_attributes_contains (attrs, gck_attributes_at (registered->attrs, j))) { + matched = FALSE; + break; + } + } + + if (matched) + return g_object_new (registered->renderer_type, "label", label, + "attributes", attrs, NULL); + } + + return NULL; +} + +/** + * gcr_renderer_register: + * @renderer_type: The renderer class type + * @attrs: The attributes to match + * + * Register a renderer to be created when matching attributes are passed to + * gcr_renderer_create(). + */ +void +gcr_renderer_register (GType renderer_type, GckAttributes *attrs) +{ + GcrRegistered registered; + + if (!registered_renderers) + registered_renderers = g_array_new (FALSE, FALSE, sizeof (GcrRegistered)); + + registered.renderer_type = renderer_type; + registered.attrs = gck_attributes_ref_sink (attrs); + g_array_append_val (registered_renderers, registered); + registered_sorted = FALSE; +} + +/** + * gcr_renderer_register_well_known: + * + * Register all the well known renderers for certificates and keys known to the + * Gcr library. + */ +void +gcr_renderer_register_well_known (void) +{ + g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_RENDERER)); + g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER)); + g_type_class_unref (g_type_class_ref (GCR_TYPE_KEY_RENDERER)); + g_type_class_unref (g_type_class_ref (GCR_TYPE_GNUPG_RENDERER)); +} diff --git a/ui/gcr-renderer.h b/ui/gcr-renderer.h new file mode 100644 index 0000000..1b81469 --- /dev/null +++ b/ui/gcr-renderer.h @@ -0,0 +1,88 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_RENDERER_H__ +#define __GCR_RENDERER_H__ + +#include + +#include "gcr/gcr-column.h" +#include "gcr/gcr-types.h" + +#include "gcr-viewer.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_RENDERER (gcr_renderer_get_type()) +#define GCR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_RENDERER, GcrRenderer)) +#define GCR_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_RENDERER)) +#define GCR_RENDERER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_RENDERER, GcrRendererIface)) + +typedef struct _GcrRendererIface GcrRendererIface; + +struct _GcrRendererIface { + GTypeInterface parent; + + /* signals */ + void (*data_changed) (GcrRenderer *self); + + /* virtual */ + void (*render_view) (GcrRenderer *self, GcrViewer *viewer); + + void (*populate_popup) (GcrRenderer *self, GcrViewer *viewer, GtkMenu *menu); + + /*< private >*/ + gpointer dummy1; + + gpointer dummy2; + gpointer dummy3; + gpointer dummy4; + gpointer dummy5; + gpointer dummy6; + gpointer dummy7; + +}; + +GType gcr_renderer_get_type (void) G_GNUC_CONST; + +void gcr_renderer_render_view (GcrRenderer *self, + GcrViewer *viewer); + +void gcr_renderer_popuplate_popup (GcrRenderer *self, + GcrViewer *viewer, + GtkMenu *menu); + +void gcr_renderer_emit_data_changed (GcrRenderer *self); + +GcrRenderer* gcr_renderer_create (const gchar *label, + GckAttributes *attrs); + +void gcr_renderer_register (GType renderer_type, + GckAttributes *attrs); + +GckAttributes * gcr_renderer_get_attributes (GcrRenderer *self); + +void gcr_renderer_set_attributes (GcrRenderer *self, + GckAttributes *attrs); + +void gcr_renderer_register_well_known (void); + +G_END_DECLS + +#endif /* __GCR_RENDERER_H__ */ diff --git a/ui/gcr-secure-entry-buffer.c b/ui/gcr-secure-entry-buffer.c new file mode 100644 index 0000000..d00ccd2 --- /dev/null +++ b/ui/gcr-secure-entry-buffer.c @@ -0,0 +1,231 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-secure-buffer.c - secure memory gtkentry buffer + + Copyright (C) 2009 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr-secure-entry-buffer.h" + +#include "egg/egg-secure-memory.h" + +#include + +/** + * SECTION:gcr-secure-entry-buffer + * @title: GcrSecureEntryBuffer + * @short_description: a GtkEntryBuffer that uses non-pageable memory + * + * It's good practice to try to keep passwords or sensitive secrets out of + * pageable memory whenever possible, so that they don't get written to disk. + * + * This is a #GtkEntryBuffer to be used with #GtkEntry which uses non-pageable + * memory to store a password placed in the entry. In order to make any sense + * at all, the entry must have it's visibility turned off, and just be displaying + * place holder characters for the text. That is, a password style entry. + * + * Use gtk_entry_new_with_buffer() or gtk_entry_set_buffer() to set this buffer + * on an entry. + */ + +/** + * GcrSecureEntryBuffer: + * + * A #GtkEntryBuffer which uses non-pageable memory for passwords or secrets. + */ + +/** + * GcrSecureEntryBufferClass: + * @parent_class: parent class + * + * The class for #GcrSecureEntryBuffer. + */ + +EGG_SECURE_DECLARE (secure_entry_buffer); + +/* Initial size of buffer, in bytes */ +#define MIN_SIZE 16 + +struct _GcrSecureEntryBufferPrivate +{ + gchar *text; + gsize text_size; + gsize text_bytes; + guint text_chars; +}; + +G_DEFINE_TYPE (GcrSecureEntryBuffer, gcr_secure_entry_buffer, GTK_TYPE_ENTRY_BUFFER); + +static const gchar * +gcr_secure_entry_buffer_real_get_text (GtkEntryBuffer *buffer, + gsize *n_bytes) +{ + GcrSecureEntryBuffer *self = GCR_SECURE_ENTRY_BUFFER (buffer); + if (n_bytes) + *n_bytes = self->pv->text_bytes; + if (!self->pv->text) + return ""; + return self->pv->text; +} + +static guint +gcr_secure_entry_buffer_real_get_length (GtkEntryBuffer *buffer) +{ + GcrSecureEntryBuffer *self = GCR_SECURE_ENTRY_BUFFER (buffer); + return self->pv->text_chars; +} + +static guint +gcr_secure_entry_buffer_real_insert_text (GtkEntryBuffer *buffer, + guint position, + const gchar *chars, + guint n_chars) +{ + GcrSecureEntryBuffer *self = GCR_SECURE_ENTRY_BUFFER (buffer); + GcrSecureEntryBufferPrivate *pv = self->pv; + gsize n_bytes; + gsize at; + + n_bytes = g_utf8_offset_to_pointer (chars, n_chars) - chars; + + /* Need more memory */ + if (n_bytes + pv->text_bytes + 1 > pv->text_size) { + + /* Calculate our new buffer size */ + while (n_bytes + pv->text_bytes + 1 > pv->text_size) { + if (pv->text_size == 0) { + pv->text_size = MIN_SIZE; + } else { + if (2 * pv->text_size < GTK_ENTRY_BUFFER_MAX_SIZE) { + pv->text_size *= 2; + } else { + pv->text_size = GTK_ENTRY_BUFFER_MAX_SIZE; + if (n_bytes > pv->text_size - pv->text_bytes - 1) { + n_bytes = pv->text_size - pv->text_bytes - 1; + n_bytes = g_utf8_find_prev_char (chars, chars + n_bytes + 1) - chars; + n_chars = g_utf8_strlen (chars, n_bytes); + } + break; + } + } + } + + pv->text = egg_secure_realloc (pv->text, pv->text_size); + } + + /* Actual text insertion */ + at = g_utf8_offset_to_pointer (pv->text, position) - pv->text; + memmove (pv->text + at + n_bytes, pv->text + at, pv->text_bytes - at); + memcpy (pv->text + at, chars, n_bytes); + + /* Book keeping */ + pv->text_bytes += n_bytes; + pv->text_chars += n_chars; + pv->text[pv->text_bytes] = '\0'; + + gtk_entry_buffer_emit_inserted_text (buffer, position, chars, n_chars); + return n_chars; +} + +static guint +gcr_secure_entry_buffer_real_delete_text (GtkEntryBuffer *buffer, + guint position, + guint n_chars) +{ + GcrSecureEntryBuffer *self = GCR_SECURE_ENTRY_BUFFER (buffer); + GcrSecureEntryBufferPrivate *pv = self->pv; + gsize start, end; + + if (position > pv->text_chars) + position = pv->text_chars; + if (position + n_chars > pv->text_chars) + n_chars = pv->text_chars - position; + + if (n_chars > 0) { + start = g_utf8_offset_to_pointer (pv->text, position) - pv->text; + end = g_utf8_offset_to_pointer (pv->text, position + n_chars) - pv->text; + + memmove (pv->text + start, pv->text + end, pv->text_bytes + 1 - end); + pv->text_chars -= n_chars; + pv->text_bytes -= (end - start); + + gtk_entry_buffer_emit_deleted_text (buffer, position, n_chars); + } + + return n_chars; +} + +static void +gcr_secure_entry_buffer_init (GcrSecureEntryBuffer *self) +{ + GcrSecureEntryBufferPrivate *pv; + pv = self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_SECURE_ENTRY_BUFFER, GcrSecureEntryBufferPrivate); + + pv->text = NULL; + pv->text_chars = 0; + pv->text_bytes = 0; + pv->text_size = 0; +} + +static void +gcr_secure_entry_buffer_finalize (GObject *obj) +{ + GcrSecureEntryBuffer *self = GCR_SECURE_ENTRY_BUFFER (obj); + GcrSecureEntryBufferPrivate *pv = self->pv; + + if (pv->text) { + egg_secure_strfree (pv->text); + pv->text = NULL; + pv->text_bytes = pv->text_size = 0; + pv->text_chars = 0; + } + + G_OBJECT_CLASS (gcr_secure_entry_buffer_parent_class)->finalize (obj); +} + +static void +gcr_secure_entry_buffer_class_init (GcrSecureEntryBufferClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkEntryBufferClass *buffer_class = GTK_ENTRY_BUFFER_CLASS (klass); + + gobject_class->finalize = gcr_secure_entry_buffer_finalize; + + buffer_class->get_text = gcr_secure_entry_buffer_real_get_text; + buffer_class->get_length = gcr_secure_entry_buffer_real_get_length; + buffer_class->insert_text = gcr_secure_entry_buffer_real_insert_text; + buffer_class->delete_text = gcr_secure_entry_buffer_real_delete_text; + + g_type_class_add_private (gobject_class, sizeof (GcrSecureEntryBufferPrivate)); +} + +/** + * gcr_secure_entry_buffer_new: + * + * Create a new #GcrSecureEntryBuffer, a #GtkEntryBuffer which uses + * non-pageable memory for the text. + * + * Returns: (transfer full): the new entry buffer + */ +GtkEntryBuffer * +gcr_secure_entry_buffer_new (void) +{ + return g_object_new (GCR_TYPE_SECURE_ENTRY_BUFFER, NULL); +} diff --git a/ui/gcr-secure-entry-buffer.h b/ui/gcr-secure-entry-buffer.h new file mode 100644 index 0000000..24399f4 --- /dev/null +++ b/ui/gcr-secure-entry-buffer.h @@ -0,0 +1,63 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-secure-buffer.h - secure memory gtkentry buffer + + Copyright (C) 2009 Stefan Walter + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_SECURE_ENTRY_BUFFER_H__ +#define __GCR_SECURE_ENTRY_BUFFER_H__ + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_SECURE_ENTRY_BUFFER (gcr_secure_entry_buffer_get_type ()) +#define GCR_SECURE_ENTRY_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_SECURE_ENTRY_BUFFER, GcrSecureEntryBuffer)) +#define GCR_SECURE_ENTRY_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_SECURE_ENTRY_BUFFER, GcrSecureEntryBufferClass)) +#define GCR_IS_SECURE_ENTRY_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_SECURE_ENTRY_BUFFER)) +#define GCR_IS_SECURE_ENTRY_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_SECURE_ENTRY_BUFFER)) +#define GCR_SECURE_ENTRY_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_SECURE_ENTRY_BUFFER, GcrSecureEntryBufferClass)) + +typedef struct _GcrSecureEntryBuffer GcrSecureEntryBuffer; +typedef struct _GcrSecureEntryBufferClass GcrSecureEntryBufferClass; +typedef struct _GcrSecureEntryBufferPrivate GcrSecureEntryBufferPrivate; + +struct _GcrSecureEntryBuffer { + GtkEntryBuffer parent; + + /*< private >*/ + GcrSecureEntryBufferPrivate *pv; +}; + +struct _GcrSecureEntryBufferClass +{ + GtkEntryBufferClass parent_class; +}; + +GType gcr_secure_entry_buffer_get_type (void) G_GNUC_CONST; + +GtkEntryBuffer * gcr_secure_entry_buffer_new (void); + +G_END_DECLS + +#endif /* __GCR_SECURE_ENTRY_BUFFER_H__ */ diff --git a/ui/gcr-tree-selector.c b/ui/gcr-tree-selector.c new file mode 100644 index 0000000..78568b8 --- /dev/null +++ b/ui/gcr-tree-selector.c @@ -0,0 +1,361 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-internal.h" + +#include "gcr-collection-model.h" +#include "gcr-tree-selector.h" + +#include + +#include + +/** + * SECTION:gcr-tree-selector + * @title: GcrTreeSelector + * @short_description: A selector widget to select certificates or keys. + * + * The #GcrTreeSelector can be used to select certificates or keys. It allows + * the user to select multiple objects from a tree. + */ + +/** + * GcrTreeSelector: + * + * A tree selector widget. + */ + +/** + * GcrTreeSelectorClass: + * + * The class for #GcrTreeSelector. + */ + +enum { + PROP_0, + PROP_COLLECTION, + PROP_COLUMNS +}; + +struct _GcrTreeSelectorPrivate { + GcrCollection *collection; + const GcrColumn *columns; + GcrCollectionModel *model; +}; + +G_DEFINE_TYPE (GcrTreeSelector, gcr_tree_selector, GTK_TYPE_TREE_VIEW); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static void +on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, GcrCollectionModel *model) +{ + GtkTreeIter iter; + + g_assert (path != NULL); + + if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (model), &iter, path)) + gcr_collection_model_toggle_selected (model, &iter); +} + +static void +add_string_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id) +{ + GtkCellRenderer *cell; + GtkTreeViewColumn *col; + const gchar *label; + + g_assert (column->column_type == G_TYPE_STRING); + g_assert (!(column->flags & GCR_COLUMN_HIDDEN)); + + cell = gtk_cell_renderer_text_new (); + g_object_set (G_OBJECT (cell), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + label = column->label ? g_dpgettext2 (NULL, "column", column->label) : ""; + col = gtk_tree_view_column_new_with_attributes (label, cell, "text", column_id, NULL); + gtk_tree_view_column_set_resizable (col, TRUE); + if (column->flags & GCR_COLUMN_SORTABLE) + gtk_tree_view_column_set_sort_column_id (col, column_id); + gtk_tree_view_append_column (GTK_TREE_VIEW (self), col); +} + +static void +add_icon_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id) +{ + GtkCellRenderer *cell; + GtkTreeViewColumn *col; + const gchar *label; + + g_assert (column->column_type == G_TYPE_ICON); + g_assert (!(column->flags & GCR_COLUMN_HIDDEN)); + + cell = gtk_cell_renderer_pixbuf_new (); + g_object_set (cell, "stock-size", GTK_ICON_SIZE_BUTTON, NULL); + label = column->label ? g_dpgettext2 (NULL, "column", column->label) : ""; + col = gtk_tree_view_column_new_with_attributes (label, cell, "gicon", column_id, NULL); + gtk_tree_view_column_set_resizable (col, TRUE); + if (column->flags & GCR_COLUMN_SORTABLE) + gtk_tree_view_column_set_sort_column_id (col, column_id); + gtk_tree_view_append_column (GTK_TREE_VIEW (self), col); +} + +static void +add_check_column (GcrTreeSelector *self, guint column_id) +{ + GtkCellRenderer *cell; + GtkTreeViewColumn *col; + + cell = gtk_cell_renderer_toggle_new (); + g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self->pv->model); + + col = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL); + gtk_tree_view_column_set_resizable (col, FALSE); + gtk_tree_view_append_column (GTK_TREE_VIEW (self), col); +} + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + +static GObject* +gcr_tree_selector_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + GcrTreeSelector *self = GCR_TREE_SELECTOR (G_OBJECT_CLASS (gcr_tree_selector_parent_class)->constructor(type, n_props, props)); + const GcrColumn *column; + guint i; + + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (self->pv->columns, NULL); + + self->pv->model = gcr_collection_model_new_full (self->pv->collection, + GCR_COLLECTION_MODEL_TREE, + self->pv->columns); + + gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->model)); + + /* First add the check mark column */ + add_check_column (self, gcr_collection_model_column_for_selected (self->pv->model)); + + for (column = self->pv->columns, i = 0; column->property_name; ++column, ++i) { + if (column->flags & GCR_COLUMN_HIDDEN) + continue; + + if (column->column_type == G_TYPE_STRING) + add_string_column (self, column, i); + else if (column->column_type == G_TYPE_ICON) + add_icon_column (self, column, i); + else + g_warning ("skipping unsupported column '%s' of type: %s", + column->property_name, g_type_name (column->column_type)); + } + + return G_OBJECT (self); +} + +static void +gcr_tree_selector_init (GcrTreeSelector *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorPrivate); +} + +static void +gcr_tree_selector_dispose (GObject *obj) +{ + GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); + + if (self->pv->model) + g_object_unref (self->pv->model); + self->pv->model = NULL; + + if (self->pv->collection) + g_object_unref (self->pv->collection); + self->pv->collection = NULL; + + G_OBJECT_CLASS (gcr_tree_selector_parent_class)->dispose (obj); +} + +static void +gcr_tree_selector_finalize (GObject *obj) +{ + GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); + + g_assert (!self->pv->collection); + g_assert (!self->pv->model); + + G_OBJECT_CLASS (gcr_tree_selector_parent_class)->finalize (obj); +} + +static void +gcr_tree_selector_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); + switch (prop_id) { + case PROP_COLLECTION: + g_return_if_fail (!self->pv->collection); + self->pv->collection = g_value_dup_object (value); + g_return_if_fail (self->pv->collection); + break; + case PROP_COLUMNS: + g_return_if_fail (!self->pv->columns); + self->pv->columns = g_value_get_pointer (value); + g_return_if_fail (self->pv->columns); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_tree_selector_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); + + switch (prop_id) { + case PROP_COLLECTION: + g_value_set_object (value, gcr_tree_selector_get_collection (self)); + break; + case PROP_COLUMNS: + g_value_set_pointer (value, (gpointer)gcr_tree_selector_get_columns (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_tree_selector_class_init (GcrTreeSelectorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructor = gcr_tree_selector_constructor; + gobject_class->dispose = gcr_tree_selector_dispose; + gobject_class->finalize = gcr_tree_selector_finalize; + gobject_class->set_property = gcr_tree_selector_set_property; + gobject_class->get_property = gcr_tree_selector_get_property; + + g_type_class_add_private (gobject_class, sizeof (GcrTreeSelectorPrivate)); + + /** + * GcrTreeSelector:collection: + * + * The collection which contains the objects to display in the selector. + */ + g_object_class_install_property (gobject_class, PROP_COLLECTION, + g_param_spec_object ("collection", "Collection", "Collection to select from", + GCR_TYPE_COLLECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /** + * GcrTreeSelector:columns: + * + * The columns to use to display the objects. + */ + g_object_class_install_property (gobject_class, PROP_COLUMNS, + g_param_spec_pointer ("columns", "Columns", "Columns to display in selector", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_tree_selector_new: (skip) + * @collection: The collection that contains the objects to display + * @columns: The columns to use to display the objects + * + * Create a new #GcrTreeSelector. + * + * Returns: (transfer full): a newly allocated selector, which should be + * released with g_object_unref() + */ +GcrTreeSelector * +gcr_tree_selector_new (GcrCollection *collection, const GcrColumn *columns) +{ + return g_object_new (GCR_TYPE_TREE_SELECTOR, + "collection", collection, + "columns", columns, + NULL); +} + +/** + * gcr_tree_selector_get_collection: + * @self: The selector + * + * Get the collection that this selector is displaying objects from. + * + * Returns: (transfer none): the collection, owned by the selector + */ +GcrCollection * +gcr_tree_selector_get_collection (GcrTreeSelector *self) +{ + g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL); + return self->pv->collection; +} + +/** + * gcr_tree_selector_get_columns: (skip) + * @self: The selector + * + * Get the columns displayed in a selector in multiple mode. + * + * Returns: (transfer none): The columns, owned by the selector. + */ +const GcrColumn * +gcr_tree_selector_get_columns (GcrTreeSelector *self) +{ + g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL); + return self->pv->columns; +} + +/** + * gcr_tree_selector_get_selected: + * @self: The selector + * + * Get a list of selected objects. + * + * Returns: (transfer container) (element-type GObject.Object): the list of selected + * objects, to be released with g_list_free() + */ +GList* +gcr_tree_selector_get_selected (GcrTreeSelector *self) +{ + g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL); + return gcr_collection_model_get_selected_objects (self->pv->model); +} + +/** + * gcr_tree_selector_set_selected: + * @self: The selector + * @selected: (element-type GObject.Object): the list of objects to select + * + * Select certain objects in the selector. + */ +void +gcr_tree_selector_set_selected (GcrTreeSelector *self, GList *selected) +{ + g_return_if_fail (GCR_IS_TREE_SELECTOR (self)); + gcr_collection_model_set_selected_objects (self->pv->model, selected); +} diff --git a/ui/gcr-tree-selector.h b/ui/gcr-tree-selector.h new file mode 100644 index 0000000..3355ca2 --- /dev/null +++ b/ui/gcr-tree-selector.h @@ -0,0 +1,68 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_TREE_SELECTOR_H__ +#define __GCR_TREE_SELECTOR_H__ + +#include "gcr/gcr-types.h" + +#include + +G_BEGIN_DECLS + +#define GCR_TYPE_TREE_SELECTOR (gcr_tree_selector_get_type ()) +#define GCR_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelector)) +#define GCR_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass)) +#define GCR_IS_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_TREE_SELECTOR)) +#define GCR_IS_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_TREE_SELECTOR)) +#define GCR_TREE_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass)) + +typedef struct _GcrTreeSelector GcrTreeSelector; +typedef struct _GcrTreeSelectorClass GcrTreeSelectorClass; +typedef struct _GcrTreeSelectorPrivate GcrTreeSelectorPrivate; + +struct _GcrTreeSelector { + GtkTreeView parent; + + /*< private >*/ + GcrTreeSelectorPrivate *pv; +}; + +struct _GcrTreeSelectorClass { + /*< private >*/ + GtkTreeViewClass parent_class; +}; + +GType gcr_tree_selector_get_type (void); + +GcrTreeSelector* gcr_tree_selector_new (GcrCollection *collection, + const GcrColumn *columns); + +GcrCollection* gcr_tree_selector_get_collection (GcrTreeSelector *self); + +const GcrColumn* gcr_tree_selector_get_columns (GcrTreeSelector *self); + +GList* gcr_tree_selector_get_selected (GcrTreeSelector *self); + +void gcr_tree_selector_set_selected (GcrTreeSelector *self, + GList *selected); + +G_END_DECLS + +#endif /* __GCR_TREE_SELECTOR_H__ */ diff --git a/ui/gcr-ui.h b/ui/gcr-ui.h new file mode 100644 index 0000000..cbec5b3 --- /dev/null +++ b/ui/gcr-ui.h @@ -0,0 +1,58 @@ +/* + * gnome-keyring + * + * Copyright (C) 2010 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#ifndef GCR_API_SUBJECT_TO_CHANGE +#error "This API has not yet reached stability." +#endif + +#ifndef __GCR_UI_H__ +#define __GCR_UI_H__ + +#include + +#include + +#define __GCR_INSIDE_HEADER__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef __GCR_INSIDE_HEADER__ + +#endif /* __GCR_UI_H__ */ diff --git a/ui/gcr-ui.pc.in b/ui/gcr-ui.pc.in new file mode 100644 index 0000000..1b994d0 --- /dev/null +++ b/ui/gcr-ui.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +datarootdir=@datarootdir@ +datadir=@datadir@ +sysconfdir=@sysconfdir@ + +Name: gcr-ui-@GCR_MAJOR@ +Description: GObject and GUI library for high level crypto parsing and display +Version: @VERSION@ +Requires: glib-2.0 gobject-2.0 gio-2.0 gtk+-3.0 gcr-base-@GCR_MAJOR@ gck-@GCK_MAJOR@ +Requires.private: p11-kit-1 +Libs: -L${libdir} -lgcr-ui-@GCR_MAJOR@ +Cflags: -I${includedir}/gcr-@GCR_MAJOR@ diff --git a/ui/gcr-ui.symbols b/ui/gcr-ui.symbols new file mode 100644 index 0000000..d258eb5 --- /dev/null +++ b/ui/gcr-ui.symbols @@ -0,0 +1,116 @@ +/* This file lists all exported symbols. It is used to guarantee that we + * only consciously change our ABI. + */ + +gcr_certificate_basics_widget_get_certificate +gcr_certificate_basics_widget_get_type +gcr_certificate_basics_widget_new +gcr_certificate_basics_widget_set_certificate +gcr_certificate_details_widget_get_certificate +gcr_certificate_details_widget_get_type +gcr_certificate_details_widget_new +gcr_certificate_details_widget_set_certificate +gcr_certificate_renderer_get_attributes +gcr_certificate_renderer_get_certificate +gcr_certificate_renderer_get_type +gcr_certificate_renderer_new +gcr_certificate_renderer_new_for_attributes +gcr_certificate_renderer_set_attributes +gcr_certificate_renderer_set_certificate +gcr_certificate_widget_get_attributes +gcr_certificate_widget_get_certificate +gcr_certificate_widget_get_type +gcr_certificate_widget_new +gcr_certificate_widget_set_attributes +gcr_certificate_widget_set_certificate +gcr_collection_model_change_selected +gcr_collection_model_column_for_selected +gcr_collection_model_get_collection +gcr_collection_model_get_selected_objects +gcr_collection_model_get_type +gcr_collection_model_is_selected +gcr_collection_model_iter_for_object +gcr_collection_model_mode_get_type +gcr_collection_model_new +gcr_collection_model_new_full +gcr_collection_model_object_for_iter +gcr_collection_model_set_collection +gcr_collection_model_set_columns +gcr_collection_model_set_selected_objects +gcr_collection_model_toggle_selected +gcr_combo_selector_get_collection +gcr_combo_selector_get_selected +gcr_combo_selector_get_type +gcr_combo_selector_new +gcr_combo_selector_set_selected +gcr_failure_renderer_get_type +gcr_failure_renderer_new +gcr_failure_renderer_new_unsupported +gcr_import_button_add_parsed +gcr_import_button_get_type +gcr_import_button_new +gcr_key_renderer_get_attributes +gcr_key_renderer_get_type +gcr_key_renderer_new +gcr_key_renderer_set_attributes +gcr_key_widget_get_attributes +gcr_key_widget_get_type +gcr_key_widget_new +gcr_key_widget_set_attributes +gcr_list_selector_get_collection +gcr_list_selector_get_selected +gcr_list_selector_get_type +gcr_list_selector_new +gcr_list_selector_set_selected +gcr_prompt_dialog_get_type +gcr_renderer_create +gcr_renderer_emit_data_changed +gcr_renderer_get_attributes +gcr_renderer_get_type +gcr_renderer_popuplate_popup +gcr_renderer_register +gcr_renderer_register_well_known +gcr_renderer_render +gcr_renderer_render_view +gcr_renderer_set_attributes +gcr_secure_entry_buffer_get_type +gcr_secure_entry_buffer_new +gcr_tree_selector_get_collection +gcr_tree_selector_get_columns +gcr_tree_selector_get_selected +gcr_tree_selector_get_type +gcr_tree_selector_new +gcr_tree_selector_set_selected +gcr_unlock_options_widget_get_choice +gcr_unlock_options_widget_get_label +gcr_unlock_options_widget_get_sensitive +gcr_unlock_options_widget_get_ttl +gcr_unlock_options_widget_get_type +gcr_unlock_options_widget_new +gcr_unlock_options_widget_set_choice +gcr_unlock_options_widget_set_label +gcr_unlock_options_widget_set_sensitive +gcr_unlock_options_widget_set_ttl +gcr_viewer_add_renderer +gcr_viewer_insert_renderer +gcr_viewer_count_renderers +gcr_viewer_get_renderer +gcr_viewer_get_type +gcr_viewer_new +gcr_viewer_new_scrolled +gcr_viewer_remove_renderer +gcr_viewer_window_get_type +gcr_viewer_window_get_viewer +gcr_viewer_window_load +gcr_viewer_window_new +gcr_viewer_widget_clear_error +gcr_viewer_widget_get_parser +gcr_viewer_widget_get_display_name +gcr_viewer_widget_get_type +gcr_viewer_widget_get_viewer +gcr_viewer_widget_load_bytes +gcr_viewer_widget_load_data +gcr_viewer_widget_load_file +gcr_viewer_widget_new +gcr_viewer_widget_show_error +gcr_viewer_widget_set_display_name diff --git a/ui/gcr-unlock-options-widget.c b/ui/gcr-unlock-options-widget.c new file mode 100644 index 0000000..c81862c --- /dev/null +++ b/ui/gcr-unlock-options-widget.c @@ -0,0 +1,513 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-unlock-options-widget.h" + +#include + +/** + * SECTION:gcr-unlock-options-widget + * @title: GcrUnlockOptionsWidget + * @short_description: A widget for unlock options + * + * This widget displays a set of unlock options for the user to select. The user + * can choose between keeping caching the unlock indefinitely, or for a given + * amount of time. + * + * Each option has a different name, for example #GCR_UNLOCK_OPTION_ALWAYS. These + * names are used together with the various functions like + * gcr_unlock_options_widget_get_choice(). + */ + +/** + * GCR_UNLOCK_OPTION_ALWAYS: + * + * Option name for caching unlock indefinitely. + */ + +/** + * GCR_UNLOCK_OPTION_IDLE: + * + * Option name for caching unlock for a certain amount of idle time. + */ + +/** + * GCR_UNLOCK_OPTION_SESSION: + * + * Option name for caching unlock for the current session. + */ + +/** + * GCR_UNLOCK_OPTION_TIMEOUT: + * + * Option name for caching unlock for a certain amount of time. + */ + +/** + * GcrUnlockOptionsWidget: + * + * An unlock options widget. + */ + +/** + * GcrUnlockOptionsWidgetClass: + * + * Class for #GcrUnlockOptionsWidget. + */ + +enum { + PROP_0, + PROP_CHOICE, + PROP_TTL +}; + +struct _GcrUnlockOptionsWidget { + GtkBin parent; + + /*< private >*/ + GcrUnlockOptionsWidgetPrivate *pv; +}; + +struct _GcrUnlockOptionsWidgetClass { + GtkBinClass parent_class; +}; + +struct _GcrUnlockOptionsWidgetPrivate { + GtkBuilder *builder; + gchar *choice; +}; + +G_DEFINE_TYPE (GcrUnlockOptionsWidget, gcr_unlock_options_widget, GTK_TYPE_BIN); + +/* ----------------------------------------------------------------------------- + * INTERNAL + */ + +static GtkToggleButton* +builder_get_toggle_button (GtkBuilder *builder, const gchar *name) +{ + GObject *object = gtk_builder_get_object (builder, name); + g_return_val_if_fail (GTK_IS_TOGGLE_BUTTON (object), NULL); + return GTK_TOGGLE_BUTTON (object); +} + +static GtkSpinButton* +builder_get_spin_button (GtkBuilder *builder, const gchar *name) +{ + GObject *object = gtk_builder_get_object (builder, name); + g_return_val_if_fail (GTK_IS_SPIN_BUTTON (object), NULL); + return GTK_SPIN_BUTTON (object); +} + +static const gchar* +widget_name_for_option (const gchar *option) +{ + g_return_val_if_fail (option, NULL); + if (g_str_equal (option, GCR_UNLOCK_OPTION_ALWAYS)) + return "lock_always_choice"; + else if (g_str_equal (option, GCR_UNLOCK_OPTION_SESSION)) + return "lock_session_choice"; + else if (g_str_equal (option, GCR_UNLOCK_OPTION_TIMEOUT)) + return "lock_timeout_choice"; + else if (g_str_equal (option, GCR_UNLOCK_OPTION_IDLE)) + return "lock_idle_choice"; + else + return NULL; +} + +static GtkToggleButton* +widget_button_for_option (GcrUnlockOptionsWidget *self, const gchar *option) +{ + const gchar *name = widget_name_for_option (option); + g_return_val_if_fail (name, NULL); + return builder_get_toggle_button (self->pv->builder, name); +} + +static const gchar* +widget_button_to_option (GcrUnlockOptionsWidget *self, GtkToggleButton *button) +{ + const gchar *option; + g_return_val_if_fail (button, NULL); + option = g_object_get_data (G_OBJECT (button), "unlock-choice"); + g_return_val_if_fail (option, NULL); + return option; +} + +static void +on_choice_toggled (GtkToggleButton *button, GcrUnlockOptionsWidget *self) +{ + GtkWidget *spin; + GtkToggleButton *after, *idle; + + spin = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "lock_minutes_spin")); + after = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice"); + idle = builder_get_toggle_button (self->pv->builder, "lock_idle_choice"); + gtk_widget_set_sensitive (spin, gtk_toggle_button_get_active (after) || + gtk_toggle_button_get_active (idle)); + + if (gtk_toggle_button_get_active (button)) { + g_free (self->pv->choice); + self->pv->choice = g_strdup (widget_button_to_option (self, button)); + } +} + +/* ----------------------------------------------------------------------------- + * OBJECT + */ + + +static GObject* +gcr_unlock_options_widget_constructor (GType type, guint n_props, GObjectConstructParam *props) +{ + GObject *obj = G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->constructor (type, n_props, props); + GcrUnlockOptionsWidget *self = NULL; + GtkToggleButton *button; + GtkWidget *widget; + + if (obj) { + self = GCR_UNLOCK_OPTIONS_WIDGET (obj); + + if (!gtk_builder_add_from_resource (self->pv->builder, "/org/gnome/gcr/ui/gcr-unlock-options-widget.ui", NULL)) + g_return_val_if_reached (obj); + + widget = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "unlock-options-widget")); + g_return_val_if_fail (GTK_IS_WIDGET (widget), obj); + gtk_container_add (GTK_CONTAINER (self), widget); + gtk_widget_show (widget); + + button = builder_get_toggle_button (self->pv->builder, "lock_always_choice"); + g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); + g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_ALWAYS); + + button = builder_get_toggle_button (self->pv->builder, "lock_session_choice"); + g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); + g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_SESSION); + on_choice_toggled (button, self); + + button = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice"); + g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); + g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_TIMEOUT); + + button = builder_get_toggle_button (self->pv->builder, "lock_idle_choice"); + g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); + g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_IDLE); + } + + return obj; +} + +static void +gcr_unlock_options_widget_init (GcrUnlockOptionsWidget *self) +{ + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetPrivate)); + self->pv->builder = gtk_builder_new (); +} + +static void +gcr_unlock_options_widget_dispose (GObject *obj) +{ + GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); + + if (self->pv->builder) + g_object_unref (self->pv->builder); + self->pv->builder = NULL; + + G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->dispose (obj); +} + +static void +gcr_unlock_options_widget_finalize (GObject *obj) +{ + GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); + + g_assert (!self->pv->builder); + g_free (self->pv->choice); + self->pv->choice = NULL; + + G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->finalize (obj); +} + +static void +gcr_unlock_options_widget_set_property (GObject *obj, guint prop_id, const GValue *value, + GParamSpec *pspec) +{ + GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); + + switch (prop_id) { + case PROP_CHOICE: + gcr_unlock_options_widget_set_choice (self, g_value_get_string (value)); + break; + case PROP_TTL: + gcr_unlock_options_widget_set_ttl (self, g_value_get_uint (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_unlock_options_widget_get_property (GObject *obj, guint prop_id, GValue *value, + GParamSpec *pspec) +{ + GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); + + switch (prop_id) { + case PROP_CHOICE: + g_value_set_string (value, gcr_unlock_options_widget_get_choice (self)); + break; + case PROP_TTL: + g_value_set_uint (value, gcr_unlock_options_widget_get_ttl (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_unlock_options_widget_class_init (GcrUnlockOptionsWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gcr_unlock_options_widget_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (GcrUnlockOptionsWidgetPrivate)); + + gobject_class->constructor = gcr_unlock_options_widget_constructor; + gobject_class->dispose = gcr_unlock_options_widget_dispose; + gobject_class->finalize = gcr_unlock_options_widget_finalize; + gobject_class->set_property = gcr_unlock_options_widget_set_property; + gobject_class->get_property = gcr_unlock_options_widget_get_property; + + g_object_class_install_property (gobject_class, PROP_CHOICE, + g_param_spec_string ("choice", "Choice", "Unlock Option Choice", + NULL, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_TTL, + g_param_spec_uint ("ttl", "TTL", "Unlock Option Timeout in Seconds", + 0, G_MAXUINT, 0, G_PARAM_READWRITE)); +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_unlock_options_widget_new: + * + * Create a new #GcrUnlockOptionsWidget. + * + * Returns: (transfer full) (type GcrUi.UnlockOptionsWidget): a new #GcrUnlockOptionsWidget + */ +GtkWidget * +gcr_unlock_options_widget_new (void) +{ + return g_object_new (GCR_TYPE_UNLOCK_OPTIONS_WIDGET, NULL); +} + +/** + * gcr_unlock_options_widget_get_choice: + * @self: The unlock options widget + * + * Get the currently selected option, like %GCR_UNLOCK_OPTION_ALWAYS. + * + * Returns: The currently selected option name. + */ +const gchar* +gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self) +{ + g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL); + return self->pv->choice; +} + +/** + * gcr_unlock_options_widget_set_choice: + * @self: The unlock options widget + * @option: The option name + * + * Set the currently selected option. Use an option name like + * %GCR_UNLOCK_OPTION_ALWAYS. + */ +void +gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self, const gchar *option) +{ + GtkToggleButton *button; + + g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); + g_return_if_fail (option); + + button = widget_button_for_option (self, option); + gtk_toggle_button_set_active (button, TRUE); +} + +/** + * gcr_unlock_options_widget_get_ttl: + * @self: The unlock options widget + * + * Get the timeout setting set for unlock options that have a timeout. + * This will also return a valid value if the currently selected option + * does not have a timeout. + * + * Returns: The unlock timeout in seconds. + */ +guint +gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self) +{ + GtkSpinButton *spin; + gint amount; + + g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), 0); + + spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin"); + amount = gtk_spin_button_get_value_as_int (spin); + return amount * 60; +} + +/** + * gcr_unlock_options_widget_set_ttl: + * @self: The unlock options widget + * @ttl: The timeout to set, in seconds + * + * Set the current setting for the timeout. This can be set even when the + * currently selected option does not have a timeout. + */ +void +gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self, guint ttl) +{ + GtkSpinButton *spin; + guint amount; + + g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); + + amount = ttl / 60; + if (!amount || ttl % 60) + amount += 1; + + spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin"); + gtk_spin_button_set_value (spin, amount); +} + +/** + * gcr_unlock_options_widget_get_label: + * @self: The unlock options widget + * @option: The option name + * + * Get the label for one of the options. Use an option name like + * %GCR_UNLOCK_OPTION_ALWAYS. + * + * Returns: The current label for the option. + */ +const gchar* +gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self, const gchar *option) +{ + GtkToggleButton *button; + const gchar *name; + + g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL); + g_return_val_if_fail (option, NULL); + + name = widget_name_for_option (option); + g_return_val_if_fail (name, NULL); + + button = builder_get_toggle_button (self->pv->builder, name); + g_return_val_if_fail (button, NULL); + + return gtk_button_get_label (GTK_BUTTON (button)); +} + +/** + * gcr_unlock_options_widget_set_label: + * @self: The unlock options widget + * @option: The option name + * @text: The new label + * + * Set the label for one of the options. Use an option name like + * %GCR_UNLOCK_OPTION_ALWAYS. + */ +void +gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self, const gchar *option, + const gchar *text) +{ + GtkToggleButton *button; + const gchar *name; + + g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); + g_return_if_fail (option); + g_return_if_fail (text); + + name = widget_name_for_option (option); + g_return_if_fail (name); + + button = builder_get_toggle_button (self->pv->builder, name); + g_return_if_fail (button); + + gtk_button_set_label (GTK_BUTTON (button), text); +} + +/** + * gcr_unlock_options_widget_get_sensitive: + * @self: The unlock options widget + * @option: The option name + * + * Get the sensitivity state for one of the options. Use an option name like + * %GCR_UNLOCK_OPTION_ALWAYS. + * + * Returns: Whether the option is sensitive or not. + */ +gboolean +gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self, const gchar *option) +{ + GtkToggleButton *button; + GtkStateType state; + + g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), FALSE); + g_return_val_if_fail (option, FALSE); + + button = widget_button_for_option (self, option); + state = gtk_widget_get_state_flags (GTK_WIDGET (button)); + return (state & GTK_STATE_FLAG_INSENSITIVE) != GTK_STATE_FLAG_INSENSITIVE; +} + +/** + * gcr_unlock_options_widget_set_sensitive: + * @self: The unlock options widget + * @option: The option name + * @sensitive: The sensitivity state. + * @reason: A user displayable string which contains the reason for the sensitivity. + * + * Set the sensitivity state for one of the options. Use an option name like + * %GCR_UNLOCK_OPTION_ALWAYS. The reason will be displayed as a tooltip. + */ +void +gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self, const gchar *option, + gboolean sensitive, const gchar *reason) +{ + GtkToggleButton *button; + + g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); + g_return_if_fail (option); + + button = widget_button_for_option (self, option); + gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive); + + if (!sensitive && reason) + gtk_widget_set_tooltip_text (GTK_WIDGET (button), reason); + else if (sensitive) + gtk_widget_set_has_tooltip (GTK_WIDGET (button), FALSE); +} diff --git a/ui/gcr-unlock-options-widget.h b/ui/gcr-unlock-options-widget.h new file mode 100644 index 0000000..3052f13 --- /dev/null +++ b/ui/gcr-unlock-options-widget.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_UNLOCK_OPTIONS_WIDGET_H__ +#define __GCR_UNLOCK_OPTIONS_WIDGET_H__ + +#include +#include + +#include "gcr/gcr-types.h" +#include "gcr/gcr-unlock-options.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_get_type ()) +#define GCR_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidget)) +#define GCR_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass)) +#define GCR_IS_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET)) +#define GCR_IS_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET)) +#define GCR_UNLOCK_OPTIONS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass)) + +typedef struct _GcrUnlockOptionsWidget GcrUnlockOptionsWidget; +typedef struct _GcrUnlockOptionsWidgetClass GcrUnlockOptionsWidgetClass; +typedef struct _GcrUnlockOptionsWidgetPrivate GcrUnlockOptionsWidgetPrivate; + +/* + * TODO: GcrUnlockOptionsWidget and GcrUnlockOptionsWidgetClass are hidden until + * we can figure out what they should be derived from. + */ + +GType gcr_unlock_options_widget_get_type (void); + +GtkWidget* gcr_unlock_options_widget_new (void); + +const gchar* gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self); + +void gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self, + const gchar *option); + +guint gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self); + +void gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self, + guint ttl); + +const gchar* gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self, + const gchar *option); + +void gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self, + const gchar *option, + const gchar *text); + +gboolean gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self, + const gchar *option); + +void gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self, + const gchar *option, + gboolean sensitive, + const gchar *reason); + +G_END_DECLS + +#endif /* __GCR_UNLOCK_OPTIONS_WIDGET_H__ */ diff --git a/ui/gcr-unlock-options-widget.ui b/ui/gcr-unlock-options-widget.ui new file mode 100644 index 0000000..d8e786e --- /dev/null +++ b/ui/gcr-unlock-options-widget.ui @@ -0,0 +1,117 @@ + + + + + + 1 + 999 + 1 + 10 + + + True + 6 + + + Automatically unlock this keyring whenever I’m logged in + True + True + False + True + True + lock_session_choice + + + False + 0 + + + + + Lock this keyring when I log out + True + True + False + True + True + + + False + 1 + + + + + True + 6 + + + True + 6 + + + Lock this keyring after + True + True + False + True + lock_session_choice + + + False + 0 + + + + + Lock this keyring if idle for + True + True + False + True + lock_session_choice + + + False + 1 + + + + + False + 0 + + + + + True + True + + spin_adjustment + 1 + True + + + False + 1 + + + + + True + 0 + minutes + + + False + 2 + + + + + False + 2 + + + + diff --git a/ui/gcr-unlock-renderer.c b/ui/gcr-unlock-renderer.c new file mode 100644 index 0000000..aa9dbdc --- /dev/null +++ b/ui/gcr-unlock-renderer.c @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr/gcr-icons.h" +#include "gcr/gcr-parser.h" + +#include "gcr-display-view.h" +#include "gcr-secure-entry-buffer.h" +#include "gcr-unlock-renderer.h" + +#include +#include + +enum { + PROP_0, + PROP_LABEL, + PROP_ATTRIBUTES +}; + +struct _GcrUnlockRendererPrivate { + GtkEntry *entry; + GtkLabel *warning; + + GBytes *locked_data; + gchar *label; + gboolean unlocked; + GList *renderers; + guint unlock_tries; + + /* block widget destroys during render */ + gint no_destroy; +}; + +enum { + UNLOCK_CLICKED, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +static void gcr_renderer_iface_init (GcrRendererIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GcrUnlockRenderer, _gcr_unlock_renderer, GTK_TYPE_BIN, + G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init); +); + +static gchar* +calculate_label (GcrUnlockRenderer *self) +{ + if (self->pv->label) + return g_strdup_printf (_("Unlock: %s"), self->pv->label); + + return g_strdup (_("Unlock")); +} + +void +_gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self, + const gchar *message) +{ + gchar *text; + + g_return_if_fail (GCR_UNLOCK_RENDERER (self)); + g_return_if_fail (message != NULL); + + text = g_strdup_printf ("%s", message); + gtk_label_set_markup (self->pv->warning, text); + g_free (text); + + gtk_widget_show (GTK_WIDGET (self->pv->warning)); +} + +static void +on_unlock_button_clicked (GtkButton *button, + gpointer user_data) +{ + GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (user_data); + g_signal_emit (self, signals[UNLOCK_CLICKED], 0); +} + +static void +on_entry_activated (GtkEntry *entry, + gpointer user_data) +{ + GtkButton *button = GTK_BUTTON (user_data); + gtk_button_clicked (button); +} + +static void +_gcr_unlock_renderer_init (GcrUnlockRenderer *self) +{ + GtkWidget *box, *vbox; + GtkWidget *button; + GtkEntryBuffer *buffer; + + self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_UNLOCK_RENDERER, + GcrUnlockRendererPrivate)); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + + buffer = gcr_secure_entry_buffer_new (); + self->pv->entry = GTK_ENTRY (gtk_entry_new_with_buffer (buffer)); + gtk_entry_set_visibility (self->pv->entry, FALSE); + gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->entry), TRUE, FALSE, 0); + gtk_widget_show (GTK_WIDGET (self->pv->entry)); + g_object_unref (buffer); + gtk_entry_set_placeholder_text (self->pv->entry, _("Password")); + + button = gtk_button_new_with_label (_("Unlock")); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + g_signal_connect (button, "clicked", G_CALLBACK (on_unlock_button_clicked), self); + g_signal_connect (self->pv->entry, "activate", G_CALLBACK (on_entry_activated), button); + gtk_widget_show (button); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 0); + gtk_widget_show (box); + + self->pv->warning = GTK_LABEL (gtk_label_new ("")); + gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (self->pv->warning), FALSE, FALSE, 0); + gtk_widget_hide (GTK_WIDGET (self->pv->warning)); + + gtk_container_add (GTK_CONTAINER (self), vbox); + gtk_widget_show (vbox); +} + +static void +_gcr_unlock_renderer_finalize (GObject *obj) +{ + GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj); + + g_bytes_unref (self->pv->locked_data); + g_free (self->pv->label); + g_list_free_full (self->pv->renderers, g_object_unref); + + G_OBJECT_CLASS (_gcr_unlock_renderer_parent_class)->finalize (obj); +} + +static void +_gcr_unlock_renderer_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_free (self->pv->label); + self->pv->label = g_value_dup_string (value); + g_object_notify (obj, "label"); + gcr_renderer_emit_data_changed (GCR_RENDERER (self)); + break; + case PROP_ATTRIBUTES: + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_unlock_renderer_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj); + + switch (prop_id) { + case PROP_LABEL: + g_value_take_string (value, calculate_label (self)); + break; + case PROP_ATTRIBUTES: + g_value_set_boxed (value, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +_gcr_unlock_renderer_class_init (GcrUnlockRendererClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GcrUnlockRendererPrivate)); + + gobject_class->finalize = _gcr_unlock_renderer_finalize; + gobject_class->set_property = _gcr_unlock_renderer_set_property; + gobject_class->get_property = _gcr_unlock_renderer_get_property; + + g_object_class_install_property (gobject_class, PROP_LABEL, + g_param_spec_string ("label", "Label", "Unlock Label", + "", G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, + g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE)); + + signals[UNLOCK_CLICKED] = g_signal_new ("unlock-clicked", GCR_TYPE_UNLOCK_RENDERER, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GcrUnlockRendererClass, unlock_clicked), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); +} + +static void +gcr_unlock_renderer_render (GcrRenderer *renderer, + GcrViewer *viewer) +{ + GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (renderer); + GcrDisplayView *view; + gchar *display; + GList *renderers; + GIcon *icon; + GList *l; + + if (GCR_IS_DISPLAY_VIEW (viewer)) { + view = GCR_DISPLAY_VIEW (viewer); + + } else { + g_warning ("GcrUnlockRenderer only works with internal specific " + "GcrViewer returned by gcr_viewer_new()."); + return; + } + + /* + * If we were successfully unlocked, then this will contain a list of + * renderers to add to the viewer. + */ + if (self->pv->unlocked) { + + /* We used prepend above, so list is backwards */ + renderers = g_list_reverse (self->pv->renderers); + self->pv->renderers = NULL; + + for (l = renderers; l != NULL; l = g_list_next (l)) + gcr_viewer_insert_renderer (viewer, l->data, renderer); + g_list_free_full (renderers, g_object_unref); + + /* And finally remove ourselves from the viewer */ + gcr_viewer_remove_renderer (viewer, GCR_RENDERER (self)); + /* + * Not yet unlocked, display the unlock dialog. + */ + } else { + + _gcr_display_view_begin (view, renderer); + + icon = g_themed_icon_new ("emblem-readonly"); + _gcr_display_view_set_icon (view, renderer, icon); + g_object_unref (icon); + + display = calculate_label (self); + _gcr_display_view_append_title (view, renderer, display); + g_free (display); + + if (self->pv->label) + display = g_strdup_printf (_("The contents of “%s” are locked. In order to view the contents, enter the correct password."), + self->pv->label); + else + display = g_strdup (_("The contents are locked. In order to view the contents, enter the correct password.")); + _gcr_display_view_append_content (view, renderer, display, NULL); + g_free (display); + + _gcr_display_view_add_widget_area (view, renderer, GTK_WIDGET (self)); + gtk_widget_show (GTK_WIDGET (self)); + + _gcr_display_view_end (view, renderer); + } +} + +static void +gcr_renderer_iface_init (GcrRendererIface *iface) +{ + iface->render_view = gcr_unlock_renderer_render; +} + +GcrUnlockRenderer* +_gcr_unlock_renderer_new (const gchar *label, + GBytes *locked_data) +{ + GcrUnlockRenderer *renderer; + + renderer = g_object_new (GCR_TYPE_UNLOCK_RENDERER, + "label", label, + NULL); + g_object_ref_sink (renderer); + + renderer->pv->locked_data = g_bytes_ref (locked_data); + return renderer; +} + +GcrUnlockRenderer * +_gcr_unlock_renderer_new_for_parsed (GcrParser *parser) +{ + g_return_val_if_fail (GCR_IS_PARSER (parser), NULL); + return _gcr_unlock_renderer_new (gcr_parser_get_parsed_label (parser), + gcr_parser_get_parsed_bytes (parser)); +} + +const gchar * +_gcr_unlock_renderer_get_password (GcrUnlockRenderer *self) +{ + g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL); + return gtk_entry_get_text (self->pv->entry); +} + +void +_gcr_unlock_renderer_set_password (GcrUnlockRenderer *self, + const gchar *text) +{ + g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self)); + g_return_if_fail (text != NULL); + gtk_entry_set_text (self->pv->entry, text); +} + +void +_gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self) +{ + g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self)); + gtk_widget_grab_focus (GTK_WIDGET (self->pv->entry)); +} + +GBytes * +_gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self) +{ + g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL); + return self->pv->locked_data; +} diff --git a/ui/gcr-unlock-renderer.h b/ui/gcr-unlock-renderer.h new file mode 100644 index 0000000..3f504a1 --- /dev/null +++ b/ui/gcr-unlock-renderer.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * + * Author: Stef Walter + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef __GCR_UNLOCK_RENDERER_H__ +#define __GCR_UNLOCK_RENDERER_H__ + +#include +#include + +#include "gcr/gcr-types.h" + +#include "gcr-renderer.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_UNLOCK_RENDERER (_gcr_unlock_renderer_get_type ()) +#define GCR_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRenderer)) +#define GCR_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass)) +#define GCR_IS_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_RENDERER)) +#define GCR_IS_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_RENDERER)) +#define GCR_UNLOCK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass)) + +typedef struct _GcrUnlockRenderer GcrUnlockRenderer; +typedef struct _GcrUnlockRendererClass GcrUnlockRendererClass; +typedef struct _GcrUnlockRendererPrivate GcrUnlockRendererPrivate; + +struct _GcrUnlockRenderer { + /*< private >*/ + GtkBin parent; + GcrUnlockRendererPrivate *pv; +}; + +struct _GcrUnlockRendererClass { + GtkBinClass parent_class; + + /* signals */ + void (*unlock_clicked) (GcrUnlockRenderer *unlock); +}; + +GType _gcr_unlock_renderer_get_type (void); + +GcrUnlockRenderer * _gcr_unlock_renderer_new (const gchar *label, + GBytes *locked_data); + +GcrUnlockRenderer * _gcr_unlock_renderer_new_for_parsed (GcrParser *parser); + +const gchar * _gcr_unlock_renderer_get_password (GcrUnlockRenderer *self); + +void _gcr_unlock_renderer_set_password (GcrUnlockRenderer *self, + const gchar *text); + +void _gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self); + +void _gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self, + const gchar *message); + +GBytes * _gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self); + +G_END_DECLS + +#endif /* __GCR_UNLOCK_RENDERER_H__ */ diff --git a/ui/gcr-viewer-tool.c b/ui/gcr-viewer-tool.c new file mode 100644 index 0000000..0117d70 --- /dev/null +++ b/ui/gcr-viewer-tool.c @@ -0,0 +1,126 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-viewer-tool.c: Command line utility + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr-viewer-window.h" + +#include +#include + +#include +#include +#include + +static gchar **remaining_args = NULL; + +static gboolean +print_version_and_exit (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + g_print("%s -- %s\n", _("GCR Certificate and Key Viewer"), VERSION); + exit (0); + return TRUE; +} + +static const GOptionEntry options[] = { + { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, + print_version_and_exit, N_("Show the application's version"), NULL}, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, + &remaining_args, NULL, N_("[file...]") }, + { NULL } +}; + +static gboolean +on_idle_load_files (gpointer user_data) +{ + GcrViewerWindow *window = GCR_VIEWER_WINDOW (user_data); + GFile *file; + gint i; + + if (remaining_args) { + for (i = 0; remaining_args[i] != NULL; ++i) { + file = g_file_new_for_commandline_arg (remaining_args[i]); + gcr_viewer_window_load (window, file); + g_object_unref (file); + } + + g_strfreev (remaining_args); + remaining_args = NULL; + } + + return FALSE; /* Don't run this again */ +} + +static void +on_window_destroy (GtkWidget *widget, + gpointer unused) +{ + gtk_widget_hide (widget); + gtk_main_quit (); +} + +int +main (int argc, char *argv[]) +{ + GOptionContext *context; + GError *error = NULL; + GtkWindow *window; + +#ifdef HAVE_LOCALE_H + /* internationalisation */ + setlocale (LC_ALL, ""); +#endif + +#ifdef HAVE_GETTEXT + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + textdomain (GETTEXT_PACKAGE); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + + context = g_option_context_new (N_("- View certificate and key files")); + g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); + g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE); + + g_option_context_add_group (context, gtk_get_option_group (TRUE)); + + if (! g_option_context_parse (context, &argc, &argv, &error)) { + g_critical ("Failed to parse arguments: %s", error->message); + g_error_free (error); + g_option_context_free (context); + return 1; + } + + g_option_context_free (context); + g_set_application_name (_("Certificate Viewer")); + + gtk_init (&argc, &argv); + + window = gcr_viewer_window_new (); + gtk_widget_show (GTK_WIDGET (window)); + + g_idle_add (on_idle_load_files, window); + g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), NULL); + gtk_main (); + + return 0; +} diff --git a/ui/gcr-viewer-widget.c b/ui/gcr-viewer-widget.c new file mode 100644 index 0000000..f2c6e71 --- /dev/null +++ b/ui/gcr-viewer-widget.c @@ -0,0 +1,710 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-viewer-widget: Widget for viewer + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr/gcr-importer.h" +#include "gcr/gcr-marshal.h" +#include "gcr/gcr-parser.h" + +#include "gcr-display-scrolled.h" +#include "gcr-failure-renderer.h" +#include "gcr-renderer.h" +#include "gcr-unlock-renderer.h" +#include "gcr-viewer-widget.h" +#include "gcr-viewer.h" + +#include +#include + +#include +#include + +/** + * SECTION:gcr-viewer-widget + * @title: GcrViewerWidget + * @short_description: A widget which shows certificates or keys + * + * A viewer widget which can display certificates and keys that are + * located in files. + */ + +enum { + PROP_0, + PROP_PARSER, + PROP_DISPLAY_NAME +}; + +/** + * GcrViewerWidget: + * + * A viewer widget object. + */ + +/** + * GcrViewerWidgetClass: + * + * Class for #GcrViewerWidget + */ + +/* + * Not yet figured out how to expose these without locking down our + * implementation, the parent class we derive from. + */ + +#define GCR_VIEWER_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_VIEWER_WIDGET, GcrViewerWidgetClass)) +#define GCR_IS_VIEWER_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_VIEWER_WIDGET)) +#define GCR_VIEWER_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_VIEWER_WIDGET, GcrViewerWidgetClass)) + +typedef struct _GcrViewerWidgetClass GcrViewerWidgetClass; +typedef struct _GcrViewerWidgetPrivate GcrViewerWidgetPrivate; + +struct _GcrViewerWidget { + /*< private >*/ + GtkBox parent; + GcrViewerWidgetPrivate *pv; +}; + +struct _GcrViewerWidgetClass { + GtkBoxClass parent_class; + + void (*added) (GcrViewerWidget *widget, + GcrRenderer *renderer, + GcrParsed *parsed); +}; + +struct _GcrViewerWidgetPrivate { + GcrViewer *viewer; + GtkInfoBar *message_bar; + GtkLabel *message_label; + GQueue *files_to_load; + GcrParser *parser; + GCancellable *cancellable; + GList *unlocks; + gboolean loading; + gchar *display_name; + gboolean display_name_explicit; +}; + +enum { + ADDED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0, }; + +static void viewer_load_next_file (GcrViewerWidget *self); +static void viewer_stop_loading_files (GcrViewerWidget *self); + +G_DEFINE_TYPE (GcrViewerWidget, gcr_viewer_widget, GTK_TYPE_BOX); + +static const gchar * +get_parsed_label_or_display_name (GcrViewerWidget *self, + GcrParser *parser) +{ + const gchar *label; + + label = gcr_parser_get_parsed_label (parser); + if (label == NULL) + label = self->pv->display_name; + + return label; +} + +static void +on_parser_parsed (GcrParser *parser, + gpointer user_data) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); + GckAttributes *attrs; + GcrRenderer *renderer; + const gchar *label; + gboolean actual = TRUE; + + label = get_parsed_label_or_display_name (self, parser); + attrs = gcr_parser_get_parsed_attributes (parser); + + renderer = gcr_renderer_create (label, attrs); + + if (renderer == NULL) { + renderer = gcr_failure_renderer_new_unsupported (label); + actual = FALSE; + } + + /* And show the data */ + gcr_viewer_add_renderer (self->pv->viewer, renderer); + + /* Let callers know we're rendering data */ + if (actual == TRUE) + g_signal_emit (self, signals[ADDED], 0, renderer, + gcr_parser_get_parsed (parser)); + + g_object_unref (renderer); +} + +static gboolean +on_parser_authenticate_for_unlock (GcrParser *parser, + guint count, + gpointer user_data) +{ + GcrUnlockRenderer *unlock = GCR_UNLOCK_RENDERER (user_data); + const gchar *password; + + if (count == 0) { + password = _gcr_unlock_renderer_get_password (unlock); + gcr_parser_add_password (parser, password); + } + + return TRUE; +} + +static void +on_unlock_renderer_clicked (GcrUnlockRenderer *unlock, + gpointer user_data) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); + GError *error = NULL; + GBytes *data; + gulong sig; + + /* Override our main authenticate signal handler */ + sig = g_signal_connect (self->pv->parser, "authenticate", + G_CALLBACK (on_parser_authenticate_for_unlock), unlock); + + data = _gcr_unlock_renderer_get_locked_data (unlock); + if (gcr_parser_parse_bytes (self->pv->parser, data, &error)) { + + /* Done with this unlock renderer */ + gcr_viewer_remove_renderer (self->pv->viewer, GCR_RENDERER (unlock)); + self->pv->unlocks = g_list_remove (self->pv->unlocks, unlock); + g_object_unref (unlock); + + } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)){ + _gcr_unlock_renderer_show_warning (unlock, _("The password was incorrect")); + _gcr_unlock_renderer_focus_password (unlock); + _gcr_unlock_renderer_set_password (unlock, ""); + g_error_free (error); + + } else { + _gcr_unlock_renderer_show_warning (unlock, error->message); + g_error_free (error); + } + + g_signal_handler_disconnect (self->pv->parser, sig); +} + +static gboolean +on_parser_authenticate_for_data (GcrParser *parser, + guint count, + gpointer user_data) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); + GcrUnlockRenderer *unlock; + + unlock = _gcr_unlock_renderer_new_for_parsed (parser); + if (unlock != NULL) { + g_object_set (unlock, "label", get_parsed_label_or_display_name (self, parser), NULL); + gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (unlock)); + g_signal_connect (unlock, "unlock-clicked", G_CALLBACK (on_unlock_renderer_clicked), self); + self->pv->unlocks = g_list_prepend (self->pv->unlocks, unlock); + } + + return TRUE; +} + +static void +gcr_viewer_widget_init (GcrViewerWidget *self) +{ + GtkWidget *area; + + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_VIEWER_WIDGET, + GcrViewerWidgetPrivate); + + gtk_orientable_set_orientation (GTK_ORIENTABLE (self), + GTK_ORIENTATION_VERTICAL); + + self->pv->viewer = gcr_viewer_new_scrolled (); + gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0); + gtk_widget_show (GTK_WIDGET (self->pv->viewer)); + + self->pv->message_label = GTK_LABEL (gtk_label_new ("")); + gtk_label_set_use_markup (self->pv->message_label, TRUE); + gtk_label_set_ellipsize (self->pv->message_label, PANGO_ELLIPSIZE_END); + gtk_widget_show (GTK_WIDGET (self->pv->message_label)); + + self->pv->message_bar = GTK_INFO_BAR (gtk_info_bar_new ()); + gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->message_bar), FALSE, TRUE, 0); + area = gtk_info_bar_get_content_area (self->pv->message_bar); + gtk_container_add (GTK_CONTAINER (area), GTK_WIDGET (self->pv->message_label)); + + self->pv->files_to_load = g_queue_new (); + self->pv->parser = gcr_parser_new (); + self->pv->cancellable = g_cancellable_new (); + self->pv->unlocks = NULL; + + g_signal_connect (self->pv->parser, "parsed", G_CALLBACK (on_parser_parsed), self); + g_signal_connect_after (self->pv->parser, "authenticate", G_CALLBACK (on_parser_authenticate_for_data), self); +} + +static void +gcr_viewer_widget_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); + + switch (prop_id) { + case PROP_PARSER: + g_value_set_object (value, gcr_viewer_widget_get_parser (self)); + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, gcr_viewer_widget_get_display_name (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_viewer_widget_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); + + switch (prop_id) { + case PROP_DISPLAY_NAME: + gcr_viewer_widget_set_display_name (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gcr_viewer_widget_dispose (GObject *obj) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); + GList *l; + + g_signal_handlers_disconnect_by_func (self->pv->parser, on_parser_parsed, self); + + for (l = self->pv->unlocks; l != NULL; l = g_list_next (l)) { + g_signal_handlers_disconnect_by_func (l->data, on_unlock_renderer_clicked, self); + g_object_unref (l->data); + } + g_list_free (self->pv->unlocks); + self->pv->unlocks = NULL; + + while (!g_queue_is_empty (self->pv->files_to_load)) + g_object_unref (g_queue_pop_head (self->pv->files_to_load)); + + g_cancellable_cancel (self->pv->cancellable); + + G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->dispose (obj); +} + +static void +gcr_viewer_widget_finalize (GObject *obj) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); + + g_assert (g_queue_is_empty (self->pv->files_to_load)); + g_queue_free (self->pv->files_to_load); + + g_free (self->pv->display_name); + g_object_unref (self->pv->cancellable); + g_object_unref (self->pv->parser); + + G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->finalize (obj); +} + +static void +gcr_viewer_widget_class_init (GcrViewerWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->dispose = gcr_viewer_widget_dispose; + gobject_class->finalize = gcr_viewer_widget_finalize; + gobject_class->get_property = gcr_viewer_widget_get_property; + gobject_class->set_property = gcr_viewer_widget_set_property; + + g_type_class_add_private (klass, sizeof (GcrViewerWidgetPrivate)); + + /** + * GcrViewerWidget:parser: + * + * The parser used to parse loaded data into viewable items. + */ + g_object_class_install_property (gobject_class, PROP_PARSER, + g_param_spec_object ("parser", "Parser", "Parser used to parse viewable items", + GCR_TYPE_PARSER, G_PARAM_READABLE)); + + /** + * GcrViewerWidget:display-name: + * + * Display name for data being displayed. This is automatically + * calculated from a loaded file, or can be explicitly set. + * + * Used as a hint when displaying a title for the data, but may be + * overridden by the parsed data. + */ + g_object_class_install_property (gobject_class, PROP_DISPLAY_NAME, + g_param_spec_string ("display-name", "Display name", "Display name", + NULL, G_PARAM_READWRITE)); + + /** + * GcrViewerWidget::added: + * @self: the viewer widget + * @renderer: (type GcrUi.Renderer): the renderer that was added + * @parsed: (type Gcr.Parsed): the parsed item that was added + * + * This signal is emitted when an item is added to the viewer widget. + */ + signals[ADDED] = g_signal_new ("added", GCR_TYPE_VIEWER_WIDGET, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GcrViewerWidgetClass, added), + NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED, + G_TYPE_NONE, 2, G_TYPE_OBJECT, GCR_TYPE_PARSED); +} + +static void +on_parser_parse_stream_returned (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); + GError *error = NULL; + GcrRenderer *renderer; + + gcr_parser_parse_stream_finish (self->pv->parser, result, &error); + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_CANCELLED)) { + viewer_stop_loading_files (self); + + } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)) { + /* Just skip this one, an unlock renderer was added */ + + } else if (error) { + renderer = gcr_failure_renderer_new (self->pv->display_name, error); + gcr_viewer_add_renderer (self->pv->viewer, renderer); + g_object_unref (renderer); + g_error_free (error); + } + + viewer_load_next_file (self); +} + +static void +update_display_name (GcrViewerWidget *self, + gchar *display_name) +{ + if (!self->pv->display_name_explicit) { + g_free (self->pv->display_name); + self->pv->display_name = g_strdup (display_name); + g_object_notify (G_OBJECT (self), "display-name"); + } +} + +static void +on_file_read_returned (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); + GFile *file = G_FILE (source); + GError *error = NULL; + GFileInputStream *fis; + GcrRenderer *renderer; + gchar *basename, *display_name; + + fis = g_file_read_finish (file, result, &error); + + basename = g_file_get_basename (file); + display_name = g_filename_display_name (basename); + g_free (basename); + + update_display_name (self, display_name); + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + viewer_stop_loading_files (self); + + } else if (error) { + renderer = gcr_failure_renderer_new (self->pv->display_name, error); + gcr_viewer_add_renderer (self->pv->viewer, renderer); + g_object_unref (renderer); + g_error_free (error); + + viewer_load_next_file (self); + + } else { + gcr_parser_set_filename (self->pv->parser, display_name); + gcr_parser_parse_stream_async (self->pv->parser, + G_INPUT_STREAM (fis), + self->pv->cancellable, + on_parser_parse_stream_returned, + self); + g_object_unref (fis); + } + g_free (display_name); +} + +static void +viewer_stop_loading_files (GcrViewerWidget *self) +{ + self->pv->loading = FALSE; +} + +static void +viewer_load_next_file (GcrViewerWidget *self) +{ + GFile* file; + + file = g_queue_pop_head (self->pv->files_to_load); + if (file == NULL) { + viewer_stop_loading_files (self); + return; + } + + g_file_read_async (file, G_PRIORITY_DEFAULT, self->pv->cancellable, + on_file_read_returned, self); + + g_object_unref (file); +} + +/** + * gcr_viewer_widget_new: + * + * Create a new viewer widget. + * + * Returns: (transfer full): A new #GcrViewerWidget object + */ +GcrViewerWidget * +gcr_viewer_widget_new (void) +{ + return g_object_new (GCR_TYPE_VIEWER_WIDGET, NULL); +} + +/** + * gcr_viewer_widget_load_file: + * @self: a viewer widget + * @file: a file to load + * + * Display contents of a file in the viewer widget. Multiple files can + * be loaded. + */ +void +gcr_viewer_widget_load_file (GcrViewerWidget *self, + GFile *file) +{ + g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); + g_return_if_fail (G_IS_FILE (file)); + + g_queue_push_tail (self->pv->files_to_load, g_object_ref (file)); + + if (!self->pv->loading) + viewer_load_next_file (self); +} + +/** + * gcr_viewer_widget_load_bytes: + * @self: a viewer widget + * @display_name: (allow-none): label for the loaded data + * @data: data to load + * + * Parse and load some data to be displayed into the viewer widgets. The data + * may contain multiple parseable items if the format can contain multiple + * items. + */ +void +gcr_viewer_widget_load_bytes (GcrViewerWidget *self, + const gchar *display_name, + GBytes *data) +{ + GError *error = NULL; + GcrRenderer *renderer; + + g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); + g_return_if_fail (data != NULL); + + g_free (self->pv->display_name); + self->pv->display_name = g_strdup (display_name); + + if (!gcr_parser_parse_bytes (self->pv->parser, data, &error)) { + renderer = gcr_failure_renderer_new (display_name, error); + gcr_viewer_add_renderer (self->pv->viewer, renderer); + g_object_unref (renderer); + g_error_free (error); + } +} + +/** + * gcr_viewer_widget_load_data: + * @self: a viewer widget + * @display_name: (allow-none): label for the loaded data + * @data: (array length=n_data): data to load + * @n_data: length of data to load + * + * Parse and load some data to be displayed into the viewer widgets. The data + * may contain multiple parseable items if the format can contain multiple + * items. + * + * This function will copy the data. Use gcr_viewer_widget_load_bytes() to avoid + * copying the data. + */ +void +gcr_viewer_widget_load_data (GcrViewerWidget *self, + const gchar *display_name, + const guchar *data, + gsize n_data) +{ + GBytes *bytes; + + g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); + + bytes = g_bytes_new (data, n_data); + gcr_viewer_widget_load_bytes (self, display_name, bytes); + g_bytes_unref (bytes); +} + +/** + * gcr_viewer_widget_get_viewer: + * @self: a viewer widget + * + * Get the viewer used to display the viewable items. + * + * Returns: (transfer none): the viewer + */ +GcrViewer * +gcr_viewer_widget_get_viewer (GcrViewerWidget *self) +{ + g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL); + return self->pv->viewer; +} + +/** + * gcr_viewer_widget_get_parser: + * @self: a viewer widget + * + * Get the parser used to parse loaded data into viewable items. + * + * Returns: (transfer none): the parser + */ +GcrParser * +gcr_viewer_widget_get_parser (GcrViewerWidget *self) +{ + g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL); + return self->pv->parser; +} + +/** + * gcr_viewer_widget_show_error: + * @self: a viewer widget + * @message: descriptive error message + * @error: (allow-none): detailed error + * + * Show an error on the viewer widget. This is displayed on a info bar near + * the edge of the widget. + */ +void +gcr_viewer_widget_show_error (GcrViewerWidget *self, + const gchar *message, + GError *error) +{ + gchar *markup; + + g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); + g_return_if_fail (message != NULL); + + if (error) + markup = g_markup_printf_escaped ("%s: %s", message, error->message); + else + markup = g_markup_printf_escaped ("%s", message); + + gtk_info_bar_set_message_type (self->pv->message_bar, GTK_MESSAGE_ERROR); + gtk_label_set_markup (self->pv->message_label, markup); + gtk_widget_show (GTK_WIDGET (self->pv->message_bar)); + g_free (markup); +} + +/** + * gcr_viewer_widget_clear_error: + * @self: a viewer widget + * + * Clear the error displayed on the viewer widget. + */ +void +gcr_viewer_widget_clear_error (GcrViewerWidget *self) +{ + g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); + gtk_widget_hide (GTK_WIDGET (self->pv->message_bar)); +} + +/** + * gcr_viewer_widget_get_display_name: + * @self: a viewer widget + * + * Get the display name for data being displayed. This is automatically + * calculated from a loaded file, or can be explicitly set. + * + * Used as a hint when displaying a title for the data, but may be + * overridden by the parsed data. + * + * Returns: the display name + */ +const gchar * +gcr_viewer_widget_get_display_name (GcrViewerWidget *self) +{ + g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL); + + if (!self->pv->display_name_explicit && !self->pv->display_name) + self->pv->display_name = g_strdup (_("Certificate Viewer")); + + return self->pv->display_name; +} + +/** + * gcr_viewer_widget_set_display_name: + * @self: a viewer widget + * @display_name: the display name + * + * Set the display name for data being displayed. Once explicitly + * set it will no longer be calculated automatically by loading data. + * + * Used as a hint when displaying a title for the data, but may be + * overridden by the parsed data. + */ +void +gcr_viewer_widget_set_display_name (GcrViewerWidget *self, + const gchar *display_name) +{ + g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); + + g_free (self->pv->display_name); + self->pv->display_name = g_strdup (display_name); + self->pv->display_name_explicit = TRUE; + g_object_notify (G_OBJECT (self), "display-name"); +} diff --git a/ui/gcr-viewer-widget.h b/ui/gcr-viewer-widget.h new file mode 100644 index 0000000..72237c2 --- /dev/null +++ b/ui/gcr-viewer-widget.h @@ -0,0 +1,66 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-viewer-widget.h: Widget for viewer + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef GCR_VIEWER_WIDGET_H +#define GCR_VIEWER_WIDGET_H + +#include + +#define GCR_TYPE_VIEWER_WIDGET (gcr_viewer_widget_get_type ()) +#define GCR_VIEWER_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER_WIDGET, GcrViewerWidget)) +#define GCR_IS_VIEWER_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER_WIDGET)) + +typedef struct _GcrViewerWidget GcrViewerWidget; + + +GType gcr_viewer_widget_get_type (void); + +GcrViewerWidget * gcr_viewer_widget_new (void); + +void gcr_viewer_widget_load_file (GcrViewerWidget *self, + GFile *file); + +void gcr_viewer_widget_load_bytes (GcrViewerWidget *self, + const gchar *display_name, + GBytes *data); + +void gcr_viewer_widget_load_data (GcrViewerWidget *self, + const gchar *display_name, + const guchar *data, + gsize n_data); + +GcrViewer * gcr_viewer_widget_get_viewer (GcrViewerWidget *self); + +GcrParser * gcr_viewer_widget_get_parser (GcrViewerWidget *self); + +void gcr_viewer_widget_show_error (GcrViewerWidget *self, + const gchar *message, + GError *error); + +void gcr_viewer_widget_clear_error (GcrViewerWidget *self); + +const gchar * gcr_viewer_widget_get_display_name (GcrViewerWidget *self); + +void gcr_viewer_widget_set_display_name (GcrViewerWidget *self, + const gchar *display_name); + +#endif /* GCR_VIEWER_WIDGET_H */ diff --git a/ui/gcr-viewer-window.c b/ui/gcr-viewer-window.c new file mode 100644 index 0000000..99a6d4f --- /dev/null +++ b/ui/gcr-viewer-window.c @@ -0,0 +1,204 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-viewer-window.c: Window for viewer + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#include "config.h" + +#include "gcr-viewer-window.h" + +#include +#include + +#include +#include + +struct _GcrViewerWindowPrivate { + GcrViewerWidget *viewer; + GcrImportButton *import; +}; + +G_DEFINE_TYPE (GcrViewerWindow, gcr_viewer_window, GTK_TYPE_WINDOW); + +static void +on_viewer_renderer_added (GcrViewerWidget *viewer, + GcrRenderer *renderer, + GcrParsed *parsed, + gpointer user_data) +{ + GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); + gcr_import_button_add_parsed (self->pv->import, parsed); +} + +static void +gcr_viewer_window_init (GcrViewerWindow *self) +{ + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_VIEWER_WINDOW, + GcrViewerWindowPrivate); +} + +static void +on_import_button_importing (GcrImportButton *button, + GcrImporter *importer, + gpointer user_data) +{ + GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); + gcr_viewer_widget_clear_error (self->pv->viewer); +} + +static void +on_import_button_imported (GcrImportButton *button, + GcrImporter *importer, + GError *error, + gpointer user_data) +{ + GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); + + if (error == NULL) { + g_object_set (button, "label", _("Imported"), NULL); + + } else { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + gcr_viewer_widget_show_error (self->pv->viewer, _("Import failed"), error); + } +} + +static void +on_close_clicked (GtkButton *button, + gpointer user_data) +{ + GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); + gtk_widget_destroy (GTK_WIDGET (self)); +} + +static void +gcr_viewer_window_constructed (GObject *obj) +{ + GcrViewerWindow *self = GCR_VIEWER_WINDOW (obj); + GtkWidget *bbox; + GtkWidget *box; + GtkWidget *button; + + G_OBJECT_CLASS (gcr_viewer_window_parent_class)->constructed (obj); + + bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); + gtk_box_set_spacing (GTK_BOX (bbox), 12); + gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END); + gtk_widget_show (bbox); + + self->pv->import = gcr_import_button_new (_("Import")); + g_signal_connect_object (self->pv->import, "importing", + G_CALLBACK (on_import_button_importing), + self, 0); + g_signal_connect_object (self->pv->import, "imported", + G_CALLBACK (on_import_button_imported), + self, 0); + gtk_widget_show (GTK_WIDGET (self->pv->import)); + + button = gtk_button_new_with_mnemonic (_("_Close")); + g_signal_connect_object (button, "clicked", + G_CALLBACK (on_close_clicked), + self, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (self->pv->import), FALSE, TRUE, 0); + + gtk_widget_set_halign (bbox, 0.5); + gtk_widget_set_valign (bbox, 0.5); +#if GTK_CHECK_VERSION (3, 12, 0) + gtk_widget_set_margin_end (bbox, 12); +#else + gtk_widget_set_margin_right (bbox, 12); +#endif + + self->pv->viewer = gcr_viewer_widget_new (); + g_object_bind_property (self->pv->viewer, "display-name", + self, "title", G_BINDING_SYNC_CREATE); + g_signal_connect_object (self->pv->viewer, "added", + G_CALLBACK (on_viewer_renderer_added), + self, 0); + gtk_widget_show (GTK_WIDGET (self->pv->viewer)); + + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_show (box); + + gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (box), bbox, FALSE, FALSE, 6); + + gtk_container_add (GTK_CONTAINER (self), box); + + gtk_window_set_default_size (GTK_WINDOW (self), 250, 400); +} + +static void +gcr_viewer_window_class_init (GcrViewerWindowClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructed = gcr_viewer_window_constructed; + + g_type_class_add_private (klass, sizeof (GcrViewerWindow)); +} + +/** + * gcr_viewer_window_new: + * + * Create a new viewer window. + * + * Returns: (transfer full) (type GcrUi.ViewerWindow): a new viewer window + */ +GtkWindow * +gcr_viewer_window_new (void) +{ + return g_object_new (GCR_TYPE_VIEWER_WINDOW, NULL); +} + +/** + * gcr_viewer_window_load: + * @self: a viewer window + * @file: file to load + * + * Load a file into a viewer window. It may not appear immediately. + */ +void +gcr_viewer_window_load (GcrViewerWindow *self, + GFile *file) +{ + g_return_if_fail (GCR_IS_VIEWER_WINDOW (self)); + g_return_if_fail (G_IS_FILE (file)); + + return gcr_viewer_widget_load_file (self->pv->viewer, file); +} + +/** + * gcr_viewer_window_get_viewer: + * @self: a viewer window + * + * Get the actual viewer showing information in the window. + * + * Returns: the viewer + */ +GcrViewer * +gcr_viewer_window_get_viewer (GcrViewerWindow *self) +{ + g_return_val_if_fail (GCR_IS_VIEWER_WINDOW (self), NULL); + return gcr_viewer_widget_get_viewer (self->pv->viewer); +} diff --git a/ui/gcr-viewer-window.h b/ui/gcr-viewer-window.h new file mode 100644 index 0000000..b64a8b3 --- /dev/null +++ b/ui/gcr-viewer-window.h @@ -0,0 +1,65 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* gcr-viewer-window.h: Window for viewer + + Copyright (C) 2011 Collabora Ltd. + + The Gnome Keyring Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Keyring Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + see . + + Author: Stef Walter +*/ + +#ifndef GCR_VIEWER_WINDOW_H +#define GCR_VIEWER_WINDOW_H + +#include + +#ifndef GCR_DISABLE_DEPRECATED + +#include "gcr/gcr.h" + +#define GCR_TYPE_VIEWER_WINDOW (gcr_viewer_window_get_type ()) +#define GCR_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindow)) +#define GCR_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass)) +#define GCR_IS_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER_WINDOW)) +#define GCR_IS_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_VIEWER_WINDOW)) +#define GCR_VIEWER_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass)) + +typedef struct _GcrViewerWindow GcrViewerWindow; +typedef struct _GcrViewerWindowClass GcrViewerWindowClass; +typedef struct _GcrViewerWindowPrivate GcrViewerWindowPrivate; + +struct _GcrViewerWindow { + /*< private >*/ + GtkWindow parent; + GcrViewerWindowPrivate *pv; +}; + +struct _GcrViewerWindowClass { + /*< private >*/ + GtkWindowClass parent_class; +}; + +GType gcr_viewer_window_get_type (void); + +GtkWindow * gcr_viewer_window_new (void); + +void gcr_viewer_window_load (GcrViewerWindow *self, + GFile *file); + +GcrViewer * gcr_viewer_window_get_viewer (GcrViewerWindow *self); + +#endif /* GCR_DISABLE_DEPRECATED */ + +#endif /* GCR_VIEWER_WINDOW_H */ diff --git a/ui/gcr-viewer.c b/ui/gcr-viewer.c new file mode 100644 index 0000000..c2c50ef --- /dev/null +++ b/ui/gcr-viewer.c @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2008 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include "config.h" + +#include "gcr-display-scrolled.h" +#include "gcr-display-view.h" +#include "gcr-renderer.h" +#include "gcr-viewer.h" + +/** + * SECTION:gcr-viewer + * @title: GcrViewer + * @short_description: A viewer which can hold renderers + * + * A #GcrViewer is an abstract interface that represents a widget that can hold + * various renderers and display their contents. + * + * The interaction between #GcrRenderer and #GcrViewer is not stable yet, and + * so viewers cannot be implemented outside the Gcr library at this time. + * + * Use the gcr_viewer_new() and gcr_viewer_new_scrolled() to get default + * implementations of viewers. + */ + +/** + * GcrViewer: + * + * An abstract viewer which displays renderers contents. + */ + +/** + * GcrViewerIface: + * @parent: The parent interface + * @add_renderer: Virtual method to add a renderer + * @insert_renderer: Virtual method to insert a renderer + * @remove_renderer: Virtual method to remove a renderer + * @count_renderers: Virtual method to count renderers + * @get_renderer: Virtual method to get a renderer + * + * The interface for #GcrViewer + */ + +typedef GcrViewerIface GcrViewerInterface; + +G_DEFINE_INTERFACE (GcrViewer, gcr_viewer, GTK_TYPE_WIDGET); + +static void +gcr_viewer_default_init (GcrViewerIface *iface) +{ + +} + +/* ----------------------------------------------------------------------------- + * PUBLIC + */ + +/** + * gcr_viewer_new: + * + * Get an implementation of #GcrViewer that supports a view + * of multiple renderers. + * + * Returns: (transfer full): a newly allocated #GcrViewer, which should be + * released with g_object_unref() + */ +GcrViewer * +gcr_viewer_new (void) +{ + return GCR_VIEWER (_gcr_display_view_new ()); +} + +/** + * gcr_viewer_new_scrolled: + * + * Get an implementation of #GcrViewer that supports a scrolled view + * of multiple renderers. + * + * Returns: (transfer floating): a #GcrViewer which is also a #GtkWidget + */ +GcrViewer* +gcr_viewer_new_scrolled (void) +{ + return GCR_VIEWER (_gcr_display_scrolled_new ()); +} + +/** + * gcr_viewer_add_renderer: + * @viewer: The viewer + * @renderer: The renderer to add + * + * Add a renderer to this viewer. + */ +void +gcr_viewer_add_renderer (GcrViewer *viewer, + GcrRenderer *renderer) +{ + g_return_if_fail (GCR_IS_VIEWER (viewer)); + g_return_if_fail (GCR_IS_RENDERER (renderer)); + g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer); + GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer (viewer, renderer); +} + +/** + * gcr_viewer_insert_renderer: + * @viewer: the viewer + * @renderer: the renderer to insert + * @before: (allow-none): the renderer to insert before + * + * Insert a renderer at a specific point in the viewer + */ +void +gcr_viewer_insert_renderer (GcrViewer *viewer, + GcrRenderer *renderer, + GcrRenderer *before) +{ + g_return_if_fail (GCR_IS_VIEWER (viewer)); + g_return_if_fail (GCR_IS_RENDERER (renderer)); + g_return_if_fail (!before || GCR_IS_RENDERER (before)); + g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer); + GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer (viewer, renderer, before); +} + +/** + * gcr_viewer_remove_renderer: + * @viewer: The viewer + * @renderer: The renderer to remove + * + * Remove a renderer from this viewer. + */ +void +gcr_viewer_remove_renderer (GcrViewer *viewer, + GcrRenderer *renderer) +{ + g_return_if_fail (GCR_IS_VIEWER (viewer)); + g_return_if_fail (GCR_IS_RENDERER (renderer)); + g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer); + GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer (viewer, renderer); +} + +/** + * gcr_viewer_count_renderers: + * @viewer: The viewer + * + * Get the number of renderers present in the viewer. + * + * Returns: The number of renderers. + */ +guint +gcr_viewer_count_renderers (GcrViewer *viewer) +{ + g_return_val_if_fail (GCR_IS_VIEWER (viewer), 0); + g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers, 0); + return GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers (viewer); +} + +/** + * gcr_viewer_get_renderer: + * @viewer: The viewer + * @index_: The index of the renderer to get + * + * Get a pointer to the renderer at the given index. It is an error to request + * an index that is out of bounds. + * + * Returns: (transfer none): the render, owned by the viewer + */ +GcrRenderer* +gcr_viewer_get_renderer (GcrViewer *viewer, + guint index_) +{ + g_return_val_if_fail (GCR_IS_VIEWER (viewer), NULL); + g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer, NULL); + return GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer (viewer, index_); +} diff --git a/ui/gcr-viewer.desktop.in.in b/ui/gcr-viewer.desktop.in.in new file mode 100644 index 0000000..91ddaba --- /dev/null +++ b/ui/gcr-viewer.desktop.in.in @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=View file +MimeType=application/pkcs12;application/pkcs12+pem;application/pkcs7-mime;application/pkcs7-mime+pem;application/pkcs8;application/pkcs8+pem;application/pkix-cert;application/pkix-cert+pem;application/pkix-crl;application/pkix-crl+pem;application/x-pem-file;application/x-pem-key;application/x-pkcs12;application/x-pkcs7-certificates;application/x-x509-ca-cert;application/x-x509-user-cert;application/pkcs10;application/pkcs10+pem;application/x-spkac;application/x-spkac+base64; +Exec=@bindir@/gcr-viewer +Type=Application +Terminal=false +NoDisplay=true +X-GNOME-Bugzilla-Bugzilla=GNOME +X-GNOME-Bugzilla-Product=gnome-keyring +X-GNOME-Bugzilla-Component=gcr \ No newline at end of file diff --git a/ui/gcr-viewer.h b/ui/gcr-viewer.h new file mode 100644 index 0000000..fe8df50 --- /dev/null +++ b/ui/gcr-viewer.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010 Stefan Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef __GCR_VIEWER_H__ +#define __GCR_VIEWER_H__ + +#include +#include + +#include "gcr/gcr-types.h" + +G_BEGIN_DECLS + +#define GCR_TYPE_VIEWER (gcr_viewer_get_type()) +#define GCR_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER, GcrViewer)) +#define GCR_IS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER)) +#define GCR_VIEWER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_VIEWER, GcrViewerIface)) + +typedef struct _GcrRenderer GcrRenderer; +typedef struct _GcrViewer GcrViewer; +typedef struct _GcrViewerIface GcrViewerIface; + +struct _GcrViewerIface { + GTypeInterface parent; + + void (*add_renderer) (GcrViewer *viewer, + GcrRenderer *renderer); + + void (*insert_renderer) (GcrViewer *viewer, + GcrRenderer *renderer, + GcrRenderer *before); + + void (*remove_renderer) (GcrViewer *viewer, + GcrRenderer *renderer); + + guint (*count_renderers) (GcrViewer *viewer); + + GcrRenderer* (*get_renderer) (GcrViewer *viewer, + guint index_); + + /*< private >*/ + gpointer dummy1; + gpointer dummy2; + gpointer dummy3; + gpointer dummy4; +}; + +GType gcr_viewer_get_type (void); + +GcrViewer* gcr_viewer_new (void); + +GcrViewer* gcr_viewer_new_scrolled (void); + +void gcr_viewer_add_renderer (GcrViewer *viewer, + GcrRenderer *renderer); + +void gcr_viewer_insert_renderer (GcrViewer *viewer, + GcrRenderer *renderer, + GcrRenderer *before); + +void gcr_viewer_remove_renderer (GcrViewer *viewer, + GcrRenderer *renderer); + +guint gcr_viewer_count_renderers (GcrViewer *viewer); + +GcrRenderer* gcr_viewer_get_renderer (GcrViewer *viewer, + guint index_); + +G_END_DECLS + +#endif /* __GCR_VIEWER_H__ */ diff --git a/ui/gcr.gresource.xml b/ui/gcr.gresource.xml new file mode 100644 index 0000000..3ab232d --- /dev/null +++ b/ui/gcr.gresource.xml @@ -0,0 +1,7 @@ + + + + gcr-pkcs11-import-dialog.ui + gcr-unlock-options-widget.ui + + diff --git a/ui/gcr.pc.in b/ui/gcr.pc.in new file mode 100644 index 0000000..f581de3 --- /dev/null +++ b/ui/gcr.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +datarootdir=@datarootdir@ +datadir=@datadir@ +sysconfdir=@sysconfdir@ + +Name: gcr-@GCR_MAJOR@ +Description: GObject and GUI library for high level crypto parsing and display +Version: @VERSION@ +Requires: gck-@GCK_MAJOR@ gcr-ui-@GCR_MAJOR@ gcr-base-@GCR_MAJOR@ diff --git a/ui/icons/16x16/Makefile.am b/ui/icons/16x16/Makefile.am new file mode 100644 index 0000000..7216880 --- /dev/null +++ b/ui/icons/16x16/Makefile.am @@ -0,0 +1,5 @@ +include $(srcdir)/../Makefile.decl + +icondir = $(datadir)/icons/hicolor/16x16/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) diff --git a/ui/icons/16x16/Makefile.in b/ui/icons/16x16/Makefile.in new file mode 100644 index 0000000..5f0b06b --- /dev/null +++ b/ui/icons/16x16/Makefile.in @@ -0,0 +1,601 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ui/icons/16x16 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(icondir)" +DATA = $(icon_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/../Makefile.decl $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +ICONS_SMALL = \ + gcr-gnupg \ + gcr-key \ + gcr-key-pair \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +ICONS_HIRES = \ + gcr-gnupg \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +icondir = $(datadir)/icons/hicolor/16x16/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.decl $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ui/icons/16x16/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ui/icons/16x16/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/../Makefile.decl $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-iconDATA: $(icon_DATA) + @$(NORMAL_INSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ + done + +uninstall-iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(icondir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-iconDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-iconDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-iconDATA install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-iconDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ui/icons/16x16/gcr-gnupg.png b/ui/icons/16x16/gcr-gnupg.png new file mode 100644 index 0000000..6595ca1 Binary files /dev/null and b/ui/icons/16x16/gcr-gnupg.png differ diff --git a/ui/icons/16x16/gcr-key-pair.png b/ui/icons/16x16/gcr-key-pair.png new file mode 100644 index 0000000..5cabf18 Binary files /dev/null and b/ui/icons/16x16/gcr-key-pair.png differ diff --git a/ui/icons/16x16/gcr-key.png b/ui/icons/16x16/gcr-key.png new file mode 100644 index 0000000..e4c2ccc Binary files /dev/null and b/ui/icons/16x16/gcr-key.png differ diff --git a/ui/icons/16x16/gcr-password.png b/ui/icons/16x16/gcr-password.png new file mode 100644 index 0000000..10f4142 Binary files /dev/null and b/ui/icons/16x16/gcr-password.png differ diff --git a/ui/icons/16x16/gcr-smart-card.png b/ui/icons/16x16/gcr-smart-card.png new file mode 100644 index 0000000..2860eb4 Binary files /dev/null and b/ui/icons/16x16/gcr-smart-card.png differ diff --git a/ui/icons/22x22/Makefile.am b/ui/icons/22x22/Makefile.am new file mode 100644 index 0000000..3001086 --- /dev/null +++ b/ui/icons/22x22/Makefile.am @@ -0,0 +1,5 @@ +include $(srcdir)/../Makefile.decl + +icondir = $(datadir)/icons/hicolor/22x22/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) diff --git a/ui/icons/22x22/Makefile.in b/ui/icons/22x22/Makefile.in new file mode 100644 index 0000000..febdd72 --- /dev/null +++ b/ui/icons/22x22/Makefile.in @@ -0,0 +1,601 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ui/icons/22x22 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(icondir)" +DATA = $(icon_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/../Makefile.decl $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +ICONS_SMALL = \ + gcr-gnupg \ + gcr-key \ + gcr-key-pair \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +ICONS_HIRES = \ + gcr-gnupg \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +icondir = $(datadir)/icons/hicolor/22x22/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.decl $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ui/icons/22x22/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ui/icons/22x22/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/../Makefile.decl $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-iconDATA: $(icon_DATA) + @$(NORMAL_INSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ + done + +uninstall-iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(icondir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-iconDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-iconDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-iconDATA install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-iconDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ui/icons/22x22/gcr-gnupg.png b/ui/icons/22x22/gcr-gnupg.png new file mode 100644 index 0000000..4210e97 Binary files /dev/null and b/ui/icons/22x22/gcr-gnupg.png differ diff --git a/ui/icons/22x22/gcr-key-pair.png b/ui/icons/22x22/gcr-key-pair.png new file mode 100644 index 0000000..8787443 Binary files /dev/null and b/ui/icons/22x22/gcr-key-pair.png differ diff --git a/ui/icons/22x22/gcr-key.png b/ui/icons/22x22/gcr-key.png new file mode 100644 index 0000000..7c0a2a3 Binary files /dev/null and b/ui/icons/22x22/gcr-key.png differ diff --git a/ui/icons/22x22/gcr-password.png b/ui/icons/22x22/gcr-password.png new file mode 100644 index 0000000..b613f16 Binary files /dev/null and b/ui/icons/22x22/gcr-password.png differ diff --git a/ui/icons/22x22/gcr-smart-card.png b/ui/icons/22x22/gcr-smart-card.png new file mode 100644 index 0000000..8474ff6 Binary files /dev/null and b/ui/icons/22x22/gcr-smart-card.png differ diff --git a/ui/icons/24x24/Makefile.am b/ui/icons/24x24/Makefile.am new file mode 100644 index 0000000..717a578 --- /dev/null +++ b/ui/icons/24x24/Makefile.am @@ -0,0 +1,5 @@ +include $(srcdir)/../Makefile.decl + +icondir = $(datadir)/icons/hicolor/24x24/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) diff --git a/ui/icons/24x24/Makefile.in b/ui/icons/24x24/Makefile.in new file mode 100644 index 0000000..1dad800 --- /dev/null +++ b/ui/icons/24x24/Makefile.in @@ -0,0 +1,601 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ui/icons/24x24 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(icondir)" +DATA = $(icon_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/../Makefile.decl $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +ICONS_SMALL = \ + gcr-gnupg \ + gcr-key \ + gcr-key-pair \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +ICONS_HIRES = \ + gcr-gnupg \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +icondir = $(datadir)/icons/hicolor/24x24/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.decl $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ui/icons/24x24/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ui/icons/24x24/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/../Makefile.decl $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-iconDATA: $(icon_DATA) + @$(NORMAL_INSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ + done + +uninstall-iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(icondir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-iconDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-iconDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-iconDATA install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-iconDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ui/icons/24x24/gcr-gnupg.png b/ui/icons/24x24/gcr-gnupg.png new file mode 100644 index 0000000..27b5adf Binary files /dev/null and b/ui/icons/24x24/gcr-gnupg.png differ diff --git a/ui/icons/24x24/gcr-key-pair.png b/ui/icons/24x24/gcr-key-pair.png new file mode 100644 index 0000000..ec78b77 Binary files /dev/null and b/ui/icons/24x24/gcr-key-pair.png differ diff --git a/ui/icons/24x24/gcr-key.png b/ui/icons/24x24/gcr-key.png new file mode 100644 index 0000000..a44b24b Binary files /dev/null and b/ui/icons/24x24/gcr-key.png differ diff --git a/ui/icons/24x24/gcr-password.png b/ui/icons/24x24/gcr-password.png new file mode 100644 index 0000000..5647789 Binary files /dev/null and b/ui/icons/24x24/gcr-password.png differ diff --git a/ui/icons/24x24/gcr-smart-card.png b/ui/icons/24x24/gcr-smart-card.png new file mode 100644 index 0000000..ce1b5ba Binary files /dev/null and b/ui/icons/24x24/gcr-smart-card.png differ diff --git a/ui/icons/256x256/Makefile.am b/ui/icons/256x256/Makefile.am new file mode 100644 index 0000000..b292590 --- /dev/null +++ b/ui/icons/256x256/Makefile.am @@ -0,0 +1,5 @@ +include $(srcdir)/../Makefile.decl + +icondir = $(datadir)/icons/hicolor/256x256/apps +icon_DATA = $(ICONS_HIRES:=.png) +EXTRA_DIST = $(icon_DATA) diff --git a/ui/icons/256x256/Makefile.in b/ui/icons/256x256/Makefile.in new file mode 100644 index 0000000..33b2290 --- /dev/null +++ b/ui/icons/256x256/Makefile.in @@ -0,0 +1,601 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ui/icons/256x256 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(icondir)" +DATA = $(icon_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/../Makefile.decl $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +ICONS_SMALL = \ + gcr-gnupg \ + gcr-key \ + gcr-key-pair \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +ICONS_HIRES = \ + gcr-gnupg \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +icondir = $(datadir)/icons/hicolor/256x256/apps +icon_DATA = $(ICONS_HIRES:=.png) +EXTRA_DIST = $(icon_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.decl $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ui/icons/256x256/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ui/icons/256x256/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/../Makefile.decl $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-iconDATA: $(icon_DATA) + @$(NORMAL_INSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ + done + +uninstall-iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(icondir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-iconDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-iconDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-iconDATA install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-iconDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ui/icons/256x256/gcr-gnupg.png b/ui/icons/256x256/gcr-gnupg.png new file mode 100644 index 0000000..200a42a Binary files /dev/null and b/ui/icons/256x256/gcr-gnupg.png differ diff --git a/ui/icons/256x256/gcr-password.png b/ui/icons/256x256/gcr-password.png new file mode 100644 index 0000000..50f7fb1 Binary files /dev/null and b/ui/icons/256x256/gcr-password.png differ diff --git a/ui/icons/256x256/gcr-smart-card.png b/ui/icons/256x256/gcr-smart-card.png new file mode 100644 index 0000000..ef5820d Binary files /dev/null and b/ui/icons/256x256/gcr-smart-card.png differ diff --git a/ui/icons/32x32/Makefile.am b/ui/icons/32x32/Makefile.am new file mode 100644 index 0000000..7f1ba6a --- /dev/null +++ b/ui/icons/32x32/Makefile.am @@ -0,0 +1,5 @@ +include $(srcdir)/../Makefile.decl + +icondir = $(datadir)/icons/hicolor/32x32/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) diff --git a/ui/icons/32x32/Makefile.in b/ui/icons/32x32/Makefile.in new file mode 100644 index 0000000..b8ba7f3 --- /dev/null +++ b/ui/icons/32x32/Makefile.in @@ -0,0 +1,601 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ui/icons/32x32 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(icondir)" +DATA = $(icon_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/../Makefile.decl $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +ICONS_SMALL = \ + gcr-gnupg \ + gcr-key \ + gcr-key-pair \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +ICONS_HIRES = \ + gcr-gnupg \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +icondir = $(datadir)/icons/hicolor/32x32/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.decl $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ui/icons/32x32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ui/icons/32x32/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/../Makefile.decl $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-iconDATA: $(icon_DATA) + @$(NORMAL_INSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ + done + +uninstall-iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(icondir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-iconDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-iconDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-iconDATA install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-iconDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ui/icons/32x32/gcr-gnupg.png b/ui/icons/32x32/gcr-gnupg.png new file mode 100644 index 0000000..f151fdf Binary files /dev/null and b/ui/icons/32x32/gcr-gnupg.png differ diff --git a/ui/icons/32x32/gcr-key-pair.png b/ui/icons/32x32/gcr-key-pair.png new file mode 100644 index 0000000..2ba1f15 Binary files /dev/null and b/ui/icons/32x32/gcr-key-pair.png differ diff --git a/ui/icons/32x32/gcr-key.png b/ui/icons/32x32/gcr-key.png new file mode 100644 index 0000000..af1abf7 Binary files /dev/null and b/ui/icons/32x32/gcr-key.png differ diff --git a/ui/icons/32x32/gcr-password.png b/ui/icons/32x32/gcr-password.png new file mode 100644 index 0000000..0b96362 Binary files /dev/null and b/ui/icons/32x32/gcr-password.png differ diff --git a/ui/icons/32x32/gcr-smart-card.png b/ui/icons/32x32/gcr-smart-card.png new file mode 100644 index 0000000..b4eaa92 Binary files /dev/null and b/ui/icons/32x32/gcr-smart-card.png differ diff --git a/ui/icons/48x48/Makefile.am b/ui/icons/48x48/Makefile.am new file mode 100644 index 0000000..7acd2b5 --- /dev/null +++ b/ui/icons/48x48/Makefile.am @@ -0,0 +1,5 @@ +include $(srcdir)/../Makefile.decl + +icondir = $(datadir)/icons/hicolor/48x48/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) diff --git a/ui/icons/48x48/Makefile.in b/ui/icons/48x48/Makefile.in new file mode 100644 index 0000000..6cbd046 --- /dev/null +++ b/ui/icons/48x48/Makefile.in @@ -0,0 +1,601 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program 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. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ui/icons/48x48 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/m4/glib-gettext.m4 \ + $(top_srcdir)/build/m4/gsettings.m4 \ + $(top_srcdir)/build/m4/gtk-doc.m4 \ + $(top_srcdir)/build/m4/intltool.m4 \ + $(top_srcdir)/build/m4/introspection.m4 \ + $(top_srcdir)/build/m4/libgcrypt.m4 \ + $(top_srcdir)/build/m4/libtool.m4 \ + $(top_srcdir)/build/m4/ltoptions.m4 \ + $(top_srcdir)/build/m4/ltsugar.m4 \ + $(top_srcdir)/build/m4/ltversion.m4 \ + $(top_srcdir)/build/m4/lt~obsolete.m4 \ + $(top_srcdir)/build/m4/nls.m4 $(top_srcdir)/build/m4/pkg.m4 \ + $(top_srcdir)/build/m4/vapigen.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(icondir)" +DATA = $(icon_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/../Makefile.decl $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GCK_LT_RELEASE = @GCK_LT_RELEASE@ +GCK_MAJOR = @GCK_MAJOR@ +GCK_MINOR = @GCK_MINOR@ +GCOV = @GCOV@ +GCR_CURRENT = @GCR_CURRENT@ +GCR_LT_RELEASE = @GCR_LT_RELEASE@ +GCR_MAJOR = @GCR_MAJOR@ +GCR_MICRO = @GCR_MICRO@ +GCR_MINOR = @GCR_MINOR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNUPG = @GNUPG@ +GREP = @GREP@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_FLAGS = @INTROSPECTION_FLAGS@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +P11_KIT_CFLAGS = @P11_KIT_CFLAGS@ +P11_KIT_LIBS = @P11_KIT_LIBS@ +P11_MODULE_PATH = @P11_MODULE_PATH@ +P11_SYSTEM_CONFIG_MODULES = @P11_SYSTEM_CONFIG_MODULES@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TEST_MODE = @TEST_MODE@ +USE_NLS = @USE_NLS@ +VALAC = @VALAC@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XSLTPROC = @XSLTPROC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkcs11standalonedir = @pkcs11standalonedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +ICONS_SMALL = \ + gcr-gnupg \ + gcr-key \ + gcr-key-pair \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +ICONS_HIRES = \ + gcr-gnupg \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +icondir = $(datadir)/icons/hicolor/48x48/apps +icon_DATA = $(ICONS_SMALL:=.png) +EXTRA_DIST = $(icon_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.decl $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ui/icons/48x48/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ui/icons/48x48/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/../Makefile.decl $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-iconDATA: $(icon_DATA) + @$(NORMAL_INSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ + done + +uninstall-iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(icondir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-iconDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-iconDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-iconDATA install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-iconDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ui/icons/48x48/gcr-gnupg.png b/ui/icons/48x48/gcr-gnupg.png new file mode 100644 index 0000000..56ddfef Binary files /dev/null and b/ui/icons/48x48/gcr-gnupg.png differ diff --git a/ui/icons/48x48/gcr-key-pair.png b/ui/icons/48x48/gcr-key-pair.png new file mode 100644 index 0000000..6a373e6 Binary files /dev/null and b/ui/icons/48x48/gcr-key-pair.png differ diff --git a/ui/icons/48x48/gcr-key.png b/ui/icons/48x48/gcr-key.png new file mode 100644 index 0000000..939fbb7 Binary files /dev/null and b/ui/icons/48x48/gcr-key.png differ diff --git a/ui/icons/48x48/gcr-password.png b/ui/icons/48x48/gcr-password.png new file mode 100644 index 0000000..8c13323 Binary files /dev/null and b/ui/icons/48x48/gcr-password.png differ diff --git a/ui/icons/48x48/gcr-smart-card.png b/ui/icons/48x48/gcr-smart-card.png new file mode 100644 index 0000000..6cd16f6 Binary files /dev/null and b/ui/icons/48x48/gcr-smart-card.png differ diff --git a/ui/icons/Makefile.am b/ui/icons/Makefile.am new file mode 100644 index 0000000..c419d89 --- /dev/null +++ b/ui/icons/Makefile.am @@ -0,0 +1,29 @@ + +SUBDIRS += \ + ui/icons/16x16 \ + ui/icons/22x22 \ + ui/icons/24x24 \ + ui/icons/32x32 \ + ui/icons/48x48 \ + ui/icons/256x256 + +EXTRA_DIST += \ + ui/icons/src \ + ui/icons/render-icons.py + +if WITH_UPDATE_ICON_CACHE + +gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor + +install-data-hook: + @-if test -z "$(DESTDIR)"; then \ + echo "Updating Gtk icon cache."; \ + $(gtk_update_icon_cache); \ + else \ + echo "*** Icon cache not updated. After install, run this:"; \ + echo "*** $(gtk_update_icon_cache)"; \ + fi +endif + +render: + cd $(srcdir) && python ui/icons/render-icons.py diff --git a/ui/icons/Makefile.decl b/ui/icons/Makefile.decl new file mode 100644 index 0000000..341dd5d --- /dev/null +++ b/ui/icons/Makefile.decl @@ -0,0 +1,15 @@ +NULL = + +ICONS_SMALL = \ + gcr-gnupg \ + gcr-key \ + gcr-key-pair \ + gcr-password \ + gcr-smart-card \ + $(NULL) + +ICONS_HIRES = \ + gcr-gnupg \ + gcr-password \ + gcr-smart-card \ + $(NULL) diff --git a/ui/icons/render-icons.py b/ui/icons/render-icons.py new file mode 100755 index 0000000..62cc0c8 --- /dev/null +++ b/ui/icons/render-icons.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python + +# Copied from gnome-icon-theme and adjusted lightly. +# +# GNOME icon theme is distributed under the terms of either +# GNU LGPL v.3 or Creative Commons BY-SA 3.0 license. + +import os +import sys +import xml.sax +import subprocess + +INKSCAPE = '/usr/bin/inkscape' +OPTIPNG = '/usr/bin/optipng' +SRC = 'ui/icons/src' +OUT = 'ui/icons' + +inkscape_process = None + +def optimize_png(png_file): + if os.path.exists(OPTIPNG): + process = subprocess.Popen([OPTIPNG, '-quiet', '-o7', png_file]) + process.wait() + +def wait_for_prompt(process, command=None): + if command is not None: + process.stdin.write((command+'\n').encode('utf-8')) + + # This is kinda ugly ... + # Wait for just a '>', or '\n>' if some other char appearead first + output = process.stdout.read(1) + if output == b'>': + return + + output += process.stdout.read(1) + while output != b'\n>': + output += process.stdout.read(1) + output = output[1:] + +def start_inkscape(): + process = subprocess.Popen([INKSCAPE, '--shell'], bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + wait_for_prompt(process) + return process + +def inkscape_render_rect(icon_file, rect, output_file): + global inkscape_process + if inkscape_process is None: + inkscape_process = start_inkscape() + wait_for_prompt(inkscape_process, '%s -i %s -e %s' % (icon_file, rect, output_file)) + optimize_png(output_file) + +class ContentHandler(xml.sax.ContentHandler): + ROOT = 0 + SVG = 1 + LAYER = 2 + OTHER = 3 + TEXT = 4 + def __init__(self, path, force=False, filter=None): + self.stack = [self.ROOT] + self.inside = [self.ROOT] + self.path = path + self.rects = [] + self.state = self.ROOT + self.chars = "" + self.force = force + self.filter = filter + + def endDocument(self): + pass + + def startElement(self, name, attrs): + if self.inside[-1] == self.ROOT: + if name == "svg": + self.stack.append(self.SVG) + self.inside.append(self.SVG) + return + elif self.inside[-1] == self.SVG: + if (name == "g" and ('inkscape:groupmode' in attrs) and ('inkscape:label' in attrs) + and attrs['inkscape:groupmode'] == 'layer' and attrs['inkscape:label'].startswith('baseplate')): + self.stack.append(self.LAYER) + self.inside.append(self.LAYER) + self.context = None + self.icon_name = None + self.rects = [] + return + elif self.inside[-1] == self.LAYER: + if name == "text" and ('inkscape:label' in attrs) and attrs['inkscape:label'] == 'context': + self.stack.append(self.TEXT) + self.inside.append(self.TEXT) + self.text='context' + self.chars = "" + return + elif name == "text" and ('inkscape:label' in attrs) and attrs['inkscape:label'] == 'icon-name': + self.stack.append(self.TEXT) + self.inside.append(self.TEXT) + self.text='icon-name' + self.chars = "" + return + elif name == "rect": + self.rects.append(attrs) + + self.stack.append(self.OTHER) + + + def endElement(self, name): + stacked = self.stack.pop() + if self.inside[-1] == stacked: + self.inside.pop() + + if stacked == self.TEXT and self.text is not None: + assert self.text in ['context', 'icon-name'] + if self.text == 'context': + self.context = self.chars + elif self.text == 'icon-name': + self.icon_name = self.chars + self.text = None + elif stacked == self.LAYER: + assert self.icon_name + assert self.context + + if self.filter is not None and not self.icon_name in self.filter: + return + + print (self.context, self.icon_name) + for rect in self.rects: + width = rect['width'] + height = rect['height'] + id = rect['id'] + + # dir = os.path.join(OUT, "%sx%s" % (width, height), self.context) + dir = os.path.join(OUT, "%sx%s" % (width, height)) + outfile = os.path.join(dir, self.icon_name+'.png') + if not os.path.exists(dir): + os.makedirs(dir) + # Do a time based check! + if self.force or not os.path.exists(outfile): + inkscape_render_rect(self.path, id, outfile) + sys.stdout.write('.') + else: + stat_in = os.stat(self.path) + stat_out = os.stat(outfile) + if stat_in.st_mtime > stat_out.st_mtime: + inkscape_render_rect(self.path, id, outfile) + sys.stdout.write('.') + else: + sys.stdout.write('-') + sys.stdout.flush() + sys.stdout.write('\n') + sys.stdout.flush() + + def characters(self, chars): + self.chars += chars.strip() + +if len(sys.argv) == 1: + if not os.path.exists(OUT): + os.mkdir(OUT) + print ('Rendering from SVGs in', SRC) + for file in os.listdir(SRC): + if file[-4:] == '.svg': + file = os.path.join(SRC, file) + handler = ContentHandler(file) + xml.sax.parse(open(file), handler) +else: + file = os.path.join(SRC, sys.argv[1] + '.svg') + if len(sys.argv) > 2: + icons = sys.argv[2:] + else: + icons = None + if os.path.exists(os.path.join(file)): + handler = ContentHandler(file, True, filter=icons) + xml.sax.parse(open(file), handler) + else: + print ("Error: No such file", file) + sys.exit(1) diff --git a/ui/icons/src/gcr-gnupg.svg b/ui/icons/src/gcr-gnupg.svg new file mode 100644 index 0000000..ce68a4b --- /dev/null +++ b/ui/icons/src/gcr-gnupg.svg @@ -0,0 +1,293 @@ + + + + + Firewall + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + Firewall + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/icons/src/gcr-key-and-keypair.svg b/ui/icons/src/gcr-key-and-keypair.svg new file mode 100644 index 0000000..0ccbbb7 --- /dev/null +++ b/ui/icons/src/gcr-key-and-keypair.svg @@ -0,0 +1,4138 @@ + + + + + Firewall + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + Firewall + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/icons/src/gcr-password.svg b/ui/icons/src/gcr-password.svg new file mode 100644 index 0000000..d5fc9b4 --- /dev/null +++ b/ui/icons/src/gcr-password.svg @@ -0,0 +1,1222 @@ + + + + + Firewall + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + Firewall + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/icons/src/gcr-smart-card.svg b/ui/icons/src/gcr-smart-card.svg new file mode 100644 index 0000000..51a3761 --- /dev/null +++ b/ui/icons/src/gcr-smart-card.svg @@ -0,0 +1,1165 @@ + + + + + Firewall + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + Firewall + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + smart card + + + +